add pos_limit
This commit is contained in:
49
bot_new.py
49
bot_new.py
@@ -112,6 +112,17 @@ class StateManager:
|
|||||||
self.CONVERSION_FEE = 10
|
self.CONVERSION_FEE = 10
|
||||||
self.ETF_COMPONENTS = {"XLF": {"BOND": 3, "GS": 2, "MS": 3, "WFC": 2}}
|
self.ETF_COMPONENTS = {"XLF": {"BOND": 3, "GS": 2, "MS": 3, "WFC": 2}}
|
||||||
self.ETF_SHARES = {"XLF": 10}
|
self.ETF_SHARES = {"XLF": 10}
|
||||||
|
self.POSITION_LIMIT = {
|
||||||
|
"BOND": 100,
|
||||||
|
"VALBZ": 10,
|
||||||
|
"VALE": 10,
|
||||||
|
"GS": 100,
|
||||||
|
"MS": 100,
|
||||||
|
"WFC": 100,
|
||||||
|
"XLF": 100,
|
||||||
|
}
|
||||||
|
self.last_strategy_time = 0
|
||||||
|
self.strategy_interval = 0.1
|
||||||
|
|
||||||
def position_for_symbol(self, symbol):
|
def position_for_symbol(self, symbol):
|
||||||
return self.positions_by_symbol.get(symbol, 0)
|
return self.positions_by_symbol.get(symbol, 0)
|
||||||
@@ -227,22 +238,40 @@ class StateManager:
|
|||||||
self.average_xlf_price.pop(0)
|
self.average_xlf_price.pop(0)
|
||||||
self.average_xlf_price.append(price)
|
self.average_xlf_price.append(price)
|
||||||
|
|
||||||
|
def can_add_position(self, symbol, size, is_buy):
|
||||||
|
current = self.position_for_symbol(symbol)
|
||||||
|
if is_buy:
|
||||||
|
return current + size <= self.POSITION_LIMIT.get(symbol, 100)
|
||||||
|
else:
|
||||||
|
return current - size >= -self.POSITION_LIMIT.get(symbol, 100)
|
||||||
|
|
||||||
def execute_strategies(self):
|
def execute_strategies(self):
|
||||||
|
now = time.time()
|
||||||
|
if now - self.last_strategy_time < self.strategy_interval:
|
||||||
|
return
|
||||||
|
self.last_strategy_time = now
|
||||||
|
|
||||||
avg_valbz = self.get_average_price(self.average_valbz_price)
|
avg_valbz = self.get_average_price(self.average_valbz_price)
|
||||||
avg_vale = self.get_average_price(self.average_vale_price)
|
avg_vale = self.get_average_price(self.average_vale_price)
|
||||||
avg_xlf = self.get_average_price(self.average_xlf_price)
|
avg_xlf = self.get_average_price(self.average_xlf_price)
|
||||||
|
|
||||||
if len(self.average_valbz_price) >= 5:
|
if len(self.average_valbz_price) >= 5:
|
||||||
self.set_orders_in_symbol_for_direction("VALBZ", "SELL", {avg_valbz + 1: 1})
|
sell_size = 1 if self.can_add_position("VALBZ", 1, False) else 0
|
||||||
self.set_orders_in_symbol_for_direction("VALBZ", "BUY", {avg_valbz - 1: 1})
|
buy_size = 1 if self.can_add_position("VALBZ", 1, True) else 0
|
||||||
|
self.set_orders_in_symbol_for_direction("VALBZ", "SELL", {avg_valbz + 1: sell_size})
|
||||||
|
self.set_orders_in_symbol_for_direction("VALBZ", "BUY", {avg_valbz - 1: buy_size})
|
||||||
|
|
||||||
if len(self.average_vale_price) >= 5:
|
if len(self.average_vale_price) >= 5:
|
||||||
self.set_orders_in_symbol_for_direction("VALE", "SELL", {avg_vale + 1: 1})
|
sell_size = 1 if self.can_add_position("VALE", 1, False) else 0
|
||||||
self.set_orders_in_symbol_for_direction("VALE", "BUY", {avg_vale - 1: 1})
|
buy_size = 1 if self.can_add_position("VALE", 1, True) else 0
|
||||||
|
self.set_orders_in_symbol_for_direction("VALE", "SELL", {avg_vale + 1: sell_size})
|
||||||
|
self.set_orders_in_symbol_for_direction("VALE", "BUY", {avg_vale - 1: buy_size})
|
||||||
|
|
||||||
if len(self.average_xlf_price) >= 25:
|
if len(self.average_xlf_price) >= 25:
|
||||||
self.set_orders_in_symbol_for_direction("XLF", "SELL", {avg_xlf + 1: 1})
|
sell_size = 1 if self.can_add_position("XLF", 1, False) else 0
|
||||||
self.set_orders_in_symbol_for_direction("XLF", "BUY", {avg_xlf - 1: 1})
|
buy_size = 1 if self.can_add_position("XLF", 1, True) else 0
|
||||||
|
self.set_orders_in_symbol_for_direction("XLF", "SELL", {avg_xlf + 1: sell_size})
|
||||||
|
self.set_orders_in_symbol_for_direction("XLF", "BUY", {avg_xlf - 1: buy_size})
|
||||||
|
|
||||||
self.execute_arb()
|
self.execute_arb()
|
||||||
|
|
||||||
@@ -257,12 +286,12 @@ class StateManager:
|
|||||||
|
|
||||||
spread = avg_valbz - avg_vale
|
spread = avg_valbz - avg_vale
|
||||||
if spread > self.CONVERSION_FEE:
|
if spread > self.CONVERSION_FEE:
|
||||||
if abs(vale_pos + 1) <= 10 and abs(valbz_pos - 1) <= 10:
|
if self.can_add_position("VALE", 1, True) and self.can_add_position("VALBZ", 1, False):
|
||||||
self.send_order("VALE", "BUY", avg_vale, 1)
|
self.send_order("VALE", "BUY", avg_vale, 1)
|
||||||
self.convert("VALE", Dir.SELL, 1)
|
self.convert("VALE", Dir.SELL, 1)
|
||||||
self.send_order("VALBZ", "SELL", avg_valbz, 1)
|
self.send_order("VALBZ", "SELL", avg_valbz, 1)
|
||||||
elif spread < -self.CONVERSION_FEE:
|
elif spread < -self.CONVERSION_FEE:
|
||||||
if abs(vale_pos - 1) <= 10 and abs(valbz_pos + 1) <= 10:
|
if self.can_add_position("VALE", 1, False) and self.can_add_position("VALBZ", 1, True):
|
||||||
self.send_order("VALE", "SELL", avg_vale, 1)
|
self.send_order("VALE", "SELL", avg_vale, 1)
|
||||||
self.convert("VALE", Dir.BUY, 1)
|
self.convert("VALE", Dir.BUY, 1)
|
||||||
self.send_order("VALBZ", "BUY", avg_valbz, 1)
|
self.send_order("VALBZ", "BUY", avg_valbz, 1)
|
||||||
@@ -270,9 +299,9 @@ class StateManager:
|
|||||||
def on_startup(self):
|
def on_startup(self):
|
||||||
bond_pos = self.position_for_symbol("BOND")
|
bond_pos = self.position_for_symbol("BOND")
|
||||||
if bond_pos > 0:
|
if bond_pos > 0:
|
||||||
self.send_order("BOND", "SELL", 1001, bond_pos)
|
self.send_order("BOND", "SELL", 1001, min(bond_pos, self.POSITION_LIMIT["BOND"]))
|
||||||
elif bond_pos < 0:
|
elif bond_pos < 0:
|
||||||
self.send_order("BOND", "BUY", 999, -bond_pos)
|
self.send_order("BOND", "BUY", 999, min(-bond_pos, self.POSITION_LIMIT["BOND"]))
|
||||||
|
|
||||||
|
|
||||||
def parse_arguments():
|
def parse_arguments():
|
||||||
|
|||||||
Reference in New Issue
Block a user