미결 주문 총액 문제

 

안녕하세요 여러분. 이 포럼에서 찾을 수 있는 모든 조언을 시도했지만 아무 것도 작동하지 않는 것 같습니다. 누군가 도와주세요. 내 OrderTotal 기능에 문제가 있다고 생각합니다. 저는 10개의 통화 쌍 을 거래하고 있습니다. 즉, EA가 10개의 차트에 열려 있습니다. 이것은 단순한 헤징 전략입니다. EA가 신호에 따라 거래(롱 또는 숏)를 열었으면 합니다. 거래가 내 방식대로 진행되면 Trailingstop 또는 이익을 취하십시오. 그러나 거래가 나에게 불리하면 반대 방향으로 거래를 열었으면합니다. 내가 사용하고 있는 코드는 작동하는 것 같지만 때때로 문제가 발생합니다. 즉, 더 이상 거래를 열지 않습니다. 또한 한 쌍에서 하나 또는 두 개의 거래가 열리면 다른 쌍에서 거래를 열지 않으려는 것 같습니다.

여기 내 코드가 있습니다

 int start()
{
     {
     if ( OrdersTotal () == 0 )
     if (Close[ 1 ]>Close[ 2 ])
         result= OrderSend ( Symbol (), OP_BUY, 0.01 , Ask, 3 , Ask - StopLoss* 0.0001 , 0 , "Original" , magicNumber, 0 , Blue);
         Print ( "Error setting Original order: " , GetLastError ());
         }

   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--) 
  {
       if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)== true )
       if (OrderSymbol()== Symbol ())
       //Calculate the point value in case there are extra digits in the quotes
       if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.00001 ) PointValue = 0.0001 ;
       else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.0001 ) PointValue = 0.01 ;
       else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.001 ) PointValue = 0.01 ;
       else PointValue = MarketInfo(OrderSymbol(), MODE_POINT);

//calculate new lotsize of hedge based on lotsize of current open trade*Multiplier
       double lots = NormalizeDouble (OrderLots() * Multiplier, 2 ); 
      
     if (OrderType() == OP_BUY) 
      {
         if (Bid - OrderOpenPrice() > NormalizeDouble (TrailingStart *PointValue, Digits ))
         {
           if (OrderStopLoss() < Bid - NormalizeDouble (TrailingStop *PointValue, Digits ))
            {
               if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble (TrailingStop *PointValue, Digits ),
              OrderTakeProfit(), Blue)) 
               Print ( "Error setting Buy trailing stop: " , GetLastError ()); 
              }
            }
             else if (OrderOpenPrice() > Bid + NormalizeDouble (Hedge*PointValue, Digits ))
             if ( OrdersTotal () == 1 )
            result= OrderSend ( Symbol (), OP_SELL, lots, Bid, 3 ,  Bid + Stoploss*PointValue, 0 , "Hedge" , 0 , 0 , Blue);
             Print ( "Error setting Sell Hedge: " , GetLastError ());
          }
 
  1. 거래를 필터링 해야 합니다.
           if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)== true )
           if (OrderSymbol()== Symbol ())
          if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.00001 ) PointValue = 0.0001 ;  // These
          else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.0001 ) PointValue = 0.01 ;// four
          else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.001 ) PointValue = 0.01 ; // lines
          else PointValue = MarketInfo(OrderSymbol(), MODE_POINT);                    // Execute only on Symbol orders .
    
          double lots = NormalizeDouble (OrderLots() * Multiplier, 2 );    // This and below are always executed
           if (OrderType() == OP_BUY)                                   // Symbol is irrelevant.             
    
    중괄호 포함 .
           if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)== true )
           if (OrderSymbol()== Symbol ())
    {                                                                   // Rest of code executes only on Symbol orders.
          if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.00001 ) PointValue = 0.0001 ;
           else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.0001 ) PointValue = 0.01 ;
           else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.001 ) PointValue = 0.01 ;
           else PointValue = MarketInfo(OrderSymbol(), MODE_POINT);
    
           double lots = NormalizeDouble (OrderLots() * Multiplier, 2 ); 
          
           if (OrderType() == OP_BUY) 
             :
    } 

  2. 4자리 브로커에서 포인트 = 0.0001
          if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.00001 ) PointValue = 0.0001 ;
          else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.0001 ) PointValue = 0.01 ;
          else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.001 ) PointValue = 0.01 ;
          else PointValue = MarketInfo(OrderSymbol(), MODE_POINT);
    
    고정 및 단순화.
    PointValue = MarketInfo(OrderSymbol(), MODE_POINT);
    if (MarketInfo(OrderSymbol(), MODE_DIGITS) % 2 = 1 ) PointValue *= 10 ;

  3. 중괄호 안의 모든 것이 Symbol()이므로 모든 MarketInfo는 미리 정의된 변수 로 대체될 수 있습니다.
  4. 숫자를 하드 코딩하지 마십시오.
    반환 코드를 확인하십시오. 함수 반환 값이란 무엇입니까? 어떻게 사용합니까? - MQL4 포럼MQL4 프로그램의 일반적인 오류 및 이를 방지하는 방법 - MQL4 기사
    result= OrderSend ( Symbol (), OP_BUY, 0.01 , Ask, 3 , Ask - StopLoss* 0.0001 , 0 , "Original" , magicNumber, 0 , Blue);
 

