VeighNa量化社区
你的开源社区量化交易平台 | vn.py | vnpy
Member
avatar
加入于:
帖子: 22
声望: 0

代码
from vnpy_ctastrategy import (
CtaTemplate,
StopOrder,
TickData,
BarData,
TradeData,
OrderData,
BarGenerator,
ArrayManager,
)

class Grid(CtaTemplate):
"""网格交易策略"""

author = "WeiRui"

Grid_distance = 100
fixed_size = 1
max_layers = 4

long_stop = 0
short_stop = 0

parameters = [
    "Grid_distance",
    "fixed_size",
    "max_layers",
]
variables = [
    "long_stop",
    "short_stop",
    "current_layer"
]

def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
    """初始化"""
    super().__init__(cta_engine, strategy_name, vt_symbol, setting)

    self.bg = BarGenerator(self.on_bar, 15, self.on_15min_bar)
    self.am = ArrayManager()

    self.initial_price = 0
    self.current_layer = 0

def on_init(self):
    """策略初始化"""
    self.write_log("策略初始化")
    self.load_bar(10)

def on_start(self):
    """策略启动"""
    self.write_log("策略启动")

def on_stop(self):
    """策略停止"""
    self.write_log("策略停止")

def on_tick(self, tick: TickData):
    """新的tick数据更新"""
    self.bg.update_tick(tick)

def on_bar(self, bar: BarData):
    """新的bar数据更新"""
    self.bg.update_bar(bar)

def on_15min_bar(self, bar: BarData):
    """15分钟bar数据更新"""
    self.cancel_all()

    am = self.am
    am.update_bar(bar)
    if not am.inited:
        return

    if self.pos == 0:
        # 开立初始多头仓位和空头仓位
        self.buy(bar.close_price, self.fixed_size)
        self.short(bar.close_price, self.fixed_size)
        self.initial_price = bar.close_price
        self.current_layer = 0

    elif bar.close_price >= self.initial_price + (self.current_layer + 1) * self.Grid_distance:
        # 平掉多头仓位
        self.sell(bar.close_price, self.fixed_size)
        # 再次开立一手多单和空单
        self.buy(bar.close_price, self.fixed_size)
        self.short(bar.close_price, self.fixed_size)
        # 更新初始开仓价格和当前网格层
        self.initial_price = bar.close_price
        self.current_layer += 1

        if self.current_layer == self.max_layers:
            # 平掉所有仓位
            self.cover(bar.close_price, abs(self.pos))
            # 重置网格层和初始价格
            self.current_layer = 0
            self.initial_price = bar.close_price

    elif bar.close_price <= self.initial_price - (self.current_layer + 1) * self.Grid_distance:
        # 平掉空头仓位
        self.cover(bar.close_price, self.fixed_size)
        # 再次开立一手多单和空单
        self.buy(bar.close_price, self.fixed_size)
        self.short(bar.close_price, self.fixed_size)
        # 更新初始开仓价格和当前网格层
        self.initial_price = bar.close_price
        self.current_layer += 1

        if self.current_layer == self.max_layers:
            # 平掉所有仓位
            self.cover(bar.close_price, abs(self.pos))
            # 重置网格层和初始价格
            self.current_layer = 0
            self.initial_price = bar.close_price

    # 检查是否回撤到上一层网格
    elif bar.close_price <= self.initial_price - self.Grid_distance:
        # 平掉所有仓位
        self.cover(bar.close_price, abs(self.pos))
        # 重置网格层和初始价格
        self.current_layer = 0
        self.initial_price = bar.close_price

    self.put_event()  # 发送事件通知其他组件

def on_order(self, order: OrderData):
    """新的订单数据更新"""
    pass

def on_trade(self, trade: TradeData):
    """新的成交数据更新"""
    self.put_event()  # 发送事件通知其他组件

def on_stop_order(self, stop_order: StopOrder):
    """停止单更新"""
    pass
Member
avatar
加入于:
帖子: 22
声望: 0

description

Member
avatar
加入于:
帖子: 22
声望: 0

已解决

© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】