import time
from binance.client import Client
from binance.enums import *
api_key = '***'
api_secret = '***'
client = Client(api_key, api_secret)
symbol = 'BTCUSDT'
quantity = 1
distance_pct = 0.01
levelsCount = 5
orders_status = {}
client.futures_change_leverage(symbol=symbol, leverage=5)
client.futures_change_margin_type(symbol=symbol, marginType='CROSSED')
client.futures_change_position_mode(dualSidePosition=False)
def check_position():
positions = client.futures_account()['positions']
for position in positions:
if position['symbol'] == symbol and float(position['positionAmt']) > 0:
return True
return False
def place_orders(initial_price):
prices = [initial_price * (1 - distance_pct * i) for i in range(levelsCount)]
target_prices = [price * 1.01 for price in prices]
for i, price in enumerate(prices):
if price not in orders_status or orders_status[price].get('order_status') in ['FILLED', 'CANCELED']:
order = client.futures_create_order(
symbol=symbol,
side=SIDE_BUY,
type=ORDER_TYPE_LIMIT,
timeInForce=TIME_IN_FORCE_GTC,
quantity=quantity,
price=str(price),
positionSide='LONG'
)
print(f"买入单已下:{order}")
tp_order = client.futures_create_order(
symbol=symbol,
side=SIDE_SELL,
type=ORDER_TYPE_LIMIT,
timeInForce=TIME_IN_FORCE_GTC,
quantity=quantity,
price=str(target_prices[i]),
positionSide='LONG'
)
print(f"止盈单已下:{tp_order}")
orders_status[price] = {'buy_order_id': order['orderId'], 'tp_order_id': tp_order['orderId'], 'order_status': 'NEW'}
else:
print(f"价格 {price} 的订单已存在或未平仓,跳过此价格级别的订单")
def check_order_status():
for price, order_info in list(orders_status.items()):
order_status = client.futures_get_order(symbol=symbol, orderId=order_info['buy_order_id'])['status']
tp_order_status = client.futures_get_order(symbol=symbol, orderId=order_info['tp_order_id'])['status']
orders_status[price]['order_status'] = order_status
if tp_order_status == 'FILLED' or order_status == 'CANCELED':
print(f"价格 {price} 的买单或平仓单已完成或取消,可以重新下单")
del orders_status[price]
if not check_position():
latest_price = float(client.futures_symbol_ticker(symbol=symbol)['price'])
place_orders(latest_price)
while True:
check_order_status()
time.sleep(400)
else:
print("已有开仓的多单,不执行买入操作。")