我想写出一个指标,可以输入指定时间范围的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 ......分钟。
因为在当前的蜡烛中,这个指标"变化"它的价值,勾选,我认为应该可以写出这样的指标,但我无法弄清楚如何做到这一点。
答案 0 :(得分:0)
然而,如上所述,您的实验需要彻底的定量验证,因为早期的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);
}
以及其他所有时间段的情侣。