초보자의 질문 MQL4 MT4 MetaTrader 4 - 페이지 250

 

간단한 경우 빠르게 확인하려면 다음과 같습니다.

   double profit = 0 ;
   int cnt=LockTicket, i , ototal = OrdersHistoryTotal();

   for (i = ototal- 1 ; i >= 0 ; i--)
     {
       if ( OrderSelect (i, SELECT_BY_POS, MODE_HISTORY))
        {
         if (OrderSymbol() == Symbol () && OrderCloseTime() > 0 )
           {
             if (OrderType() == OP_BUY || OrderType() == OP_SELL)
              {
               if (OrderMagicNumber() == Magic )
                 {
                  profit += OrderProfit()+OrderCommission()+OrderSwap();
                   if (profit>max)
                    { 
                    cnt=OrdersTicket();
                     break ;
                    }                  
                 }
              }
           }
        }
     }

일반적으로 주문은 제 시간에 서로 이어지지만 보장되지는 않습니다. 따라서 좋은 방법으로 연대기를 확인해야합니다. 그러나 실험을 위해서는 그렇게 할 것입니다.

 
Aleksei Stepanenko # :

간단한 경우 빠르게 확인하려면 다음과 같이 하십시오.

일반적으로 주문은 시간에 따라 이어지지만 보장되지는 않습니다. 따라서 좋은 방법으로 연대기를 확인해야합니다. 그러나 실험을 위해 그것은 할 것입니다.

시간이 보장되지 않는다는 점에 동의하므로 모든 마감된 주문을 티켓을 늘리는 방향으로 진행하고 싶습니다. 주문의 티켓을 알고 그것부터 세어보려고 하는데 뭔가 잘못됐어) 어떻게 되나?

 
Aleksei Stepanenko # :

간단한 경우 빠르게 확인하려면 다음과 같습니다.

일반적으로 주문은 제 시간에 서로 이어지지만 보장되지는 않습니다. 따라서 좋은 방법으로 연대기를 확인해야합니다. 그러나 실험을 위해서는 그렇게 할 것입니다.

역사상 더 작은 것에서 더 큰 것으로 주문을 정렬하는 것이 더 정확합니다. 재계산 시 마감되는 주문을 고려하기 위해, 우리는 이러한 시장 주문을 더 큰 것에서 더 작은 것으로 계산하여 개설 및 마감을 올바르게 고려합니다. 같은 틱에있는 것들. 그렇게 생각해요)

알렉세이 스테파넨코 # :

간단한 경우 빠르게 확인하려면 다음과 같습니다.

일반적으로 주문은 제 시간에 서로 이어지지만 보장되지는 않습니다. 따라서 좋은 방법으로 연대기를 확인해야합니다. 그러나 실험을 위해서는 그렇게 할 것입니다.

그리고 Alexey의 코드도 올바르게 계산되지 않습니까?

 
Valeriy Yastremskiy # :

역사상 더 작은 것에서 더 큰 것으로 주문을 정렬하는 것이 더 정확합니다. 재계산 시 마감되는 주문을 고려하기 위해, 우리는 이러한 시장 주문을 더 큰 것에서 더 작은 것으로 계산하여 개설 및 마감을 올바르게 고려합니다. 같은 틱에있는 것들. 그렇게 생각해요)

그리고 Alexey의 코드도 올바르게 계산되지 않습니까?

시도하지 않았습니다. 나는 지금 시도 할거야. 나는 그것을 쓸 것이다.

 
Aleksei Stepanenko # :

간단한 경우 빠르게 확인하려면 다음과 같습니다.

일반적으로 주문은 제 시간에 서로 이어지지만 보장되지는 않습니다. 따라서 좋은 방법으로 연대기를 확인해야합니다. 그러나 실험을 위해서는 그렇게 할 것입니다.

나는 많은 것을 컴파일 할 때 다음을 제외하고 모든 것을 고쳤습니다.

 if (profit>max)

이 줄, 나는 그것을 잘 이해하지 못합니다. 설명해주실 수 있나요?

 
makssub # :
아이디어는 다음과 같습니다. 일정한 이익을 얻은 후 티켓을 변경하십시오.

최대 - 이것은 이익 한도이며 그 후에 티켓이 변경됩니다. 당신은 그 가치를 설정합니다.

 
Aleksei Stepanenko # :

최대 - 이것은 이익 한도이며 그 후에 티켓이 변경됩니다. 당신은 그 가치를 설정합니다.

내가 올바르게 이해하면 작업이 다릅니다. 1, 2, 3 주문이 오픈되었습니다. 시가가 어떻게 형성되는지 모르겠습니다. 주문 3이 마감되고 총 이익은 주문 3의 이익과 같습니다. 당신은 주문 3 전에 열린 주문의 티켓을 계산해야합니다. 그런 다음 주문 2가 닫힙니다.주문 2 이전에 열린 주문의 티켓을 찾아야 합니다. 이것이 주문 1입니다. 총 이익은 2 및 3 주문의 이익과 같습니다.

왜 그러는지 이해가 안가는데, 논리가 맞는 것 같습니다.)

 
Valery, 나는 그 두 문장 뒤에 숨겨진 논리를 완전히 이해하지 못했습니다.
 
Aleksei Stepanenko # :
Valery, 나는 그 두 문장 뒤에 숨겨진 논리를 완전히 이해하지 못했습니다.

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

초보자의 질문 MQL4 MT4 MetaTrader 4

막섭 , 2021.09.01 16:38

 int FindTicket()
   {
   int oldticket;
   int tick= 0 ;
   ticket= 0 ;
   
   
   for ( int cnt = OrdersTotal ()- 1 ; cnt>= 0 ; cnt--)
      {
       if ( OrderSelect (cnt, SELECT_BY_POS, MODE_TRADES))
         {
         if (OrderSymbol() == Symbol () && OrderMagicNumber() == Magic)
            {
            oldticket = OrderTicket();
             if (oldticket > ticket)
               {
               ticket = oldticket;
               tick = OrderTicket();
               }
            }
         }
      }
   return (tick); 
   }              
int TickF = FindTicket();
 int CalculateProfitHistory() 
{
   double _point;
   int     i, _ototal = OrdersHistoryTotal(), _profit= 0 ;
   for    (i = 0 ; i < OrdersHistoryTotal(); i++) 
  {
     if ( OrderSelect (TickF, SELECT_BY_TICKET, MODE_HISTORY)) 
    {
       if (OrderSymbol() == Symbol ())
      {
         if (OrderMagicNumber() == Magic) 
        {
           _point = MarketInfo(OrderSymbol(), MODE_POINT);
           if (_point == 0 ) 
           {
               if ( StringFind (OrderSymbol(), "" ) < 0 ) 
                 _point = 0.0001 ; 
               else _point = 0.01 ;
           }   
           if (OrderType() == OP_BUY) 
           {
              _profit += int ((MarketInfo(OrderSymbol(), MODE_BID) - OrderOpenPrice())/_point);
           }
           if (OrderType()==OP_SELL) 
           {
              _profit += int ((OrderOpenPrice() - MarketInfo(OrderSymbol(), MODE_ASK))/_point);
           }
         }
      }
    }
  }
   return (_profit);
}

첫 번째 기능에서는 필요한 주문의 티켓을 찾습니다. 그리고 두 번째는 이 티켓 이후에 마감된 모든 주문의 이익을 계산해야 합니다. 그 이전에 있었던 사람들의 이익은 나에게 흥미롭지 않습니다. 여기 두 번째가 있습니다. 그는 삐딱하게 생각합니다. 주문을 열 때 이 2개의 함수가 호출되므로 0과 같아야 하지만 같지는 않습니다.
PS는 귀하의 조언을 받아들였으며 어레이를 거부했습니다)
위에서 12번째 사각형)


 

다 생각했고, 당신의 제안에 따라 내 방식대로 했습니다)

후속 작업은 적자 주문이 나오면 이익이 나는 다른 주문에 의해 차단되어야 합니다.

구현 방법. 잃어버린 주문의 티켓 이 기억되고 이것이 우리의보고 포인트였습니다. 그 후, 우리는 잃는 주문의 이익, 그 이후에 마감된 주문의 이익을 계산하기 시작합니다. 첫 번째 주문이 열려 있고 이익에 도달하면 닫는다는 것을 상기시켜 드리겠습니다.

if ( (CalculateProfitHistory() + FirstProfit() >= 이익)

{

닫기 우선();

인쇄("우리는 첫 번째 무익한 것을 닫습니다");

}


 double CalculateProfitHistory() 
{
   double profit = 0 ;
   int cnt=Ticket, i , ototal = OrdersHistoryTotal();

   for (i = ototal- 1 ; i >= 0 ; i--)
   {
       if ( OrderSelect (i, SELECT_BY_POS, MODE_HISTORY))
      {
         if (OrderSymbol() == Symbol () && OrderCloseTime() > 0 )
         {
             if (OrderType() == OP_BUY || OrderType() == OP_SELL)
            {
               if (OrderMagicNumber() == Magic )
               {
                   if (Ticket != 0 )
                  {
                     if (OrderTicket() >= Ticket)
                     {
                        profit += OrderProfit()+OrderCommission()+OrderSwap();
                     }                  
                  }
               }
            }
         }
      }
   }
   return (profit);
}