# -*- coding:utf-8 -*-
# 現貨搬磚策略實作
# 策略邏輯:監控不同平臺間統一交易對的盤口價差,進行高賣低買
from quant import const
from quant.utils import logger
from quant.config import config
from quant.market import Market
from quant.trade import Trade
from quant.const import BINANCE, COINSUPER
from quant.order import Order
from quant.market import Orderbook
from quant.utils.decorator import async_method_locker
from quant.order import ORDER_ACTION_BUY, ORDER_ACTION_SELL, ORDER_STATUS_FILLED,\
ORDER_STATUS_PARTIAL_FILLED, ORDER_STATUS_CANCELED
class Test1:
def __init__(self):
""" 初始化
"""
# maker 平臺
self.maker_platform = COINSUPER
self.maker_account = config.accounts[0]["account"]
self.maker_access_key = config.accounts[0]["access_key"]
self.maker_secret_key = config.accounts[0]["secret_key"]
self.maker_symbol = config.maker_symbol
# taker 平臺
self.taker_platform = BINANCE
self.taker_account = config.accounts[1]["account"]
self.taker_access_key = config.accounts[1]["access_key"]
self.taker_secret_key = config.accounts[1]["secret_key"]
self.taker_symbol = config.taker_symbol
self.strategy = config.strategy # 策略名
self.maker_buy_order_no = None # maker創建buy訂單的id
self.maker_sell_order_no = None # maker創建sell訂單id
self.maker_buy_price = -1 # buy訂單價格
self.maker_sell_price = -1 # sell訂單價格
self.maker_buy_cumqty = 0 # buy order累計成交量
self.maker_sell_cumqty = 0 # sell order累計成交量
self.taker_bid_price = -1 # taker盤口bid價格 參考價格
self.taker_ask_price = -1 # taker盤口ask價格 參考價格
# 掛單價差
self.spread = config.spread
# maker交易模塊
cc = {
"strategy": self.strategy,
"platform": self.maker_platform,
"symbol": self.maker_symbol,
"account": self.maker_account,
"access_key": self.maker_access_key,
"secret_key": self.maker_secret_key,
"asset_update_callback": self.on_event_asset_update_callback,
"order_update_callback": self.on_event_maker_order_update,
"init_success_callback": self.on_event_maker_init_success_callback
}
# 現貨交易沒有position回呼
self.maker_trader = Trade(**cc)
# taker交易模塊
cc = {
"strategy": self.strategy,
"platform": self.taker_platform,
"symbol": self.taker_symbol,
"account": self.taker_account,
"access_key": self.taker_access_key,
"secret_key": self.taker_secret_key,
"asset_update_callback": self.on_event_asset_update_callback,
"order_update_callback": self.on_event_taker_order_update,
"init_success_callback": self.on_event_taker_init_success_callback
}
# 現貨交易沒有position回呼
self.taker_trader = Trade(**cc)
# 訂閱行情,此處只訂閱taker行情,根據taker行情在maker平臺上進行動態掛撤單
Market(const.MARKET_TYPE_ORDERBOOK, self.taker_platform, self.taker_symbol, self.on_event_orderbook_update)
# init success
self.maker_init_success = False
self.taker_init_success = False
async def on_event_maker_init_success_callback(self, success, error):
# 正常登錄,且獲取當前未完成訂單
logger.info("maker coinsuper initialize success:", success, "error:", error, caller=self)
self.maker_init_success = success
async def on_event_taker_init_success_callback(self, success, error):
# 正常登錄,且獲取當前未完成訂單
logger.info("taker binance initialize success:", success, "error:", error, caller=self)
self.taker_init_success = success
async def on_event_asset_update_callback(self, asset):
logger.info("current asset detail:", asset)
async def on_event_taker_order_update(self, order: Order):
""" taker訂單狀態更新
"""
logger.info("taker order update:", order, caller=self)
@async_method_locker("core")
async def on_event_maker_order_update(self, order: Order):
""" maker訂單狀態更新
"""
logger.info("maker order update:", order, caller=self)
# 只針對有處理的狀態,如完全成交、部分成交或撤單
if order.status != ORDER_STATUS_PARTIAL_FILLED and order.status != ORDER_STATUS_FILLED and\
order.status != ORDER_STATUS_CANCELED:
return
# 買單
if order.action == ORDER_ACTION_BUY and order.order_no == self.maker_buy_order_no:
cur_cumqty = float(order.quantity) - float(order.remain) # 當前累計成交量
pre_cumqty = self.maker_buy_cumqty # 上一次累計成交量
cur_filledqty = round(cur_cumqty - pre_cumqty, 3) # 當前成交量
if cur_filledqty > 0:
action = ORDER_ACTION_SELL
price = round(self.taker_bid_price * (1 - 0.05), 6) # 低于taker bid價格5%追單
order_no, error = await self.taker_trader.create_order(action, price, cur_filledqty)
if error:
logger.error("taker create sell order error! error:", error, caller=self)
else:
# 記錄當前的累計成交量
self.maker_buy_cumqty = cur_cumqty
# 如果成交完畢,或撤單,則狀態重置
if float(order.remain) == 0 or order.status == ORDER_STATUS_CANCELED:
self.maker_buy_order_no = None
logger.info("maker buy order status clear!", caller=self)
# 賣單
if order.action == ORDER_ACTION_SELL and order.order_no == self.maker_sell_order_no:
cur_cumqty = float(order.quantity) - float(order.remain)
pre_cumqty = self.maker_sell_cumqty
cur_filledqty = round(cur_cumqty - pre_cumqty, 3)
if cur_filledqty > 0:
action = ORDER_ACTION_BUY
price = round(self.taker_ask_price * (1 + 0.05), 6) # 低于taker bid價格5%追單
order_no, error = await self.taker_trader.create_order(action, price, cur_filledqty)
if error:
logger.error("taker create buy order error! error:", error, caller=self)
else:
# 記錄當前的累計成交量
self.maker_sell_cumqty = cur_cumqty
# 如果成交完畢,或撤單,則狀態重置
if float(order.remain) == 0 or order.status == ORDER_STATUS_CANCELED:
self.maker_sell_order_no = None
logger.info("maker sell order status clear!", caller=self)
@async_method_locker("core", False)
async def place_maker_orders(self):
"""發單,根據taker盤口價格,計算maker平臺的掛單價格(相當于提前埋伏,等待有人不合理的砸盤或拉盤)
現貨的買賣單數量都是正數
"""
if not self.maker_buy_order_no:
action = ORDER_ACTION_BUY
price = round(self.taker_bid_price * (1 - self.spread), 6) # 低于taker bid 0.5%在maker上進行掛單
quantity = 0.1 # 發單數量
order_no, error = await self.maker_trader.create_order(action, price, quantity)
if error:
logger.error("maker create buy order error! error:", error, caller=self)
return
self.maker_buy_order_no = order_no
self.maker_buy_price = price
self.maker_buy_cumqty = 0
logger.info("maker create new buy order: ", order_no, "price: ", str(price), "quantity: ",
str(quantity), caller=self)
# 掛賣單
if not self.maker_sell_order_no:
action = ORDER_ACTION_SELL
price = round(self.taker_ask_price * (1 + self.spread), 6) # 高于taker ask 0.5%在maker上進行掛單
quantity = 0.1
order_no, error = await self.maker_trader.create_order(action, price, quantity)
if error:
logger.error("maker create sell order error! error:", error, caller=self)
return
self.maker_sell_order_no = order_no
self.maker_sell_price = price
self.maker_sell_cumqty = 0
logger.info("maker create new sell order: ", order_no, "price: ", str(price), "quantity: ",
str(quantity), caller=self)
@async_method_locker("cancel_maker_orders", False)
async def cancel_maker_orders(self):
"""撤單
掛單后,當計算價格偏離0.2%時撤單
"""
if self.maker_buy_order_no:
if abs(self.taker_bid_price * (1 - self.spread) - self.maker_buy_price) / self.maker_buy_price > 0.002:
_, error = await self.maker_trader.revoke_order(self.maker_buy_order_no)
if error:
logger.error("maker revoke buy order error! error:", error, caller=self)
else:
logger.info("maker revoke buy order:", self.maker_buy_order_no, caller=self)
self.maker_buy_order_no = None
if self.maker_sell_order_no:
if abs(self.taker_ask_price * (1 + self.spread) - self.maker_sell_price) / self.maker_sell_price > 0.002:
_, error = await self.maker_trader.revoke_order(self.maker_sell_order_no)
if error:
logger.error("maker revoke sell order error! error:", error, caller=self)
else:
logger.info("maker revoke sell order:", self.maker_sell_order_no, caller=self)
self.maker_sell_order_no = None
async def on_event_orderbook_update(self, orderbook: Orderbook):
""" 訂單薄更新
"""
if not self.maker_init_success or not self.taker_init_success:
logger.info("init failed!", caller=self)
return
# 獲取參考價格
self.taker_bid_price = float(orderbook.bids[0][0]) # 買1價格
self.taker_ask_price = float(orderbook.asks[0][0]) # 賣1價格
# 撤單
await self.cancel_maker_orders()
# 掛單
await self.place_maker_orders()
其實比較簡單,上面的代碼也直接可以用,有任何問題也可以加我wx : coinsuperlucy
另外,最近心血來潮開了個免費課,主要針對技術小白或初入門用戶,會系統的從量化策略、工具的安裝與實體來講,贈送工具與策略,大家感興趣的可以加我。
uj5u.com熱心網友回復:
coinsuperlucy轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/28585.html
標籤:區塊鏈技術
上一篇:如何對接基于erc20的usdt
下一篇:什么是區塊鏈
