Benim yaklaşımım. Çekirdek - Motor. - sayfa 92

 
Maxim Kuznetsov :

Normalde, danışmanlar, göstergeler, komut dosyaları arasında veri alışverişi için yalnızca ve yalnızca GlobalVariables ve dosyalar vardır.

yukarıdaki 4 noktanın tümü, balık eksikliğinden kaynaklanan yerel "kesmelerdir". Yukarıdaki 4 noktanın tümü, keyfi veri alışverişi için amaçlanmayan mekanizmalar kullanır ve hatta veri dizileri için daha da fazlası.

GlobalVariables'ın mesajlaşma için düzenli olarak oluşturulduğunu düşünebilirsiniz. Aptalca dediler. Aslında, bu diğer herhangi bir öğeyle aynı hack.

 
fxsaber :


... Kabaca söylemek gerekirse, kaynak üzerinden yazma/okuma tıklamalarının tam döngüsü saniyede 4 milyon tıklama hızında gerçekleşir.

Bir kaynağa Okuma/Yazma çok hızlıdır. Ancak bu, böyle bir aktarım için ne kadar uygundur:

1. Strona A. Zamanlayıcı olayı. Olay üzerinde değiştirilen tüm parametre değerlerinin toplanarak bir dizgeye dönüştürülmesi. Dizeyi Char'a çeviriyoruz, kaynağa yazıyoruz. B tarafına bir mesaj sinyali gönderiyoruz.

2. Taraf B. OnChartEvent() olayı, bir mesaj sinyali aldı, kaynağı açtı, okudu, parametre çekirdeğini yeni değerlerle doldurdu, gerekli öğeleri yeniden çizdi.

Ya bu olay zamanlayıcının frekansında sürekli olarak devam ederse?

Soru, başka seçenekler varsa, bunun için kaynakların en iyi nasıl kullanılacağıdır.

//------------------------------------------------ -------------------------------------------------- --------------------

  • EventChartCustom() seçeneğinin iki dezavantajı vardır.

  1. Mesaj olay kuyruğuna eklenir
  2. Parsel 127 karakterden fazla olamaz. Bu nedenle, 1000 karakterlik bir mesajın parçalanması ve ardından yeniden birleştirilmesi gerekir. Ve mesajın her bir parçası olay kuyruğunda duracaktır.
  • Grafik üzerinden transfer seçeneği. nesneler, mesajı her biri 64 karakterlik paketlere bölmeyi, bunları nesnelerin açıklamasına yazmayı ve ardından birleştirmeyi gerektirir. İlginçtir, bu seçenek en hızlısıdır, ancak hat uzunluğu arttıkça hızı azalır. Yani, ObjectSetString()'e yapılan her çağrı 3 mikrosaniyedir. Ancak, dize 1000 karakter ise, 64 karaktere bölünmesi gerekir, bu da ObjectSetString () öğesinin yaklaşık 8 kez çağrılması anlamına gelir. 8*3 = 24ms. Sonra aynı miktarda dize toplamak için. Bu nedenle, dize 10.000 karakter olsaydı, bu yöntem kesinlikle kaynaklarla çalışma yöntemine hızlı bir şekilde yaklaşmaya başlardı. (Kaynak kaydetme ve okuma + dizeleri uint ve geri çevirme zamanı ile ilgili).
Kaynak seçeneği sonuna kadar denenmemiş olarak kalır. Bugün test cihazında kontrol edeceğim ve sonunda evrensel olup olmadığı netleşecek.
 
Реter Konow :

Ya bu olay zamanlayıcının frekansında sürekli olarak devam ederse?

Soru, başka seçenekler varsa, bunun için kaynakların en iyi nasıl kullanılacağıdır.

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

Programlar arasında veri alışverişi

fxsaber , 2018.11.21 13:12

Etkileşimler için çeşitli seçenekleri bu kadar ayrıntılı bir şekilde boyamak için muhtemelen çok zamanınız var. Maalesef böyle bir kaynağım yok.

İşte tam bir etkileşimin olduğu konuyla ilgili bir makale . Her bina tuğladan ve belirli görevler için inşa edilmiştir. Tüm olası tuğlalar dalın en başında gösterilir. Gerisi inşaatçıya kalmış.

 
fxsaber :

Makale, biri test cihazında bulunan kaynaklar aracılığıyla iki programın bağlantısını kontrol etmez.

 

Sendikanın sorunu ne? Lütfen bir örnek:

union UZ{
   double d;
   int i[ 2 ];
};

void OnStart (){

   UZ u1;
   UZ u2;
   
   u1.d= 12345.678 ;
   
   ArrayCopy (u2.i,u1.i);
   
   Alert (u2.d);

}
 
Реter Konow :

Makale, biri test cihazında bulunan kaynaklar aracılığıyla iki programın bağlantısını kontrol etmez.

Tuğlalarla ilgili cümleyi okuyun.

 
fxsaber :

...

Bu makale serçelere top ateşliyor. Birçok makale gibi. Sorunu makalede çözmektense kendim çözmeyi tercih ederim.

Her şey 10 kat daha kolay ve görsel olarak yapılabilir. Ve makalede - şeytan bacağını kıracak ...


Ve test cihazındaki kaynaklarla çalışmayı kontrol etmediğinizi söylediyseniz, bu makalenin anlamı nedir?

 
Реter Konow :

Ve test cihazındaki kaynaklarla çalışmayı kontrol etmediğinizi söylediyseniz, bu makalenin anlamı nedir?

Tartışmayı bıraktı.

 

Bu karar bir tür saçmalık. Belki yanlış bir şey yapıyorum.

Kısaca konuşmak gerekirse:

StringToCharArray() işlevi YALNIZCA bir karakter dizisini kabul eder.

ResourceCreate() işlevi YALNIZCA bir uint dizisini kabul eder.

Bu nedenle, char dizisinin ( dönüştürülmüş dizeyle doldurulmuş) içeriğinin bir uint dizisine yeniden yazılması gerekir.

 
//+------------------------------------------------------------------+
//|                                                    Tester EA.mq4 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   //----------------------------------------------
   ObjectCreate ( 0 , "Resource" , OBJ_BITMAP_LABEL , 0 , 0 , 0 );
   ObjectSetString ( 0 , "Resource" , OBJPROP_BMPFILE , "::Resource" );
   //----------------------------------------------
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//--- destroy timer
   
      
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
   uchar Arr[];
   uint   Data[];
   //---------------------------
   string price = ( string ) Bid ;
   //---------------------------
   int width = StringToCharArray (price,Arr);
   //---------------------------
   ArrayResize (Data,width);
   //---------------------------
   ArrayCopy (Arr,Data);
   //---------------------------
   if (! ResourceCreate ( "::Resource" ,Data,width, 1 , 0 , 0 , 0 , COLOR_FORMAT_XRGB_NOALPHA )) Print ( "Resource is not created!" );
   //---------------------------
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer ()
  {
//---
   
  }
//+------------------------------------------------------------------+

Normal bir grafikte gösterge:

 //+------------------------------------------------------------------+
//|                                              Resource reader.mq4 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   EventSetMillisecondTimer ( 25 ); 
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {
//---
   
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer ()
  {
//---
   uint Data[ 50 ],width,height;
   //-----------------------------
   if (! ResourceReadImage ( "::Resource" ,Data,width,height)) Print ( "Failed to read resource!" );
   else Print ( "Resource is readable!" );
   //-----------------------------
   
  }
//+------------------------------------------------------------------+
Neden: