Gerçek zamanlı keneler - sayfa 22

 
Andrey Khatimlianskii :

Günlük zamanına bakın. Bütün bunlar bir ms'de ve ardından (aynı ms'de) bir sürü OnBook'ta oldu.

Tüm olayları sayaç olarak sayabilirsiniz, ancak görsel olarak bile daha fazla OnBook'un olduğu açıktır.

Andrey, OnFunctions tetiklendiğinde sayılar sabit mikrosaniyelerdir ve ardından her şey diziden birlikte yazdırılır. OnBuks, sonunda, belki daha fazla - sayacağım, ancak OnTiki'nin sıraya girmesine neden izin verdikleri açık değil. Yoksa her OnTik, OnBuk'a karşılık gelmiyor mu?
 
prostotrader :


Async siparişlerini kullandığınızı yazdınız mı?
İlginç hale geldi, işlemlerin yürütülmesini hangi algoritmayı kontrol ediyorsunuz?

 
Aleksey Mavrin :
Andrey, OnFunctions tetiklendiğinde sayılar sabit mikrosaniyelerdir ve ardından her şey diziden birlikte yazdırılır. OnBuks, sonunda, belki daha fazla - sayacağım, ancak OnTiki'nin sıraya girmesine neden izin verdikleri açık değil. Yoksa her OnTik, OnBuk'a karşılık gelmiyor mu?

ağ dünyasına hoş geldiniz

yönetici olarak çalıştırmanın en kolay yolu: Netstat - a -b

bağlantı noktalarını ve yazılımı göreceksiniz, kurcalamak istemiyorum, ancak MT5 sunucusunun, terminalin zaten gerekli "raflara" koyduğu farklı bilgiler içeren paketleri eşzamansız olarak çalıştırdığını düşünüyorum.

Not: Bir seferde çok fazla çıktı alıyorsanız Print () ve baskıların ihmal edilmesi hakkında? - Bilgilerinizi dosyaya yazın - bu yüzden her şeyi sırayla kaydedin, ancak kapatmadan önce dosyayı kapatmayı unutmayın. Teoride, dosyadaki günlüklerdeki Print() tam olmalıdır, ancak kontrol etmedim ve genel olarak çok fazla veri görüntülenip görüntülenmediğine güvenmiyorum. Burada tartışılan https://www.mql5.com/ru/forum/329730 , çok sık "eksik baskılar" tartışılır))) - arama

 
Aleksey Mavrin :
Andrey, OnFunctions tetiklendiğinde sayılar sabit mikrosaniyelerdir ve ardından her şey diziden birlikte yazdırılır. OnBuks, sonunda, belki daha fazla - sayacağım, ancak OnTiki'nin sıraya girmesine neden izin verdikleri açık değil. Yoksa her OnTik, OnBuk'a karşılık gelmiyor mu?

Anladım.

Eh, yakınlarda hala bir sürü OnBook var. Böyle bir günlük ile herhangi bir sonuç çıkarmak zordur.

 
Roman :

Async siparişlerini kullandığınızı yazdınız mı?
İlginç hale geldi, işlemlerin yürütülmesini hangi algoritmayı kontrol ediyorsunuz?

OnTradeTransaction() + işlevinde, uzun bir süre sunucu yanıtı olup olmadığını kontrol edin.

Genelde sihir üzerine.

Her sembol için bir danışman kurarken 65535 büyü ayırıyorum,

ve bir sipariş gönderirken, ona benzersiz bir sihir atıyorum,

diğer enstrümanlarla örtüşmez.

Bir sembol için başlangıç büyüsünü bu şekilde atadım

 //+------------------------------------------------------------------+
//|                                                    AutoMagic.mqh |
//|                                 Copyright 2017-2018 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
//version   "1.01
ulong symb_magic;
//-------------------------------------------------------------------+
// Split string function                                             |
//+------------------------------------------------------------------+
string SplitString( const string a_str, ulong &a_month, ulong &a_year)
  {
   int str_size= StringLen (a_str);
   int str_tire= StringFind (a_str, "-" );
   int str_tochka= StringFind (a_str, "." , str_tire);
   if ((str_tire> 0 ) && (str_tochka> 0 ) &&(str_size > 0 ))
     {
      a_month= ulong ( StringToInteger ( StringSubstr (a_str,str_tire+ 1 ,str_tochka-str_tire- 1 )));
      a_year = ulong ( StringToInteger ( StringSubstr (a_str,str_tochka+ 1 ,str_size-str_tochka- 1 )));
       if ((a_month > 0 ) && (a_year > 0 )) return ( StringSubstr (a_str, 0 , str_tire));
     }
   return ( "" );
  }
//-------------------------------------------------------------------+
// Get Magic function                                                |
//+------------------------------------------------------------------+
ulong GetMagic( const string a_symbol)
{
  symb_magic = 0 ;
   if ( SymbolSelect ( Symbol (), true ) == false )
  {
     Print ( __FUNCTION__ , ": Нет такого символа!" );
     return ( 0 );
  }
   ulong month = 0 ;
   ulong year = 0 ;
   string new_str = SplitString(a_symbol,month,year);
   if ( StringLen (new_str)> 0 )
  {
     uchar char_array[];
     int result= StringToCharArray (new_str,char_array, 0 , WHOLE_ARRAY , CP_ACP );
     if (result> 0 )
   {
     ulong value;
     for ( int i = 0 ; i < result - 1 ; i++)
     {
       value= ulong (char_array[i]);
       value<<=( 56 -(i* 8 ));
       symb_magic += value;
     }
     month<<= 24 ;
     symb_magic += month;
     year<<= 16 ;
     symb_magic += year;
     return (symb_magic);
   }
 }
   return ( 0 ); 
}
//-------------------------------------------------------------------+
// Is my magic function                                              |
//+------------------------------------------------------------------+
bool IsMyMagic( const ulong m_magic)
{
   if (m_magic > 0 )
  {
     ulong stored_magic=symb_magic;
    stored_magic>>= 16 ;
     ulong in_magic = m_magic;
    in_magic>>= 16 ;
     if (in_magic == stored_magic) return ( true );
  }  
   return ( false );
}
//-------------------------------------------------------------------+
// Get stored magic function                                         |
//+------------------------------------------------------------------+
ulong GetStoredMagic()
{
   if (symb_magic > 0 ) return (symb_magic);
   return ( 0 );  
}
//+------------------------------------------------------------------+

Magic - ulong (8 bayt) N-p

GAZR-3.12

Bayt[7] (yüksek bayt) - "G"

Bayt[6] - "A"

Bayt[5] - "Z"

Bayt[4] - "R"

Bayt[3] - "3"

Bayt[2] - "12"

Bayt[1] ve Bayt[0] - sihirbazlar için yedek (65535)

Bir sipariş gönderirken sihirleri şu şekilde sıralarım:

  mem_magic = magic_storage + 1 ;
   if (magic_storage >= (magic_number + 65530 )) mem_magic = magic_number;

Ancak bu yalnızca FORTS için geçerlidir, çünkü sembol adları standartlaştırılmıştır !

Katma

Ve sipariş başarıyla gönderilirse, o zaman

zamanı hatırlamak

   if ( OrderSendAsync (request, result) == true )
  {
     if ((result.retcode == TRADE_RETCODE_PLACED ) || (result.retcode == TRADE_RETCODE_DONE )) 
    {
      req_id = result.request_id;
      magic_storage = mem_magic;
      state = ORD_DO_SET;
      mem_time = GetMicrosecondCount ();
      mem_start_time = TimeCurrent ();
      SetTransCount();
    }
     else
    {
      mem_magic = 0 ;
      mem_time = 0 ;
      mem_start_time = 0 ;
      CheckError(result.retcode, "Place: Ордер не установлен! Причина: " , order_status, ticket);
    }
  }
mem_time = GetMicrosecondCount (); - для проверки времени задержки OnTradeTransaction
mem_start_time = TimeCurrent ();   - для сужения рамок поиска в истории

Ve sonra (OnTradeTransaction'da yanıt yoksa)

ticket = FindOrderBuyMagic(mem_magic, start_time);

Peki, FindOrderBuyMagic işlevinin kendisi

 #define TIME_DELAY     180
 //+------------------------------------------------------------------+
// Expert Find order Buy Magic function                              |
//+------------------------------------------------------------------+
ulong FindOrderBuyMagic( const ulong a_magic, const datetime set_time)
{
   if (a_magic > 0 )
  {
     if (IsMyMagic(a_magic) == true )
    {
       ulong cur_ticket = 0 ;
       for ( int i = OrdersTotal () - 1 ; i >= 0 ; i--)
      {
        cur_ticket = OrderGetTicket (i);
         if ( OrderSelect (cur_ticket))
        {
           if ( ulong ( OrderGetInteger ( ORDER_MAGIC )) == a_magic) return (cur_ticket);
        }  
     }
      cur_ticket = 0 ;
       datetime start_time = datetime ( ulong (set_time) - TIME_DELAY);
       datetime end_time = datetime ( ulong ( TimeCurrent ()) + TIME_DELAY);    
       if ( HistorySelect (start_time, end_time))
      {
         for ( int i = HistoryOrdersTotal () - 1 ; i >= 0 ; i--)
        {
          cur_ticket = HistoryOrderGetTicket (i);
           if ( ulong ( HistoryOrderGetInteger (cur_ticket, ORDER_MAGIC )) == a_magic) return (cur_ticket);
        }
      }
    }
  }
   return ( 0 );
}

Katma

Otomajikte "iyilik için", 1. bayta danışman tanımlayıcısını (0-255) eklemeniz gerekir,

ama henüz ihtiyacım yok, o yüzden yapmadım :)

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...
 
