编码帮助 - 页 557

 
mntiwana:
亲爱的MLADEN,

可能我之前的请求不小心被删除了,因为大多数事情都是在这里和那里运行,寻找和调整它们的确切位置,但我们很容易和舒适地做我们的工作,作为提醒,我请求你提供一些简单的拖曳止损和BE代码,我想添加/合并到附件中的EA,我在你的帮助和指导下改变,但我不急,当它可能为你,我知道有很多东西传播和等待你,谢谢。

问候

simple_ma_cross_eamod-hp.mq4

好的。将会完成

 
 

大家好。

谢谢你花时间阅读我的帖子。当涉及到代码时,我是一个绝对的新手。我尝试了一些方法来使这个EA工作,但它们都不是答案。我正在研究全局变量,因为我认为它需要这个来记住已经发生的事情,而不是在刷新/重新加载等发生时重新启动。它在回溯测试中工作得很好,但由于某些原因,在实际运行时,它就会停止交易或关闭交易,我就是想不明白这一点。我也在努力学习如何做这些事情,但我才刚刚开始,如果我做错了,请原谅我。该EA有一个开始和停止的时间,在这段时间内,它可以打开X个交易,当它关闭时,一个周期就完成了。它被设置为每个时间段只允许一个周期。

谁能看一下这段代码,看看问题出在哪里。非常感谢您的帮助

maa1

quantum_shaolin_1.3.2.mq4

quantum.mq4

附加的文件:
 

你好,Mladen。

我有一个扫描器指标,它告诉人们有多少个指标表明某个特定符号有买入或卖出的机会,它在多个时间段扫描该符号。

问题是,该指标说总是有指标指示,即使它们事实上没有。当出现这种情况时,指标金额总是相同的数字。

请看下面的代码。

double BufferALL[22];

int Timeframe[7][3]={15,,, 60,,, 240,,, 1440,,, 10080,,, 43200,, ,,};

for(x=0; x<=5; x++) {

if ((SymbolBars[y][x]==iBars(symbol[y],Timeframe[x][0]))&&(SymbolBars[y][x+1]==iBars(symbol[y],Timeframe[x+1][0]))) continue;

BufferALL[0]=indi1(symbol[y],Timeframe[x][0]);

//BufferALL[1]=ind2i(symbol[y],Timeframe[x][0]);

BufferALL[2]=ind3i(symbol[y],Timeframe[x][0]);

BufferALL[3]=ind4i(symbol[y],Timeframe[x][0]);

BufferALL[4]=ind5i(symbol[y],Timeframe[x][0]);

BufferALL[5]=indi(symbol[y],Timeframe[x][0]);

BufferALL[6]=indi(symbol[y],Timeframe[x][0]);

BufferALL[7]=indi(symbol[y],Timeframe[x][0]);

BufferALL[8]=indi(symbol[y],Timeframe[x][0]);

BufferALL[9]=indi(symbol[y],Timeframe[x][0]);

BufferALL[10]=indi(symbol[y],Timeframe[x][0]);

BufferALL[11]=indi(symbol[y],Timeframe[x][0]);

BufferALL[12]=indi(symbol[y],Timeframe[x][0]);

BufferALL[13]=indi(symbol[y],Timeframe[x][0]);

BufferALL[14]=indi(symbol[y],Timeframe[x][0]);

BufferALL[15]=indi(symbol[y],Timeframe[x][0]);

BufferALL[16]=indi(symbol[y],Timeframe[x][0]);

BufferALL[17]=indi(symbol[y],Timeframe[x][0]);

BufferALL[18]=indi(symbol[y],Timeframe[x][0]);

BufferALL[19]=indi(symbol[y],Timeframe[x][0]);

BufferALL[20]=indi(symbol[y],Timeframe[x][0]);

BufferALL[21]=indi(symbol[y],Timeframe[x][0]);

for(z=0; z<=14; z++){

if (BufferALL[z] >=534653647457) Timeframe[x][1]=Timeframe[x][1]+1;

if (BufferALL[z] <=543456346463) Timeframe[x][2]=Timeframe[x][2]+1;

}

for(z=15; z<=21; z++){

if (BufferALL[z] >= 22345654) Timeframe[x][2]=Timeframe[x][2]+1; //>

if (BufferALL[z] <= 11111111111) Timeframe[x][1]=Timeframe[x][1]+1; //<

}

} // end of timeframe loop 6 iterations

当所有的东西都显示在警报信息中时,我得到的是这样的信息:EURUSD: 15m/60m/4u/1d/1w/1mo表明有买入机会,7/7/7/7/7/。

这意味着它为每个时间框架总结了7个指标,这显然是错误的。当我取出所有的函数调用 时,它甚至说明了这一点。当我这样做时,BufferALL[]的所有元素都是空的。

但显然,EMPTY这个值仍然是一个可以与另一个值进行比较的值,比如说534653647457。我怎样才能补救这个问题呢?

 
mrcodix:
你好,Mladen。

我有一个扫描器指标,它告诉人们有多少个指标表明某个特定符号有买入或卖出的机会,它在多个时间段扫描该符号。

问题是,该指标说总是有指标指示,即使它们事实上没有。当出现这种情况时,指标金额总是相同的数字。

请看下面的代码。

double BufferALL[22];

int Timeframe[7][3]={15,,, 60,,, 240,,, 1440,,, 10080,,, 43200,, ,,};

for(x=0; x<=5; x++) {

if ((SymbolBars[y][x]==iBars(symbol[y],Timeframe[x][0]))&&(SymbolBars[y][x+1]==iBars(symbol[y],Timeframe[x+1][0]))) continue;

BufferALL[0]=indi1(symbol[y],Timeframe[x][0]);

//BufferALL[1]=ind2i(symbol[y],Timeframe[x][0]);

BufferALL[2]=ind3i(symbol[y],Timeframe[x][0]);

BufferALL[3]=ind4i(symbol[y],Timeframe[x][0]);

BufferALL[4]=ind5i(symbol[y],Timeframe[x][0]);

BufferALL[5]=indi(symbol[y],Timeframe[x][0]);

BufferALL[6]=indi(symbol[y],Timeframe[x][0]);

BufferALL[7]=indi(symbol[y],Timeframe[x][0]);

BufferALL[8]=indi(symbol[y],Timeframe[x][0]);

BufferALL[9]=indi(symbol[y],Timeframe[x][0]);

BufferALL[10]=indi(symbol[y],Timeframe[x][0]);

BufferALL[11]=indi(symbol[y],Timeframe[x][0]);

BufferALL[12]=indi(symbol[y],Timeframe[x][0]);

BufferALL[13]=indi(symbol[y],Timeframe[x][0]);

BufferALL[14]=indi(symbol[y],Timeframe[x][0]);

BufferALL[15]=indi(symbol[y],Timeframe[x][0]);

BufferALL[16]=indi(symbol[y],Timeframe[x][0]);

BufferALL[17]=indi(symbol[y],Timeframe[x][0]);

BufferALL[18]=indi(symbol[y],Timeframe[x][0]);

BufferALL[19]=indi(symbol[y],Timeframe[x][0]);

BufferALL[20]=indi(symbol[y],Timeframe[x][0]);

BufferALL[21]=indi(symbol[y],Timeframe[x][0]);

for(z=0; z<=14; z++){

if (BufferALL[z] >=534653647457) Timeframe[x][1]=Timeframe[x][1]+1;

if (BufferALL[z] <=543456346463) Timeframe[x][2]=Timeframe[x][2]+1;

}

for(z=15; z<=21; z++){

if (BufferALL[z] >= 22345654) Timeframe[x][2]=Timeframe[x][2]+1; //>

if (BufferALL[z] <= 11111111111) Timeframe[x][1]=Timeframe[x][1]+1; //<

}

} // end of timeframe loop 6 iterations

当所有的东西都显示在警报信息中时,我得到的是这样的信息:EURUSD: 15m/60m/4u/1d/1w/1mo表明有买入机会,7/7/7/7/7/。

这意味着它为每个时间框架总结了7个指标,这显然是错误的。当我取出所有的函数调用时,它甚至说明了这一点。当我这样做时,BufferALL[]的所有元素都是空的。

但显然EMPTY这个值仍然是一个可以与另一个值比较的值,例如534653647457。我怎样才能补救这个问题呢?

姆科迪克斯

如果不知道指标到底是做什么的(它们的返回值是什么),我所能做的就是胡乱猜测,而这根本没有帮助。

 
mladen:

mrcodix

如果不知道这些指标到底是做什么的(它们的返回值是什么),我所能做的就是胡乱猜测,而这根本没有帮助。

亲爱的Mladen,

你不需要知道回报值,因为罪魁祸首不是指标。你看,当我通过在每行代码前添加"//"来禁用所有的调用函数(将它们变成注释行)时,会出现完全相同的问题。这一部分的=后面的值也是如此。

for(z=0; z<=14; z++){

if (BufferALL[z] >=534653647457) Timeframe[x][1]=Timeframe[x][1]+1;

if (BufferALL[z] <=543456346463) Timeframe[x][2]=Timeframe[x][2]+1;

}

for(z=15; z<=21; z++){

if (BufferALL[z] >= 22345654) Timeframe[x][2]=Timeframe[x][2]+1; //>

if (BufferALL[z] <= 11111111111) Timeframe[x][1]=Timeframe[x][1]+1; //<

}[/CODE]

it might aswell be something like

for(z=0; z<=14; z++){

if (BufferALL[z] >=1111111111111) Timeframe[x][1]=Timeframe[x][1]+1;

if (BufferALL[z] <=2222222222222) Timeframe[x][2]=Timeframe[x][2]+1;

}

for(z=15; z<=21; z++){

if (BufferALL[z] >= 333333333333) Timeframe[x][2]=Timeframe[x][2]+1; //>

if (BufferALL[z] <= 444444444444) Timeframe[x][1]=Timeframe[x][1]+1; //<

}

it will give the same exact alert message that says /15m/60m/4u/1d/1w/1mo/ is indicating a buying opportunity /7/7/7/7/7/7/. I disabled all the function call lines with // so the BufferALL[22] elements should be EMPTY, they shoulden't contain any value whatsoever. Yet, when the computer comes at the if condition parts BufferALL[z] >=1111111111111 etc it ALWAYS states that the "value" thats inside BufferALL[z] is larger then 11111111111 (or any value you wish to put behind it). The only way to make these additions stop is by changing the if condition = into ==. When the computer asks whether the empty value of BufferALL[z] is exactly the same as 11111111 or 22222 or whatever value you wish to compare, it doesen't return a true and Timeframe is not added with +1. Please try it for youself. I will add the message construction code below:

[CODE]

int SymbolBars[216][7];

if (((Timeframe[0][1] > 0) && (Timeframe[1][1] > 0) && (SymbolBars[y][0]!=iBars(symbol[y],Timeframe[0][0]))&&(SymbolBars[y][1]!=iBars(symbol[y],Timeframe[1][0]))) || ((Timeframe[1][1] > 0) && (Timeframe[2][1] > 0)&& (SymbolBars[y][1]!=iBars(symbol[y],Timeframe[1][0]))&&(SymbolBars[y][2]!=iBars(symbol[y],Timeframe[2][0]))) || ((Timeframe[2][1] > 0) && (Timeframe[3][1] > 0)

&& (SymbolBars[y][2]!=iBars(symbol[y],Timeframe[2][0]))&&(SymbolBars[y][3]!=iBars(symbol[y],Timeframe[3][0]))) || ((Timeframe[3][1] > 0) && (Timeframe[4][1] > 0) && (SymbolBars[y][3]!=iBars(symbol[y],Timeframe[3][0]))&&(SymbolBars[y][4]!=iBars(symbol[y],Timeframe[4][0]))) || ((Timeframe[4][1] > 0) && (Timeframe[5][1] > 0)&& (SymbolBars[y][4]!=iBars(symbol[y],Timeframe[4][0])) &&(SymbolBars[y][5]!=iBars(symbol[y],Timeframe[5][0]))))

{

if (Timeframe[0][1]>0)

{

StringAdd(alarmbericht,"15m/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[0][1],"/"));

SymbolBars[y][0]=iBars(symbol[y],15);

}

if (Timeframe[1][1]>0)

{

StringAdd(alarmbericht,"60m/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[1][1],"/"));

SymbolBars[y][1]=iBars(symbol[y],60);

}

if (Timeframe[2][1]>0)

{

StringAdd(alarmbericht,"4u/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[2][1],"/"));

SymbolBars[y][2]=iBars(symbol[y],240);

}

if (Timeframe[3][1]>0)

{

StringAdd(alarmbericht,"1d/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[3][1],"/"));

SymbolBars[y][3]=iBars(symbol[y],1440);

}

if (Timeframe[4][1]>0)

{

StringAdd(alarmbericht,"1w/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[4][1],"/"));

SymbolBars[y][4]=iBars(symbol[y],10080);

}

if (Timeframe[5][1]>0)

{

StringAdd(alarmbericht,"1mo/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[5][1],"/"));

SymbolBars[y][5]=iBars(symbol[y],43200);

}

Alert(+symbol[y]+" "+alarmbericht+" are indicating a selling opportunity. " +indicatoraantal+".");

alarmbericht = "";

indicatoraantal = "";

}

if (((Timeframe[0][2] > 0) && (Timeframe[1][2] > 0) && (SymbolBars[y][0]!=iBars(symbol[y],Timeframe[0][0]))&&(SymbolBars[y][1]!=iBars(symbol[y],Timeframe[1][0]))) || ((Timeframe[1][2] > 0) && (Timeframe[2][2] > 0)&& (SymbolBars[y][1]!=iBars(symbol[y],Timeframe[1][0]))&&(SymbolBars[y][2]!=iBars(symbol[y],Timeframe[2][0]))) || ((Timeframe[2][2] > 0) && (Timeframe[3][2] > 0)

&& (SymbolBars[y][2]!=iBars(symbol[y],Timeframe[2][0]))&&(SymbolBars[y][3]!=iBars(symbol[y],Timeframe[3][0]))) || ((Timeframe[3][2] > 0) && (Timeframe[4][2] > 0) && (SymbolBars[y][3]!=iBars(symbol[y],Timeframe[3][0]))&&(SymbolBars[y][4]!=iBars(symbol[y],Timeframe[4][0]))) || ((Timeframe[4][2] > 0) && (Timeframe[5][2] > 0)&& (SymbolBars[y][4]!=iBars(symbol[y],Timeframe[4][0])) &&(SymbolBars[y][5]!=iBars(symbol[y],Timeframe[5][0]))))

{

if (Timeframe[0][2]>0)

{

StringAdd(alarmbericht,"15m/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[0][2],"/"));

SymbolBars[y][0]=Bars(symbol[y],15);

}

if (Timeframe[1][2]>0)

{

StringAdd(alarmbericht,"60m/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[1][2],"/"));

SymbolBars[y][1]=Bars(symbol[y],60);

}

if (Timeframe[2][2]>0)

{

StringAdd(alarmbericht,"4u/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[2][2],"/"));

SymbolBars[y][2]=Bars(symbol[y],240);

}

if (Timeframe[3][2]>0)

{

StringAdd(alarmbericht,"1d/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[3][2],"/"));

SymbolBars[y][3]=Bars(symbol[y],1440);

}

if (Timeframe[4][2]>0)

{

StringAdd(alarmbericht,"1w/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[4][2],"/"));

SymbolBars[y][4]=Bars(symbol[y],10080);

}

if (Timeframe[5][2]>0)

{

StringAdd(alarmbericht,"1mo/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[5][2],"/"));

SymbolBars[y][5]=Bars(symbol[y],43200);

}

Alert(+symbol[y]+" "+alarmbericht+" are indicating a buying oppertunity. " +indicatoraantal+".");

alarmbericht = "";

indicatoraantal = "";

}
 

Mladen,

下面是一个例子,当我把所有的指标调用变成注释线时,连续的警报信息传递。

当它是一个买入机会时,所有可能的时间框架中的指标总和是15。当它是一个卖出机会时,它是7。BufferALL[]是空的,所以这没有任何意义。

最后,我想向你提一些偏离主题的事情。在过去,我问过一些关于扫描器指标连续扫描多个符号的问题。我在想,当指标连接到一个当前符号更新不那么频繁的图表上时,它是否不能获得更频繁变化的符号的所有刻度(每秒的刻度较少)。这意味着,理论上我的指标仍然在20:05的5分钟柱状图中,而它应该扫描的更新速度较快的符号已经在20:10了。这只是因为新条形在20:04:59之后的第一个刻度开始,而不是在时钟进入20:05:00时开始。你对此的回应是,所有的符号都将以一个固定的检查速度进行检查,因为在新的metatrader版本中,开始{返回}程序不再在每个新的刻度上激活。相反,它以固定的速度激活。事实证明,这不是真的。在把我所有的指标变成包含在我的扫描器指标本身的代码中的函数后,整个指标在我运行时仍然使mt4冻结。因此,使用iCustom()来调用代码或通过插入代码并将其变成一个内部函数完全没有区别,它仍然冻结。但我已经找到了一个解决方案,那就是放弃215次迭代的长主循环(每次迭代都要处理符号[y]中的不同符号),用一个变量代替它,在每次勾选后得到一个加号。我用它来告诉计算机它应该使用哪个符号,所以现在不是在每个tick 上试图分析所有216个符号(这使得整个事情冻结),而是在每个tick上只分析一个符号。当加法变量达到215时,它被重置为0,整个216周期又重新开始。现在所有的符号都被分析了,尽管比起在每个tick上分析所有216个符号的速度要慢一些(如果它没有冻结的话)....。不管怎么说。重点是,Start{}只有在图表中的当前符号更新时才会被激活。这意味着,当指标是一个不太活跃的符号(如股票),而不是一个非常活跃的符号(如欧元兑美元)时,需要更长的时间来浏览所有216个符号。所以Start{}仍然在每个新的刻度上被激活。

附加的文件:
 

你好,Mladen和Mrtools,我非常高兴地问。

如果能解决在编译所附指标时出现的两个错误的问题,那就太好了。

谢谢你

莫雷诺

PS: 很抱歉我的英语不好 :-)

附加的文件:
 
morenokosta:
你好,Mladen和Mrtools,我很高兴地问。

如果能解决在编译附件中的指标时出现两个错误的问题,那就太好了。

谢谢你

莫雷诺

PS: 很抱歉我的英语不好:-)

更多

该指标可以正常使用

不需要做任何代码修改

 

嗨,Mladen

能否请您在该指标上添加警报,我是个新手。

谢谢

附加的文件:
cross.mq4  2 kb