MT5 ve iş başında hız

 

MT5 çevik bir platformdur. Ancak hızlı ticaretin tüm çabalarını boşa çıkaran darboğazlar var.

Sorunları burada toplamak, tartışmak ve kendi başıma, bir yerde Geliştiricilerin yardımıyla çözmek istiyorum.

 

GeçmişSeçin.


Bu delicesine pahalı bir özellik. Ve ne yazık ki, hiçbir önbelleğe alma, çalışma hızını şu anda kabul edilebilir hale getiremez.


Örneğin, muharebe danışmanlarında güncel verilerle çalışmak önemlidir. Özellikle, Market Watch ve CopyTicks'teki işaretler mümkün olduğunca güncel olmalıdır.

Bunu yapmak için, mevcut fiyat verilerinin uygunluğunu kontrol etmek için çok iyi değil, zorunlu mekanizmalar vardır. Böyle bir mekanizmanın parçalarından biri, bir sembol üzerinde bir anlaşmanın son onay işaretinden sonra geçtiği durumların tespitidir. Bu nadiren olmaz, bu nedenle mevcut tik işaretinin hala alakalı olup olmadığını bilmek önemlidir.


Bu tür bir tespit için, son işlemlerin geçmişine erişebilmeniz gerekir. Bu, aşağıdaki şematik şekilde HistorySelect aracılığıyla yapılır.

 void OnTick ()
{
   MqlTick Tick;

   if (SymbolInfo( _Symbol , Tick) && HistorySelect (Tick.time, INT_MAX ) ) // Взяли история торгов со времени текущего тика.
     // Проверяем актуальность тика через сравнение Tick.time_msc и DEAL_TIME_MSC.
}


Ne yazık ki, böyle bir HistorySelect çağrısı 5-30 milisaniye sürer (Bunu Release-EX5'te kendim ölçtüm). OnTick'teki Expert Advisor'da bu tür birkaç güncelleme yapıldığında (iyi bir şekilde, herhangi bir duraklamadan sonra yapılmalıdır. Örneğin, her OrderSend'den sonra), o zaman her şey delicesine pahalı / uzun olur. HistorySelect, bir OnTick'te toplamda birkaç saniye yiyebilir.


Sevgili geliştiriciler, neden bu kadar pahalı? Bu işlev, düzgün bir şekilde uygulanırsa anlık olabilir.


Lütfen tarihle çalışmak için bu tür işlevleri tanıtmayı düşünün.

HistoryDealsSelect( const int Index, const int Count = WHOLE_ARRAY );  // Из внутренней таблицы сделок взять сделки, начиная с заданного индекса в таблице.
HistoryOrdersSelect( const int Index, const int Count = WHOLE_ARRAY ); // Из внутренней таблицы ордеров взять ордера, начиная с заданного индекса в таблице.

HistorySelect frenlerini tamamen kaplayacaklardı. Çünkü en son işlemleri elde etme sorununu çözmek çok ucuz olacaktır. Şimdi savaş performansında bir eziyet.


OnTradeTransaction aracılığıyla en son işlemleri kontrol etmek her zaman mümkün değildir. Bu nedenle, tarihle hızlı çalışma önemlidir.

 

ChartEvent ve TradeTransaction etkinliklerine erişim.


Fikir ve olası uygulama seçeneklerinden biri önerildi. O yüzden buraya kopyalıyorum.

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

Hatalar, hatalar, sorular

Sergey Dzyublik , 2020.05.20 00:47

Geliştiriciler için öneri.
Lütfen MQL'ye, kullanıcıların OnChartEvent'te birikmiş "mesajların" işlenmesini kullanıcı kodundan bağımsız olarak çağırmalarına olanak sağlayacak bir işlev eklemeyi düşünün.
1) Bu, zaman alıcı bir hesaplamanın yinelemeleri arasında OnChartEvent işlemeyi çağırmaya izin vererek, kullanıcının grafik panelini en azından bir şekilde bir bahçe oluşturmadan duyarlı hale getirir: görev havuzu, veri aktarımı, durum senkronizasyonu, bağlam kaydetme ve geri yükleme ...
2) Bu, komut dosyalarında OnChartEvent'in kullanılmasına izin verecektir.

Teşekkür ederim.

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

Hatalar, hatalar, sorular

Sergey Dzyublik , 2020.05.20 13:39

Pek değil, bu işlevi olası bir imza olan HandleNextEvent olarak adlandırmayı tercih ederim:

 bool HandleNextEvent (ENUM_EVENT_TYPE);


Çağrıldığında, GetNextEvent'e benzer şekilde, kuyrukta belirtilen ENUM_EVENT_TYPE'nin varlığını kontrol eder,
ve bu olay mevcutsa, kontrolü otomatik olarak ilgili işleyicinin kullanıcı koduna aktarır (OnChartEvent, OnTrade, OnTradeTransaction, ... (ek için fxsaber sayesinde)).
Kuyrukta bir olay varsa true, değilse false döndürür.


Olası kullanım durumu:

 //....
for ( int i = 0 ; i < 10 ^ 6 ; ++i){
   // .... Data Calculations

   if ((i % 10 ^ 3) == 0 ){
       while (HandleNextEvent(EVENT_TYPE_ALL));
   }
}
//.... 

