Sonsuza kadar harika ve korkunç MT4 (veya bir geçiş stratejisinin nasıl doğru bir şekilde geliştirileceği) - sayfa 14

 
Ihor Herasko :

Evet ve ben de aynı şeyden bahsediyorum. Görünen o ki, aslında iki tane varken, komut dosyası konumlardan birini kapatmayı başarır, ancak PositionsTotal() 1 döndürür. Ve sonra, kapanıştan sonra, döngü sonlandırma koşulu karşılanır, yani PositionsTotal() 2 döndürür.

Neler olup bittiğini tam olarak görmek için çıktıları yapıştırabilirsiniz.

 
fxsaber :

Neler olup bittiğini tam olarak görmek için çıktıları yapıştırabilirsiniz.

Evet, gerekçenin doğruluğunu teyit etmek için:

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

Sonuç:

 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

Aslında, pozisyon asmak için yalnız kaldı.

PS Gönderiyi düzelttim, çünkü kopyala-yapıştır nedeniyle koda yanlış şeyi ekledim.
 
Ihor Herasko :

Aslında, pozisyon asmak için yalnız kaldı.

Günlükte, büyük olasılıkla, son ticari işlemin kaydedilme zamanı, komut dosyasının kapanışını kaydetme zamanını takip eder.

Sipariş Toplamını yazdırmak da önemlidir.
 
fxsaber :

Günlükte, büyük olasılıkla, son ticari işlemin kaydedilme zamanı, komut dosyasının kapanışını kaydetme zamanını takip eder.

Bu iki kayıttan mı bahsediyorsun?

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

Burada bence düzen açısından her şey doğru. Aslında iki pozisyon var, ancak PositionsTotal() henüz bir güncelleme almadı. Bu nedenle, 1 döndürür ve pozisyon kapanır. Ve ticaret işleminin yürütülmesinden sonra, ticaret işleminin yürütülmesinden önceki duruma karşılık gelen duruma güncellenir. Burada 2 elde ederiz.

 
fxsaber :

Konu uzun süredir tartışılıyor. Neredeyse herkeste var. Kodunu kararlı bir şekilde yeniden üretiyor - ilk kez.

Çözüm bulundu.

Çözüm nedir?

Ve kararlı bir çoğaltma kodu bulmanın zorluğu neydi? Bir eylem - açılış veya kapanış, diğeri ise piyasadaki veya tarihteki pozisyon sayısına dayalı bir kararla.
 
Ihor Herasko :

Bu iki kayıttan mı bahsediyorsun?

Hayır, alım satım faaliyetinin son kaydı ikinci kayıttadır.

 
fxsaber :

Sipariş Toplamını yazdırmak da önemlidir.

Baskılar eklendi. Şimdi beklendiği gibi iki pozisyon kaldı:

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

Sonuç:

 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 :

Çözüm nedir?

pozisyon sayısına dayalı bir kararla.

Zorluk olmadı, hemen yazdım.

 

Hiç durmadan pozisyonları böyle açıyor

 #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 ); // Если нет позиции и ордера - открываем позицию.
  }
//+------------------------------------------------------------------+

enstantane fotoğraf

 
SanAlex :

Hiç durmadan pozisyonları böyle açıyor

Peki, toplamı kim güncelleyecek? ))