有关MT5调用iCustom的问题

 
问题:
      OnTick()函数里的"len"会因为每天不同的价格会有所变动,
      
      要如何写才能把"len"的值给予 OnInit()函数内的调用参数
      
      直接在OnInit()写成Custom = iCustom(Symbol(),时间周期,"Examples\\donchian_channels",len,0,-2,1); 是不可行的
                                                                                          
      如果直接把调用函数写进OnTick(),再回测执行时,速度会非常慢
      
      有试着把 Custom = iCustom(Symbol(),时间周期,"Examples\\donchian_channels",len,0,-2,1); 写成定义函数 来使用
      

      甚至写成"类"来调用,回测执行时,速度还是很慢,有没有解决的方法?

调用iCustom的问题

 

OnTick 是每次价格跳动都会触发,如果你发现写在里面,跑复盘会变慢,如果这个指标调用只需要在每个 K 刚开的时候计算一次,可以在 OnTick 函数里改用


新增一个全局参数 ,宣告在所有函数外面:

datetime dtLast=0;


在 OnTick 函数里面


if(dtLast!=iTime(Symbol(),时间周期,0))

{

dtLast=iTime(Symbol(),时间周期,0);//这样就只会在时间周期那个K一开的时候进来这里一次

//然后把放在这里

Custom=iCustom(.....);

//

顺便还释放掉指标调用 handle,不然 mt5 指标保留给指标调用数组的内存还是不小的

IndicatorRelease(Custom);

}


看这样的改写是否可以改善你那里复盘缓慢的问题。如果不是要每次新开K只作一次计算判断,那就没有其它好方法了。

 
把你代碼裡 OnTick計算len的部分 寫進自訂義指標裏面 另外把"區間參數" 設置成自定義指標的設置參數
 
Hung Wen Lin #:
把你代碼裡 OnTick計算len的部分 寫進自訂義指標裏面 另外把"區間參數" 設置成自定義指標的設置參數

这个部份我试过了,是不行的,执行初始化"OnInit()"就死机了

 
ambercrystal #:

OnTick 是每次价格跳动都会触发,如果你发现写在里面,跑复盘会变慢,如果这个指标调用只需要在每个 K 刚开的时候计算一次,可以在 OnTick 函数里改用


新增一个全局参数 ,宣告在所有函数外面:

datetime dtLast=0;


在 OnTick 函数里面


if(dtLast!=iTime(Symbol(),时间周期,0))

{

dtLast=iTime(Symbol(),时间周期,0);//这样就只会在时间周期那个K一开的时候进来这里一次

//然后把放在这里

Custom=iCustom(.....);

//

顺便还释放掉指标调用 handle,不然 mt5 指标保留给指标调用数组的内存还是不小的

IndicatorRelease(Custom);

}


看这样的改写是否可以改善你那里复盘缓慢的问题。如果不是要每次新开K只作一次计算判断,那就没有其它好方法了。

非常感谢您有很好的解答,在回测上速度有比较好很多,可惜还是有差距