1. 도와주셔서 정말 감사합니다. 제안한 대로 중괄호를 추가했지만 EA는 여전히 하나의 통화 쌍 에 대해서만 거래를 엽니다. 구매 조건이 충족되더라도 다른 차트에서 거래를 열지 않습니다. 나는 몇 주 동안 이것에 갇혔습니다. 다시 한 번 살펴보시겠습니까?

2. 편집: 더 이상 필요하지 않습니다

3. 이제 내 코드는 다음과 같습니다.

 int start()
{
  {
     if ( OrdersTotal () == 0 )
     if (Close[ 1 ]>Close[ 2 ])
         result= OrderSend ( Symbol (), OP_BUY, 0.01 , Ask, 3 , Ask - StopLoss* Point * 10 , 0 , "Original" , magicNumber, 0 , Blue);
         Print ( "Error setting Original order: " , GetLastError ());
  }       

   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--) 
    {
       //calculate new lotsize of hedge based on lotsize of current open trade*Multiplier
       double lots = NormalizeDouble (OrderLots() * Multiplier, 2 );
       if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)== true )
       if (OrderSymbol()== Symbol ())
    { 
     if (OrderType() == OP_BUY) 
       {
         if (Bid - OrderOpenPrice() > NormalizeDouble (TrailingStart * Point * 10 , Digits ))
         {
           if (OrderStopLoss() < Bid - NormalizeDouble (TrailingStop * Point * 10 , Digits ))
           {
               if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble (TrailingStop * Point * 10 , Digits ),
              OrderTakeProfit(), Blue)) 
               Print ( "Error setting Buy trailing stop: " , GetLastError ()); 
           }
         }
             else if (OrderOpenPrice() > Bid + NormalizeDouble (Hedge* Point * 10 , Digits ))
             if ( OrdersTotal () == 1 )
            result= OrderSend ( Symbol (), OP_SELL, lots, Bid, 3 ,  Bid + Stoploss* Point * 10 , 0 , "Hedge" , 0 , 0 , Blue);
             Print ( "Error setting Sell Hedge: " , GetLastError ());
       }
 
     if ( OrdersTotal () == 0 )
     if (Close[ 1 ]>Close[ 2 ])
         result= OrderSend ( Symbol (), OP_BUY, 0.01 , Ask, 3 , Ask - StopLoss*PointValue, 0 , "Original" , magicNumber, 0 , Blue);
         Print ( "Error setting Original order: " , GetLastError ());
어떤 쌍에서 주문이 열려 있으면 OrdersTotal()==0이 다시 시작될 때까지 다른 주문이 열리지 않습니다.
 
GumRai :
어떤 쌍에서 주문이 열려 있으면 OrdersTotal()==0이 다시 시작될 때까지 다른 주문이 열리지 않습니다.

도와주셔서 감사합니다. 첫 번째 원래 주문을 하나의 거래로만 제한해야 합니다. 구매 조건이 충족될 때 EA가 계속해서 주문을 여는 것을 원하지 않습니다. 그래서 이것을 제한하기 위해 Orderstotal을 추가했습니다. 그러나 이 코드는 여기의 코드를 방해하는 것 같습니다.

 else if (OrderOpenPrice() > Bid + NormalizeDouble (Hedge* Point * 10 , Digits ))
             if ( OrdersTotal () == 1 ) //<----------
            result= OrderSend ( Symbol (), OP_SELL, lots, Bid, 3 ,  Bid + Stoploss* Point * 10 , 0 , "Hedge" , 0 , 0 , Blue);
             Print ( "Error setting Sell Hedge: " , GetLastError ());

여기서는 EA가 공개 거래당 하나의 헤지를 열도록 하고, 따라서 OrderTotal ==1

