MQL4多时间帧指示器

时间:2017-11-12 22:11:12

标签: trading mql4 algorithmic-trading metatrader4

我想写出一个指标,可以输入指定时间范围的In [25]: m = pd.DataFrame(np.array([[1, 3, 5], [2, 4, 6]])) In [26]: m.apply(np.mean, axis=0) Out[26]: 0 1.5 1 3.5 2 5.5 dtype: float64 ,并输出与另一个时间范围相关的值。

作为一个例子,我想在100个M15期间写一个MACD指标,它可以在当前蜡烛之前返回其值1,2,3,4,5,6,7 ......分钟。

因为在当前的蜡烛中,这个指标"变化"它的价值,勾选,我认为应该可以写出这样的指标,但我无法弄清楚如何做到这一点。

2 个答案:

答案 0 :(得分:0)

MQL4语言主要有以下工具:

然而,如上所述,您的实验需要彻底的定量验证,因为早期的Builds在 [MT4-Strategy Tester] 代码执行环境中不支持此功能(并且最近转换为< em> New - MQL4.56789对所有 [CustomIndicators] ,所有 [MT4-graph] -GUI-s加上性能约束全部 [EA交易] -s使用,因为所有这些突然共享一个(是的,ONE和THE ONLY)计算线程。

好的,你已被警告:o)

所以,
如果确实希望装备 [CustomIndicator] 以便独立于GUI-native-TimeFrame,那么[CustomIndicator]代码中的所有计算必须使用间接访问工具来获取PriceDOMAIN数据 - 所以永远不要直接使用任何{ Open[] | High[] | Low[] | Close[] } - TimeSeries数据,但只使用 { iOpen() | iHigh() | iLow() | iClose() }

所有这些访问工具在概念上都有一个共同的签名:

double  iLow( string   symbol,          // symbol 
              int      timeframe,       // timeframe 
              int      shift            // shift
              );


如果你的代码
遵守这项义务,
你的[CustomIndicator] iff 策略测试人员最终不会破坏游戏 - 由于定量测试会显示这一点)
将处理来自timeframe&amp;的数据。 shift您的愿望。

实施备注:

您的[CustomIndicator]代码必须独立于GUI-native-TimeFrame "non-GUI-shift"实现 shift - 计数。请参阅iCustom()签名模板以获取灵感。 GUI-TimeFrame - shift就像在GUI屏幕上移动线图一样,即在GUI-native-TimeFrame步骤中,而不考虑您的[CustomIndicator]“内部” - {{1} 值,因此您的代码必须更智能,以便在值生成期间处理此“内部” - "non-GUI-shift" 。如果怀疑,在原型制作过程中,请在"non-GUI-shift" vs Time[aShiftINTENDED]上验证正确的“机制”

由于有很多要点,iTime( _Symbol, PERIOD_INTENDED, aShiftINTENDED )调用接口可能有点误导,或者修改 - 更改管理容易出错,我们习惯使用每个[Custom]的正式模板指标]代码,有助于在实际[ExpertAdvisor]代码中使用iCustom()来保持参照完整性。这可能看起来有点愚蠢,但是那些花了5个小时寻找{un- |中的错误的人错误的呼叫界面变化,这可能会成为一个救生员。

我们以这样的方式形式化调用接口,在[CustomIndicator]代码中维护的这个部分总是可以复制到[ExpertAdviser]代码中,这样iCustom()签名匹配就可以了被检查。

iCustom()

答案 1 :(得分:0)

找到一种以非常简单的方式编写它的方法:

double M1  (int shift) {double val = iCustom(NULL,PERIOD_M1, "my_indicator",100,2.0,30.0,0,shift); return(val);}
double M15 (int shift) {double val = iCustom(NULL,PERIOD_M15,"my_indicator",100,2.0,30.0,0,shift); return(val);}

int s1_15;
double B_M1_M15(int i) {

                          if (i>=0  && i<15 ) s1_15=0;
                     else if (i>=15 && i<30 ) s1_15=1;
                     else if (i>=30 && i<45 ) s1_15=2;
                     else if (i>=45 && i<60 ) s1_15=3;
                     else if (i>=60 && i<75 ) s1_15=4;

                     return NormalizeDouble(MathAbs(M1(i) - M15(s1_15)),Digits);

                     } 

以及其他所有时间段的情侣。