Başka bir zaman dilimine geçerken göstergedeki global bir değişken, yapı nasıl aktarılır? - sayfa 4

 
Nikolai Semko :
Şahsen ben kaynakları sendika aracılığıyla kullanırım.
Yapı dizileri bile bir dosyaya yazmadan TF'ler arasında kolayca aktarılır.

Ve daha ayrıntılı olarak mümkündür. Teşekkür ederim.

 
Mikhail Nazarenko :

Ve daha ayrıntılı olarak mümkündür. Teşekkür ederim.

Bir şekilde KB olarak yazacağım.
Aslında burada bunun için sınıf var.
Ve göstergeye yalnızca iki satır eklemeniz gerekir:

  • TF'ler arasında geçirilecek yapı dizinizi bağlayarak OnInit'ten önce bu sınıfın bir örneğini oluşturun. Bu ilk başlatma değilse, yapı dizisi önceki TF'nin verileriyle doldurulacaktır.
  • OnDeinit'te dizinizi bu sınıftaki tek yöntemle kaydedin.

 template < typename T>
class CStructArr {
 private :
   union StructUint {
      T st;
       uint u[ 1 + sizeof (T)/ 4 ];
   };
   string             Name;
   uint               Var[];
   int                w;
   int                h;
   StructUint        su;
   int                size;

 public :
   CStructArr( const string name,T &var[]);
   ~CStructArr();
   bool               Set(T &var[]);
   //bool              Save();
   T                 value[];
};
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template < typename T>
CStructArr::CStructArr( const string name,T &var[]) {
   //ulong tt=GetMicrosecondCount();
   size = ArraySize (var);
   w= 1 +size* sizeof (T)/ 4 ;
   ArrayResize (Var,w);
   h= 1 ;
   Name= "::" +name+ IntegerToString ( ChartGetInteger ( 0 , CHART_WINDOW_HANDLE ));
   if ( ResourceReadImage (Name,Var,w,h)) {
      size = 4 *(w- 1 )/ sizeof (T);
       ArrayResize (value,size);
       ArrayResize (var,size);
       for ( int j= 0 ; j<size; j++) {
         for ( int i= 0 ; i< sizeof (T)/ 4 ; i++) su.u[i]=Var[j* sizeof (T)/ 4 +i];
         value[j]=su.st;
         var[j]=value[j];
      }
   } else {
       for ( int j= 0 ; j<size; j++) {
         su.st=var[j];
         for ( int i= 0 ; i< sizeof (T)/ 4 ; i++) Var[j* sizeof (T)/ 4 +i]=su.u[i];
         value[j]=var[j];
      }
       if (! ResourceCreate (Name,Var,w, 1 , 0 , 0 , 0 , COLOR_FORMAT_XRGB_NOALPHA )) printf ( "Error create Resource: " + DoubleToString ( GetLastError (), 0 ));
   }
   //tt=GetMicrosecondCount()-tt;
   //Print("!!!!!!!!  =  "+string(tt));
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template < typename T>
CStructArr::~CStructArr() {
   if ( _UninitReason != REASON_RECOMPILE && _UninitReason != REASON_CHARTCHANGE ) ResourceFree (Name);
}
//+------------------------------------------------------------------+
template < typename T>
bool CStructArr::Set(T &var[]) {
   size = ArraySize (var);
   ArrayResize (value,size);
   w= 1 +size* sizeof (T)/ 4 ;
   ArrayResize (Var,w);
   for ( int j= 0 ; j<size; j++) {
      su.st=var[j];
       for ( int i= 0 ; i< sizeof (T)/ 4 ; i++) Var[j* sizeof (T)/ 4 +i]=su.u[i];
      value[j]=var[j];
   }
   if (! ResourceCreate (Name,Var,w, 1 , 0 , 0 , 0 , COLOR_FORMAT_XRGB_NOALPHA )) {
       printf ( "Error create Resource: " + DoubleToString ( GetLastError (), 0 ));
       return ( false );
   } else return ( true );
}
//+------------------------------------------------------------------+
ZY TF arasında parametre transferi için terminalin global değişkenlerini kullanmayı çok çarpık bir karar olarak görüyorum.
 
Nikolai Semko :

Bir şekilde KB olarak yazacağım.
Aslında burada bunun için sınıf var.
Ve göstergeye yalnızca iki satır eklemeniz gerekir:

  • TF'ler arasında geçirilecek yapı dizinizi bağlayarak OnInit'ten önce bu sınıfın bir örneğini oluşturun. Bu ilk başlatma değilse, yapı dizisi önceki TF'nin verileriyle doldurulacaktır.
  • OnDeinit'te dizinizi bu sınıftaki tek yöntemle kaydedin.

ZY TF arasında parametre transferi için terminalin global değişkenlerini kullanmayı çok çarpık bir karar olarak görüyorum.

Teşekkürler, tamam.

 
Nikolai Semko :

Aslında burada bunun için sınıf var.

İlk bakışta, T[]<->uint[] dönüşümünün uygulanması optimal değildir.
 
fxsaber :
İlk bakışta, T[]<->uint[] dönüşümünün uygulanması optimal değildir.

bu kodu uzun zaman önce yazdı. Belki.
Optimize edilecek özel bir şey yok gibi görünse de. Belki sadece küçük şeylerde.
Her durumda, Market'teki en son ücretsiz ürünümde bu dersi çalışırken deneyebilirsiniz.

Daha iyi bir uygulama önerirseniz minnettar olurum.

 
Nikolai Semko :

Daha iyi bir uygulama önerirseniz minnettar olurum.

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

Kitaplıklar: Ticaret İşlemleri

fxsaber , 2019.03.15 07:36

 // Быстрый кастинг массивов.
#include <fxsaber\TradeTransactions\Convert.mqh> // https://www.mql5.com/ru/code/22166

void OnStart ()
{
   MqlTick Ticks[];

   MqlRates Rates[];  
   CopyRates ( _Symbol , PERIOD_CURRENT , 0 , 10 , Rates); // Получили котировки.
  CONVERT::ArrayToArray(Rates, Ticks);               // Кастинг MqlRates[] -> MqlTick[].

   MqlRates Rates2[];    
  CONVERT::ArrayToArray(Ticks, Rates2);             // Кастинг MqlTick[] -> MqlRates[].
   ArrayPrint (Rates2);                               // Убедились, что все корректно.
}
Dosyalar:
Convert.mqh  4 kb
 
Mikhail Nazarenko :
Başka bir zaman dilimine geçerken göstergedeki global bir değişken , yapı, nesne nasıl aktarılır? Google bulamadı.

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

Kitaplıklar: Ticaret İşlemleri

fxsaber , 2018.12.17 23:48

Kaynaklar aracılığıyla her şeyi paylaşabilirsiniz.

 // Пример обмена любыми данными (включая строковые массивы).

#include <fxsaber\TradeTransactions\ResourceData.mqh> // https://www.mql5.com/ru/code/22166

#define PRINT(A) Print ( #A + " = " + ( string )(A));

void OnStart ()
{    
   // Произвольные данные для примера
   string Str[] = { "123" , "Hello World!" };
   double Num = 5 ;
   MqlTick Tick = { 0 };
  Tick.bid = 1.23456 ;

   const RESOURCEDATA< uint > Resource; // Ресурс для обмена данными
  CONTAINER< uint > Container;         // Создаем контейнер - все будет храниться в массиве простого типа (в примере выбран uint)
  
   // Заполняем контейнер разными данными
  Container[ 0 ] = Str;
  Container[ 1 ] = Num;
  Container[ 2 ] = Tick;
    
   // Распечатаем типы хранимых в контейнере данных
   for ( int i = 0 ; i < Container.GetAmount(); i++)
    PRINT(Container[i].GetType())

  Resource = Container.Data;  // Отправили данные на обмен
  
  CONTAINER< uint > Container2; // Сюда будем получать данные
  
  Resource.Get(Container2.Data); // Получили данные
      
   // Получим данные в исходном виде
   string Str2[];
  Container[ 0 ].Get(Str2);                 // Получили массив
   ArrayPrint (Str2);

  PRINT(Container[ 1 ].Get< double >())       // Получили число
  PRINT(Container[ 2 ].Get< MqlTick >().bid) // Получили структуру   
}
 
fxsaber :

Ne yazık ki, asılsız değil. İncillerine girmeyeceğim.
Kodunuzu zaten anlamaya çalıştım ve henüz ona yetişmediğimi fark ettim. :))

