"MQL5 Cookbook: TradeTransaction Olayının İşlenmesi" makalesi için tartışma

 

Yeni makale MQL5 Cookbook: TradeTransaction Olayının İşlenmesi yayınlandı:

Bu makale MQL5 dilinin imkanlarını, olay güdümlü programlama açısından ele almaktadır. Bu yaklaşımın en büyük avantajı, alım satım operasyonunun aşamalı uygulaması hakkında programın bilgi alabilmesidir. Makale ayrıca, TradeTransaction olay işleyicisini kullanarak devam eden alım satım işlemi hakkında, bilgiyi alma ve işleme örneği içerir. Benim görüşüme göre, böyle bir yaklaşım yatırımları bir terminalden diğerine kopyalamak için kullanılabilir.

Neredeyse pozisyon işlenmesiyle ilgili tüm alım satım işlemleri, OnTradeTransaction() işleyicisinin beş çağrısını gerektirir. Bunlar arasında:

  • bir pozisyonun açılması;
  • pozisyon;
  • pozisyonun tersine çevrilmesi;
  • pozisyona lot eklemek;
  • pozisyonun kısmi kapanması vardır.

Bir pozisyonu değiştirmek, TradeTransaction olay işleyicisini iki kez çağıran tek işlemdir.

Belirli alım satım operasyonlarından hangi işlem türlerinin sorumlu olduğu hakkında bilgi bulunmadığı için bunu deneme yanılma yoluyla bulacağız.

Bundan önce, TradeTransaction olay işleyicisini içerecek bir Expert şablonu oluşturmamız gerekecektir. Şablon sürümünü TradeProcessor.mq5 olarak adlandırdım. Logdaki yapı alanlarının değerleri hakkında bilgi gösterme erişimi için bir özellik ekledim. Bu değerler, olay işleyicisinin parametreleridir. Bu kayıtları analiz etmek zaman alacaktır ancak sonunda olayların tam resmini sunarak işe yarayacaktır.

Expert'i, MetaTrader 5 terminalindeki herhangi bir grafikte ve hata ayıklama modunda tekrar başlatmamız gereklidir.

Manuel bir pozisyon açın ve koda bir göz atın. İşleyicinin ilk çağrısı şu şekilde olacaktır (Şekil 1).

Şek.1. Tür alanı, TRADE_TRANSACTION_REQUEST'e eşittir

Şek.1. Tür alanı, TRADE_TRANSACTION_REQUEST'e eşittir

Yazar: Denis Kirichenko

 

Deneyimlerime dayanarak TradeTransaction'ı kullanmanın gerçek ihtiyacının asenkron modda programlama yaparken ortaya çıktığını söyleyebilirim. Makalenin bu mod hakkında tek kelime etmemesi üzücü.

s.s. Ben de "Ne MQL tarifleri" diye düşünmüştüm. - Anatoly'nin makalelerinin ticari marka başlığıydı. Ama şimdi öyle olmadığı ortaya çıktı(

 

C-4, görüşünüz için teşekkür ederim.

C-4:

Deneyimlerime dayanarak TradeTransaction'ı kullanmanın gerçek ihtiyacının asenkron modda programlama yaparken ortaya çıktığını söyleyebilirim. Makalenin bu mod hakkında tek kelime etmemesi üzücü ...

TradeTransaction işleyicisini kullanmanın nedeni olabilecek farklı ihtiyaçlar ve gereksinimler vardır. Bu ilginç bir konu, umarım deneyimli meslektaşlar da bu konu hakkında yorum yaparlar...

s.s. Ben de "MQL tarifleri" diye düşünmüştüm. - Anatoly'nin makalelerinin markasıydı. Şimdi öyle olmadığı ortaya çıktı(

Evet, bu yazı dizisinin mucidinin Anatoly olduğunu kabul ediyorum. Hoşuma gitti, ben de mütevazı bir şekilde döngüye katıldım :-))))

Umarım Anatoly aldırmaz....

 
Bu makalede kısmi emir gerçekleştirme(ORDER_STATE_PARTIAL) konusunu ele almak için henüz zamanım olmadı. Size sorum, TradeTransaction işleyicisi kaç kez çağrılacak?
 
denkir:
Bu makalede kısmi emir gerçekleştirme(ORDER_STATE_PARTIAL) konusunu ele almak için henüz zamanım olmadı. Size sorum, TradeTransaction işleyicisi kaç kez çağrılacak?

Bilmiyorum. Mantıksal olarak, işleyici tam bir yürütmede olduğu kadar çok kez tetiklenmelidir. Çünkü emir gerçekleştirme ayrık bir olay değildir ve MT emrin kısmen mi yoksa tamamen mi gerçekleştirileceğini bilemez.

s.s. Ne yazık ki, olayların teslimi garanti edilmez ve olayların kendileri yalnızca gerçek zamanlı olarak çalışır, bu da uygulamalarını sınırlı hale getirir. Ancak eşzamansız sistemler veya ticari kopyalayıcılar gibi durum takibine dayalı sistemler için son derece kullanışlıdırlar. Olaylar sayesinde, OnTimer olayını beklemekle ilişkili döngü ve ek frenler olmadan bir algoritma oluşturmak mümkündür.

 
denkir:

...

Umarım Anatoly için sakıncası yoktur.

Hayır, tabii ki aldırmaz. ) Özellikle de...

C-4:

...

s.s. Ben de "MQL tarifleri "nin - Anatoly'nin makalelerinin marka ismiydi. Şimdi öyle olmadığı ortaya çıktı(

... "MQL5 Tarifler" etiketi MQ editör kadrosu tarafından önerilmiştir, bu nedenle herkes tarafından kullanılabilir. Önemli olan daha fazla ve farklı makalelere sahip olmaktır.

 
Referans kılavuzunda tutarlılığın garanti edilmediği açıkça belirtilmektedir! Geçmiş verilere bakarsanız, tutarlılığın oldukça farklı olduğunu görürsünüz.
 
Bu makale için teşekkürler. Çok faydalı.
 
Sistemi nasıl çalıştırabilirim?
 
Mükemmel bir metin! Burada çok şey öğrendim, tebrikler
 
VikMorroHun #:
Bu makale için teşekkürler. Çok faydalıdır.

Merhaba,

Durumum oldukça basit görünüyor: Bekleyen bir emir (Sell_Stop) veriyorum ve a) bekleyen emrin yerine getirilmesi ve son olarak b) açık pozisyonun zararı durdur veya kar hedefi ile kapatılması durumunda tepki verebilmek istiyorum.

Doğru mu anlıyorum?

  1. bekleyen emir doldurulduğunda, OnTradeTransaction()'ın "request" parametresi "magic" alanına sahip olmasına rağmen, sihirli numarayı yalnızca pozisyon listesinden talep ederek alabilirim:
             if(!PositionSelectByTicket(trans.position)) {Print(__LINE__," PositionSelectByTicket FAILED ",err());}
             else {      
                OpnPos[sz].mag  = PositionGetInteger(POSITION_MAGIC);
             }   
    

  2. satış pozisyonunun açılıp kapanmadığını bilemeyeceğim şekilde çeşitli işlem türleri:
    void OnTradeTransaction(const MqlTradeTransaction& trans,
                            const MqlTradeRequest& request,
                            const MqlTradeResult& result)
      {
    //---
    
    //--- 
       static int counter=0;   // OnTradeTransaction() çağrılarının sayacı 
       static uint lasttime=0; // OnTradeTransaction() son çağrısının zamanı 
    //--- 
       uint time=GetTickCount(); 
    //--- son işlem 1 saniyeden daha uzun süre önce gerçekleştirilmişse, 
       if(time-lasttime>1000) 
         { 
          counter=0; // o zaman bu yeni bir işlemdir ve sayaç sıfırlanabilir 
          if(IS_DEBUG_MODE) 
             Print(__LINE__," "," New trade operation dTime",time-lasttime); 
         } 
       Print(__LINE__," ",counter," ",DoubleToString((double(lasttime=time)/1000.0,2)
                ," Tr.Type: ",EnumToString(trans.type)," DL.Type: ",EnumToString(trans.deal_type)
                ," RQ.Type: ",EnumToString(request.type)," RQ.Fill: ",EnumToString(request.type_filling)
             ); 
    Bu Yazdırma, 01:00:40'ta bir pozisyon açılması ve bu pozisyonun 10:04:40'ta kapatılması durumunda üretilir:
    01:00:40   322 0 81952.76 Tr.Type: TRADE_TRANSACTION_DEAL_ADD DL.Type: DEAL_TYPE_SELL RQ.Type: ORDER_TYPE_BUY RQ.Fill: ORDER_FILLING_FOK // open sell position
    10:04:40   322 0 81970.73 Tr.Type: TRADE_TRANSACTION_DEAL_ADD DL.Type: DEAL_TYPE_BUY  RQ.Type: ORDER_TYPE_BUY RQ.Fill: ORDER_FILLING_FOK // close sell position
    
    01:00:40   322 0 81955.30 Tr.Type: TRADE_TRANSACTION_ORDER_DELETE DL.Type: DEAL_TYPE_BUY RQ.Type: ORDER_TYPE_BUY RQ.Fill: ORDER_FILLING_FOK // open sell position
    10:04:40   322 0 81980.91 Tr.Type: TRADE_TRANSACTION_ORDER_DELETE DL.Type: DEAL_TYPE_BUY RQ.Type: ORDER_TYPE_BUY RQ.Fill: ORDER_FILLING_FOK // close sell position
    
    01:00:40   322 0 81965.14 Tr.Type: TRADE_TRANSACTION_HISTORY_ADD DL.Type: DEAL_TYPE_BUY RQ.Type: ORDER_TYPE_BUY RQ.Fill: ORDER_FILLING_FOK // open sell position
    10:04:40   322 0 81982.69 Tr.Type: TRADE_TRANSACTION_HISTORY_ADD DL.Type: DEAL_TYPE_BUY RQ.Type: ORDER_TYPE_BUY DL.Type: ORDER_FILLING_FOK // close sell position
    
    01:00:59   322 0 81968.50 Tr.Type: TRADE_TRANSACTION_REQUEST     DL.Type: DEAL_TYPE_BUY RQ.Type: ORDER_TYPE_SELL RQ.Fill: ORDER_FILLING_FOK // open sell position
    
    Çağrılar hemen hemen aynı görünüyor - nasıl yani? 1:00'de bir satış açıldı - neden 12 ..TYPE_BUY ve sadece 2 TYPE_SELL var?
    Bir satış stopunun tetiklenmesi ve bir satış (pozisyon) haline gelmesi durumunda request.type = ORDER_TYPE_BUY'un anlamı nedir? _BUY nereden geliyor?
Bir pozisyonun satış mı yoksa alış pozisyonu mu olduğunu bilmeden OnTradeTransaction()'ın araçlarıyla (parametreleriyle) zarar durdurma veya kar hedefi ile kapatıldığını belirlemenin zarif bir yolunu biliyor musunuz?