tür olayı işleme yeteneği sağlamak güzel olurdu.
3) İşlem sırasında tekrar HandleNextEvent'e bir çağrı yapılacaksa - çağrı ve işlem. Olabilecek tek şey bir yığın taşmasıdır, ancak bu geliştiricilerin değil, kullanıcının ve kodunun sorunudur.
4) Filtrenin altına girmeyen olaylar aynı sırada kalır ve her zamanki gibi kullanıcı kontrolü sisteme geri verdiğinde çağrılır.


Şimdi, yürütme kodu içinde aynı TradeTransaction olaylarına ulaşmak için koltuk değneği kullanmak gerekiyor.

Savaş kullanımı için danışmanların gerçekten bu fırsata ihtiyacı var.

 
fxsaber :

OnTradeTransaction aracılığıyla en son işlemleri kontrol etmek her zaman mümkün değildir . Bu nedenle, tarihle hızlı çalışma önemlidir.

Kontrol etmenin bir yolu olmadığında lütfen bir örnek verin?

 
prostotrader :

Kontrol etmenin bir yolu olmadığında lütfen bir örnek verin?

OnTradeTransaction'a güvenemezsiniz. OrderSendAsync ile çalışmak için güvenilir bir genel mekanizma olmaması üzücü.


Ayrıca, kodun içinde birkaç OrderSends ayarlarken. Bir OrderSend öncekine bağlı olduğunda.

 
fxsaber :

Ayrıca, kodun içinde birkaç OrderSends ayarlarken. Bir OrderSend öncekine bağlı olduğunda.

Bağlantıda bir kopukluk olursa, tarihe hiçbir şey eklenmez!

5 yıldan fazla bir süredir OrderSendAsync kullanıyorum (o zaman OrderSend ile ilgili sorunlar vardı) + OnTradeTransaction() sadece savaş modunda - sorun yok!

İletişimde bir kopukluk olursa, her bir siparişe atanan sihire göre açıklama gerçekleşir (Forex'te bunu yapmak zordur çünkü sembollerin isimleri standartlaştırılmamıştır).

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

Bağlantıda bir kopukluk olursa, tarihe hiçbir şey eklenmez!

5 yıldan fazla bir süredir OrderSendAsync kullanıyorum (o zaman OrderSend ile ilgili sorunlar vardı) + OnTradeTransaction() sadece savaş modunda - sorun yok!

Async+OnTrade için yıllardır nasıl boğulduğunuzu fark etmemeniz mümkün değil. Ayrıca verileri bu mekanizma ve diğer her şey aracılığıyla güncellersiniz, çünkü herhangi bir sorun yoktur.

Lütfen burada "Yemek yapmayı bilmiyorsun" demeyin.

 
fxsaber :

Async+OnTrade için yıllardır nasıl boğulduğunuzu fark etmemeniz mümkün değil. Ayrıca verileri bu mekanizma ve diğer her şey aracılığıyla güncellersiniz, çünkü herhangi bir sorun yoktur.

Lütfen burada "Yemek yapmayı bilmiyorsun" demeyin.

Mikrosaniyeler için "mücadele edersiniz", aynı zamanda zaman alan tonlarca kodu sararsınız,

ve vakaların %99'unda gerekli değildir.

 
Sadece yapıcı bir şekilde konuşmanızı rica ediyorum.
 
fxsaber :

ChartEvent ve TradeTransaction etkinliklerine erişim.

Fikir ve olası uygulama seçeneklerinden biri önerildi. O yüzden buraya kopyalıyorum.

Şimdi, yürütme kodu içinde aynı TradeTransaction olaylarına ulaşmak için koltuk değneği kullanmak gerekiyor.

Koltuk değneklerini yanlış yönde yapıyorsun:

OnXXX işlevlerinde yalnızca kuyruktaki olayları (parametreleri) kopyalayarak ve ana OnMain işlevini çağırarak bırakın. Tüm kodlarını yinelenen On2XX işlevlerine taşıyın. Ve bu yinelenen On2XX işlevlerini OnMain'den ihtiyacınız olan sırayla çağırın, sırayla bunları kuyruklardan parametre olarak iletin

Ardından, ölçümler yapın - hızdaki kazancı gösterin ve ardından MQL'yi uygun işlevsellik ile desteklemeyi önermek zaten mümkün olacaktır. Ama her şeyi zaten burada ve şimdi yaptıysanız neden ek?!

 
A100 :

OnXXX işlevlerinde yalnızca olayları (parametreleri) kuyruğa kopyalayarak ve ana OnMain işlevini çağırarak bırakın. On2XX işlevlerini çoğaltmak için tüm kodu taşıyın. Ve bu yinelenen On2XX işlevlerini OnMain'den ihtiyacınız olan sırayla çağırın, sırayla bunları kuyruktan parametre olarak iletin

Lütfen bu fikrin temel bir şema kodunu sağlayın. İlk bakışta, tam bir yanlış anlama gibi geliyor.

OnMain işlevinin yürütülmesi sırasında, mevcut gerçek kuyruğun durumunu bilmenin bir yolu yoktur. Bunu yapmak için tek geçici çözüm, bağlantıda bahsettiğim gibi bir casus programdır.

Neden: