[警告关闭!]任何新手问题,为了不给论坛添乱。专业人士,不要走过。没有你,哪里都不能去。 - 页 842 1...835836837838839840841842843844845846847848849...1145 新评论 Alexey Subbotin 2010.09.11 06:34 #8411 你把订单修改放在与开盘相同的区块中,其条件是没有订单。事实证明,你刚刚开了一个订单,并立即试图修改它 - 但5点的利润从何而来? a11adin 2010.09.11 12:57 #8412 大家好!最近对移动平均线产生了兴趣。我找到了一些移动平均线和交易条件的组合,并决定检查我的TS,它是否有利可图,如果有的话,对它进行优化。但我的专家顾问在测试期间没有打开交易。我花了整整一个晚上试图找出解决方案,并决定询问你们,亲爱的程序员。为了理解EA的工作原理,我将简要解释我的TS:在带有EMA(13)和EMA(55)的图表上,如果一个条形图穿过EMA(13),并且所有随后的条形图都高于/低于EMA(13),那么在触及MA(13)的价格时,我们在之前条形图的方向上开仓(在穿过+至少9且不超过23后)。获利60点,止损=EMA(55)加上减去5点。这实际上是整个战略。为了更好地说明问题,我贴出了一个例子。 这里是专家顾问的代码。 //+------------------------------------------------------------------+ //| DWM.mq4 | //| Copyright © 2010, Bobkov Vasiliy | //| http://www.forex4you.ru | //+------------------------------------------------------------------+ #property copyright "Copyright © 2010, Bobkov Vasiliy" #property link "http://mql4.com" extern double Lot=0.1; extern int FastMA=13; //Быстрая МА extern int SlowMA=54; //МедленнаяМА extern int TP=60; //Тейк профит extern int MinBars=8; //Минимальное кол-во баров вне МА extern int MaxBars=25; //Максимальное кол-во баров вне МА extern int slippage=3; //Слипадж extern int Magic=347586; //Магическое число extern int Space=10; //Отступ от МА при тралле ордеров //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- if (OrderCheck()==true) //Проверяем, есть ли ордер... { //...если ордер есть... Trall(); //Траллим return (0); } else //...если нет открытых позиций то... { double FMA=MA(0); double SMA=iMA(NULL,0,SlowMA,0,MODE_EMA,PRICE_CLOSE,0); for (int x=1;;x++) //Вычесляем сколько баров вне МА... { if (MA(x)<High[x]&& MA(x)>Low[x]) break; } if (Bid==FMA && x>MinBars && x<MaxBars) //Если условия выполняются, то... { if (FMA>SMA ) OrdOpen(0,SMA); //...открывем сделку на покупку if (FMA<SMA) OrdOpen(1,SMA); //...или на продажу } } //---- return(0); } //+------------------------------------------------------------------+ bool OrderCheck() //Функция проверки позиций { for(int i=1;i<=OrdersTotal();i++) { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) return(true); } else Print("OrderSelect() вернул ошибку - ",GetLastError()); } return(false); } void OrdOpen(int type,double SO) //Функция открытия позиций { if (type==0) { if (OrderSend(Symbol(),0,Lot,Ask,slippage,SO-Space*Point,Ask+TP*Point,NULL,Magic,0,Blue)==true) return; else Print("OrderSend() вернул ошибку - ",GetLastError()); } else { if (OrderSend(Symbol(),0,Lot,Bid,slippage,SO+Space*Point,Bid-TP*Point,NULL,Magic,0,Blue)==true) return; else Print("OrderSend() вернул ошибку - ",GetLastError()); } return; } void Trall() //Трейллинг стоп { if (OrderSelect(Magic,SELECT_BY_TICKET)==true) { double SL=iMA(NULL,0,SlowMA,0,MODE_EMA,PRICE_CLOSE,0); if (Bid<iMA(NULL,0,SlowMA,0,MODE_EMA,PRICE_CLOSE,0)) SL=SL+Space*Point; else SL=SL-Space*Point; if (OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(SL,Digits),OrderTakeProfit(),0,Blue)==true) return; else Print("OrderModify() вернул ошибку - ",GetLastError()); } return; } double MA(int m) //Функция возвращающая значение МА { return(iMA(NULL,0,FastMA,m,MODE_EMA,PRICE_CLOSE,0)); } 如果有人能提供帮助,请。我也会给你EA本身 附加的文件: dwm.mq4 5 kb Oleg 2010.09.11 19:52 #8413 许多功能可以收集在一个for-cycle中,以打开、改变、关闭位置,等等。 下面是一个简单的例子。 bool Ans=OrderModify(Ticket,Price,SL,TP,0); if (Ans==true) { Alert ("Ордер ",Text,Ticket," модифицирован:)"); break; // Из цикла модифи. } - 问题:这里使用 "break "而不是 "return "是否正确?有什么区别吗? Andrey F. Zelinsky 2010.09.11 19:56 #8414 chief2000: 许多功能可以收集在一个for-cycle中,以打开、改变、关闭位置,等等。 下面是一个简单的例子。 - 问题:这里使用 "break "而不是 "return "是否正确?有什么区别吗? 从https://docs.mql4.com/ru/basis/operators/break。 "break"语句停止执行最近的嵌套的外部switch、while或for语句。控制权交给了紧随其后的操作者,结束了"。 从https://docs.mql4.com/ru/basis/operators/return。 "返回 语句终止当前函数并将控制权返回给调用程序。" 答案:这里用 "打破 "是正确的。 Oleg 2010.09.11 20:12 #8415 abolk: 从https://docs.mql4.com/ru/basis/operators/break。 "break"操作符终止最近的嵌套外部开关、while或for操作符的执行。控制权被转移到紧随其后的操作者身上,结束了"。 从https://docs.mql4.com/ru/basis/operators/return。 "返回 操作符终止当前函数并将控制权返回给调用程序。" 答案:这里用 "打破 "是正确的。 其实我自己也用break,但以为return是指tick的变化(而break则不是)。 在现实中,在订单发生变化之前,会有一个变化的tick,所以为了让测试人员正确模拟情况 你需要使用返回。对吗? 也许我搞错了,但我想了解它。 Andrey F. Zelinsky 2010.09.11 20:26 #8416 chief2000: 其实我自己也用break,但我以为return是指刻度变化 (而break不是)。 在现实中,直到订单发生变化,才会发生嘀嗒声的变化,因此测试人员必须使用回车来正确模拟这种情况。 你需要使用返回。对吗? 也许我弄错了,但我想了解它。 让我们在文档中阅读。"返回 操作符停止执行当前函数,并将控制权返回给调用程序。" 如果是当前的start()函数,再次阅读文档。 https://docs.mql4.com/ru/runtime/start "当一个新的报价到来时,附加的专家顾问和自定义指标的函数start()被执行。如果在一个新的报价到来时,在前一个报价上运行的函数start()被执行,那么进入的报价将被专家顾问忽略。所有在程序执行过程中出现的新引号都会被忽略,直到start()函数的下一次执行结束。此后,函数start()将只在下一个新报价到达后启动。 Oleg 2010.09.11 20:42 #8417 abolk: 在文件中阅读。"返回 语句终止当前函数 并将控制权返回给调用程序。" 如果当前函数是start(),再次阅读文档。 https://docs.mql4.com/ru/runtime/start "当新的报价到来时,函数start()将被执行,用于连接专家顾问和自定义指标。如果在一个新的报价到来时,在前一个报价上运行的函数start()被执行,那么进入的报价将被专家顾问忽略。所有在程序执行过程中出现的新引号都会被忽略,直到start()函数的下一次执行结束。此后,函数start()将只在下一个新报价到达后启动。 我希望你能用你自己的话说出来。我不明白你的意思。 在测试器中,如果for是以break结束的,并且有其他函数跟随它,它将在同一个tick上被执行。但实际上,在这段时间内(在修改订单的同时)可能会有几个点位发生变化。这就是为什么我认为回归是更现实的。不是吗? Andrey F. Zelinsky 2010.09.11 20:51 #8418 chief2000: 我希望你能用你自己的话说出来。我不明白你的意思。 如果for是以break结束的,并且后面有其他函数,它将在同一个tick上执行。但实际上,在这段时间内(在修改订单的同时)可能会有几个点位发生变化。这就是为什么我认为回归是更现实的。不是吗? start()从一个tick的开始开始,到下一个tick的开始可能还没有完成。 break终止为,而return终止为函数。如果for后面没有运算符,那么对于这种算法来说,使用for和return是没有区别的。 但每个操作员都有其目的。而非故意使用操作者就像没有子弹的猎枪。 同样,在for循环算法中,由于某种原因不需要继续执行该函数,我们可以使用return。 换句话说,如果算法需要在循环中中断,那么就使用中断,即使函数在循环后仍被终止。 Oleg 2010.09.11 21:36 #8419 abolk: start()在一个tick开始时开始工作,它的工作可能在下一个tick开始时还没有结束。 break完成为,return完成为函数。如果for后面没有运算符,那么这个算法使用for和return就没有区别。 但每个操作员都有其目的。而非故意使用操作者就像没有子弹的猎枪。 同样,在for循环算法中,由于某种原因不需要继续执行该函数,我们可以使用return。 换句话说,如果算法要求我们打破循环,我们就放上break,即使函数在循环之后还是终止了。 我突然想到,既然这一切只是为了测试者,我们可以(在必要时)做以下工作。 if(IsTesting()==true || IsOptimization()==true) { return; } break; 谢谢你! Andrey F. Zelinsky 2010.09.11 21:38 #8420 chief2000: 出现了一个想法--既然这只是为一个测试者开始的,你可以(在适当的地方)做以下事情。 谢谢你! 你可以 1...835836837838839840841842843844845846847848849...1145 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
大家好!最近对移动平均线产生了兴趣。我找到了一些移动平均线和交易条件的组合,并决定检查我的TS,它是否有利可图,如果有的话,对它进行优化。但我的专家顾问在测试期间没有打开交易。我花了整整一个晚上试图找出解决方案,并决定询问你们,亲爱的程序员。为了理解EA的工作原理,我将简要解释我的TS:在带有EMA(13)和EMA(55)的图表上,如果一个条形图穿过EMA(13),并且所有随后的条形图都高于/低于EMA(13),那么在触及MA(13)的价格时,我们在之前条形图的方向上开仓(在穿过+至少9且不超过23后)。获利60点,止损=EMA(55)加上减去5点。这实际上是整个战略。为了更好地说明问题,我贴出了一个例子。
这里是专家顾问的代码。
如果有人能提供帮助,请。我也会给你EA本身
许多功能可以收集在一个for-cycle中,以打开、改变、关闭位置,等等。
下面是一个简单的例子。
- 问题:这里使用 "break "而不是 "return "是否正确?有什么区别吗?
许多功能可以收集在一个for-cycle中,以打开、改变、关闭位置,等等。
下面是一个简单的例子。
- 问题:这里使用 "break "而不是 "return "是否正确?有什么区别吗?
从https://docs.mql4.com/ru/basis/operators/break。
"break"语句停止执行最近的嵌套的外部switch、while或for语句。控制权交给了紧随其后的操作者,结束了"。
从https://docs.mql4.com/ru/basis/operators/return。
"返回 语句终止当前函数并将控制权返回给调用程序。"
答案:这里用 "打破 "是正确的。
从https://docs.mql4.com/ru/basis/operators/break。
"break"操作符终止最近的嵌套外部开关、while或for操作符的执行。控制权被转移到紧随其后的操作者身上,结束了"。
从https://docs.mql4.com/ru/basis/operators/return。
"返回 操作符终止当前函数并将控制权返回给调用程序。"
答案:这里用 "打破 "是正确的。
其实我自己也用break,但以为return是指tick的变化(而break则不是)。
在现实中,在订单发生变化之前,会有一个变化的tick,所以为了让测试人员正确模拟情况
你需要使用返回。对吗?
也许我搞错了,但我想了解它。
其实我自己也用break,但我以为return是指刻度变化 (而break不是)。
在现实中,直到订单发生变化,才会发生嘀嗒声的变化,因此测试人员必须使用回车来正确模拟这种情况。
你需要使用返回。对吗?
也许我弄错了,但我想了解它。
让我们在文档中阅读。"返回 操作符停止执行当前函数,并将控制权返回给调用程序。"
如果是当前的start()函数,再次阅读文档。
https://docs.mql4.com/ru/runtime/start
"当一个新的报价到来时,附加的专家顾问和自定义指标的函数start()被执行。如果在一个新的报价到来时,在前一个报价上运行的函数start()被执行,那么进入的报价将被专家顾问忽略。所有在程序执行过程中出现的新引号都会被忽略,直到start()函数的下一次执行结束。此后,函数start()将只在下一个新报价到达后启动。
在文件中阅读。"返回 语句终止当前函数 并将控制权返回给调用程序。"
如果当前函数是start(),再次阅读文档。
https://docs.mql4.com/ru/runtime/start
"当新的报价到来时,函数start()将被执行,用于连接专家顾问和自定义指标。如果在一个新的报价到来时,在前一个报价上运行的函数start()被执行,那么进入的报价将被专家顾问忽略。所有在程序执行过程中出现的新引号都会被忽略,直到start()函数的下一次执行结束。此后,函数start()将只在下一个新报价到达后启动。
我希望你能用你自己的话说出来。我不明白你的意思。
在测试器中,如果for是以break结束的,并且有其他函数跟随它,它将在同一个tick上被执行。但实际上,在这段时间内(在修改订单的同时)可能会有几个点位发生变化。这就是为什么我认为回归是更现实的。不是吗?
我希望你能用你自己的话说出来。我不明白你的意思。
如果for是以break结束的,并且后面有其他函数,它将在同一个tick上执行。但实际上,在这段时间内(在修改订单的同时)可能会有几个点位发生变化。这就是为什么我认为回归是更现实的。不是吗?
start()从一个tick的开始开始,到下一个tick的开始可能还没有完成。
break终止为,而return终止为函数。如果for后面没有运算符,那么对于这种算法来说,使用for和return是没有区别的。
但每个操作员都有其目的。而非故意使用操作者就像没有子弹的猎枪。
同样,在for循环算法中,由于某种原因不需要继续执行该函数,我们可以使用return。
换句话说,如果算法需要在循环中中断,那么就使用中断,即使函数在循环后仍被终止。
start()在一个tick开始时开始工作,它的工作可能在下一个tick开始时还没有结束。
break完成为,return完成为函数。如果for后面没有运算符,那么这个算法使用for和return就没有区别。
但每个操作员都有其目的。而非故意使用操作者就像没有子弹的猎枪。
同样,在for循环算法中,由于某种原因不需要继续执行该函数,我们可以使用return。
换句话说,如果算法要求我们打破循环,我们就放上break,即使函数在循环之后还是终止了。
我突然想到,既然这一切只是为了测试者,我们可以(在必要时)做以下工作。
谢谢你!
出现了一个想法--既然这只是为一个测试者开始的,你可以(在适当的地方)做以下事情。
谢谢你!
你可以