파이썬/바이낸스 선물 API

[선물 API] 여러개 주문 동시에 넣기

Eluv 2023. 6. 17. 17:39

해당 코드는 과거에 사용하고 최근에 개선하지 않은 코드입니다.

제대로 작동하지 않을 수 있습니다.

 

import ccxt
import asyncio
import logging

# API, Secret Key가 저장된 txt 파일을 불러오는 코드. 경로는 바꿔도 상관없다.
with open("D:/코인/binance key.txt") as f:
    lines = f.readlines()
    api_key = lines[0].strip()
    secret_key = lines[1].strip()

logger = logging.getLogger('ccxt')
logger.setLevel(logging.ERROR)

Futures_binance = ccxt.binance({
    'apiKey': api_key,
    'secret': secret_key,
    'enableRateLimit': True,
    'options': {
        'defaultType': 'future',
        'adjustForTimeDifference': True,
    }
})

async def batch_order(orders):
    try:
        response = Futures_binance.fapiPrivatePostBatchOrders({
            'batchOrders': '[' + ','.join(orders) + ']'
        })
        print(response)
    except Exception as e:
        print('Error:', str(e))

# 주문 리스트
order_count = 5
orders = []
symbol = 'ETH/USDT'
markets = Futures_binance.load_markets()

for x in range(order_count):
    orders += [{'symbol': symbol.translate({ord('/'): None}),
                'side': 'BUY',
                "positionSide": "LONG",
                'type': 'LIMIT',
                'quantity': Futures_binance.amount_to_precision(symbol, 0.006),
                'price': Futures_binance.price_to_precision(symbol, 1700 * ( 1 - x * 0.01)),
                'timeInForce': 'GTC'},]
#print(orders)
orders = [Futures_binance.encode_uri_component(Futures_binance.json(order), safe=",") for order in orders]
Futures_binance.verbose = True  # for debugging purposes


# batch_order 함수 호출

loop = asyncio.get_event_loop()
loop.run_until_complete(batch_order(orders))

참조
Is it possible to Place Multiple Orders Binance · Issue #6805 · ccxt/ccxt · GitHub, 08) 계좌 잔고 조회 - 파이썬을 이용한 비트코인 자동매매 (개정판) (wikidocs.net)

 

동시에 넣을 수 있는 주문의 최대치는 5개

 

quantity에서 0.006은 주문 할 수량, price에서 1700은 가격이다.

나중에 차트를 불러와서 연동시킬 계획이므로 이 둘은 따로 변수를 만들어 관리하지 않았다.

가격 1700을 기준으로 1%씩 낮은 가격마다 LONG 포지션으로 BUY 주문을 넣도록 되어있다.

(반대의 경우 SHORT, SELL)

 

물론 위처럼 한 종목에 여러 주문을 넣는 것 말고, 여러 종목에 주문을 넣는 것 또한 가능하다.

 

주문을 넣게되면 fetch Request, Response 메시지가 출력된다. 

해당 메시지가 출력되지 않도록 setLevel(lpgging.ERROR)를 설정하였지만 해결하지 못했다.

 

주문이 정상적으로 입력되면 print문을 통해 아래의 메시지가 출력된다.

[{'symbol': 'ETHUSDT', 'side': 'BUY', 'positionSide': 'LONG', 'type': 'LIMIT', 'quantity': 0.05, 'price': 1600.0}, 
{'symbol': 'ETHUSDT', 'side': 'BUY', 'positionSide': 'LONG', 'type': 'LIMIT', 'quantity': 0.05, 'price': 1584.0}, 
{'symbol': 'ETHUSDT', 'side': 'BUY', 'positionSide': 'LONG', 'type': 'LIMIT', 'quantity': 0.05, 'price': 1568.0}, 
{'symbol': 'ETHUSDT', 'side': 'BUY', 'positionSide': 'LONG', 'type': 'LIMIT', 'quantity': 0.05, 'price': 1552.0}, 
{'symbol': 'ETHUSDT', 'side': 'BUY', 'positionSide': 'LONG', 'type': 'LIMIT', 'quantity': 0.05, 'price': 1536.0}]


음.. 이것도 좀 글을 최신화 할까 했는데

어차피 잘 안쓰는 방법이라 그냥 생략함

혹시나 필요한 사람 있을까봐 일단 냅둠