Add client order ID and mode to order placement
This commit is contained in:
parent
5e6ce06b91
commit
034f3b5829
|
@ -1,5 +1,6 @@
|
||||||
import argparse
|
import argparse
|
||||||
import asyncio
|
import asyncio
|
||||||
|
import time
|
||||||
|
|
||||||
from base58 import b58decode
|
from base58 import b58decode
|
||||||
from solana.keypair import Keypair
|
from solana.keypair import Keypair
|
||||||
|
@ -35,12 +36,29 @@ async def main():
|
||||||
|
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'--price',
|
'--price',
|
||||||
type=float
|
type=float,
|
||||||
|
required=True
|
||||||
)
|
)
|
||||||
|
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'--size',
|
'--size',
|
||||||
type=float
|
type=float,
|
||||||
|
required=True
|
||||||
|
)
|
||||||
|
|
||||||
|
parser.add_argument(
|
||||||
|
'--mode',
|
||||||
|
type=str,
|
||||||
|
required=False,
|
||||||
|
default='Limit',
|
||||||
|
choices=['Limit', 'ImmediateOrCancel', 'PostOnly']
|
||||||
|
)
|
||||||
|
|
||||||
|
parser.add_argument(
|
||||||
|
'--client-order-id',
|
||||||
|
type=int,
|
||||||
|
required=False,
|
||||||
|
default=int(time.time_ns() / 1e6)
|
||||||
)
|
)
|
||||||
|
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
@ -51,7 +69,7 @@ async def main():
|
||||||
|
|
||||||
mango_account = await mango_client.get_mango_account(args.mango_account)
|
mango_account = await mango_client.get_mango_account(args.mango_account)
|
||||||
|
|
||||||
print(await mango_client.place_order(mango_account, keypair, args.symbol, args.side, args.price, args.size))
|
print(await mango_client.place_order(mango_account, keypair, args.symbol, args.side, args.price, args.size, args.mode, args.client_order_id))
|
||||||
|
|
||||||
# e.g 3VQA4zqmRPLtmeHBNV2dKZKhXYX3cHBiM1LpCrjgJZwZDF418GF6RQ9DihSZq6Zg4pjqcUjTMQwEDNLuybfL8mQT
|
# e.g 3VQA4zqmRPLtmeHBNV2dKZKhXYX3cHBiM1LpCrjgJZwZDF418GF6RQ9DihSZq6Zg4pjqcUjTMQwEDNLuybfL8mQT
|
||||||
# (Check the UI)
|
# (Check the UI)
|
||||||
|
|
|
@ -909,7 +909,17 @@ class MangoClient():
|
||||||
|
|
||||||
return serum3_create_open_orders_ix
|
return serum3_create_open_orders_ix
|
||||||
|
|
||||||
def make_serum3_place_order_ix(self, mango_account: MangoAccount, keypair: Keypair, symbol: str, side: Literal['bids', 'asks'], price: float, size: float):
|
def make_serum3_place_order_ix(
|
||||||
|
self,
|
||||||
|
mango_account: MangoAccount,
|
||||||
|
keypair: Keypair,
|
||||||
|
symbol: str,
|
||||||
|
side: Literal['bids', 'asks'],
|
||||||
|
price: float,
|
||||||
|
size: float,
|
||||||
|
mode: Literal['Limit', 'ImmediateOrCancel', 'PostOnly'] = 'Limit',
|
||||||
|
client_order_id: int = int(time.time_ns() / 1e6)
|
||||||
|
):
|
||||||
serum_market_config = [serum3_market_config for serum3_market_config in self.group_config['serum3Markets'] if serum3_market_config['name'] == symbol][0]
|
serum_market_config = [serum3_market_config for serum3_market_config in self.group_config['serum3Markets'] if serum3_market_config['name'] == symbol][0]
|
||||||
|
|
||||||
serum_market_index = serum_market_config['marketIndex']
|
serum_market_index = serum_market_config['marketIndex']
|
||||||
|
@ -930,25 +940,23 @@ class MangoClient():
|
||||||
|
|
||||||
max_base_qty = serum_market_external.state.base_size_number_to_lots(size)
|
max_base_qty = serum_market_external.state.base_size_number_to_lots(size)
|
||||||
|
|
||||||
order_type = {'limit': serum3_order_type.Limit(), 'immediate_or_cancel': serum3_order_type.ImmediateOrCancel()}['limit']
|
mode = serum3_order_type.from_decoded({mode: {}})
|
||||||
|
|
||||||
max_native_quote_qty_without_fees = limit_price * max_base_qty
|
max_native_quote_qty_without_fees = limit_price * max_base_qty
|
||||||
|
|
||||||
is_maker = order_type == serum3_order_type.PostOnly()
|
is_maker = mode == serum3_order_type.PostOnly()
|
||||||
|
|
||||||
fees = {True: - (0.5 / 1e4), False: (1 / 1e4)}[is_maker]
|
fees = - (0.5 / 1e4) if is_maker else (1 / 1e4)
|
||||||
|
|
||||||
max_native_quote_qty_including_fees = max_native_quote_qty_without_fees + round(max_native_quote_qty_without_fees * fees)
|
max_native_quote_qty_including_fees = max_native_quote_qty_without_fees + round(max_native_quote_qty_without_fees * fees)
|
||||||
|
|
||||||
client_order_id = round(time.time_ns() / 1e6)
|
|
||||||
|
|
||||||
serum3_place_order_args: Serum3PlaceOrderArgs = {
|
serum3_place_order_args: Serum3PlaceOrderArgs = {
|
||||||
'side': {'bids': serum3_side.Bid(), 'asks': serum3_side.Ask()}[side],
|
'side': {'bids': serum3_side.Bid(), 'asks': serum3_side.Ask()}[side],
|
||||||
'limit_price': limit_price,
|
'limit_price': limit_price,
|
||||||
'max_base_qty': max_base_qty,
|
'max_base_qty': max_base_qty,
|
||||||
'max_native_quote_qty_including_fees': max_native_quote_qty_including_fees,
|
'max_native_quote_qty_including_fees': max_native_quote_qty_including_fees,
|
||||||
'self_trade_behavior': serum3_self_trade_behavior.DecrementTake(),
|
'self_trade_behavior': serum3_self_trade_behavior.DecrementTake(),
|
||||||
'order_type': order_type,
|
'order_type': mode,
|
||||||
'client_order_id': client_order_id,
|
'client_order_id': client_order_id,
|
||||||
'limit': 10
|
'limit': 10
|
||||||
}
|
}
|
||||||
|
@ -1036,18 +1044,30 @@ class MangoClient():
|
||||||
|
|
||||||
return serum3_place_order_ix
|
return serum3_place_order_ix
|
||||||
|
|
||||||
def make_perp_place_order_ix(self, mango_account: MangoAccount, keypair: Keypair, symbol, side, price, size):
|
def make_perp_place_order_ix(
|
||||||
|
self,
|
||||||
|
mango_account: MangoAccount,
|
||||||
|
keypair: Keypair,
|
||||||
|
symbol,
|
||||||
|
side,
|
||||||
|
price: float,
|
||||||
|
size: float,
|
||||||
|
mode: Literal['Limit', 'ImmediateOrCancel', 'PostOnly', 'Market', 'PostOnlySlide'] = 'Limit',
|
||||||
|
client_order_id: int = int(time.time() * 1e3)
|
||||||
|
):
|
||||||
perp_market_config = [perp_market_config for perp_market_config in self.group_config['perpMarkets'] if perp_market_config['name'] == symbol][0]
|
perp_market_config = [perp_market_config for perp_market_config in self.group_config['perpMarkets'] if perp_market_config['name'] == symbol][0]
|
||||||
|
|
||||||
perp_market = [perp_market for perp_market in self.perp_markets if perp_market.perp_market_index == perp_market_config['marketIndex']][0]
|
perp_market = [perp_market for perp_market in self.perp_markets if perp_market.perp_market_index == perp_market_config['marketIndex']][0]
|
||||||
|
|
||||||
|
mode = place_order_type.from_decoded({mode: {}})
|
||||||
|
|
||||||
perp_place_order_args: PerpPlaceOrderArgs = {
|
perp_place_order_args: PerpPlaceOrderArgs = {
|
||||||
'side': {'bids': Bid, 'asks': Ask}[side],
|
'side': {'bids': Bid, 'asks': Ask}[side],
|
||||||
'price_lots': PerpMarketHelper.ui_price_to_lots(perp_market, price),
|
'price_lots': PerpMarketHelper.ui_price_to_lots(perp_market, price),
|
||||||
'max_base_lots': PerpMarketHelper.ui_base_to_lots(perp_market, size),
|
'max_base_lots': PerpMarketHelper.ui_base_to_lots(perp_market, size),
|
||||||
'max_quote_lots': sys.maxsize,
|
'max_quote_lots': sys.maxsize,
|
||||||
'client_order_id': int(time.time() * 1e3),
|
'client_order_id': client_order_id,
|
||||||
'order_type': place_order_type.Limit(),
|
'order_type': mode,
|
||||||
'reduce_only': False,
|
'reduce_only': False,
|
||||||
'expiry_timestamp': 0,
|
'expiry_timestamp': 0,
|
||||||
'limit': 10
|
'limit': 10
|
||||||
|
@ -1081,7 +1101,9 @@ class MangoClient():
|
||||||
symbol: str,
|
symbol: str,
|
||||||
side: Literal['bids', 'asks'],
|
side: Literal['bids', 'asks'],
|
||||||
price: float,
|
price: float,
|
||||||
size: float
|
size: float,
|
||||||
|
mode: Literal['Limit', 'ImmediateOrCancel', 'PostOnly'] = 'Limit',
|
||||||
|
client_order_id: int = int(time.time_ns() / 1e6)
|
||||||
):
|
):
|
||||||
market_type = {'PERP': 'perpetual', 'USDC': 'spot'}[re.split(r"[-|/]", symbol)[1]]
|
market_type = {'PERP': 'perpetual', 'USDC': 'spot'}[re.split(r"[-|/]", symbol)[1]]
|
||||||
|
|
||||||
|
@ -1104,7 +1126,9 @@ class MangoClient():
|
||||||
symbol,
|
symbol,
|
||||||
side,
|
side,
|
||||||
price,
|
price,
|
||||||
size
|
size,
|
||||||
|
mode,
|
||||||
|
client_order_id
|
||||||
)
|
)
|
||||||
|
|
||||||
recent_blockhash = str((await self.connection.get_latest_blockhash()).value.blockhash)
|
recent_blockhash = str((await self.connection.get_latest_blockhash()).value.blockhash)
|
||||||
|
@ -1119,7 +1143,7 @@ class MangoClient():
|
||||||
|
|
||||||
recent_blockhash = str((await self.connection.get_latest_blockhash()).value.blockhash)
|
recent_blockhash = str((await self.connection.get_latest_blockhash()).value.blockhash)
|
||||||
|
|
||||||
perp_place_order_ix = self.make_perp_place_order_ix(mango_account, keypair, symbol, side, price, size)
|
perp_place_order_ix = self.make_perp_place_order_ix(mango_account, keypair, symbol, side, price, size, mode, client_order_id)
|
||||||
|
|
||||||
tx.add(perp_place_order_ix)
|
tx.add(perp_place_order_ix)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue