İşlem işleme OnTradeTransaction

 

İyi akşamlar.

Arkadaşlar lütfen çözmeme yardım edin. Sorun muhtemelen yeni değil, ancak net bir çözüm bulamadım (ne pratikte ne de forumlarda).

2 araçtaki terminalde 2 farklı robot başlatıyorum. Büyüler her yerde farklıdır. Robot bekleyen limitler belirler, OnTradeTransaction prosedüründe işlemin işlemlerini yakalarım ve buna bağlı olarak bekleyen stop emirleri veririm.

İşlem işlem kodu aşağıdadır

 case TRADE_TRANSACTION_DEAL_ADD :
        {
         drop_info2( "TRADE_TRANSACTION_DEAL_ADD\r\n" +TransactionDescription(trans));
         if ((trans.deal_type== DEAL_TYPE_BUY || trans.deal_type== DEAL_TYPE_SELL ) && trans.order!= 0 )
           {
             if (getIsDealOfExpert(trans.deal)) //функция проверки принадлежности сделки к роботу
              {
               drop_info2( "Сделка наша" );
               analyzeFilledOrder(trans.order,trans.volume); //процедура по выставлению отложенных стоп ордеров
              }
           }
        }
       break ;

Bir anlaşmanın bir robota ait olup olmadığını kontrol etmek için fonksiyon kodu

 bool getIsDealOfExpert( ulong dealTicket)
     {
       if ( HistoryDealSelect (dealTicket) && HistoryDealGetInteger (dealTicket, DEAL_MAGIC )==magic_number && HistoryDealGetString (dealTicket, DEAL_SYMBOL )==symbol)
         return true ;
       else
         return false ;
     }

Bekleyen durdurma emirleri vermek için prosedür kodu

 void analyzeFilledOrder( ulong orderTicket, double volume)
  {
   bool isFindOrder= false ;
   string fullComment;
   ENUM_ORDER_TYPE orderType;
   if (getIsOrderOfExpert(orderTicket, true )) //Если ордер из сделки уже в истории
     {
      fullComment= HistoryOrderGetString (orderTicket, ORDER_COMMENT );
      orderType= ENUM_ORDER_TYPE ( HistoryOrderGetInteger (orderTicket, ORDER_TYPE ));
      isFindOrder= true ; //локальная переменная, если нашли в истории
     }
   if (!isFindOrder && getIsOrderOfExpert(orderTicket, false )) //Если не нашли ордер в истории и ордер есть не в истории
     {
      fullComment= OrderGetString ( ORDER_COMMENT ); 
      orderType= ENUM_ORDER_TYPE ( OrderGetInteger ( ORDER_TYPE ));
      isFindOrder= true ; //локальная переменная, если нашли не в истории
     }
   if (isFindOrder) //если хоть где-то нашли, то выставляем отложенные стоп ордера
     {
     //выставляем стоп ордера

Tarihte değil, geçmişte sipariş arama fonksiyonunun kodu

 bool getIsOrderOfExpert( ulong OrderTicket , bool isHistory)
     {
       bool is_expert= false ;
       //если ордер находится в истории
       if (isHistory)
        {
         if ( HistoryOrderSelect ( OrderTicket ) && HistoryOrderGetInteger ( OrderTicket , ORDER_MAGIC )==magic_number && HistoryOrderGetString ( OrderTicket , ORDER_SYMBOL )==symbol)
            is_expert= true ;
        }
       else
        {
         if ( OrderSelect ( OrderTicket ) && OrderGetInteger ( ORDER_MAGIC )==magic_number && OrderGetString ( ORDER_SYMBOL )==symbol)
            is_expert= true ;
        }
       return is_expert;
     }

İşlemlerin gelişiyle ilgili bilgileri, terminalde alındıkları sıraya göre günlükte gösteririm. Şimdi bir demo hesapta işlem yaparken karşılaştığım sorun:

Periyodik olarak, işlemler şu sırayla gelir: TRADE_TRANSACTION_ORDER_DELETE, ardından TRADE_TRANSACTION_DEAL_ADD, ardından TRADE_TRANSACTION_HISTORY_ADD. Genellikle bu durumda, işlem tamamlandıktan sonra stop emirleri verilmez. Bence bu, siparişin zaten silinmiş olması, ancak henüz tarihe girmemiş olmasından kaynaklanmaktadır. Yani ne tarihte ne de terminalde anlaşmadan bir emir bulamıyoruz. Bu şüpheli olsa da, robot tüm boyutlarda bir sipariş aradıktan sonra ( isFindOrder= false ) bulamadığı için durdurma emirlerinin verilmediği gerçeği devam etmektedir. İşlemlerin sırası doğru olabilir, ancak sipariş hala hiçbir yerde bulunamadı. Her durumda, robot anlaşmayı doğru bir şekilde belirler, ancak siparişlerin verilmesine ulaşmaz. Aynı zamanda her şey zaman zaman düzgün çalışıyor ve siparişler veriliyor.

Farklı yaklaşımlar denedim, hiçbir şey yardımcı olmuyor. Şimdi bekleyen siparişler için prosedürün başlangıcına 1 saniyelik bir uyku eklemeyi düşünüyorum, belki yeterli zaman yoktur. Genel olarak, başka nerede kazacağımı bile bilmiyorum.

Lütfen deneyimlerinizi ve fikirlerinizi paylaşın.

 
Илья Ребенок :

İyi akşamlar.

Arkadaşlar lütfen çözmeme yardım edin. Sorun muhtemelen yeni değil, ancak net bir çözüm bulamadım (ne pratikte ne de forumlarda).

2 araçtaki terminalde 2 farklı robot başlatıyorum. Büyüler her yerde farklıdır. Robot bekleyen limitler belirler, OnTradeTransaction prosedüründe işlemin işlemlerini yakalarım ve buna bağlı olarak bekleyen stop emirleri veririm.

İşlem işlem kodu aşağıdadır

Bir anlaşmanın bir robota ait olup olmadığını kontrol etmek için fonksiyon kodu

Bekleyen durdurma emirleri vermek için prosedür kodu

Tarihte değil, geçmişte sipariş arama fonksiyonunun kodu

İşlemlerin gelişiyle ilgili bilgileri, terminalde alındıkları sıraya göre günlükte gösteririm. Şimdi bir demo hesapta işlem yaparken karşılaştığım sorun:

Periyodik olarak, işlemler şu sırayla gelir: TRADE_TRANSACTION_ORDER_DELETE, ardından TRADE_TRANSACTION_DEAL_ADD, ardından TRADE_TRANSACTION_HISTORY_ADD. Genellikle bu durumda, işlem tamamlandıktan sonra stop emirleri verilmez. Bence bu, siparişin zaten silinmiş olması, ancak henüz tarihe girmemiş olmasından kaynaklanmaktadır. Yani ne tarihte ne de terminalde anlaşmadan bir emir bulamıyoruz. Bu şüpheli olsa da, robot tüm boyutlarda bir sipariş aradıktan sonra ( isFindOrder= false ) bulamadığı için durdurma emirlerinin verilmediği gerçeği devam etmektedir. İşlemlerin sırası doğru olabilir, ancak sipariş hala hiçbir yerde bulunamadı.

Farklı yaklaşımlar denedim, hiçbir şey yardımcı olmuyor. Şimdi bekleyen siparişler için prosedürün başlangıcına 1 saniyelik bir uyku eklemeyi düşünüyorum, belki yeterli zaman yoktur. Genel olarak, başka nerede kazacağımı bile bilmiyorum.

Lütfen deneyimlerinizi ve fikirlerinizi paylaşın.

Kodun tamamını anlamadım. Bana göre, yaklaşım hiç doğru değil.

TRADE_TRANSACTION_DEAL_ADD işlem tipi sırasında, trans.position ile bir pozisyon seçmeniz ve sihrini kontrol etmeniz gerekir.

 if ( PositionSelectByTicket (trans.position) && PositionGetInteger ( POSITION_MAGIC ) == mag)

Ayrıca sembolü trans.symbol == _Symbol ile kontrol edebilir ve bu kontrollerin sonuçlarına göre bir karar verebilirsiniz.

 
Alexey Viktorov :

Kodun tamamını anlamadım. Bana göre, yaklaşım hiç doğru değil.

TRADE_TRANSACTION_DEAL_ADD işlem tipi sırasında, trans.position ile bir pozisyon seçmeniz ve sihrini kontrol etmeniz gerekir.

Ayrıca sembolü trans.symbol == _Symbol ile kontrol edebilir ve bu kontrollerin sonuçlarına göre bir karar verebilirsiniz.

Netleştirme modunu eklemeyi unuttum. Konum tüm robotlar için aynıdır. Yani bir robot pozisyonu satın aldı, ikincisi pozisyon aldı, TRADE_TRANSACTION_DEAL_ADD olayları ters sırada geldi ve sonuç olarak ilk robot görmedi.

Evet ve mantığa göre işlemden emir yorumu almam gerekiyor pozisyonun burada pek bir faydası olmayacaktır.
 
Илья Ребенок :

Lütfen deneyimlerinizi ve fikirlerinizi paylaşın.

bir durum

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Hatalar, hatalar, sorular

fxsaber , 2018.06.20 23:18

Sipariş sistemdeyken, Terminal'de değilken, bu tür hayali sipariş durumlarının ne kadar sürdüğünü kontrol etmeye karar verdim.

 // Советник отслеживает длительность ситуаций, когда ордер отсутствует среди текущих и исторических

#define TOSTRING(A)   #A + " = " + ( string )(A) + "\n"
#define TOSTRING2(A) #A + " = " + EnumToString (A) + " (" + ( string )(A) + ")\n"

bool OrderIsExist( const ulong & OrderTicket )
{
   return ( OrderTicket ? OrderSelect ( OrderTicket ) || HistoryOrderSelect ( OrderTicket ) : true );
}

void OnTradeTransaction ( const MqlTradeTransaction &Trans, const MqlTradeRequest &, const MqlTradeResult & )
{
   static bool PrevIsExist = true ;
   static ulong StartTime = 0 ;
   static ulong MaxInterval = 0 ;
  
   const ulong NowTime = GetMicrosecondCount ();
   const bool IsExist = OrderIsExist(Trans.order);
    
   if (!IsExist)
  {
     Print (TOSTRING2(Trans.type) + TOSTRING(Trans.order) +
          TOSTRING( OrderSelect (Trans.order)) + TOSTRING( HistoryOrderSelect (Trans.order)));       
  
     if (PrevIsExist) 
      StartTime = NowTime;
  }
   else if (!PrevIsExist)
  {
     const ulong Interval = NowTime - StartTime;
    
     Print (TOSTRING(Interval) + TOSTRING2(Trans.type) + TOSTRING(Trans.order) +
          TOSTRING( OrderSelect (Trans.order)) + TOSTRING( HistoryOrderSelect (Trans.order)));       
    
     if (Interval > MaxInterval)
    {
      MaxInterval = Interval;
      
       Comment (TOSTRING(MaxInterval) + TOSTRING(Trans.order)); // mcs.
    }
  }
          
  PrevIsExist = IsExist;
}


Sonuç

 2018.06 . 21 00 : 10 : 31.047 Trans.type = TRADE_TRANSACTION_ORDER_DELETE ( 2 )
2018.06 . 21 00 : 10 : 31.047 Trans.order = 2210967406
2018.06 . 21 00 : 10 : 31.047 OrderSelect (Trans.order) = false
2018.06 . 21 00 : 10 : 31.047 HistoryOrderSelect (Trans.order) = false
2018.06 . 21 00 : 10 : 31.047 
2018.06 . 21 00 : 10 : 31.080 Interval = 32643
2018.06 . 21 00 : 10 : 31.080 Trans.type = TRADE_TRANSACTION_HISTORY_ADD ( 3 )
2018.06 . 21 00 : 10 : 31.080 Trans.order = 2210967406
2018.06 . 21 00 : 10 : 31.080 OrderSelect (Trans.order) = false
2018.06 . 21 00 : 10 : 31.080 HistoryOrderSelect (Trans.order) = true


32 milisaniyelik bir emir var ama Terminalde yok! Bu aralıkta ticaret mantığı yürütülürse bunun ne gibi sonuçlara yol açabileceğini hayal edin...


İlginç bir şekilde, hayali siparişler çoğunlukla yalnızca TRADE_TRANSACTION_ORDER_DELETE ve TRADE_TRANSACTION_DEAL_ADD (çok daha az sıklıkla) işlem türleri için mevcuttur.


Platformun çok kötü nüansı.


ZY Ne yazık ki ilk beşte alım satım işlemlerinin şüpheli performansı.


İkinci

Pozisyon açan bir piyasa emri verildi ve Emir Toplamı bir arttı.

  • Yerine getirildi ve Sipariş Toplamı bir azaldı, ancak Pozisyon Toplamı bir artmadı. Onlar. bir pozisyon var ama Terminal'in bundan haberi yok.
  • Örneğin, pozisyon veya emir yok - PositionsTotal = 0, OrdersTotal = 0.

    Bir piyasa emri veriyorsunuz. Bu durumda, PozisyonlarToplam = 0, SiparişlerToplam = 1.

    Piyasa emri tamamlandı - Emir Toplamı = 0. Ancak Pozisyon Toplamı = 0 !

     
    Илья Ребенок :

    Netleştirme modunu eklemeyi unuttum. Konum tüm robotlar için aynıdır

    Önemli değil. Bir pozisyonun her zaman bir bileti vardır, ancak sembolle de seçebilirsiniz. İşlem hacmi veya başka bir şey için bir çek eklemeniz gerekebilir. Örneğin, siparişleri seçin ve anlaşmaları konumlandırın ve doğru olanı bulmak için bunları sallayın. Ama anlaşma anlaşmadır... Ve hiç kimse işlemlerin sırasını garanti etmez. Çok uzun zaman önce, genellikle olası işlem kayıpları hakkında bir uyarı vardı.


    Gönderinizdeki ek göz önüne alındığında, uymuyor. Bu durumda, daha yakından bakmanız gerekir.

     
    Илья Ребенок :

    Farklı yaklaşımlar denedim, hiçbir şey yardımcı olmuyor.

    Gerçekleştirmek için basit bir eylem yazın.

     
    fxsaber :

    bir durum


    İkinci

    Teşekkürler, okuyacağım ama ilk bakışta varsayımımı doğruluyor.

    Alexey Viktorov :

    Önemli değil. Bir pozisyonun her zaman bir bileti vardır, ancak sembolle de seçebilirsiniz. İşlem hacmi veya başka bir şey için bir çek eklemeniz gerekebilir. Örneğin, siparişleri seçin ve anlaşmaları konumlandırın ve doğru olanı bulmak için bunları sallayın. Ama anlaşma anlaşmadır... Ve hiç kimse işlemlerin sırasını garanti etmez. Çok uzun zaman önce, olası işlem kaybı hakkında bir uyarı vardı.


    Gönderinizdeki ek göz önüne alındığında, uymuyor. Bu durumda, daha yakından bakmanız gerekir.

    İşlem kaybıyla ilgili bir gönderi gördüm, ancak orada moderatörler bunun geçmişin kalıntısı olduğunu ve belgelerden çıkarmayı unuttuğunu söylediler.

    fxsaber :

    Gerçekleştirmek için basit bir eylem yazın.

    Basit bir eylem yazmayı tam olarak anlamadım) Lütfen açıklayın.

     
    Илья Ребенок :


    İşlem kaybıyla ilgili bir gönderi gördüm, ancak orada moderatörler bunun geçmişin kalıntısı olduğunu ve belgelerden çıkarmayı unuttuğunu söylediler.

    Zaten silindi, ama çok uzun zaman önce değildi.

     
    Илья Ребенок :

    Basit bir eylem yazmayı tam olarak anlamadım) Lütfen açıklayın.

    Ticaret görevi nedir?

     
    fxsaber :

    Ticaret görevi nedir?

    Limit gecikmeleri belirliyoruz, tetiklendiğinde bir durdurma emri ve kar al emri belirliyoruz. Durdurma tetiklenir, kar al'ı kaldırırız ve bunun tersi de geçerlidir. Durdurma emirleri verdiğimiz ve kar aldığımız temel limitin bileti, durdurma emirlerini yazıyorum ve yorumda kar alıyorum. Bu nedenle emir yorumları almak önemlidir, böylece bir stop emri tetiklendiğinde, aynı yorumla bir kar al ve silebilirsiniz.

    Robot yeniden doldurma sağlar, bu nedenle, yeniden satın alırken, ayrıca bir durdurma emri verir ve kar alırız ve yeniden doldurma biletini yoruma gireriz.

    1 saniyede uyku fikri günü kurtarabilir mi? Tüm TRADE_TRANSACTION_ORDER_DELETE ve TRADE_TRANSACTION_HISTORY_ADD işlemlerini yapmak için zamana sahip olmak

    Общие принципы - Торговые операции - MetaTrader 5
    Общие принципы - Торговые операции - MetaTrader 5
    • www.metatrader5.com
    Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и позиция. — это распоряжение брокерской компании купить или продать финансовый инструмент. Различают два основных типа ордеров: рыночный и отложенный. Помимо них существуют специальные ордера Тейк Профит...
     

    Илья Ребенок :

    Robot yeniden doldurma sağlar, bu nedenle, yeniden satın alırken, ayrıca bir durdurma emri verir ve kar alırız ve yeniden doldurma biletini yoruma gireriz.

    Aynı anda >=2 alma ve durma olabilir mi?