여러 쌍을 사용할 때 EA 충돌... - 페이지 2

 
DomGilberto :
죄송합니다 - 제대로 설명하지 못한 제 잘못입니다. D1, 4시간, 마지막으로 1시간을 살펴보고 MA가 떨어져 나가도록 합니다(많은 다른 필터 중) - 일단 모두 정렬되면 H1에서 막대가 21 EMA ONCE로 다시 당겨질 때까지 기다린 다음 거기에서 최고점 위의 주문과 60 EMA - ATR 아래의 스탑을 배치합니다.

21 EMA로의 철회는 한 번만 발생합니다. 거기에서 21 EMA에 대한 풀백을 찾는 것을 중단합니다. 그러나 해야 할 일은 현재 열려 있는 PENDING 주문이 매시간 마감 후 로트, 스탑 및 수익을 정확하게 최신 상태로 유지하도록 하는 것입니다. 그러나 나는 해결할 수 없습니다. 왜 때로는 완벽하게 작동하고 모든 H1 마감 후에 보류 주문을 업데이트하고 다른 때는 그렇지 않습니까? 보류 중인 주문이 자체적으로 업데이트되는 이유는 " " if (OrderStopLoss() < iMA ( NULL , 60 , MA_Period, 0 , 1 , 0 , 0 ) - ATR) " 때문입니다.

그것이 사실이 아니라면 그렇게 하지 않을 것입니다. 그러나 그것이 사실인 경우가 셀 수 없이 많지만, 주문을 삭제하지 않고 새 값으로 새 주문을 배치하지 않습니까?

비디오와 관련하여 위의 해당 코드에서 무언가를 볼 수 있는지 확실하지 않습니까? (수정한 첫 번째 코드). 더 명확하기를 바라십니까?

힘들고 힘든 일을 하셔야 한다고 생각합니다. . . 관련 변수를 인쇄하고, Strategy Tester 에서 시간을 이동하고, 필요한 경우 틱별로 틱, 변수가 무엇인지 확인합니다. . . 그런 다음 그들이 어떤 일이 일어나도록 해야 한다고 생각하고 그들이 하지 않았다면 그 코드에 집중할 수 있습니다.

다른 사람의 코드에서 간단한 구문 문제를 발견하는 것은 상대적으로 쉽고, 전략을 코딩할 때 오류를 발견하는 것이 더 어렵고 훨씬 더 많은 시간이 소요됩니다. 코딩을 하는 사람이 더 좋습니다.

 
네 맞아요! 지금 바로 할게요 :) Raptor 감사합니다!
 
내 머리에서 분명히해야 할 한 가지는 다음과 같습니다. 루프에서 이 코드는 OrderDelete() 함수 를 수행하고 루프 가 모든 H1 닫기에서 반복되는지 어떻게 확인합니까? 루프가 H1 기반으로 수행되는지 여부를 나타내는 "int start"에 이것을 가지고 있기 때문입니까? ("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 닫기에서 반복되는지 어떻게 확인합니까? 루프가 H1 기반으로 수행되는지 여부를 나타내는 "int start"에 이것을 가지고 있기 때문입니까? ("IsNewCandle()") ?


CheckForMATrade()는 새 H1 막대의 시작 부분에 한 번 있을 H1 차트에서 실행 중인 경우 새 막대당 한 번 호출됩니다. . . 나머지는 매 틱마다 실행됩니다.

새 막대의 시작에 대해 올바른 ATR 값을 계산하고 있습니까? 방금 Bar 0을 시작했다는 것을 염두에 두고 Bar 0을 기반으로 MA를 받고 싶습니까? 지표는 내 것이 아니므로 내가 틀렸다고 생각하지 마십시오.

 
예, MA-ATR 수학을 다시 확인 하기 위해 방금 인쇄했습니다. 맞습니다. 저는 Bar 1(가장 최근에 닫은 H1 bar)에서 하고 있습니다. 수학은 정확합니다. 계산이 모든 H1 Bar 닫기에서 일관되게 수행되고 있다고 생각하지 않습니다...
 
DomGilberto :
예, MA-ATR 수학을 다시 확인하기 위해 방금 인쇄했습니다. 맞습니다. 저는 Bar 1(가장 최근에 닫은 H1 bar)에서 하고 있습니다. 수학은 정확합니다. 계산이 모든 H1 Bar 닫기에서 일관되게 수행되고 있다고 생각하지 않습니다...

MA는 막대 1에 있지 않습니다. . .

 iMA ( NULL , 60 , MA_Period, 0 , 1 , 0 , 0    ) - ATR)  
 
좋은 점 - 감사합니다 :) 주문을 삭제하지 않는 이유를 알 것 같습니다... OrderStopLoss가 MA-ATR보다 > 아닌 경우 아무 작업도 수행하지 않을 것입니다... 그래서 이해가 됩니다... 그냥 가끔 봅니다. 마치 주문을 삭제하고 필요할 때 새 주문을 하고 싶지 않은 것처럼요?

괜찮으시다면 마지막 질문입니다. 이 poxy Order Modify 오류 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보다 > 아닌 경우 아무 작업도 수행하지 않을 것입니다... 그래서 이해가 됩니다... 그냥 가끔 봅니다. 마치 주문을 삭제하고 필요할 때 새 주문을 하고 싶지 않은 것처럼요?

괜찮으시다면 마지막 질문입니다. 이 poxy Order Modify 오류 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 - 이 비디오가 정말 잘 설명되어 있기를 바랍니다!! :디


도움이 되지 않으셔도 걱정마세요 :)

     // 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.
      }
 
어떤 아이디어?