策略运行框架&约定函数

本节内容仅用于代码策略,可视化策略不涉及以下内容。

一、策略运行框架

框架示意图

二、约定函数

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 秒运行一次、定时运行。