MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 755

 

안녕하세요. 무엇이 잘못되었는지 알 수 없습니다.

더 작고 더 많은 양과 다른 테이크 이익 을 가진 두 개의 주문이 있습니다. 더 적은 양의 주문이 먼저 열리고 더 큰 주문이 열립니다. 대량의 이익실현 주문을 찾아야 합니다.

 //MaxLotBuy() - функция находит ордер с наибольшим объемом (в Comment("") показывает правильные значения)
//buyTpL - в глобальных переменных
//---------------------------------------------
for (i = total- 1 ; i >= 0 ; i--)
{
   if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
   {
       if ( OrderSymbol () == Symbol () && OrderMagicNumber () == Magic)
      { 
         if ( OrderType () == OP_BUY )
         { 
             if ( OrderLots () == MaxLotBuy())
               buyTpL = OrderTakeProfit ();
         }
      }
   }
} 

모든 것이 맞는 것 같지만 결과적으로 어떤 이유로 더 작은 볼륨으로 이익을 취하는 값이 표시됩니다(먼저 열림). 뭐가 문제 야?

추신 총계 = OrdersTotal()

 
Youri Lazurenko :

안녕하세요. 무엇이 잘못되었는지 알 수 없습니다.

더 작고 더 많은 양과 다른 테이크 이익 을 가진 두 개의 주문이 있습니다. 더 적은 양의 주문이 먼저 열리고 더 큰 주문이 열립니다. 대량의 이익실현 주문을 찾아야 합니다.

모든 것이 맞는 것 같지만 결과적으로 어떤 이유로 더 작은 볼륨으로 이익을 취하는 값이 표시됩니다(먼저 열림). 뭐가 문제 야?

추신 총계 = OrdersTotal()

분명히 MaxLotBuy() 함수는 자체 주문 열거를 거치고 이 함수로 돌아갈 때 다른 주문이 선택됩니다. 일종의 주문 반복 주기 외부에서 주문을 반복하지 마십시오. 그는 그가 말한 것을 이해하지 못했습니다. 그러나 그렇습니다.

이 상황에서는 루프 전에 변수를 선언하고 새 값이 이전 값보다 크다면 OrderLots() 값을 할당하는 것이 좋습니다.

 double orderLot = 0 ;
for (i = total- 1 ; i >= 0 ; i--)
{
   if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
   {
       if ( OrderSymbol () == Symbol () && OrderMagicNumber () == Magic)
      { 
         if ( OrderType () == OP_BUY )
         { 
             if ( OrderLots () > orderLot)
             {
              orderLot = OrderLots ();
              buyTpL = OrderTakeProfit ();
             }
         }
      }
   }
} 
 
Alexey Viktorov :

분명히 MaxLotBuy() 함수는 자체 주문 열거를 거치고 이 함수로 돌아갈 때 다른 주문이 선택됩니다. 일종의 주문 반복 주기 외부에서 주문을 반복하지 마십시오. 그는 그가 말한 것을 이해하지 못했습니다. 그러나 그렇습니다.

이 상황에서는 루프 전에 변수를 선언하고 새 값이 이전 값보다 크다면 OrderLots() 값을 할당하는 것이 좋습니다.

고맙습니다. 예, MaxLotBuy()에는 자체 주문 열거가 있지만 반환된 값은 최대 값입니다(코드를 제공하는 것이 좋습니다).

 //  GetLots() - функция мани менеджмента
//------------------------
double MaxLotBuy()
{
   int     i;
   int     total  = OrdersTotal ();
   double lot    = GetLots();
   
   if (CountBuy() == 0 )
      lot = GetLots();
   
   if (CountBuy() >= 1 )
   {   
       for (i = total- 1 ; i >= 0 ; i--)
      {
         if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
         {
             if ( OrderSymbol () == Symbol () && OrderMagicNumber () == Magic)
            {
               if ( OrderType () == OP_BUY ) 
               {
                   if (lot < OrderLots ())
                     lot = OrderLots ();
               }
            }
         }
      }
   }
   return (lot);
}

하지만 당신의 아이디어를 얻었습니다. 감사합니다. 나는 지금 시도 할거야.

 
Konstantin Nikitin :
아마 더 좋을 것 같다

덕분에 더 나은 것 같습니다.

 
Konstantin Nikitin :
아마 더 나을거야

고맙습니다. 자신에게 쓸 때뿐만 아니라 더 조심해야합니다.

비록 그것이 그것이 말하는 바입니다.

루프 전에 변수 선언


 

여러분, 정말 감사합니다. 제대로 작동합니다. 원래 위치로 재설정을 추가했습니다.

   int     i;     
   int     total       = OrdersTotal ();
   double orderLotBuy = GetLots();

   if (CountBuy() == 0 )
      orderLotBuy = GetLots();

   for (i = total- 1 ; i >= 0 ; i--)
   {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
      {
         if ( OrderSymbol () == Symbol () && OrderMagicNumber () == Magic)
         { 
             if ( OrderType () == OP_BUY )
            { 
               if ( OrderLots () > orderLotBuy)
               {
                  buyTpL      = OrderTakeProfit ();
                  orderLotBuy = OrderLots ();
               }
            }
         }
      }
   } 
   
 
Youri Lazurenko :

여러분, 정말 감사합니다. 제대로 작동합니다. 원래 위치로 재설정을 추가했습니다.

네, 그렇습니다. 내 예는 완전하지 않습니다. 방금 수정하고 추가했으며 내 수정 사항은 제 시간에 귀하의 메시지와 일치했습니다.
 
Alexey Viktorov :
네, 그렇습니다. 내 예는 완전하지 않습니다. 방금 수정하고 추가했으며 내 수정 사항은 제 시간에 귀하의 메시지와 일치했습니다.

그것이 완전하지 않다는 것은 중요하지 않습니다. 가장 중요한 것은 올바른 아이디어, 접근 방식입니다. 다시 한 번 감사드립니다.

 
Youri Lazurenko :

그것이 완전하지 않다는 것은 중요하지 않습니다. 가장 중요한 것은 올바른 아이디어, 접근 방식입니다. 다시 한 번 감사드립니다.

그럼

   int     total       = OrdersTotal ();
   double orderLotBuy = GetLots();

   if (CountBuy() > 0 )
       for (i = total- 1 ; i >= 0 ; i--)
      {
         if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
         {
             if ( OrderSymbol () == Symbol () && OrderMagicNumber () == Magic)
            { 
               if ( OrderType () == OP_BUY )
               { 
                   if ( OrderLots () > orderLotBuy)
                  {
                     buyTpL      = OrderTakeProfit ();
                     orderLotBuy = OrderLots ();
                  }
               }
            }
         }
      } 
 
Konstantin Nikitin :

그럼

원칙적으로 전체 코드를 게시하지 않고, 가장 많은 로트가 있는 주문의 테이크 이익을 찾는 부분만 게시했습니다. 전체 본질은 다음과 같습니다. 가격이 반전되면 큰 로트 의 보류 주문 이 배치됩니다. 그것이 작동하면 손절매가 반대 주문에 배치되어 이익 테이크가 큰 주문이 닫힐 때 손절매 이익이 음수인 주문도 닫힙니다. 전체 코드, 정지 손실 설정 수정은 다음과 같습니다.

 // sp            - величина спреда
// FirstOrderBuy - дабы избежать error1
//----------------------------------------------- 
     int i;
      
       int     total        = OrdersTotal ();
       double orderLotBuy  = GetLots();     
   
       static int FirstOrderBuy  = 0 ;     

       if (CountBuy() < FirstOrderBuy)
         FirstOrderBuy = 0 ; 
         
       if (CountBuy() == 0 )
         orderLotBuy = GetLots();
      
       if (CountSell() >= 1 && CountBuy() > FirstOrderBuy && MaxLotBuy() > MaxLotSell())
      {
         for (i = total- 1 ; i >= 0 ; i--)
         {
             if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
            {
               if ( OrderSymbol () == Symbol () && OrderMagicNumber () == Magic)
               { 
                   if ( OrderType () == OP_BUY )
                  { 
                     if ( OrderLots () > orderLotBuy)
                     {
                        buyTpL      = OrderTakeProfit ();
                        orderLotBuy = OrderLots ();
                     }
                  }
               }
            }
         } 
                        
         for (i = total- 1 ; i >= 0 ; i--)
         {
             if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
            {
               if ( OrderSymbol () == Symbol () && OrderMagicNumber () == Magic)
               { 
                   if ( OrderType () == OP_SELL )  
                  {               
                     if ( OrderStopLoss () == 0 || ( OrderStopLoss () != 0 && OrderStopLoss () > OrderOpenPrice ()))
                     {
                        slSell = NormalizeDouble (buyTpL + sp*point, Digits );
                        
                        OrderModifyX( OrderTicket (), OrderOpenPrice (), slSell, OrderTakeProfit (), 0 , 0 );
                     }
                  }    
               }
            }
         }
         FirstOrderBuy = CountBuy();
      }

추신: 테스트 과정에서 이런 경우에 어떻게 행동해야 하는지 조언자에게 "설명"해야 하는 뉘앙스가 너무 많습니다.