X庭X XX:
當我的BIAS參數大於101,就無法使用EVERYTICK回測EA。程式碼有哪裡出了問題嗎?
當我的BIAS參數大於101,就無法使用EVERYTICK回測EA。程式碼有哪裡出了問題嗎?
bi = bi + 100*(MathAbs(Close[i+1]-iMA(NULL,0,MABi1,0,MODE_SMA,PRICE_CLOSE,i+1))/iMA(NULL,0,MABi1,0,MODE_SMA,PRICE_CLOSE,i+1));
大概率是测试数据不足101柱造成MA为0了。程序中应在上述代码段计算MA之前作一个0判断。
Lin Luo:
大概率是测试数据不足101柱造成MA为0了。程序中应在上述代码段计算MA之前作一个0判断。
感謝您的回覆,言下之意,1.EA實際測試正常運作(因為以往的數據遠超過101柱)。2.測試EA需增加計算MA之前作一個0判斷(因為數據超過101柱,分母為0數學邏輯錯誤)。 但是,這計算MA之前作一個0判斷...iMA(NULL,0,MABi1,0,MODE_SMA,PRICE_CLOSE,i+1)本身是一段計算程式,我不明白如何做0判斷,是否能直接修改呢? 以下為更新,感謝你的建議 void BaisBlance(double &bi,int Biask) { bi=0; for(int i=0; i<Biask; i++) { if(iMA(NULL,0,MABi1,0,MODE_SMA,PRICE_CLOSE,i+1) != 0) { bi = bi + 100*(MathAbs(Close[i+1]-iMA(NULL,0,MABi1,0,MODE_SMA,PRICE_CLOSE,i+1))/iMA(NULL,0,MABi1,0,MODE_SMA,PRICE_CLOSE,i+1)); } } return; }
Lin Luo:
大概率是测试数据不足101柱造成MA为0了。程序中应在上述代码段计算MA之前作一个0判断。
正解。
很多新手只会调用指标,没有搞清楚SMA的算法。
判断一个数一个是否为0都不会?那就变通一下,检查K线的个数满足条件:
void OnTick() { if(lastT == Time[1]) return; if(iBars(NULL,0)<=MAK3 || iBars(NULL,0)<=MABi1)return; //...your code }
Ziheng Zhuang:
感謝你,讓新手學習不一樣的寫法~~
判断一个数一个是否为0都不会?那就变通一下,检查K线的个数满足条件:
庭WAN XI:
void BaisBlance(double &bi,int Biask) { bi=0; for(int i=0; i<Biask; i++) { if(iMA(NULL,0,MABi1,0,MODE_SMA,PRICE_CLOSE,i+1) != 0) { bi = bi + 100*(MathAbs(Close[i+1]-iMA(NULL,0,MABi1,0,MODE_SMA,PRICE_CLOSE,i+1))/iMA(NULL,0,MABi1,0,MODE_SMA,PRICE_CLOSE,i+1)); } } return; }
理论上没问题了。但调用同一个MA算法,程序重算了三次,似乎有些浪费计算机资源。如果改为以下示例,仅算一次,个人觉得稍高效些。(结果意味着柱数不足MABi1时,有几柱,程序就算了几柱的bi)
void BaisBlance(double &bi,int Biask) { bi=0; double tempma=0; for(int i=0; i<Biask; i++) { tempma=iMA(NULL,0,MABi1,0,MODE_SMA,PRICE_CLOSE,i+1); if(tempma!= 0) bi+=100*(MathAbs(Close[i+1]-tempma)/tempma); else break; } return; }
Lin Luo:
理论上没问题了。但调用同一个MA算法,程序重算了三次,似乎有些浪费计算机资源。如果改为以下示例,仅算一次,个人觉得稍高效些。(结果意味着柱数不足MABi1时,有几柱,程序就算了几柱的bi)
感謝大神,收穫良多。
當我的BIAS參數大於101,就無法使用EVERYTICK回測EA。程式碼有哪裡出了問題嗎?