在使用多个对子时,EA发生冲突... - 页 2

 
DomGilberto:
对不起 - 这是我的错,我没有解释清楚。我在D1、4Hr和1Hr上查看MA的扇形分布(在其他过滤器中)--一旦它们都排好队,在H1上,它将等待任何条形回拉到21 EMA一次,然后从那里它将在高点以上下单,并在60 EMA以下停止--ATR。

回撤到21 EMA的情况只发生一次。从那里开始,它将停止寻找对21 EMA的任何回撤。然而,它应该做的是,确保当前打开的待定订单与每小时收盘后的手数、止损和获利都是准确的更新。然而,我无法理解,为什么有时它能完美地工作,并在每个H1收盘后更新挂单,而有时却不能?为什么挂单会自行更新的原因是""if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0,1, 0, 0)) - ATR)"。

如果这不是真的,那么它就不会 - 然而,有无数次,当这是真的,但它不会删除订单并以新的价值放置一个新的订单?

不知道你是否能在上面的代码中看到与视频有关的东西?(你纠正的第一个代码)。希望这更清楚?

我认为你必须以艰难的方式来做......打印相关的变量,在策略测试器中 通过时间移动,如果需要的话,逐点验证变量是什么......然后如果你发现它们应该使某些事情发生,而它们没有,你可以专注于该代码。

发现别人代码中的简单语法问题相对容易,发现其策略编码中的错误则更难,也更耗时,因为要做到这一点,策略的理解必须和做编码的人一样,甚至更好。

 
是的,你是对的。我现在就去做 :) 谢谢Raptor!
 
我需要弄清楚的一件事是;这里的代码,在循环中,我如何确保它正在执行OrderDelete()函数,并且循环是在每个H1收盘时循环?这是因为我在 "int start "处有这个,描述了循环是否在H1基础上完成?("IsNewCandle()")

int start()
 {
   if(IsNewCandle())
      {
      CheckForMaTrade();//signals, deletions and candle trails only need checked on a new candle.
      }

   if(OpenOrdersThisPair(Symbol())>0)
      {
      if(UseMoveToBreakEven)MoveToBreakEven();//Move to b/e, normal trail and MA_trail need to trail on each tick
      if(Use_MA_Trail)MA_Trail();
      }
   
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  
if(OrderSelect(OrderTicket(),SELECT_BY_TICKET, MODE_TRADES)==True)
{  
            
      if(OpenOrdersThisPair(Symbol())>0 && OrderSymbol()==Symbol() && OrderType()==OP_SELL)
         {
         CloseHalfOrder1(); 
         }
   
      if(OpenOrdersThisPair(Symbol())>0 && OrderSymbol()==Symbol() && OrderType()==OP_BUY)
         {
         CloseHalfOrder(); 
         }   
     }
}
 for(int b=OrdersTotal()-1; b>=0; b--)
         {
         if(!OrderSelect(b, SELECT_BY_POS, MODE_TRADES)) continue;
           
         if( OrderType() == OP_BUYSTOP &&
            OrderMagicNumber() == MagicNumber &&
            OrderSymbol() == Symbol() )        
            {
            if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0) - ATR)  
               {
               Stored_BuyPrice = OrderOpenPrice();   
               DeleteOrder = OrderDelete(OrderTicket()); 
               }

            if(OpenOrdersThisPair(Symbol()) == 0 && DeleteOrder)  // If there are no open orders = place a new order. 
               {
               int NewBuyOrder = OrderSend(Symbol(), OP_BUYSTOP, LotSize, Stored_BuyPrice, 3, BuyStopPrice, btp, NULL, MagicNumber, 0, Green);
               if(NewBuyOrder == -1) Print("New Buy Order Last Error = ", GetLastError());
               }
            }
         }
bool IsNewCandle()
   {
   static datetime  Bar1Time;
   if(Bar1Time == Time[1]) //"Time" used to be "Bars" with no brackets 
      return(false);
      
   Bar1Time = Time[1]; //"Time" used to be "Bars" with no brackets 
   return(true);
   }
 
DomGilberto:
我需要弄清楚的一件事是;这里的代码,在循环中,我如何确保它正在执行OrderDelete()函数,并且循环是在每一个H1收盘时循环 的?这是因为我在 "int start "处有这个,描述了循环是否在H1基础上完成?("IsNewCandle()")?


CheckForMATrade()在每个新条上被调用一次,如果你在H1图表上运行,那就是在新的H1条开始时调用一次 ......其余的是在每个点上 执行。

