策略运行框架&约定函数
本节内容仅用于代码策略,可视化策略不涉及以下内容。
一、策略运行框架

二、约定函数
class Strategy(StrategyBase):
def initialize(self): # 初始化,仅在策略启动时运行一次
declare_strategy_type(AlgoStrategyType.SECURITY) # 声明策略类型
self.trigger_symbols() # 定义运行标的
self.custom_indicator() # 注册指标
self.global_variables() # 定义全局变量
def trigger_symbols(self): # 定义运行标的
self.运行标的1 = declare_trig_symbol()
self.运行标的2 = declare_trig_symbol()
def global_variables(self): # 定义全局变量
self.a = 10 # 定义浮点(数值)型全局变量
self.b = Contract('US.AAPL') # 定义标的型全局变量
def custom_indicator(self): # 定义自定义指标
self.register_indicator(indicator_name='MA', script='''MA1:MA(CLOSE,P1),COLORFF8D1E;''', param_list=['P1']) # 注册一个用麦语言写的自定义指标
def handle_data(self): # 约定函数2,每次收到触发信号,会运行一次。响应:每 K线运行一次,每tick运行一次、每N秒运行一次、定时运行
## 策略的执行逻辑,写在这里
pass
约定函数详述:
2.1 initialize() 初始化
initialize() 初始化函数,仅会在策略启动时运行一次。后续在接收信号循环运行时,不会反复初始化。 initialize() 函数中,默认有 3 个约定函数:
- trigger_symbols()
- custom_indicator()
- global_variables()
注意:您可以在 initialize() 内,增加其他自定义函数。但是我们不建议在 initialize() 内增加过多的逻辑,因为这可能会导致策略启动缓慢。
2.2 trigger_symbols() 定义运行标的
您可以参照如下方法定义运行标的:
def trigger_symbols(self): # 定义运行标的
self.运行标的1 = declare_trig_symbol()
self.运行标的2 = declare_trig_symbol()
- 每个策略中最多可创建 50 个运行标的。实盘运行和历史回测中,可指定具体标的为运行标的。 例如:将运行标的指定为 苹果(AAPL)。
- 可以在接口中,使用运行标的进行代指。 例如:将下单控件指定为"买入 10 股运行标的"。
- 运行标的的行情推送,可以驱动策略循环运行。 例如:将策略的运行条件设为"苹果(AAPL)每个 tick 运行一次"。

2.3 custom_indicator() 注册指标
不同于可视化策略,代码策略无法直接调用 "自选" tab 下 K 线图表下方的 "指标管理" 中的已有自定义指标,需要重新编写。
使用代码策略调用自定义技术指标前,需要在 custom_indicator() 函数中,先使用麦语言编写和注册该指标。请参考以下步骤:
步骤 1:在 custom_indicator() 函数中,使用 register_indicator() 接口编写并注册该指标:
def custom_indicator(self):
self.register_indicator(indicator_name='MA', script='''MA1:MA(CLOSE,P1),COLORFF8D1E;''', param_list=['P1'])
步骤 2:需要获取指标值时,使用 get_MyLang_indicator() 接口进行请求。
2.4 global_variables() 定义全局变量
您可以参照如下方法定义全局变量:
def global_variables(self): # 定义全局变量
self.a = 10 # 定义浮点(数值)型全局变量
self.b = Contract('US.AAPL') # 定义标的型全局变量
Python 中常见的变量类型都支持定义,例如:字符串(str)、浮点数(float)、整数(int)、列表(list)、元组(tuple)、字典(dict)等。 如果需要定义标的型全局变量,则需要使用 Contract() 函数。参数为指定的字符串格式:市场代码.证券代码。例如:苹果的格式为'US.AAPL'。
2.5 handle_data() 主函数
每次收到触发信号,会运行一次 handle_data() 函数。建议将策略的主要逻辑,写在 handle_data() 函数中。 handle_data() 目前会响应这 4 类触发信号:每根 K 线运行一次,每 Tick 运行一次、每 N 秒运行一次、定时运行。