여러 쌍을 사용할 때 EA 충돌...

 
우선, Raptor가 이전에 저에게 이 문제를 제기했다는 것을 알고 있습니다. 그러나 어디에 썼는지 기억이 나지 않으며, 더 중요한 것은 제가 어디에서 잘못되고 있는지 이해하는 것입니다.

내가 아는 한 해당 쌍에 연결된 EA가 항상 해당 쌍에서만 작동할 수 있도록 올바르게 작성했습니다. 현재 GBPCAD와 GBPUSD가 작동하지 않는 것으로 나타났습니다. 즉, GBPCAD 손절매는 계산이 GBPUSD 쌍 에 의해 수행된다고 생각합니다... 그래서 보류 주문이 트리거되면 손절매가 GBPCAD 값에서 케이블로 깜박입니다. ....

나는 magicnumber==1234를 사용한다.

내가 멍청한 제안이나 영역이 있으면 언제든지 강조 표시하십시오 :(

 //+-------------------------------------------------------------------------------------+
//| Order Buy Function                                                                  |
//+-------------------------------------------------------------------------------------+   

//Place a pending buystop if no orders exists.. pending or otherwise.
if (direction== 0 )
{ 
       double btp=buy_takeprofit_price;
      
       double Min_Lot = MarketInfo( Symbol (),MODE_MINLOT);

       double Lot_Step = MarketInfo( Symbol (),MODE_LOTSTEP);

       double BuyLotSize =(RiskedAmount/(pips_to_bsl/pips))/ 10 ;
       double Lots = NormalizeDouble (BuyLotSize, 2 );
      LotSize = MathFloor (Lots/Lot_Step)*Lot_Step;

  
       static double Stored_BuyPrice;

       if (OpenOrdersThisPair( Symbol ())== 0 )
         {
         int BuyTicketOrder= OrderSend ( Symbol (),OP_BUYSTOP,LotSize,buyPrice, 3 ,BuyStopPrice,btp, NULL ,MagicNumber, 0 ,Green);  >>>> // I am not sure if its this part? There is no way for this first OrderSend to tell what pair it is?
         if (BuyTicketOrder == - 1 ) Print ( "First Buy Order Last Error = " , GetLastError ());
         } 

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



       for ( int b= OrdersTotal ()- 1 ; b>= 0 ; b--)
         {
         if (! OrderSelect (b,SELECT_BY_POS,MODE_TRADES)) continue ;
           
         if (OrderType()==OP_BUYSTOP) 
             if (OrderMagicNumber()==MagicNumber)
               if (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==True) // 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 ());
            }
      }
} 
 
DomGilberto :
우선, Raptor가 이전에 저에게 이 문제를 제기했다는 것을 알고 있습니다. 그러나 어디에 썼는지 기억이 나지 않으며, 더 중요한 것은 제가 어디에서 잘못되고 있는지 이해하는 것입니다.

내가 아는 한 해당 쌍에 연결된 EA가 항상 해당 쌍에서만 작동할 수 있도록 올바르게 작성했습니다. 현재 GBPCAD와 GBPUSD가 작동하지 않는 것으로 나타났습니다. 즉, GBPCAD 손절매는 계산이 GBPUSD 쌍에 의해 수행된다고 생각합니다... 그래서 보류 주문이 트리거되면 손절매가 GBPCAD 값에서 케이블로 깜박입니다. ....

나는 magicnumber==1234를 사용한다.

내가 멍청한 제안이나 영역이 있으면 언제든지 강조 표시하십시오 :(

귀하의 문제는 명확하지만 중괄호 들여쓰기 및 조건을 사용하는 방식 때문에 보기가 조금 어려울 수 있습니다. . . 당신은 이것을 할:

       for ( int b= OrdersTotal ()- 1 ; b>= 0 ; b--)
         {
         if (! OrderSelect (b,SELECT_BY_POS,MODE_TRADES)) continue ;
           
         if (OrderType()==OP_BUYSTOP) 
             if (OrderMagicNumber()==MagicNumber)
               if (OrderSymbol()== Symbol ())                                   // if the symbol matches do . . . 
                   if (OrderStopLoss()< iMA ( NULL , 60 ,MA_Period, 0 , 1 , 0 , 0 )-ATR)   //  . . . .  this
                        {
                        Stored_BuyPrice = OrderOpenPrice();                 // and this
                        DeleteOrder = OrderDelete(OrderTicket());           // and this
                        }

         if (OpenOrdersThisPair( Symbol ())== 0 && DeleteOrder==True) // If there are no open orders = place a new order.   //  this happens even if the symbol didn't match . . .
            {
             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 ());
            }
      }

내 생각에 당신이 의미한 것은 이것이었습니다. . .

     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 ());
               }
            }
         }
 
아 좋아 - 내가 거기 놓친 작은 작은 것. 또한 첫 번째 OrderSend() 함수 가 호출될 때 거기에서 뭔가 잘못하고 있습니까? 나는 그 시점에서 어느 쌍으로 주문 전송을 보내야 하는지 알고 있는지 여부에 대해 논리적으로 생각하려고 하기 때문에 이것을 묻습니다. 어리석은 질문일 수 있지만 그 부분에 대해 내가 잘못한 것은 아니지 않습니까? "BuyTicketOrder" 보내기 기능 부분?

저를 위해 그 비트를 찾아 주셔서 감사합니다 :)
 
DomGilberto :
아 좋아 - 내가 거기 놓친 작은 작은 것. 또한 첫 번째 OrderSend() 함수가 호출될 때 거기에서 뭔가 잘못하고 있습니까? 나는 그 시점에서 어느 쌍으로 주문 전송을 보내야 하는지 알고 있는지 여부에 대해 논리적으로 생각하려고 하기 때문에 이것을 묻습니다. 어리석은 질문일 수 있지만 그 부분에 대해 내가 잘못한 것은 아니지 않습니까? "BuyTicketOrder" 보내기 기능 부분?

저를 위해 그 비트를 찾아 주셔서 감사합니다 :)
Symbol()은 EA가 실행 중인 차트의 기호입니다. . . 그것은 틀릴 수 없습니다, 그것은 하나의 상징 일 수 있습니다
 
//+----------------------------------------------------------------------------------------------------------------------------------------+  
//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 );

//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.
   for ( int b= OrdersTotal ()- 1 ; b>= 0 ; b--)
     {
       if ( OrderSelect (b,SELECT_BY_POS,MODE_TRADES))
         if (OrderMagicNumber()==MagicNumber)
             if (OrderSymbol()== Symbol ())
               if (OrderType()==OP_BUY)
               {
                 if (OrderStopLoss() > BuyStopPrice) break ; 
                   if (OrderStopLoss() < BuyStopPrice)
                     bool BuyModify = OrderModify(OrderTicket(),OrderOpenPrice(),BuyStopPrice,OrderTakeProfit(), 0 , CLR_NONE );
                     if (BuyModify < 0 ) 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.     
   for ( int s= OrdersTotal ()- 1 ; s>= 0 ; s--)
     {
       if ( OrderSelect (s,SELECT_BY_POS,MODE_TRADES))
         if (OrderMagicNumber()==MagicNumber)
             if (OrderSymbol()== Symbol ())
               if (OrderType()==OP_SELL)
               {
                 if (OrderStopLoss() < SellStopPrice) break ; 
                   if (OrderStopLoss() > SellStopPrice)
                     bool SellModify = OrderModify(OrderTicket(),OrderOpenPrice(),SellStopPrice,OrderTakeProfit(), 0 , CLR_NONE );
                     if (SellModify < 0 ) Print ( " Sell Trailing Stop Failed: " , GetLastError ());
               }   
     }

  }
Ok - 이것이 문제의 원인이라고 생각합니다. 방금 이 부분의 코드를 업데이트했는데 케이블에서 GBPCAD 가격까지 매 틱마다 깜박임을 멈춘 것 같습니다... 이제 이 시간 마감에 자체 업데이트될 때까지 원스톱 가격에 고정되어 있습니다... 그래서 저는 확인하다.

괜찮아 보이나요? 또한 이러한 부분 주문이 닫혀 있기 때문에 "OrderSymbol()==Symbol())"에 대해 중괄호가 올바른 위치에 있는지 다시 확인해야 할 필요가 있다고 가정합니다.
 
if (OpenOrdersThisPair( Symbol ()) == 0
이것을 몇 번이나 부르시겠습니까? 모든 주문(귀하의 코드)에 대해? 현재 차트(RaptorUK의 코드)에 있는 모든 주문 보류 주문에 대해? 또는 보류 중인 항목을 저장하고 삭제한 후 ONCE?
 
DomGilberto :
Ok - 이것이 문제의 원인이라고 생각합니다. 방금 이 부분의 코드를 업데이트했는데 케이블에서 GBPCAD 가격까지 매 틱마다 깜박임을 멈춘 것 같습니다... 이제 이 시간 마감에 자체 업데이트될 때까지 원스톱 가격에 고정되어 있습니다... 그래서 저는 확인하다.

괜찮아 보이나요? 또한 이러한 부분 주문이 닫혀 있기 때문에 "OrderSymbol()==Symbol())"에 대해 중괄호가 올바른 위치에 있는지 다시 확인해야 할 필요가 있다고 가정합니다.

괜찮아 보입니다. 예, 항상 중괄호를 확인 하고 할 수 있는 모든 곳에서 자신의 삶을 더 쉽게 만들 수 있습니다. 만약 그것이 중괄호를 추가하는 것을 의미한다면 그렇게 하되 중괄호와 들여쓰기를 일관되게 사용하십시오.

두 개의 루프가 필요하지 않습니다. 하나는 하면 됩니다. . .

 //+----------------------------------------------------------------------------------------------------------------------------------------+  
//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 ());
                  }
               }   
     }

OrderModify()는 int가 아닌 bool, true 또는 false를 반환합니다. . . 따라서 SellModify는 0보다 작지 않습니다. . . 나는 어제 ForexFactory에서 같은 것을 입력했습니다

 

주문이 삭제될 때마다 - 보류 중인 주문이 1시간마다 삭제되기를 원합니다. 그런 다음 동일한 매개변수로 새 주문이 열리거나 해당하는 경우 " 에 따라 새 정류장, 대상 및 로트 크기 조정이 시작됩니다. (OrderStopLoss() < iMA ( NULL , 60 , MA_Period, 0 , 1 , 0 , 0 ) - ATR) "

새로운 보류 주문(삭제 후)에 대해 저장해야 하는 유일한 것은 해당 특정 설정의 초기 진입 가격입니다. ( Stored_BuyPrice = OrderOpenPrice(); )


위의 첫 번째 코드가 내가 게시하려는 다른 스레드와도 연결되어 있기 때문에 재미있습니다. 비슷한 질문으로 새 주제를 게시하는 대신 여기에 질문하겠습니다. 괜찮으시다면? 아래 링크를 확인하십시오 - 제가 겪고 있는 문제를 설명하는 2분 분량의 비디오로 해결하기 어렵다는 것을 알게 되었습니다...

나는 너무 많은 코드를 작성했지만 이제 그것이 내가 수리해야 하는 비효율의 경우라는 것을 깨닫기 시작했습니다...

비디오: http://screencast.com/t/4nl8AaH8Sag

제한된 양의 코드만 제공하여 이것을 매우 모호하게 만들었다면 더 많은 것을 붙일 것입니까?

 
고마워 랩터 - 네, 방금 알아차렸습니다. 코드가 엉망이었기 때문에 코드를 정리하는 데 시간을 보냈습니다. 위의 예제와 같이 Prints를 사용 하려고 시도하는 것과 같은 아마추어 오류 lol.
 
DomGilberto :

주문이 삭제될 때마다 - 보류 중인 주문이 1시간마다 삭제되기를 원합니다. 그런 다음 동일한 매개변수로 새 주문이 열리거나 해당하는 경우 " 에 따라 새 정류장, 대상 및 로트 크기 조정이 시작됩니다. (OrderStopLoss() < iMA ( NULL , 60 , MA_Period, 0 , 1 , 0 , 0 ) - ATR) "

새로운 보류 주문(삭제 후)에 대해 저장해야 하는 유일한 것은 해당 특정 설정의 초기 진입 가격입니다. ( Stored_BuyPrice = OrderOpenPrice(); )


위의 첫 번째 코드가 내가 게시하려는 다른 스레드와도 연결되어 있기 때문에 재미있습니다. 비슷한 질문으로 새 주제를 게시하는 대신 여기에 질문하겠습니다. 괜찮으시다면? 아래 링크를 확인하십시오 - 제가 겪고 있는 문제를 설명하는 2분 분량의 비디오로 해결하기 어렵다는 것을 알게 되었습니다...

나는 너무 많은 코드를 작성했지만 이제 그것이 내가 수리해야 하는 비효율의 경우라는 것을 깨닫기 시작했습니다...

비디오: http://screencast.com/t/4nl8AaH8Sag

제한된 양의 코드만 제공하여 이것을 매우 모호하게 만들었다면 더 많은 것을 붙일 것입니까?

내가 잘못 이해하면 수정하십시오. . . 그러나 비디오의 대부분의 막대에 대해 21 EMA로의 철회를 얻지 못했습니다.
 
죄송합니다 - 제대로 설명하지 못한 제 잘못입니다. 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) " 때문입니다.

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

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