그렇다면 거래 수를 제한하는 가장 좋은 방법은 무엇입니까, 즉 하나의 원래 거래와 하나의 헤지 거래는 무엇입니까? 고맙습니다

 
Trader3000 : 그렇다면 거래 수를 제한하는 가장 좋은 방법은 무엇입니까, 즉 하나의 원래 거래와 하나의 헤지 거래는 무엇입니까?
  1. 따라서 현재 차트에서 열려 있는 주문 수를 계산합니다. OrdersTotal모든 차트에 열려 있는 주문 수를 반환합니다.
  2. 매직 넘버로 필터링하지 않으면 EA가 다른 모든 것과 호환되지 않으며(다른 TF의 자체 포함) 수동 거래 기호 다른 통화가 다른 별도 차트에 추가될 때 Ordersymbol과 동일하지 않습니다. - MQL4 포럼
 

모든 분들의 도움에 진심으로 감사드립니다. 나는 이 문제를 해결했고 이제 EA는 구매 조건이 충족될 때 모든 차트에서 거래를 열 것입니다. 그러나 이 아래의 어떤 것도 현재 작동하지 않습니다. EA는 Trailingstop 또는 Hedge 함수 를 호출하지 않습니다. 누군가 살펴보고 내가 알아낼 수 없기 때문에 내가 무엇을 잘못했는지 알려주시겠습니까?   

 int start()
{ 
   double Lots = NormalizeDouble (AccountEquity()*Percentage*Lotsize/ 100 , 2 );
   double lots = NormalizeDouble (OrderLots() * Multiplier, 2 );
   total= 0 ;
   for (i = OrdersTotal ()- 1 ; i >= 0 ; i--)
   if ( OrderSelect (i, SELECT_BY_POS)                
    &&  OrderMagicNumber()  == magicNumber            
    &&  OrderSymbol()       == Symbol ())
    {             
      total++;
    }
    {
     if (total== 0 )
     if (Close[ 1 ]>Close[ 2 ])
    {
         result= OrderSend ( Symbol (), OP_BUY, Lots, Ask, 3 , Ask - StopLoss* Point * 10 , 0 , "Original" , magicNumber, 0 , Blue);
         Print ( "Error setting Original order: " , GetLastError ());     
    }
    
     if (OrderType() == OP_BUY) 
       {
         if (Bid - OrderOpenPrice() > NormalizeDouble (TrailingStart * Point * 10 , Digits ))
         {
           if (OrderStopLoss() < Bid - NormalizeDouble (TrailingStop * Point * 10 , Digits ))
           {
               if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble (TrailingStop * Point * 10 , Digits ),
              OrderTakeProfit(), Blue)) 
               Print ( "Error setting Buy trailing stop: " , GetLastError ()); 
           }
         }
 else if (OrderOpenPrice() > Bid + NormalizeDouble (Hedge* Point * 10 , Digits ))
             if (total == 1 )
            result= OrderSend ( Symbol (), OP_SELL, lots, Bid, 3 ,  Bid + Stoploss* Point * 10 , 0 , "Hedge" , magicNumber, 0 , Blue);
             Print ( "Error setting Sell Hedge: " , GetLastError ());
       }
 
   double Lots = NormalizeDouble (AccountEquity()*Percentage*Lotsize/ 100 , 2 );
   double lots = NormalizeDouble ( OrderLots() * Multiplier, 2 );

나는 당신이 무엇을하고 있는지 정확히 모르지만 대문자 만 다른 두 변수의 이름을 지정하지 않는 것이 좋습니다. 2를 혼동하기 쉽습니다. 특히 코드를 읽는 다른 사람들이 대문자로 시작하는 변수가 Globalscope라는 규칙을 잘 채택했을 때 그렇습니다.

주문이 선택되지 않았으므로 OrderLots()는 무엇이든 될 수 있습니다.


    
     if (OrderType() == OP_BUY) 

이것은 이전 루프에서 선택한 마지막 순서 의 값을 사용하며 올바른 매직 넘버나 기호가 아닐 수 있습니다.

 

당신의 답변에 감사드립니다. 제가 하려고 하는 것은 EA가 첫 번째 원래 거래를 열도록 하는 것입니다. 여기서 lotsize는 제 자산의 일정 비율입니다. 거래가 반대되는 경우

나, EA는 반대 방향으로 하나의 헤지를 열어야 하지만 여기서 로트 크기는 원래 로트 크기(OrderLots)의 3배여야 합니다. 없는 것처럼 보여도

주문이 선택되었지만 작업에 영향을 미치지 않는 것 같습니다. 이제 OrderSend 함수 에 직접 Lot를 배치했지만 trailingstop이나

헤지는 필요할 때 트리거됩니다. 내가 이것을 추가하기 전에 둘 다 완벽하게 작동했습니다.

