Simple Buy and Sell¶
Let’s start with a simple buy and sell(cancel) strategy.
First, we need to create a strategy class. You can subscribe the bookl1 data of the BTCUSDT.OKX symbol in the __init__ method.
from nexustrader.strategy import Strategy
class Demo(Strategy):
def __init__(self):
super().__init__()
self.subscribe_bookl1(symbols=["BTCUSDT.OKX"])
self.signal = True
Then we need to implement the on_bookl1 method to handle the bookl1 data.
class Demo(Strategy):
# Existing code...
def on_bookl1(self, bookl1: BookL1):
if self.signal:
oid = self.create_order(
symbol="BTCUSDT.OKX",
side=OrderSide.BUY,
type=OrderType.LIMIT,
price=self.price_to_precision("BTCUSDT.OKX", bookl1.bid),
amount=Decimal("0.01"),
)
# You can also use the `self.create_order` method to create a `SELL` order.
self.cancel_order(
symbol="BTCUSDT.OKX",
oid=oid,
)
self.signal = False
if you want to check the status of the order, you can use the on_cancel_failed_order, on_canceled_order, on_failed_order, on_pending_order, on_accepted_order, on_partially_filled_order, and on_filled_order methods. Let’s implement them.
class Demo(Strategy):
# Existing code...
def on_cancel_failed_order(self, order: Order):
print(order)
def on_canceled_order(self, order: Order):
print(order)
def on_failed_order(self, order: Order):
print(order)
def on_pending_order(self, order: Order):
print(order)
def on_accepted_order(self, order: Order):
print(order)
def on_partially_filled_order(self, order: Order):
print(order)
def on_filled_order(self, order: Order):
print(order)
Then we need to create a config file to run the strategy. You need to pass the strategy_id, user_id, strategy, basic_config, public_conn_config, and private_conn_config to the Config class.
config = Config(
strategy_id="okx_buy_and_sell",
user_id="user_test",
strategy=Demo(),
basic_config={
ExchangeType.OKX: BasicConfig(
api_key=OKX_API_KEY,
secret=OKX_SECRET,
passphrase=OKX_PASSPHRASE,
testnet=True,
)
},
public_conn_config={
ExchangeType.OKX: [
PublicConnectorConfig(
account_type=OkxAccountType.DEMO,
)
]
},
private_conn_config={
ExchangeType.OKX: [
PrivateConnectorConfig(
account_type=OkxAccountType.DEMO,
)
]
}
)
Finally, you can run the strategy by passing the config to the Engine class.
# Existing code...
engine = Engine(config)
if __name__ == "__main__":
try:
engine.start()
finally:
engine.dispose()
The full code can be found in buy_and_cancel.py.