Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri - sayfa 101

 
fxsaber :

Sonuç

Evet, bilgisayarımda yaklaşık 4 ms süren Sleep'in dahili çalışmasını hesaba katmadım

İyi için, Uyku'ya daha doğru bir alternatif (doğruluğu kim umursar :))

 void sleep( int m)
  {
   if (m> 0 ) Sleep ( int ( 0.995 *m+ 0.5 )- 1 );
  }

0,995 katsayısının doğruluğunu garanti etmiyorum. Bilgisayarım için seçildi. Muhtemelen herkes için uygundur.

Dosyalar:
TestSleep.mq5  1 kb
 
fxsaber :

Dürüst olmak gerekirse, bunun ne anlama geldiğini ve MQL5'te nerede karşılaşabileceğinizi bile bilmiyorum.

Bu, senkron fonksiyonlarda bile tüm durumlarda patlamaların mümkün olduğu anlamına gelir. Sadece onlar hakkında bilgi sahibi olmanız ve onlara dikkat etmemeniz gerekir, çünkü. bu konuda hiçbir şey yapılamaz.

https://en.wikipedia.org/wiki/Interrupt
Interrupt - Wikipedia
Interrupt - Wikipedia
  • en.wikipedia.org
This article is about computer interrupts. For the study of the effect of disruptions on job performance, see Interruption science. For other uses, see Interruption. In system programming, an interrupt is a signal to the processor emitted by hardware or software indicating an event that needs immediate attention. An interrupt alerts the...
 

Dosyalara ve global değişkenlere ek olarak, programlar arasında bilgi aktarmanın başka bir yolu daha vardır.

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

Kitaplıklar: Ticaret İşlemleri

fxsaber , 2018.09.20 16:23

 // Пример хранения/обмена данными через Ресурсы внутри Терминала
#include <fxsaber\TradeTransactions\ResourceData.mqh> // https://www.mql5.com/ru/code/22166

void OnStart ()
{  
   const RESOURCEDATA< int > ResourceINT( "::int" ); // Ресурс для обмена int-ами. const - как доказательство, что ничего не пишется в объект класса
  
   int ArrayINT[] = { 1 , 2 , 3 };
   int Num = 5 ;
  
  ResourceINT = ArrayINT;  // Ресурс хранит массив.
  ResourceINT += Num;      // Добавили в ресурс еще значение .
  ResourceINT += ArrayINT; // Добавили массив.
  
   int ArrayINT2[];  
  ResourceINT.Get(ArrayINT2); // Считали данные из ресурса.
   ArrayPrint (ArrayINT2);       // Вывели: 1 2 3 5 1 2 3

  ResourceINT.Free();                // Удалили данные из ресурса
   Print (ResourceINT.Get(ArrayINT2)); // Убедились, что данных нет: 0

   const RESOURCEDATA< MqlTick > ResourceTicks( "::Ticks" );  // Ресурс для обмена тиками. const - как доказательство, что ничего не пишется в объект класса
   MqlTick Tick;
  
   if ( SymbolInfoTick ( _Symbol , Tick))
     for ( int i = 0 ; i < 3 ; i++)
      ResourceTicks += Tick; // Добавили в ресурс тики

   MqlTick Ticks[];
  ResourceTicks.Get(Ticks); // Считали данные из ресурса.
   ArrayPrint (Ticks);         // Вывели.
  
   // Это полное имя ресурса для обращения из другой программы
   const string NameOut = StringSubstr ( MQLInfoString ( MQL_PROGRAM_PATH ), StringLen ( TerminalInfoString ( TERMINAL_PATH )) + 5 ) + "::Ticks" ;  
   Print (NameOut); // Вывели полное имя ресурса.
  
   const RESOURCEDATA< MqlTick > Resource(NameOut); // Ресурс для доступа к данным (read-only) из другой программы
  
   MqlTick TicksOut[];
  Resource.Get(TicksOut); // Считали данные из ресурса.
   ArrayPrint (TicksOut);   // Вывели.
  
  Resource.Free();   // Не получится повлиять на данные read-only-ресурса.
   Print ( _LastError ); // ERR_INVALID_PARAMETER - Ошибочный параметр при вызове системной функции.
}
 
fxsaber :

Dosyalara ve global değişkenlere ek olarak, programlar arasında bilgi aktarmanın başka bir yolu daha vardır.

Çalışan bir terminal içindeki programlardan mı bahsediyoruz?

 
Nikolay Semko :

Çalışan bir terminal içindeki programlardan mı bahsediyoruz?

Evet. Bu yüzden global değişkenlerden bahsedilir.

Ve Terminaller arasında bu yöntem kullanılmaya başlandı.
 
fxsaber :

Evet. Bu yüzden global değişkenlerden bahsedilir.

Ve Terminaller arasında bu yöntem kullanılmaya başlandı.

Evet, gerçekten harika!
Çok güzel bir keşif, SSD'ler yerine RAM disklerinin kullanılmasıdır.

 
fxsaber :

Evet. Bu yüzden global değişkenlerden bahsedilir.

Ve Terminaller arasında bu yöntem kullanılmaya başlandı.

Uzun zamandır user32.dll kullanarak kendim için bu kadar kolay bir semi-hacker yöntemi kullanıyorum. Ancak kene dizileri bu şekilde aktarılamaz.

Uzun zaman önce MQL4'te ustalaşmanın şafağında icat edildi. Hiçbir yerde daha kısa bir çözüm görmedim. Tabii ki, borsanın normal organizasyonu açısından çarpık, ancak akıllıca çalışıyor (mevcut tüm çözümlerden daha hızlı olması mümkündür) ve düzgün çalışıyor ve her şeyde bana uyuyor, bu yüzden yapmadım beynimi daha fazla zorlama.

Ayrıca, bu yöntem ek adımlar gerektirmez.

Mesele şu ki, tüm Windows için, ana Windows penceresinin adı olan dize türünde ortak bir değişken vardır. Herkes değiştirebilir ve herkes görebilir.

Dosyalar:
 
Nikolay Semko :

Uzun zamandır user32.dll kullanarak kendim için bu kadar kolay bir semi-hacker yöntemi kullanıyorum. Ancak kene dizileri bu şekilde aktarılamaz.

Eğer dll üzerinden ise, tüm veri türleri için evrensel bir çözüm vardır.

 
Nikolay Semko :

ancak akıllıca çalışır (mevcut tüm çözümlerden daha hızlı olması mümkündür)

Eh, zaten çok ileri gittin) Önce mesaj kuyruğundan geçer. İkincisi, bazı ek dönüşümler (ileri geri) yapmanız gerekir. Ayrıca bir çeşit doğrulama oluyor.

Bu arada,yapının boyutu açıkça belirtilmemelidir. Sizeof bunun için var.

 
fxsaber :

Eğer dll üzerinden ise, tüm veri türleri için evrensel bir çözüm vardır.

tartışmıyorum. Çözümünüz gerçekten daha genel.
Ancak kişisel olarak, yalnızca mevcut keneyi aktarmak için terminaller arasında bir köprüye ihtiyacım var.

Benim versiyonum, ilkelliği nedeniyle anlaşılması daha kolay ve biraz daha hızlı çalışıyor. Sizinkiyle karşılaştırıldığında ölçüldü - 1,5-2 kat daha hızlı bir yerde. 160 mikrosaniyeye karşılık 90 mikrosaniyelik bir tik iletiminde okuma.

Dosyalar: