如何编码? - 页 322

 

你好。

我的请求只是为了提供信息,目前是这样的。

如果我有一个指标,在创建离线图表时不计算过去的数据,而只计算实时数据,那么是否可以将其附加到策略测试器 模板中,用历史数据创建一个离线图表?

谢谢你。

 
mladen:
jayjonbeach,

你在循环中一次又一次地测试trendCurr的值,而没有改变它(所以它将总是返回NONE)。

试着把iCustom()放到循环中,然后测试这个值。就像这样。

if (trendCurr>0)

{

for(int i=1; i<=lookback; i++)

{

int testValue = iCustom(NULL,StepMaTimeFrame,"StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+i);

if (testValue<0) return(LONG);

}

return(NONE);

}

亲爱的先生。我对此只有两个字,但它们值得重复......

谢谢你,谢谢你,谢谢你

的确,你的代码工作得非常好,我敢打赌,你 我节省了12个小时或更多的时间来研究其他的 "for "循环,试验和错误等等,最后我才偶然发现了你发布的内容。

实际上,我认为我想在循环中反复测试trendCurr,但现在我看到了错误,这要感谢你,而且我看到你用 "i "改变Stepbartotest的解决方案确实是完美的解决方案,这里使用 "i "实际上是关键,但似乎并不完全明显,至少对我这样的新手来说,我可能要花一些时间才能弄清楚...

虽然你的代码按预期运行,但我的整个区块却不是,在LONG标准内运行这个循环,有一个非常有趣的意外结果。

if(TwentyOneEMA > FiftyFiveEMA)

{

if (trendCurr>0) //检查 步骤过滤器的电流。

{

如果(Bid > TwentyOneEMA)

{

for(int i=0; i<=lookback; i++)

{

int testValue = iCustom(NULL,StepMaTimeFrame, "StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percent,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+i);

如果(testValue<0)返回(LONG)。

}

return(NONE);

}

}

}

现在发生的情况是,当满足ifs时,循环被测试,如果是真的,它就买了,如果不是,它什么也不做,很好。然而,整个代码块就像一个 "while "循环,因为只要if(TwentyOneEMA > FiftyFiveEMA)为真,下面的其他代码就会继续运行,如果其他条件都为真,这个傻瓜就会买进!我在这里看到了我的代码结构的明显错误。我在这里看到了我的代码结构的明显错误....(我在想另一个类似的for循环可以测试EMA,以确保EMA交叉是一个新的交叉)。

然而,这并不一定是坏事(正如一些分析所暗示的那样),事实上,这有点像我的下一个目标,以不同的方式,它需要更多的测试,但现在我打算在这个机器人上保留这一修订,并在一个副本上开始下一步的修订。

在我让它查看过去的情况后,我打算做的是,如果过去的循环结果是假的,我想让它检查下一个10条的阶梯信号,如果它是真的,就进行交易(我在考虑用一个while循环来做这个?)所以这已经在发生了,只是在它的展望中没有10条的限制,而且我不确定我应该如何构建整个事情来正确地工作。(我想我可以检查步骤信号,如果是真的,就在最后10条中寻找新的MA交叉点,但我必须为此重复所有的区块,我想一定有更好的更有效/更优雅的方法)。

再次感谢您的帮助,我相信这在未来的编码中会非常有用。

 

你好。

我试图修改附件中的指标。通常情况下,当移动常数触及价格时,它会报警并改变触及的时间框架。我在警报中设置了一个延迟,但在警报之后,如果我改变时间框架,它就会忽略它。

它可以被修复吗?

谢谢你medie_mobili.mq4

附加的文件:
 

晓晓

对于指标,你不能改变它。当你这样做时,指标会将全局范围和静态变量重置为默认值,所以当改变时间框架或符号时,你不能保留一些值。你可以使用全局变量(用 "GlobalVariable... "函数管理的变量),但这将使你的代码变得非常复杂(对于多个实例,多个符号,...),在我看来,这不值得努力。

dasio:
你好。

我试着修改附件中的指标。通常情况下,当移动常数触及价格时,它会报警并改变触及的时间框架。我在警报中设置了一个延迟,但在警报之后,如果我改变时间框架,它就会忽略它。

这个问题可以解决吗?

谢谢你medie_mobili.mq4
 

...

只是对以前的帖子做一个补充:有一件事并不广为人知--EA对这些变量(全局范围和静态变量)的处理是不同的--当时间框架或符号改变时,它们不会被重置。这里有一个非常非常简单的EA,它将向那些对它感兴趣的人展示这些值是如何在EA中不像在指标中那样被重置的。

int counter = 0;

int init()

{

return(0);

}

int start()

{

static int counterStart = 0;

counterStart++;

counter++;

Comment("counter from start : "+counterStart," counter using global scope : "+counter);

return(0);

}

这甚至是一些Eas中错误的原因(如果EA没有考虑到变量在时间框架或符号改变时不会被重置,那么EA工作中就会发生一些非常奇怪的错误)。

 
mladen:
dasio 从代码中我看不出该代码的意图是什么。总之,这里有一段代码,你可以选择是否使用真实范围作为指标的 "基本 "值(这是你代码的第一部分),或者你希望使用你代码的第二部分作为 "基本 "值

再一次谢谢你mladen。

是否可以根据这个条件再加一条线?

画一条水平线= 始终基于天数的Work[]>Avg[]的常数?

谢谢你。

 

信号修正

嗨,Mladen。

我想在这段代码中加入停止卖出或停止买入的信号.....,例如,如果随机信号线超过主线,停止卖出等,我把它添加到代码中,但它没有工作...请帮助

如果(Period()==240)

{

static datetime lastAlerted=0;

double ist_main=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,0) 。

double ist_signal=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_SIGNAL,0);

double RSIP1=iRSI(NULL,240,14,PRICE_CLOSE,0);

double RSIP2=iRSI(NULL,240,70,PRICE_CLOSE,0);

double b4enCCI=iCCI(NULL,240,6,PRICE_TYPICAL,1);

double nowenCCI=iCCI(NULL,240,6,PRICE_TYPICAL,0);

double b4trCCI=iCCI(NULL,240,14,PRICE_TYPICAL,1);

double nowtrCCI=iCCI(NULL,240,14,PRICE_TYPICAL,0);

// 警报

如果((ist_main>ist_signal)&&(RSIP1>RSIP2)&&(nowenCCI>0&&nowenCCI>b4enCCI)&&(nowtrCCI>0&&nowtrCCI>b4trCCI)&&(lastAlerted! =Time[0])

{

lastAlerted=Time[0]; Alert("Buy Arrow","\n","当前时间 是",TimeToStr(CurTime()),"\n",Symbol())。

}

如果((ist_main<ist_signal)&&(RSIP1<RSIP2)&&(nowenCCI<0&&nowenCCI<b4enCCI)&&(nowtrCCI<0&&nowtrCCI<b4trCCI)&&(lastAlerted! =Time[0])

{

lastAlerted=Time[0]; Alert("Sell Arrow","/n", "当前时间是",TimeToStr(CurTime()),"/n",Symbol())。

}

}

 

你可以试试这样的方法。

if(Period()==240)

{

static datetime lastAlerted=0;

double ist_main=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MOD E_MAIN,0);

double ist_signal=iStochastic(NULL,240,8,3,3,MODE_SMA,0,M ODE_SIGNAL,0);

double RSIP1=iRSI(NULL,240,14,PRICE_CLOSE,0);

double RSIP2=iRSI(NULL,240,70,PRICE_CLOSE,0);

double b4enCCI=iCCI(NULL,240,6,PRICE_TYPICAL,1);

double nowenCCI=iCCI(NULL,240,6,PRICE_TYPICAL,0);

double b4trCCI=iCCI(NULL,240,14,PRICE_TYPICAL,1);

double nowtrCCI=iCCI(NULL,240,14,PRICE_TYPICAL,0);

// alerts

alertType = "do nothing";

if((ist_main>ist_signal)&&(RSIP1>RSIP2)&&(nowenCCI >0&&nowenCCI>b4enCCI)&&(nowtrCCI>0&&nowtrCCI>b4trC CI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Time[0]; Alert("Buy Arrow","\n","Current time is ",TimeToStr(CurTime()),"\n",Symbol()); alertType="buy";

}

if((ist_main<ist_signal)&&(RSIP1<RSIP2)&&(nowenCCI <0&&nowenCCI<b4enCCI)&&(nowtrCCI<0&&nowtrCCI<b4trC CI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Time[0]; Alert("Sell Arrow","\n","Current time is ",TimeToStr(CurTime()),"\n",Symbol()); alertType="sell";

}

if (alertType=="do nothing")

{

lastAlerted=Time[0]; Alert("Stop previous action","\n","Current time is ",TimeToStr(CurTime()),"\n",Symbol());

}

}
Mastercash:
嗨,Mladen。

我想在这段代码中添加停止卖出或停止买入的信号.....,例如,如果随机信号线超过主线,停止卖出等,我把它添加到代码中,但它不工作...请帮助

如果(Period()==240)

{

static datetime lastAlerted=0;

double ist_main=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,0) 。

double ist_signal=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_SIGNAL,0);

double RSIP1=iRSI(NULL,240,14,PRICE_CLOSE,0);

double RSIP2=iRSI(NULL,240,70,PRICE_CLOSE,0);

double b4enCCI=iCCI(NULL,240,6,PRICE_TYPICAL,1);

double nowenCCI=iCCI(NULL,240,6,PRICE_TYPICAL,0);

double b4trCCI=iCCI(NULL,240,14,PRICE_TYPICAL,1);

double nowtrCCI=iCCI(NULL,240,14,PRICE_TYPICAL,0);

// 警报

如果((ist_main>ist_signal)&&(RSIP1>RSIP2)&&(nowenCCI>0&&nowenCCI>b4enCCI)&&(nowtrCCI>0&&nowtrCCI>b4trCCI)&&(lastAlerted! =Time[0])

{

lastAlerted=Time[0]; Alert("Buy Arrow","\n", "当前时间是",TimeToStr(CurTime()),"\n",Symbol())。

}

如果((ist_main<ist_signal)&&(RSIP1<RSIP2)&&(nowenCCI<0&&nowenCCI<b4enCCI)&&(nowtrCCI<0&&nowtrCCI<b4trCCI)&&(lastAlerted! =Time[0])

{

lastAlerted=Time[0]; Alert("Sell Arrow","/n", "当前时间是",TimeToStr(CurTime()),"/n",Symbol())。

}

}
 

好吧,我又被卡住了。由于我的代码的结构方式,我正试图纠正EA对未来的观察。

我的信号代码以一个 "如果 "开始,只要这个 "如果 "为真,后面的代码就会继续执行,因为它应该这样做(在插入第一个for循环之前,这不是一个问题,但现在它是)。所以我已经尝试了很多不同的方法来纠正这个问题,但是没有任何方法是有效的 ,我也检查了 手册,但是没有发现任何问题,也许在同一个块中有两个 "for "循环是不允许的?

这是我认为我最好的努力(为了简洁起见,只显示了LONG),没有错误,但EA没有交易,所以可能我又把循环搞砸了。

如果(NumOrders == 0)

{

if(TwentyOneEMA > FiftyFiveEMA+Separation)

{

如果(trendCurr>0)

{

for(int i=0; i<=lookbackma; i++)

int testValue1 = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i) 。

int testValue2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i);

如果(testValue1 < testValue2-Separation2)

{

如果(Bid TwentyOneEMA)//新闻过滤器

{

for(i=0; i<=lookback; i++)

{

int testValue3 = iCustom(NULL,StepMaTimeFrame, "StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percent,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+i);

如果(testValue3 <0 && NumOrders < maxorders)返回(LONG)。

}

return(NONE);

}

}

}

}

}

==========

注意,我试过如果(testValue1 < testValue2-Separation2)继续;但它将'继续'标记为错误 如果不允许有2个循环,那么我想我的下一个任务是添加另一个循环,这可能是误导。

 
jayjonbeach:
好吧,我又被卡住了。 由于我的代码的结构方式,我正试图纠正EA对未来的展望。

我的信号代码以一个 "if "开头,只要这个 "if "为真,后面的代码就会一直执行,因为它应该这样(在插入第一个for循环之前,这不是一个问题,但现在它是)。所以我已经尝试了很多不同的方法来纠正这个问题,但是没有任何方法是有效的 ,我也检查了手册,但是没有发现任何问题,也许在同一个块中有两个 "for "循环是不允许的?

这是我认为我最好的努力(为了简洁起见,只显示了LONG),没有错误,但EA没有交易,所以可能我又把循环搞砸了。

如果(NumOrders == 0)

{

if(TwentyOneEMA > FiftyFiveEMA+Separation)

{

如果(trendCurr>0)

{

for(int i=0; i<=lookbackma; i++)

int testValue1 = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i) 。

int testValue2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i);

如果(testValue1 < testValue2-Separation2)

{

如果(Bid TwentyOneEMA)//新闻过滤器

{

for(i=0; i<=lookback; i++)

{

int testValue3 = iCustom(NULL,StepMaTimeFrame, "StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percent,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+i);

如果(testValue3 <0 && NumOrders < maxorders)返回(LONG)。

}

return(NONE);

}

}

}

}

}

==========

注意我试过如果(testValue1 < testValue2-Separation2)继续;但它把'继续'标记为一个错误 如果2个循环是不允许的,那么我想我的下一个任务是添加另一个循环可能是误导...

好吧,我想我明白了,这是我构造for循环的方式,因为事情不会在第一个循环后直接 "结束",它的结构需要与第二个循环稍有不同,至少这是我看了一些其他机器人后得出的结论。 快速测试显示以下工作,但要做更多的测试

NumOrders = CalculateCurrentOrders();

如果(NumOrders == 0)

{

如果(TwentyOneEMA > FiftyFiveEMA+Separation)

{

如果(trendCurr>0)

{

for(int i=0; i<=lookbackma; i++)

{

int testValue1 = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i) 。

int testValue2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i);

如果(testValue1 <! testValue2-Separation2)

{

Print("没有交易")。

休息。

}

如果(Bid TwentyOneEMA)继续; // 新闻过滤器

for(int j=0; j<=lookback; j++)

{

int testValue3 = iCustom(NULL,StepMaTimeFrame, "StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percent,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+j);

如果(testValue3 <0 && NumOrders < maxorders)返回(LONG)。

}

return(NONE);

}

}

}

}

原因: