위대하고 끔찍한 MT4 영원히 (또는 전환 전략을 올바르게 개발하는 방법) - 페이지 14

 
Ihor Herasko :

네, 저도 같은 이야기를 하고 있습니다. 실제로 두 개의 위치가 있을 때 스크립트는 위치 중 하나를 닫을 수 있지만 PositionsTotal()은 1을 반환합니다. 그런 다음 닫은 후 루프 종료 조건이 충족됩니다. 즉, PositionsTotal()은 2를 반환합니다.

출력물을 붙여넣어 진행 상황을 완전히 볼 수 있습니다.

 
fxsaber :

출력물을 붙여넣어 진행 상황을 완전히 확인할 수 있습니다.

예, 추론의 정확성을 확인하려면:

 #include <Trade\Trade.mqh>

void OnStart ()
{
  CTrade Trade;
  
   while (! IsStopped () && ( PositionsTotal () <= 1 )) // Закончим, когда появится более одной позиции.
     if ( PositionsTotal () == 1 )
    {
      Trade.PositionClose( PositionGetTicket ( 0 )); // Если есть позиция - закрываем.
       Print ( "Закрытие, т. к. PositionsTotal() равно 1" );
    }
     else if (! OrdersTotal ())
    {
      Trade.Buy( 0.01 ); // Если нет позиции и ордера - открываем позицию.
      
Print("Открытие. PositionsTotal: ", PositionsTotal()); 
    }
    
   Print ( "Выход. PostionsTotal: " , PositionsTotal ());
}

결과:

 2021.05 . 05 10 : 11 : 43.393 Test (EURUSD,M1)        Открытие. PositionsTotal : 0
2021.05 . 05 10 : 11 : 43.488 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal () равно 1
2021.05 . 05 10 : 11 : 43.535 Test (EURUSD,M1)        CTrade:: OrderSend : market sell 0.01 position # 2249868517 EURUSD [position closed]
2021.05 . 05 10 : 11 : 43.535 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal () равно 1
2021.05 . 05 10 : 11 : 43.615 Test (EURUSD,M1)        Открытие. PositionsTotal : 0
2021.05 . 05 10 : 11 : 43.697 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal () равно 1
2021.05 . 05 10 : 11 : 43.777 Test (EURUSD,M1)        Открытие. PositionsTotal : 0
2021.05 . 05 10 : 11 : 43.859 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal () равно 1
2021.05 . 05 10 : 11 : 43.941 Test (EURUSD,M1)        Открытие. PositionsTotal : 0
2021.05 . 05 10 : 11 : 44.023 Test (EURUSD,M1)        Открытие. PositionsTotal : 1
2021.05 . 05 10 : 11 : 44.101 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal () равно 1
2021.05 . 05 10 : 11 : 44.101 Test (EURUSD,M1)        Выход. PostionsTotal: 2

사실, 그 위치는 교수형에 처할 수밖에 없었습니다.

PS 복사 붙여넣기 때문에 코드에 잘못된 것을 삽입했기 때문에 게시물을 수정했습니다.
 
Ihor Herasko :

사실, 그 자리에 매달릴 수밖에 없었습니다.

로그에서 마지막 거래 작업 을 기록하는 시간은 스크립트 종료 기록 시간을 따릅니다.

OrdersTotal을 인쇄하는 것도 중요합니다.
 
fxsaber :

로그에서 마지막 거래 작업 을 기록하는 시간은 스크립트 종료 기록 시간을 따릅니다.

이 두 항목을 말씀하시는 건가요?

 2021.05 . 05 10 : 11 : 44.101 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal () равно 1
2021.05 . 05 10 : 11 : 44.101 Test (EURUSD,M1)        Выход. PostionsTotal: 2

여기에서는 모든 것이 순서대로 옳다고 생각합니다. 실제로 두 개의 위치가 있지만 PositionsTotal()은 아직 업데이트를 받지 못했습니다. 따라서 1을 반환하고 위치가 닫힙니다. 그리고 거래 작업을 수행한 후에는 거래 작업을 수행하기 전의 상태에 해당하는 상태로 업데이트됩니다. 여기서 우리는 2를 얻습니다.

 
fxsaber :

이 문제는 오랫동안 논의되었습니다. 거의 모든 사람이 가지고 있습니다. 처음으로 코드를 안정적으로 재생합니다.

솔루션을 찾았습니다.

그리고 해결책은 무엇입니까?

그리고 안정적인 재생 코드를 찾는 데 어려움은 무엇이었습니까? 하나의 조치 - 개시 또는 폐쇄, 그리고 다음은 시장 또는 과거 의 포지션 수에 따라 결정됩니다.
 
Ihor Herasko :

이 두 항목을 말씀하시는 건가요?

아니요, 거래 활동의 마지막 기록은 두 번째 로그에 있습니다.

 
fxsaber :

OrdersTotal을 인쇄하는 것도 중요합니다.

지문을 추가했습니다. 이제 예상대로 두 자리가 남았습니다.

 #include <Trade\Trade.mqh>

void OnStart ()
{
  CTrade Trade;
  
   while (! IsStopped () && ( PositionsTotal () <= 1 )) // Закончим, когда появится более одной позиции.
     if ( PositionsTotal () == 1 )
    {
      Trade.PositionClose( PositionGetTicket ( 0 )); // Если есть позиция - закрываем.
       Print ( "Закрытие, т. к. PositionsTotal() равно 1" );
    }
     else if (! OrdersTotal ())
    {
       printf ( "Перед открытием. PositionsTotal: %d, OrdersTotal: %d" , PositionsTotal (), OrdersTotal ());
      Trade.Buy( 0.01 ); // Если нет позиции и ордера - открываем позицию.
       printf ( "После открытия. PositionsTotal: %d, OrdersTotal: %d" , PositionsTotal (), OrdersTotal ());
    }
    
   Print ( "Выход. PostionsTotal: " , PositionsTotal ());
}

결과:

 2021.05 . 05 10 : 22 : 50.583 Test (EURUSD,M1)        Перед открытием. PositionsTotal : 0 , OrdersTotal : 0
2021.05 . 05 10 : 22 : 50.663 Test (EURUSD,M1)        После открытия. PositionsTotal : 0 , OrdersTotal : 1
2021.05 . 05 10 : 22 : 50.679 Test (EURUSD,M1)        Перед открытием. PositionsTotal : 0 , OrdersTotal : 0
2021.05 . 05 10 : 22 : 50.757 Test (EURUSD,M1)        После открытия. PositionsTotal : 2 , OrdersTotal : 0
2021.05 . 05 10 : 22 : 50.757 Test (EURUSD,M1)        Выход. PostionsTotal: 2
 
Dmitry Fedoseev :

그리고 해결책은 무엇입니까?

의 포지션 수에 따라 결정됩니다.

어려움은 없었고, 나는 박쥐에서 바로 썼습니다.

 

이것은 전혀 멈추지 않고 포지션을 여는 방법입니다.

 #include <Trade\Trade.mqh>
CTrade Trade;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
//---
   int total= PositionsTotal ();
   int Ordertotal= OrdersTotal ();
   while (! IsStopped () && (total <= 1 ))   // Закончим, когда появится более одной позиции.
       if (total == 1 )
         Trade.PositionClose( PositionGetTicket ( 0 )); // Если есть позиция - закрываем.
       else
         if (!Ordertotal)
            Trade.Buy( 0.01 ); // Если нет позиции и ордера - открываем позицию.
  }
//+------------------------------------------------------------------+

스냅 사진

 
SanAlex :

이것은 전혀 멈추지 않고 포지션을 여는 방법입니다.

글쎄, 누가 총계를 업데이트 할 것인가? ))