VNPY-网络交易(算法交易)

from vnpy.trader.constant import Direction
from vnpy.trader.object import TradeData, OrderData, TickData
from vnpy.trader.engine import BaseEngine
from vnpy.trader.constant import OrderType, Offset, Direction
from ..template import AlgoTemplate
import math


class MyGridAlgo(AlgoTemplate):
    """"""

    display_name = "My Grid Tradding  网格交易 "

    default_setting = {
        "step_price": 1.0,
        "step_volume": 1,
        "interval": 1,
        "grid_up":100,
        "grid_down":50
    }

    variables = [
        "pos",
        "long_pos",
        "short_pos",
        "timer_count",
        "vt_orderid",
        "grid_bid_base",
        "grid_ask_base"
    ]

    def __init__(
        self,
        algo_engine: BaseEngine,
        algo_name: str,
        vt_symbol: str,
        direction: str,
        offset: str,
        price: float,
        volume: float,
        setting: dict
    ):
        """"""
        super().__init__(algo_engine, algo_name,vt_symbol, direction, offset, price, volume, setting)

        # Parameters
        self.step_price = setting["step_price"]
        self.step_volume = setting["step_volume"]
        self.interval = setting["interval"]
        self.grid_up=setting['grid_up']
        self.grid_down=setting['grid_down']
        self.grid_bid_base=0
        self.grid_ask_base=0

        # Variables
        self.timer_count = 0
        self.vt_orderid = ""
        self.pos = 0
        self.long_pos=0
        self.short_pos=0
        self.last_tick = None
        self.put_event()

    def on_tick(self, tick: TickData):
        """"""
        self.last_tick = tick

    def on_timer(self):
        """"""
        if not self.last_tick:
            return

        self.timer_count += 1
        if self.timer_count < self.interval:
            self.put_event
            return
        self.timer_count = 0

        if self.vt_orderid:
            self.cancel_all()





        bid_diff = self.last_tick.bid_price_1 - self.grid_bid_base;##平多或者开空的价差(买入价价差)
        ask_diff = self.last_tick.ask_price_1 - self.grid_ask_base;##开多或者平空的价差(卖出价价差)


        # 市场下跌时买多
        if ask_diff <= -1* self.step_price:
            self.grid_ask_base = self.last_tick.ask_price_1
            self.grid_bid_base= self.last_tick.bid_price_1
            if self.grid_ask_base >=self.grid_down and self.grid_ask_base<=self.grid_up:
                self.write_log("下跌开多")
                ##下跌时加多仓(加多仓位)
                self.vt_orderid= self.buy(
                    self.last_tick.ask_price_1,
                    self.step_volume,
                    OrderType.LIMIT,
                    Offset.OPEN
                )
                ##下跌时平空仓(平空获利)
                self.buy(
                    self.last_tick.ask_price_1,
                    self.step_volume,
                    OrderType.LIMIT,
                    Offset.CLOSE
                )
        # 市场上涨时平多
        elif bid_diff >= self.step_price:
            self.write_log("上涨平多")
            self.grid_bid_base = self.last_tick.bid_price_1
            self.grid_ask_base=self.last_tick.ask_price_1
            if self.grid_bid_base >=self.grid_down and self.grid_bid_base<=self.grid_up:
                ##上涨时,平多仓

                self.sell(
                    self.last_tick.bid_price_1,
                    self.step_volume,
                    OrderType.LIMIT,
                    Offset.CLOSE 
                    )
                ##上涨时开空仓
                self.sell(
                    self.last_tick.bid_price_1,
                    self.step_volume,
                    OrderType.LIMIT,
                    Offset.OPEN
                    )
        # Update UI
        self.put_event()

    def on_order(self, order: OrderData):
        """"""
        if not order.is_active():
            self.vt_orderid = ""
            self.put_event

    def on_trade(self, trade: TradeData):
        """"""
        if trade.direction == Direction.LONG:
            if trade.offset==Offset.OPEN:
                self.long_pos +=  trade.volume
                self.pos += trade.volume
            else:
                self.short_pos -=  trade.volume
                self.pos -= trade.volume

        else:
            if trade.offset==Offset.OPEN:
                self.short_pos +=  trade.volume
                self.pos -= trade.volume
            else:
                self.long_pos -= trade.volume
                self.pos -=trade.volume

        self.put_event

 

posted @ 2023-08-22 15:05  嗷嗷鹿鸣[VX|dshoub]  阅读(40)  评论(0编辑  收藏  举报