if (MA5_1 > MA8_1 && MA5_0 < MA8_0) res =2;//Cross down
BarCount=Bars;
return (res);
}[/php]and you are calling it like this :
if (GetDailyTrend(1) && ...) Order = SIGBNAL_BUY;
if (GetDailyTrend(2) && ...) Order = SIGNAL_SELL;
[/php]The way it is used and called now expressions GetDailyTrend(1) and GetDailyTrend(2) are always true (in metatrader any value not equal to 0 is considered a true.
_________________________
Redefine the GetDailyTrend() to something like this:
[php]int GetDailyTrend ()
{
int res = 0;
double MA5_1 = double iMA(NULL,1440,5,0,1,0,1);
double MA5_0 = double iMA(NULL,1440,5,0,1,0,0);
double MA8_1 = double iMA(NULL,1440,8,0,1,0,1);
double MA8_0 = double iMA(NULL,1440,8,0,1,0,0);
if (MA5_1 MA8_0) res =1;//Cross up
if (MA5_1 > MA8_1 && MA5_0 < MA8_0) res =2;//Cross down
return (res);
}
And then use it this way :
[php]if (GetDailyTrend()==1 && ...) Order = SIGBNAL_BUY;
if (GetDailyTrend()==2 && ...) Order = SIGNAL_SELL;
DTosc消息...
Mladen,
我在Expers文件夹中得到一条信息,说....... "Array Maximum函数 的起始位置10148不正确"--不过指标似乎表现得很好。
有什么解释吗?
预先感谢你。
ValeoFX
在不知道是哪个指标的情况下,它通常是这样的 找到确定限制的地方,然后把它改成这样的。
这个表达式中的第二个参数(Bars-1)在这种情况下确保极限不大于图表上的条数。
但是,正如你已经注意到的,这是一个 "良性 "错误:它只发生一次(当指标被加载或时间框架被改变时),而且,与其他一些错误不同,它不会停止指标的计算,所以所有其余的计算都是正确的,数值也被正确计算。
问候
mladen
Mladen。
我在Expers文件夹中得到一条信息,说....... "Array Maximum函数的起始位置10148不正确"--但指标似乎表现完美。
有什么解释吗?
先谢谢你了。谢谢...
ValeoFX
不知道是关于哪个指标的,通常是这样的 找到确定限制的地方,然后把它改成这样的。
在这种情况下,该表达式的第二个参数(Bars-1)确保限制不大于图表上的条数。
但是,正如你已经注意到的,这是一个 "良性 "错误:它只发生一次(当指标被加载或时间框架被改变时),而且,与其他一些错误不同,它不会停止指标的计算,所以所有其余的计算都是正确的,数值也被正确计算。
问候
mladen======================
对不起,Mladen,我在 "标题 "窗口中有指标的名称(DTOsc),没有想到要再重复一遍。不过,谢谢你的解释--我会立即查看的。
在第124行我发现。
limit = MathMax(limit,MathMin(Bars,iCustom(NULL,timeFrame,IndicatorFileName, "getBarsCount",0,0)*timeFrame/Period())。
由于它与你的建议不同,你能不能详细说明我应该怎么做来纠正它,谢谢?
非常感谢。
ValeoFX
我没有注意到信息的副标题,抱歉
总之,如果你使用的是这个帖子中的那个:https://www.mql5.com/en/forum/general,那么你就会收到这个信息。
另一方面,如果你使用的是这个帖子中的那个:https://www.mql5.com/en/forum/general(较新的那个),那么你就不会收到这个信息。
我不记得我到底是什么时候做的第一个帖子里的那个,但后来我改变了一些编码风格(因此没有那个错误信息),坦率地说,以前我并不太关心那个错误信息,因为它真的没有改变什么。在那之后,我干脆决定不给任何最终的错误留下任何空间,因此在确定极限时进行了 "安全检查"
____________________________________
PS:该行在多时间框架模式下工作。它 "询问 "目标时间段内有多少条变化,以便能够重新计算当前时间段内需要的确切条数。因此,该线只有在多时间框架模式下才有效。
mladen,
我是编码方面的新手。这很难。但如果我只有CodersGuru的书来做EA.......,那是不够的。
见我的帖子第183页
Tradefx1
你想找到的每日趋势:你需要重新定义它(重写它)。现在它是这样写的。
double MA5_1 = double iMA(NULL,1440,5,0,1,0,1);
double MA5_0 = double iMA(NULL,1440,5,0,1,0,0);
double MA8_1 = double iMA(NULL,1440,8,0,1,0,1);
double MA8_0 = double iMA(NULL,1440,8,0,1,0,0);
if (MA5_1 MA8_0) res =1;//Cross up
if (MA5_1 > MA8_1 && MA5_0 < MA8_0) res =2;//Cross down
BarCount=Bars;
return (res);
}[/php]and you are calling it like this :
if (GetDailyTrend(2) && ...) Order = SIGNAL_SELL;
[/php]The way it is used and called now expressions GetDailyTrend(1) and GetDailyTrend(2) are always true (in metatrader any value not equal to 0 is considered a true.
_________________________
Redefine the GetDailyTrend() to something like this:
[php]int GetDailyTrend ()
{
int res = 0;
double MA5_1 = double iMA(NULL,1440,5,0,1,0,1);
double MA5_0 = double iMA(NULL,1440,5,0,1,0,0);
double MA8_1 = double iMA(NULL,1440,8,0,1,0,1);
double MA8_0 = double iMA(NULL,1440,8,0,1,0,0);
if (MA5_1 MA8_0) res =1;//Cross up
if (MA5_1 > MA8_1 && MA5_0 < MA8_0) res =2;//Cross down
return (res);
}
And then use it this way :
[php]if (GetDailyTrend()==1 && ...) Order = SIGBNAL_BUY;
if (GetDailyTrend()==2 && ...) Order = SIGNAL_SELL;
_________________________
关于书本和编码:我一直认为学习编码的最好方法是从实例和工作程序中学习。信不信由你,但微软的人是很好的学习对象(他们确实统一地写代码(这意味着他们有坚定的团队规则,代码应该如何写),非常干净,他们试图使代码尽可能地高效)。
在精英部分有很多例子和工作中的EA,任何人都可以使用(我可以向你推荐这个https://www.mql5.com/en/forum/180383),原因我已经在那条线上说过了,我认为它很容易被用作其他EA的 "框架"。但是,也有很多其他非常有用的EA,可以用来学习和制作有效的EA。
请永远记住一件事:编码语言就是:"语言"。这意味着它是一个简单的谈话,就像其他的谈话一样。只是要小心你 "告诉 "电脑的内容,因为电脑不像人,不会质疑你告诉它的内容,而是简单地执行它(有时它不是我们想要的
),然后,经过一段时间,你会习惯于与电脑 "对话",然后一切都变得更容易。
以防万一...
如果有人想知道adxvma指标背后的基本逻辑是什么,这里是它的一个中间步骤,可能和指标本身一样有用。(在这一步之后还有其他的步骤,所以不要比较这两个指标,但这一步似乎特别有趣) 如果有人觉得它很熟悉,答案是 "是"。它似乎是动力趋势指标("真正的 "动力趋势,而不是那些被张贴和公布的动力趋势--对此我不是100%确定(我从 "真正的 "动力趋势看到的只是它的图片),但它肯定看起来很像它)ValeoFX
我没有注意到信息的副标题,抱歉
总之,如果你使用的是这个帖子中的那个:https://www.mql5.com/en/forum/general,那么你就会收到这个信息。
另一方面,如果你使用的是这个帖子中的:https://www.mql5.com/en/forum/general(较新的那个),那么你就不会得到这个信息。
我不记得我到底是什么时候做的第一个帖子里的那个,但后来我改变了一些编码风格(因此没有那个错误信息),坦率地说,以前我并不太关心那个错误信息,因为它真的没有改变什么。在那之后,我干脆决定不给任何最终的错误留下任何空间,因此在确定极限时进行了 "安全检查"
____________________________________
PS:该行在多时间框架模式下工作。它 "询问 "目标时间段内有多少条变化,以便能够重新计算当前时间段内需要的确切条数。所以该线只有在多时间框架模式下才有效。=========================================================
非常感谢你的解释。非常感谢,也帮助我更好地理解了编码。
我将立即下载第二版。
最好的祝愿。
adxvma
mladen,
我要求你发布Tradestation的版本,会不会太过分了?
雷
伙计们,我注意到指标中有一个不合逻辑的地方(第一步是如何计算adx部分),我确实用tradestation指标作为模型,似乎其中有一个错误,我没有想到就继承了
问候
姆拉登雷。
在这里,它是。该指标:
Price (close),
length (14);
vars:
av (0);
av = ADXVMA(Price, length);
Plot1(av, "Rising");
Plot2(av, "Falling");
Plot3(av, "Neutral");
Plot4(av, "ADXVMA", iff(av = av[1], GetPlotColor(3), iff(av > av[1], GetPlotColor(1), GetPlotColor(2))));
NoPlot(1);
NoPlot(2);
NoPlot(3); [/php]and the adxvma function
[php]inputs:
Price (NumericSeries),
Length (NumericSimple);
vars:
TR(0),
DI_Diff(0),
DI_Sum(0),
ma(0),
pdm(0),
mdm(0),
pdi(0),
mdi(0),
DI_Factor(0),
VI(0),
diff(0),
HHV(0),
LLV(0),
WeightDM(Length),
WeightDI(Length),
WeightDX(Length),
ChandeEMA(Length),
out(0),
j(0);
once ma=Price;
//
// in order to make it right the "pdm=0; mdm=0;" must be added (it does not
// exist in original and that is an error, tradestation inherits values fom
// a previous loop and they must be zeroed before these calculations)
//
pdm=0; mdm=0;
if(Price>Price[1]) then pdm=Price-Price[1] else mdm=Price[1]-Price;
pdm=((WeightDM-1)*pdm[1] + pdm)/WeightDM;
mdm=((WeightDM-1)*mdm[1] + mdm)/WeightDM;
TR=pdm+mdm;
if (TR>0) then begin pdi=pdm/TR; mdi=mdm/TR; endelse begin
pdi=0;
mdi=0;
end;
pdi=((WeightDI-1)*pdi[1] + pdi)/WeightDI;
mdi=((WeightDI-1)*mdi[1] + mdi)/WeightDI;
DI_Diff=pdi-mdi;
if (DI_Diff<0) then DI_Diff= -DI_Diff;
DI_Sum=pdi+mdi;
DI_Factor=0;
if (DI_Sum>0) then out=DI_Diff/DI_Sum else out=0;
out=((WeightDX-1)*out[1] + out)/WeightDX;
if (out>out[1]) then begin HHV=out; LLV=out[1]; end
else begin
HHV=out[1];
LLV=out;
end;
for j = 1 to Length-1 begin
if(out[j+1]>HHV)then HHV=out[j+1];
if(out[j+1]<LLV) then LLV=out[j+1];
end;
diff = HHV - LLV;
VI=0;
if (diff>0) then VI=(out-LLV)/diff;
ma=((ChandeEMA-VI)*ma[1]+VI*Price)/ChandeEMA;
ADXVMA = ma;
增加了注释 和一个代码更正,在原版中不存在(这是我对它做的唯一改动)。一些变量名称有误导性:在任何步骤中都没有EMA计算。那是在中间平滑步骤中使用的平滑移动平均线,而不是EMA。另外,你会注意到,即使基本的计算逻辑来自于ADX,它实际上也不是ADX,但在这个 "混合 "指标的情况下,它足够接近于值得这个名字。
问候
姆拉登
mladen。
如果我要求你发布Tradestation版本,会不会太过分了?
雷