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

 
JRandomTrader :

İşte belgelerden:

" Bu işlemlerin terminale ulaşma sırası garanti edilmez, bu nedenle alım satım algoritmanızı diğerlerinin gelmesinden sonra bazı alım satım işlemlerinin gelmesini beklemek üzerine kuramazsınız. " https://www.mql5.com/ ru/docs/event_handlers/ontradetransaction

Ve deneyime göre, TRADE_TRANSACTION_ORDER_DELETE , TRADE_TRANSACTION_DEAL_ADD , TRADE_TRANSACTION_HISTORY_ADD işlemleri herhangi bir sırayla gelebilir.

Bu nedenle, tarihte henüz anlaşma ve emir olmadığı, ancak artık emir olmadığı durumlar ortaya çıkar. Ya da tam tersi, hala bir sipariş var ama zaten bir anlaşma var. Bu sadece düzenin hem güncelde hem de tarihte olduğu bir durum, pek mümkün değil.

Olayları yakalamam, resmin tamamına yeni bir kene ile bakarım.


JRandomTrader :

Aslında, bu yüzden CTrade sınıfını kullanmayı reddetti - tüm bu komisyonun üzerine basıyor.

Mücadele yolu - her danışman emirlerinin bir listesini tutar ve durumlarını izler. dahil "standart dışı" - "sipariş gönderildi, ancak aktif olanlarda henüz görünmedi" (burada iki katına çıkarılabilir), "sipariş silindi, ancak tarihte görünmedi". Aynı zamanda netleştirme sırasında tek bir sembol üzerinde aynı anda çalışmaya yardımcı olur.

Yakın zamana kadar, eksik siparişleri kontrol eden evrensel bir koltuk değneği kullanıyordum. Ama bir noktada başarısız olmaya başladı.

Danışmana başka bir kişisel koltuk değneği eklendi, şimdi siparişlerini ayrı ayrı izliyor.

Çok fazla koltuk değneği...

 
Andrey Khatimlianskii :

Çok fazla koltuk değneği...

konuyu inceliyorum Hatta bununla karşılaştım : Bir piyasa emrinin OrderSend'i doğrudur, bundan sonra PositionsTotal = 0, OrdersTotal = 0, geçmiş tablolar değişmez.

Görünüşe göre IsSynchronized() yazmak mümkünmüş. Kod ağır. Nasıl yayınlayacağıma henüz karar vermedim.

 
// Демонстрация открытия дубля позиции в MT5.

#include <Trade\Trade.mqh>

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

Bu kodu boş bir demo hesabında çalıştırın ve birkaç saniye içinde iki pozisyonun açıldığını görün.


MT4'teki aynı mantık şuna benziyor.

 void OnStart ()
{
   while (! IsStopped () && ( OrdersTotal () <= 1 )) // Закончим, когда появится более одной позиции.
     if ( OrderSelect ( 0 , SELECT_BY_POS))
      OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0 ) // Если есть позиция - закрываем.
     else
       OrderSend ( _Symbol , OP_BUY, 0.01 , Ask, 0 , 0 , 0 ) // Если нет позиции и ордера - открываем позицию.
}

MT4'teki böyle bir kodun çift pozisyona neden olmayacağı açıktır. Ama MT5'te değil.

 
fxsaber :

Bu kodu boş bir demo hesabında çalıştırın ve birkaç saniye içinde iki pozisyonun açıldığını görün.


MT4'te de aynı mantık şuna benziyor.

MT4'teki böyle bir kodun çift pozisyona neden olmayacağı açıktır. Ama MT5'te değil.

En sonunda! Bunu yeni mi keşfettin? Bu sorun, terminalin kendisi kadar eskidir. Ama sonunda, terminal kullanıcıları bunu fark ettiler ... on yıl sonra.

Alım satım işlemlerini kendiniz gerçekleştirdiğinizde, sorun basit bir şekilde çözülebilir - eylem gerçekleştirildikten sonra bir saniyeliğine Sleep() öğesini girin. Ancak EA'da zararı durdur/karı al ve piyasa kapanışı kullanıldığında, bu sorunla karşılaşma tehlikesi vardır ve bu durumda bunun bir çözümü yoktur.

 
Dmitry Fedoseev :

En sonunda! Bunu yeni mi keşfettin? Bu sorun, terminalin kendisi kadar eskidir. Ama sonunda, terminal kullanıcıları bunu fark ettiler ... on yıl sonra.

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

Alım satım işlemlerini kendiniz gerçekleştirdiğinizde, sorun basit bir şekilde çözülebilir - eylem gerçekleştirildikten sonra bir saniyeliğine Sleep() öğesini girin. Ancak EA'da zararı durdur/karı al ve piyasa kapanışı kullanıldığında, bu sorunla karşılaşma tehlikesi vardır ve bu durumda bunun bir çözümü yoktur.

Çözüm bulundu.

 
fxsaber :

Bu kodu boş bir demo hesabında çalıştırın ve birkaç saniye içinde iki pozisyonun açıldığını görün.

Garip. Oynanabilir değil. MQ'dan bir demo üzerinde kontrol edildi, inşa 2900, EURUSD, sıfır yayılma. Yaklaşık beş dakika bekledi.

Belki de bir MQ sunucusu değil, gerçek bir DC/broker'ın belirli bir sunucusunu kullanmanız gerekiyor?

 
Ihor Herasko :

Garip. Oynanabilir değil. MQ'dan bir demo üzerinde kontrol edildi, inşa 2900, EURUSD, sıfır spread. Yaklaşık beş dakika bekledi.

Belki de bir MQ sunucusu değil, gerçek bir DC/broker'ın belirli bir sunucusunu kullanmanız gerekiyor?

ForexTimeFXTM-Demo01

 
fxsaber :

ForexTimeFXTM-Demo01

Evet, şimdi komut dosyası duruyor. Ama pozisyon hala aynı. İkincisi, görünüşe göre, kapanmak için zamanı var mı?

 
Ihor Herasko :

Evet, şimdi komut dosyası duruyor. Ama pozisyon hala aynı. İkincisi, görünüşe göre, kapanmak için zamanı var mı?

Bende her zaman iki tane kalır. Biri kalırsa, bu daha da büyük bir hatadır:

  1. PositionsTotal = 1 - kapatmak için bir emir gönderir.
  2. Bundan sonra, PositionsTotal = 2 ve p.1'den gelen sipariş kapatılır.
 
fxsaber :

Bende her zaman iki tane kalır. Biri kalırsa, bu daha da büyük bir hatadır:

  1. PositionsTotal = 1 - kapatmak için bir emir gönderir.
  2. Bundan sonra, PositionsTotal = 2 ve p.1'den gelen sipariş kapatılır.

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.