total= 0 ;
   for (i = OrdersTotal ()- 1 ; i >= 0 ; i--)
   if ( OrderSelect (i, SELECT_BY_POS)                
    &&  OrderMagicNumber()  == magicNumber            
    &&  OrderSymbol()       == Symbol ())
    {             
      total++;
    }

 int start()
{ 
   double Lots = NormalizeDouble (AccountEquity()*Percentage*Lotsize/ 100 , 2 );
   
   total= 0 ;
   for (i = OrdersTotal ()- 1 ; i >= 0 ; i--)
   if ( OrderSelect (i, SELECT_BY_POS)                
    &&  OrderMagicNumber()  == magicNumber            
    &&  OrderSymbol()       == Symbol ())
    {             
      total++;
    }
    {
     if (total== 0 )
     if (Close[ 1 ]>Close[ 2 ])
         result= OrderSend ( Symbol (), OP_BUY, Lots, Ask, 3 , Ask - StopLoss* Point * 10 , 0 , "Original" , magicNumber, 0 , Blue);
         Print ( "Error setting Original order: " , GetLastError ());     
    }
    {
     if (OrderType() == OP_BUY) 
       {
         if (Bid - OrderOpenPrice() > NormalizeDouble (TrailingStart * Point * 10 , Digits ))
         {
           if (OrderStopLoss() < Bid - NormalizeDouble (TrailingStop * Point * 10 , Digits ))
           {
               if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble (TrailingStop * Point * 10 , Digits ),
              OrderTakeProfit(), Blue)) 
               Print ( "Error setting Buy trailing stop: " , GetLastError ()); 
           }
         }
             else if (OrderOpenPrice() > Bid + NormalizeDouble (Hedge* Point * 10 , Digits ))
             if (total == 1 )
            result= OrderSend ( Symbol (), OP_SELL, NormalizeDouble (OrderLots() * Multiplier, 2 ), Bid, 3 ,  Bid + Stoploss* Point * 10 , 0 , "Hedge" , magicNumber, 0 , Blue);
             Print ( "Error setting Sell Hedge: " , GetLastError ());
       }

내 중괄호 {}가 올바른 위치에 있지 않다고 생각합니다.

 
이전 포스트의 2부에서 이미 말씀드린 바 있습니다.
 

지금까지 많은 도움을 주셔서 감사합니다. 나는 진전을 이루고 있다. 이제 EA가 헤지 거래를 시작하기 위한 조건을 무시한다는 점을 제외하고 모든 것이 원래대로 작동하는 것처럼 보이도록 했습니다. 조건이 충족되지 않은 경우에도 때때로(항상 그런 것은 아님) 헤지 거래를 시작합니다. 또한 TrailingStop이 항상 실행되는 것은 아닙니다. 아직 중괄호 {}가 어딘가에 누락된 것 같습니다. 내 코드는 이제 다음과 같습니다. 누가 저를 좀 봐주세요. 고맙습니다.

 int start()
{ 
   total= 0 ;
   for (i = OrdersTotal ()- 1 ; i >= 0 ; i--)
   if ( OrderSelect (i, SELECT_BY_POS)                
    &&  OrderMagicNumber()  == magicNumber            
    &&  OrderSymbol()       == Symbol ())
    {             
      total++;
    }
    {
     if (total== 0 )
     if (Close[ 1 ]>Close[ 2 ])
    {
         result= OrderSend ( Symbol (), OP_BUY, 0.01 , Ask, 3 , Ask - StopLoss* Point * 10 , 0 , "Original" , magicNumber, 0 , Blue);
         Print ( "Error setting Original order: " , GetLastError ());     
    }
     if (OrderType() == OP_BUY) 
       {
         if (Bid - OrderOpenPrice() > NormalizeDouble (TrailingStart * Point * 10 , Digits ))
         {
           if (OrderStopLoss() < Bid - NormalizeDouble (TrailingStop * Point * 10 , Digits ))
           {
               if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble (TrailingStop * Point * 10 , Digits ),
              OrderTakeProfit(), Blue)) 
               Print ( "Error setting Buy trailing stop: " , GetLastError ()); 
           }
         }
             else if (OrderOpenPrice() > Bid + NormalizeDouble (Hedge* Point * 10 , Digits )) //<------- THIS IS BEING IGNORED SOMETIMES (I THINK)
             if (total == 1 )
            {
            result= OrderSend ( Symbol (), OP_SELL, NormalizeDouble (OrderLots() * Multiplier, 2 ), Bid, 3 ,  Bid + Stoploss* Point * 10 , 0 , "Hedge" , magicNumber, 0 , Blue);
             Print ( "Error setting Sell Hedge: " , GetLastError ());
            }
       }
       // else if (OrderType() == OP_SELL)
       // ... 

검라이 :

This would use the values from the last order selected in the previous loop, it may not be the correct magic number or symbol.


중괄호를 변경하여 이 문제를 해결하려고 했습니다. 그것이 최선의 방법입니까, 아니면 OrderSend 전에 매번 OrderSelect 함수 를 복제하고 추가해야 합니까? 고맙습니다