**
第一部分 先分析dual_thrust_strategy.py的day_high和day_low等
**
from datetime import time
from vnpy_ctastrategy import (
CtaTemplate,
BarGenerator,
)
class DualThrustStrategy(CtaTemplate):
bars = []
day_open = 0
day_high = 0
day_low = 0
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)
self.bars = []
def on_init(self):
"""
Callback when strategy is inited.
"""
self.write_log("策略初始化")
self.load_bar(10)
def on_bar(self, bar: BarData):
self.bars.append(bar)
if len(self.bars) <= 2:
return
else: # 相当于len(self.bars) >= 3
self.bars.pop(0)
last_bar = self.bars[-2]
if last_bar.datetime.date() != bar.datetime.date():
if self.day_high: # 正常流程进入这一步,day_high为昨天的最高价
# 计算 self.day_range, self.long_entry, self.short_entry
self.day_range = self.day_high - self.day_low
self.long_entry = bar.open_price + self.k1 * self.day_range
self.short_entry = bar.open_price - self.k2 * self.day_range
self.day_open = bar.open_price
self.day_high = bar.high_price # day_high为当天的第一根K线的最高价
self.day_low = bar.low_price
self.long_entered = False
self.short_entered = False
else: # 相当于last_bar.datetime.date() = bar.datetime.date()
# day_high在最开始实例化时为0,后面就有具体的值了
# bar一直更新,到当天的最后一根K线,day_high就为当天的最高价
self.day_high = max(self.day_high, bar.high_price)
# day_low在最开始实例化时为0,后面就有具体的值了
# bar一直更新,到当天的最后一根K线,day_low就为当天的最低价
self.day_low = min(self.day_low, bar.low_price)
if not self.day_range:
return
正常情况下,策略初始化时,
先是:
def on_init(self)
self.load_bar(10
self.load_bar(1)时,
else: # 相当于last_bar.datetime.date() = bar.datetime.date()
# day_high在最开始实例化时为0,后面就有具体的值了
# bar一直更新,到当天的最后一根K线,day_high就为当天的最高价
self.day_high = max(self.day_high, bar.high_price)
# day_low在最开始实例化时为0,后面就有具体的值了
# bar一直更新,到当天的最后一根K线,day_low就为当天的最低价
self.day_low = min(self.day_low, bar.low_price)
接着:
if last_bar.datetime.date() != bar.datetime.date():
if self.day_high: # 正常流程进入这一步,day_high为昨天的最高价
# 计算 self.day_range, self.long_entry, self.short_entry
self.day_range = self.day_high - self.day_low
self.long_entry = bar.open_price + self.k1 * self.day_range
self.short_entry = bar.open_price - self.k2 * self.day_range
self.day_open = bar.open_price
self.day_high = bar.high_price # day_high为当天的第一根K线的最高价
self.day_low = bar.low_price
self.long_entered = False
self.short_entered = False