你是否为新条形图的开始计算了正确的ATR值? 考虑到你刚刚开始了第0条,你是否真的想获得基于第0条的MA值?指标不是我的专长,所以不要以为我说你错了,我只是问一下

 
是的,我刚刚做了一个打印,仔细检查了 MA-ATR的计算。它是正确的。我是在第1条(最近关闭的H1条)上做的。数学是正确的,我只是不认为计算是在每一个H1栏关闭时进行的......
 
DomGilberto:
是的,我刚刚做了一个打印,仔细检查了MA-ATR的计算。它是正确的。我是在第1条(最近关闭的H1条)上做的。数学是正确的,我只是不认为计算是在每一个上半年收盘时进行的...。

虽然MA不在第1小节上......。

iMA(NULL, 60, MA_Period, 0, 1, 0, 0   ) - ATR)  
 
好地方 - 谢谢 :)我想我知道为什么它没有删除订单...如果OrderStopLoss不大于MA-ATR,那么它就不会做什么......所以这是有道理的...只是有时我看着它,它好像不想删除订单,而在它应该删除的时候放置一个新的订单?

最后一个问题,如果你不介意的话--我仍然收到这个该死的订单修改错误 1!当我把它打印出来时,发现它是从这里来的?有什么想法吗?

//+----------------------------------------------------------------------------------------------------------------------------------------+  
//Moving Average Trailing Stop Function
//+----------------------------------------------------------------------------------------------------------------------------------------+   
void MA_Trail()

{

   double ATR = iATR(NULL,60,14,1);
   double MA = iMA(NULL,60,MA_Period,0,1,0,1);
   
   double BuyStopPriceMath = MA - ATR;
   double SellStopPriceMath = MA + ATR;
   
   double BuyStopPrice = NormalizeDouble(BuyStopPriceMath,5);
   double SellStopPrice = NormalizeDouble(SellStopPriceMath,5);

   for(int b=OrdersTotal()-1; b>=0; b--)
     {
      if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
               {
               //buy order section - This is where the stop will trail based 
               // upon a fixed point value stated on the EA. It will trail with price.
               if(OrderType()==OP_BUY)
                  {
                  if(OrderStopLoss() > BuyStopPrice) break; 
                  if(OrderStopLoss() < BuyStopPrice)
                     bool BuyModify = OrderModify(OrderTicket(),OrderOpenPrice(),BuyStopPrice,OrderTakeProfit(),0,CLR_NONE);
                   if(!BuyModify)Print(" Buy Trailing Stop Failed: ", GetLastError());
                   }     

               // sell order section - This is where the stop will trail based 
               // upon a fixed point value stated on the EA. It will trail with price.     
               if(OrderType()==OP_SELL)
                  {
                  if(OrderStopLoss() < SellStopPrice) break; 
                  if(OrderStopLoss() > SellStopPrice)
                     bool SellModify = OrderModify(OrderTicket(),OrderOpenPrice(),SellStopPrice,OrderTakeProfit(),0,CLR_NONE);
                  if(!SellModify)Print(" Sell Trailing Stop Failed: ", GetLastError());
                  }
               }   
     }
}
 
DomGilberto:
说得好--谢谢 :)我想我知道为什么它没有删除订单......如果OrderStopLoss不大于MA-ATR,那么它就不会做任何事情......所以这是有道理的...只是有时我看着它,它好像不想删除订单,而在它应该删除的时候放置一个新的订单?

最后一个问题,如果你不介意的话--我仍然收到这个该死的订单修改错误1!当我把它打印出来时,发现它是从这里来的?有什么想法吗?

这就是问题所在 .... (OP_SELL的情况也类似)

if( OrderStopLoss() < BuyStopPrice )

. . . 当你得到一个错误1,这是因为OrderStopLoss() == BuyStopPrice,所以你修改订单,使其具有相同的StopLoss值,因此错误1,所以现在你在想,一方面OrderStopLoss()== BuyStopPrice,另一方面OrderStopLoss()< BuyStopPrice

你有没有按照帖子中的链接阅读,直到你的眼睛出血? 我打赌你没有 . . .https://www.mql5.com/en/forum/146380 如果你继续忽视这个问题,它就会一直抓住你,你就会一直浪费时间 . . . 掌握它,了解它,不要再受它的影响,要快乐起来

 

好吧,我再读一遍所有的内容--回到所附视频的问题上,我认为我已经解决了这个问题,但是,它在买入方面不起作用?由于某些原因,根本就没有交易被触发。然而,在卖出方面,它完全按照我想要的方式工作?

买方的一切都完全颠倒了。所有这些if语句只是移动平均线。我所改变的具体行数是"triggerBarTime+H1_high >= ema21"。在买入方面,它看起来像= "triggerBarTime+H1_low <= ema21" - 如果我去掉 "triggerBarTime",那么它将对买入和卖出订单都有效。然而,如果我保留 "triggerBarTime",它将在卖出方完美地工作(例如,在每一个柱子上关闭订单,完美地重新计算,然后用调整后的参数下一个新订单!)。但在买入方面,却不能下任何订单,也不能尝试做任何事情?这是一个非常重要的调整,我需要做...

请看这个视频 http://screencast.com/t/uJu3nlNxAXDF - 希望这能很好地解释它!:D


如果你不能提供帮助,请不要担心 :)

     // Check for Moving Averages Fanned up ON THE DAILY TIME FRAME, creating an UP bias.   
    if(D1_Bias=="None") 
      if(Daily_3<Daily_5)
         if(Daily_5<Daily_8)
            if(Daily_8<Daily_10)
               if(Daily_10<Daily_12)
                  if(Daily_12<Daily_15)
                     if(Daily_15<Daily_30)
                        if(Daily_30<Daily_35)
                           if(Daily_35<Daily_40)
                              if(Daily_40<Daily_45)
                                 if(Daily_45<Daily_50)
                                    if(Daily_50<Daily_60)
                                       {
                                       D1_Bar=Time[1];
                                       D1_Bias="Daily is Down";
                                       Comment("Bias is: "+D1_Bias+" since: "+TimeToStr(D1_Bar,TIME_DATE|TIME_MINUTES));
                                       }
   
   // Check for Moving Averages Fanned up ON THE 4 HOUR TIME FRAME, creating an UP bias.  
    if(H4_Bias=="None") 
      if(Hour4_3<Hour4_5)
         if(Hour4_5<Hour4_8)
            if(Hour4_8<Hour4_10)
               if(Hour4_10<Hour4_12)
                  if(Hour4_12<Hour4_15)
                     if(Hour4_15<Hour4_30)
                        if(Hour4_30<Hour4_35)
                           if(Hour4_35<Hour4_40)
                              if(Hour4_40<Hour4_45)
                                 if(Hour4_45<Hour4_50)
                                    if(Hour4_50<Hour4_60)
                                       {
                                       H4_Bar=Time[1];
                                       H4_Bias="4 Hour is Down";
                                       Comment("Bias is: "+H4_Bias+" since: "+TimeToStr(H4_Bar,TIME_DATE|TIME_MINUTES));
                                       }
   
   // Check for Moving Averages Fanned down creating an DOWN bias.  
   if(D1_Bias=="Daily is Down" && H4_Bias=="4 Hour is Down" && H1_Bias=="None")
      if(CurrentSmallFish1<CurrentSmallFish2)
         if(CurrentSmallFish2<CurrentSmallFish3)
            if(CurrentSmallFish3<CurrentSmallFish4)
               if(CurrentSmallFish4<CurrentSmallFish5)
                  if(CurrentSmallFish5<CurrentSmallFish6)
                     if(CurrentSmallFish6<CurrentBigFish1)
                        if(CurrentBigFish1<CurrentBigFish2)
                           if(CurrentBigFish2<CurrentBigFish3)
                              if(CurrentBigFish3<CurrentBigFish4)
                                 if(CurrentBigFish4<CurrentBigFish5)
                                    if(CurrentBigFish5<CurrentBigFish6)
                                       {
                                       triggerBarTime=Time[1];
                                       H1_Bias="Down";
                                       Comment("Bias is: "+H1_Bias+" since: "+TimeToStr(triggerBarTime,TIME_DATE|TIME_MINUTES));
                                       H4_Bias="4 Hour is Down";
                                       Comment("Bias is: "+H4_Bias+" since: "+TimeToStr(H4_Bar,TIME_DATE|TIME_MINUTES));
                                       D1_Bias="Daily is Down";
                                       Comment("Bias is: "+D1_Bias+" since: "+TimeToStr(D1_Bar,TIME_DATE|TIME_MINUTES));
                                       }
   
   ///////////////////////////////////////////////////////////////////////////////////////
   
   H1_high  = iHigh(NULL, PERIOD_H1, 1);
   H1_close = iClose(NULL, PERIOD_H1, 1);
   if(H1_Bias=="Down" && H4_Bias=="4 Hour is Down" && D1_Bias=="Daily is Down" && triggerBarTime+H1_high >= ema21 && H1_close < CurrentBigFish6)
      {
      OrderEntry(1); // Sell function is called.
      }
 
有什么想法吗?