# 策略结构化

在策略编写过程中受函数机制、策略执行逻辑等因素的影响,适当的结构化更有利于提高策略的可读性和执行效率。如下示例有什么不当之处:

INPUT:X(20,1,100,1),NMIN(10,1,100,1),SS(1,1,10000,1);
X周期高点:=REF(HHV(H,X),1);//X是参数,自行调整
X周期低点:=REF(LLV(L,X),1);
手数:=SS;
//NMIN为参数,T0TOTIME(TIMETOT0(CLOSETIME(0))-NMIN*60)表示 收盘时间-提前N分钟 N由NMIN控制
开仓时间:=TIME>OPENTIME(1) AND TIME<T0TOTIME(TIMETOT0(CLOSETIME(0))-NMIN*60);
平仓时间:=TIME>=T0TOTIME(TIMETOT0(CLOSETIME(0))-NMIN*60);
 
//交易条件:
开多平空条件:=High>=X周期高点 and 开仓时间 and holding<=0;
开空平多条件:=Low<=X周期低点 and 开仓时间 and holding>=0;

//交易系统
收盘平多:sell(平仓时间 and holding>0, 0, thisclose);
收盘平空:sellshort(平仓时间 and holding<0,0,thisclose);

平空:sellshort(开多平空条件 and holding<0, 手数,limitr,X周期高点);
平多:sell(开空平多条件 and holding>0,手数,limitr,X周期低点);
开空:buyshort(开空平多条件 and holding=0,手数,limitr,X周期低点);
开多:buy(开多平空条件 and holding=0, 手数,limitr,X周期高点);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

上述代码整体采用顺序结构运行,但是首次阅读时,整体感受下单逻辑并不清晰。原因是下单条件都在下单函数内部进行判断。那么针对上述问题如何调整代码?

调整一:将判断条件从函数内部移至外部,减少了非必要的执行语句,同时也能有效提升策略的执行效率。
INPUT:X(20,1,100,1),NMIN(10,1,100,1),SS(1,1,10000,1);
X周期高点:=REF(HHV(H,X),1);//X是参数,自行调整
X周期低点:=REF(LLV(L,X),1);
手数:=SS;
//NMIN为参数,T0TOTIME(TIMETOT0(CLOSETIME(0))-NMIN*60)表示 收盘时间-提前N分钟 N由NMIN控制
CLOSE_TIME:=T0TOTIME(TIMETOT0(CLOSETIME(0))-NMIN*60);
开仓时间:=TIME>OPENTIME(1) AND TIME<CLOSE_TIME;
平仓时间:=TIME>=CLOSE_TIME;

//交易条件:
开多平空条件:=High>=X周期高点 and 开仓时间 and holding<=0;
开空平多条件:=Low<=X周期低点 and 开仓时间 and holding>=0;

//交易系统
IF 平仓时间=1 THEN BEGIN
	收盘平多:sell(holding>0, 0, thisclose);
	收盘平空:sellshort(holding<0,0,thisclose);
END

IF 开空平多条件=1 THEN BEGIN
	平多:sell( holding>0,手数,limitr,X周期低点);
	开空:buyshort(holding=0,手数,limitr,X周期低点);
END

IF 开多平空条件=1 THEN BEGIN
	平空:sellshort(holding<0, 手数,limitr,X周期高点);
	开多:buy(holding=0, 手数,limitr,X周期高点);
END
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
调整二:若策略中需要重复使用相同的处理代码,可以为其定义一个中间变量保存结果,避免进行重复计算。同时在代码修改时,也能避免发生遗漏的情况出现

例如上述代码中T0TOTIME(TIMETOT0(CLOSETIME(0))-NMIN*60);将其提取保存在CLOSE_TIME变量中,可以有效减少一次重复运算。

原代码

//代码中多处使用T0TOTIME(TIMETOT0(CLOSETIME(0))-NMIN*60)语句,造成重复计算。
开仓时间:=TIME>OPENTIME(1) AND TIME<T0TOTIME(TIMETOT0(CLOSETIME(0))-NMIN*60);
平仓时间:=TIME>=T0TOTIME(TIMETOT0(CLOSETIME(0))-NMIN*60
1
2
3

调整后

//通过CLOSE_TIME保存换算结果,只需计算一次即可。
CLOSE_TIME:=T0TOTIME(TIMETOT0(CLOSETIME(0))-NMIN*60);
开仓时间:=TIME>OPENTIME(1) AND TIME<CLOSE_TIME;
平仓时间:=TIME>=CLOSE_TIME;
1
2
3
4