Her durumda, tüm içeriği açarsanız, kodunuz kaynak kodunda ve yürütülebilir dosyada daha uzun olacaktır.

Ben de senin İncillerini kullandığımda birkaç kez kendimi yaktım ve sonra frenlerin kaynağını uzun bir süre, onlar yıkılana kadar buldum. Ondan sonra vazgeçti.

Birçok kapsayıcıdan oluşan kodunuzu kullanmanın ana zorluğu, her adımda yeni bir sınıf, tanım veya makro olduğunda hata ayıklamanın yüksek karmaşıklığıdır.
Ve test zamanı için üzülüyorum çünkü algoritmamı önemli ölçüde hızlandırmanın pek mümkün olmadığını anlıyorum.
Şu anda sövemde gördüğüm tek şey, bazı yerlerde CopyArray yerine döngüleri kullanmam. Bu düzeltmeden sonra kodum performans ve okunabilirlik açısından neredeyse mükemmel olacak.

 
Nikolai Semko :

Şu anda sövemde gördüğüm tek şey, bazı yerlerde CopyArray yerine döngüleri kullanmam. Bu düzeltmeden sonra kodum performans ve okunabilirlik açısından neredeyse mükemmel olacak .

Bir performans ölçümü yazarsanız, karşılaştırmak ilginç olacaktır.

 

:)

Şimdi kimsenin "koltuk değneği", "bisikletin icadı", "verileri başka bir terminale aktarmadaki zorluklar", " görev MQL araçları kullanılarak çözülmesi gerektiği " hakkında yazmaması garip.
Metakotalardan alınan kararların koltuk değneği ve mauvais tonu olduğu ortaya çıktı)