下面我将解释我通过我的算法错误地向 Binance 发送订单的问题,我将不胜感激。
我创建了一个模型,根据我的模型输出向币安发送市场买卖订单。我有一个名为 action 的数据框列,最新的(列的底部)值被用作向 Binance 发送订单的信号。action 列可以采用 1(买单)-1(卖单)或 0(什么都不做)的形式。动作列不可能有两个 1 或两个 -1 背靠背。总会有一个买单,然后是一个卖单(可能由“不做任何订单”分隔)。我已经检查了数据框中的操作列,并且可以确认从来没有任何实例违反了此规则。
我遇到的问题是,当我在循环中运行我的程序时,我经常会遇到程序将(尝试)背靠背发送多个买单而没有卖单将订单拆分的场景,反之亦然,程序发送多个背靠背卖单,没有买单将它们分开。根据 action 列中的值,这是不可能的,所以我怀疑我的业余 Python 能力以一种可能明显的方式让我对更资深的程序员感到失望。
我将非常感谢有关如何解决此问题并确保我的市场订单按照模型逻辑发送到交易所的任何建议。
def bot():
while True:
tick = datetime.datetime.now()
print(tick)
# Import the data from Binance. Final outcome is data points for closing price only in a data frame.
candles = client.get_historical_klines("ADAUSDT", Client.KLINE_INTERVAL_1MINUTE, "1 day→ago UTC")
data = pd.DataFrame({'close':np.asarray(candles)[:,4]})
data['close'] = data['close'].astype(float)
# I have removed the model logic though the model will create a 1, -1 or 0 depending on what action should be taken.
# This action is located in the 'action' column seen below.
data['action'] = data['position_signal'].diff()
action_final = float(data['action'][-1:])
close = float(data['close'][-1:])
balancebuy = float(client.get_asset_balance(asset='ADA', recvWindow=10000)['free'])
balancesell = float(client.get_asset_balance(asset='USDT', recvWindow=10000)['free'])
maxBuy = round(balancesell / close * .99)
if action_final ==1:
client.create_order(
symbol='ADAUSDT',
side=client.SIDE_BUY,
type=client.ORDER_TYPE_MARKET,
quantity=maxBuy,
recvWindow=10000)
print('Buy.')
elif action_final ==-1:
client.create_order(
symbol='ADAUSDT',
side=client.SIDE_SELL,
type=client.ORDER_TYPE_MARKET,
quantity=round(balancebuy - 0.1),
recvWindow=10000)
print('Sell.')
else:
print('No trade.')
time.sleep(60.0 - ((time.time() - starttime) % 60.0))
bot()
我对我的问题可能是什么的最初想法(我还不能完全得出结论)是;
- 关于我的 if 语句的结构不佳
- 错误地分配了我通过 if 语句的“动作”
- 关于向交易所发送订单的更多Binance特定内容
再次感谢任何帮助或建议,因为我已经在这个问题上停留了相当长的时间!干杯!
杰克