prostotrader :

OnTradeTransaction() + işlevinde, uzun bir süre sunucu yanıtı olup olmadığını kontrol edin.

İpucu için teşekkürler.

 
prostotrader :

1. Brokerdeki ikinci ve sonraki terminaller ödenir ve sadece hisse ( hisse portföyleri ) ticareti yaptığım stratejilerim yok.

2. Birikmiş GetMicrosecondCount ()'u görüntüleyecekseniz, o zaman

OnDeinit() içinde zamanlayıcı olmadan yapın, EA çıktığında her şey yazdırılacaktır.

lütfen komisyoncuya bir bağlantı atın, kişisel hesapta yapabilirsiniz.

İlginç bir konu... :-)

 
Igor Makanu :

ağ dünyasına hoş geldiniz

yönetici olarak çalıştırmanın en kolay yolu: Netstat - a -b

bağlantı noktalarını ve yazılımı göreceksiniz, kurcalamak istemiyorum, ancak MT5 sunucusunun, terminalin zaten gerekli "raflara" koyduğu farklı bilgiler içeren paketleri eşzamansız olarak çalıştırdığını düşünüyorum.

Not: Bir seferde çok fazla çıktı alıyorsanız Print () ve baskıların ihmal edilmesi hakkında? - Bilgilerinizi dosyaya yazın - bu yüzden her şeyi sırayla kaydedin, ancak kapatmadan önce dosyayı kapatmayı unutmayın. Teoride, dosyadaki günlüklerdeki Print() tam olmalıdır, ancak kontrol etmedim ve genel olarak çok fazla veri görüntülenip görüntülenmediğine güvenmiyorum. Burada tartışılan https://www.mql5.com/ru/forum/329730 , çok sık "eksik baskılar" tartışılır))) - arama

Igor, günlük dosyasını açmayı düşünmeyenler arasında baskı kaybı tartışılıyor, Rinat Fatkullin'in kendisi yüzlerce kez günlük dosyasında hiçbir şeyin kaybolmadığını yazdı. Ama yazınız boşuna kalmasın diye :) Çıktıyı ayrı bir dosyaya ekledim, ayrıca olası sıkışmaları atlamak için biraz farklı çıktı aldığım (tüm olayları CArrayObj'de biriktirdiğim) ikinci bir dosya da yaptım. iki dizi sipariş eden tasarımımdan, yani. Her şeyi iki diziden CArrayObj'a ittim, ardından mikrosaniyelere göre sıraladım ve ne tür bir Tick veya Book olayı notuyla çıktı aldım.

Ve evet, ve işte limanlar, ne verecek? Sadece Expert Advisor'ın olay kuyruğunu test ediyorum. Bir onay gelirse, iki olay oluşturulmalıdır - OnTick ve karşılık gelen OnBuk, OnTick her zaman kuyruğa alınır ve OnTick kuyrukta zaten bir OnTick varsa (kılavuzda olduğu gibi), yani OnTick kaybolabilir. OnTicks'in OnBooks olmadan birbiri ardına gittiği durum ancak 1. OnTics "sıra dışı" olduğunda olabilir 2. OnBuk'ta bir sistem gecikmesi var, kontrol etmek istediğim bu, bu gecikmeyi saniye cinsinden açıklayabilir, önceden meslektaşları tarafından belirlenir. Bir günde 2+ kat daha fazla OnBook var, ama neden geride kalıyorlar? Bu gecikme, paketlerin uyumsuzluğundan ve ayrıştırılmasından kaynaklanıyorsa, bu mümkündür, ancak şu ana kadar yalnızca Uzman Danışman olarak gelirlerini kontrol ediyorum. Kalan nüansları dikkate alarak nasıl protesto edilir, henüz düşünmedim.

İşte yeni kod, açılışta işin doğruluğunu test edeceğim ve bir günlüğüne başlatacağım.

ps Sebebi de şu olabilir: Eğer tik sipariş defterini değiştirmeden aynı fiyatlardan geçerse - OnBook oluşmaz mı? Hisse senedi ticaretinde uzman değilim, size kim söyleyecek. OnTick'in her zaman OnBook'u aradığını sanıyordum .

 //+------------------------------------------------------------------+
//|                                                   TestOnBook.mq5 |
//|                                           Copyright 2019, Allex@ |
//|                                                 alex-all@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, Allex@"
#property link        "alex-all@mail.ru"
#property version    "1.00"
#include <Allex\Logger.mqh>
#include <Arrays\ArrayObj.mqh>
//---
bool is_book;
enum ENUM_BOOK_OR_TICK
{
        USE_BOOK,       // Use OnBookEvent
        USE_TICK         // Use OnTick
};
class CMcsOn: public CObject
{
public :
ulong mcs;
ENUM_BOOK_OR_TICK Ontype;
CMcsOn( ulong m, ENUM_BOOK_OR_TICK t):mcs(m),Ontype(t){};
int        Compare( const CObject*Object, const int mode= 0 ) const
     {
       const CMcsOn* obj1= dynamic_cast < const CMcsOn*>(Object);
      CMcsOn* obj=(CMcsOn*)(obj1);
       if (!obj) return 0 ;
       return (mcs-obj.mcs);
      }
};
input ENUM_BOOK_OR_TICK Mode = USE_BOOK;
input int    SecForPrint =   3600 ;
//---
ulong TimeArrayBook[ 65536 ];
ulong TimeArrayTick[ 65536 ];
ushort curBook,curTick;
ulong   DelaySum= 0 ,DelayCount= 0 ,CountOnBook= 0 ,CountOnTick= 0 ;
int delay,delayMax= 0 ;
CLogger* Logger,*Logger2;
CArrayObj ArrayObj;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
{
   curBook= 0 ;
   curTick= 0 ; 
   DelaySum= 0 ;DelayCount= 0 ;CountOnBook= 0 ;CountOnTick= 0 ;delayMax= 0 ;
   ArrayInitialize (TimeArrayBook, INT_MAX );
   ArrayInitialize (TimeArrayTick, INT_MAX );
   Logger=CLogger::GetLogger();
   Logger2= new CLogger();
   Logger.SetSetting( __FILE__ + "\\" , Symbol ()+ "_" + EnumToString ( Period ())+ "_" + TimeToString ( TimeCurrent (), TIME_DATE ));  
   Logger2.SetSetting( __FILE__ + "\\" , "Alt_" + Symbol ()+ "_" + EnumToString ( Period ())+ "_" + TimeToString ( TimeCurrent (), TIME_DATE ));  
   if (Mode == USE_BOOK) is_book = MarketBookAdd ( Symbol ());
  ArrayObj.Shutdown();
   if ( EventSetTimer (SecForPrint) &&  Logger.Init() && Logger2.Init()) 
   return ( INIT_SUCCEEDED );
   else return ( INIT_FAILED );
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
{
   if (Mode == USE_BOOK)
  {
     if (is_book == true ) MarketBookRelease ( Symbol ());
  }  
   delete Logger;
   delete Logger2;
}
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent ( const string &symbol)
{  
  TimeArrayBook[curBook++]= GetMicrosecondCount ();
  CountOnBook++;
   //Print(__FUNCTION__, " ",curBook);
}
void OnTick ()
{
  TimeArrayTick[curTick++]= GetMicrosecondCount ();
  CountOnTick++;
   //Print(__FUNCTION__, " ",curTick);

}
//+------------------------------------------------------------------+
void OnTimer ()
  {
   string out= NULL ;
   int total= MathMax (curBook,curTick);
   int i= 0 ,k= 0 ;
   while (i<total)
     {
       while (i<total && TimeArrayBook[i]<TimeArrayTick[k] )
        {
          MyPrint( "Book " +TimeArrayBook[i++]);
        }    
       if (k<curTick- 1 )
        {
         if (i<total)
          {
           delay=TimeArrayBook[i]-TimeArrayTick[k];
           if (delay>delayMax) 
            delayMax=delay;
           if (delay> 0 )
              {
                 DelaySum+=delay;
                 DelayCount++;
              }
          }
         MyPrint( "Tick " +TimeArrayTick[k++]+ " delay mcs " +delay);
        }       
        i++;
     }
     if (curTick> 0 )
     {
     MyPrint( "Tick " +TimeArrayTick[curTick- 1 ]+ " last" );
     string out= "Count Event Book after Tick " +DelayCount+ ". Delay Average " + DoubleToString (DelaySum/DelayCount, 2 )+ ". Max " +delayMax+ " OnBooks " +CountOnBook+ " OnTicks " +CountOnTick;
     MyPrint (out);
     Comment (out);
     }
     Logger.Logger();
     Alt();
     curBook= 0 ;
     curTick= 0 ;
  }
//---
void MyPrint( string out)  
{
   Print (out);
   Logger.Log( __FUNCTION__ ,out, 2 , false );
}
//---
void Alt()
{
int last=ArrayObj.Total();
for ( int i= 0 ;i<curBook;i++)
  {
   if (!ArrayObj.Add( new CMcsOn(TimeArrayBook[i],USE_BOOK)))
      Logger2.Log( __FUNCTION__ , "Error Book Add" , 0 );   
  }
for ( int i= 0 ;i<curTick;i++)
  {
   if (!ArrayObj.Add( new CMcsOn(TimeArrayTick[i],USE_TICK)))
      Logger2.Log( __FUNCTION__ , "Error Tick Add" , 0 );   
  }
  ArrayObj.Sort();
   int total=ArrayObj.Total();
  total-=last;
  CMcsOn*Obj;
   for ( int i= 0 ;i<total;i++)
    {    
     Obj=ArrayObj.At(i);
     if ( CheckPointer (Obj)== POINTER_INVALID )
      { Logger2.Log( __FUNCTION__ , "Error At Array" , 0 ); continue ;}
       string out = Obj.USE_BOOK ? "Book " : "Tick " ;
      out+= Obj.mcs  ;
      Logger2.Log( __FUNCTION__ ,out, 2 );
    }
   Logger2.Log( "ArrayObj_" , "Last " +last+ " total " +ArrayObj.Total(), 1 );  
   Logger2.Logger();
   //ArrayObj.Shutdown(); 
}
 
prostotrader :
Ama merak ediyorum, topikstarter sorusuna verilen cevaplardan memnun mu?

Zaten tüm cevapları aldım ve kendim için sonuçlar çıkardım.
Sabit bir zaman diliminde bir işlem akışını analiz etmem gerekiyor - işlem fiyatları, gerçekleşen hacimler vb.
Ayrıca strateji test cihazında algoritmanın çalışmasını simüle etmeniz gerekir.
OnTick olayı bununla mükemmel bir şekilde başa çıkıyor, gerçek ticaretin sonuçları ve test cihazındaki simülasyon sonuçları küçük bir hatayla birleşiyor, bu beni tatmin ediyor.
Anlaşma akışının daha hızlı bir analizine ihtiyacınız varsa, OnTimer'ı kullanabilirsiniz.

Ve mutlaka terminale gelen her işaretin OnBook'a gitmesi gerekmez - bu, piyasa emirlerinin yürütülmesinin özellikleridir.

 
Vladimir Mikhailov :


Ve mutlaka terminale gelen her işaretin OnBook'a gitmesi gerekmez - bu, piyasa emirlerinin yürütülmesinin özellikleridir.

Aksine, OnTick işleyicisine gelen her tik (olay) OnBook ile senkronize edilmelidir.
Bakın, OnTick işleyicisinde üç olay vardır, en iyi teklif fiyatı değişikliği, en iyi satış fiyatı değişikliği ve takas(son).
Alış fiyatı veya işlem olmadan satış fiyatı değişirse, bu bir olay olacak ve bu olaylar OnTick'e gelecektir.
Ve OnBuk da bu olayları yakalamalı, sadece kendi olaylarını, işleyicisini, aksi takdirde işleyiciler arasında teklif sorma fiyatlarında tutarsızlıklar olacaktır.

Ve son olay OnTick'e gelirse, ticaret geçmiş demektir.
Bir ticaret OnBook'ta bir olay oluşturur, çünkü bir ticaretten sonra, sipariş defterindeki bandın fiyatı veya hacmi değişir.
Bir kısır döngü ortaya çıkıyor.

Hem OnTick hem de OnBook'ta en iyi teklif ve en iyi talep olayları vardır.
Bu olaylar her zaman her iki işleyicide de eşzamanlı olmalıdır.
Ve son olayın kendisi, ticaretten sonra OnBook'ta bir olay oluşturur.
Bu nedenle, OnTick işleyicisine gelen herhangi bir olay OnBook'a eşzamanlı olarak yansıtılmalıdır.

Neden: