[警告关闭!]任何新手问题,为了不给论坛添乱。专业人士,不要走过。没有你,哪里都不能去。 - 页 842

 
你把订单修改放在与开盘相同的区块中,其条件是没有订单。事实证明,你刚刚开了一个订单,并立即试图修改它 - 但5点的利润从何而来?
 

大家好!最近对移动平均线产生了兴趣。我找到了一些移动平均线和交易条件的组合,并决定检查我的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
 

许多功能可以收集在一个for-cycle中,以打开、改变、关闭位置,等等。

下面是一个简单的例子。

            bool Ans=OrderModify(Ticket,Price,SL,TP,0);
            if (Ans==true) {
               Alert ("Ордер ",Text,Ticket," модифицирован:)");
               break;                           // Из цикла модифи.
            }

- 问题:这里使用 "break "而不是 "return "是否正确?有什么区别吗?

 
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。
"返回 语句终止当前函数并将控制权返回给调用程序。"

答案:这里用 "打破 "是正确的。

 
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,所以为了让测试人员正确模拟情况

你需要使用返回。对吗?

也许我搞错了,但我想了解它。

 
chief2000:

其实我自己也用break,但我以为return是指刻度变化 (而break不是)。

在现实中,直到订单发生变化,才会发生嘀嗒声的变化,因此测试人员必须使用回车来正确模拟这种情况。

你需要使用返回。对吗?

也许我弄错了,但我想了解它。

让我们在文档中阅读。"返回 操作符停止执行当前函数,并将控制权返回给调用程序。"

如果是当前的start()函数,再次阅读文档。

https://docs.mql4.com/ru/runtime/start
"当一个新的报价到来时,附加的专家顾问和自定义指标的函数start()被执行。如果在一个新的报价到来时,在前一个报价上运行的函数start()被执行,那么进入的报价将被专家顾问忽略。所有在程序执行过程中出现的新引号都会被忽略,直到start()函数的下一次执行结束。此后,函数start()将只在下一个新报价到达后启动。

 
abolk:

在文件中阅读。"返回 语句终止当前函数 并将控制权返回给调用程序。"

如果当前函数是start(),再次阅读文档。

https://docs.mql4.com/ru/runtime/start
"当新的报价到来时,函数start()将被执行,用于连接专家顾问和自定义指标。如果在一个新的报价到来时,在前一个报价上运行的函数start()被执行,那么进入的报价将被专家顾问忽略。所有在程序执行过程中出现的新引号都会被忽略,直到start()函数的下一次执行结束。此后,函数start()将只在下一个新报价到达后启动。

我希望你能用你自己的话说出来。我不明白你的意思。

在测试器中,如果for是以break结束的,并且有其他函数跟随它,它将在同一个tick上被执行。但实际上,在这段时间内(在修改订单的同时)可能会有几个点位发生变化。这就是为什么我认为回归是更现实的。不是吗?

 
chief2000:

我希望你能用你自己的话说出来。我不明白你的意思。

如果for是以break结束的,并且后面有其他函数,它将在同一个tick上执行。但实际上,在这段时间内(在修改订单的同时)可能会有几个点位发生变化。这就是为什么我认为回归是更现实的。不是吗?


start()从一个tick的开始开始,到下一个tick的开始可能还没有完成。

break终止为,而return终止为函数。如果for后面没有运算符,那么对于这种算法来说,使用for和return是没有区别的。

但每个操作员都有其目的。而非故意使用操作者就像没有子弹的猎枪。

同样,在for循环算法中,由于某种原因不需要继续执行该函数,我们可以使用return。

换句话说,如果算法需要在循环中中断,那么就使用中断,即使函数在循环后仍被终止。

 
abolk:


start()在一个tick开始时开始工作,它的工作可能在下一个tick开始时还没有结束。

break完成为,return完成为函数。如果for后面没有运算符,那么这个算法使用for和return就没有区别。

但每个操作员都有其目的。而非故意使用操作者就像没有子弹的猎枪。

同样,在for循环算法中,由于某种原因不需要继续执行该函数,我们可以使用return。

换句话说,如果算法要求我们打破循环,我们就放上break,即使函数在循环之后还是终止了。

我突然想到,既然这一切只是为了测试者,我们可以(在必要时)做以下工作。

if(IsTesting()==true   ||   IsOptimization()==true) {
   return;
}

break;

谢谢你!

 
chief2000:

出现了一个想法--既然这只是为一个测试者开始的,你可以(在适当的地方)做以下事情。

谢谢你!


你可以