PROFI'den SUPERPROFI'ye kadar tüm sorularınız - 1. - sayfa 42

 
swanhearts :

Merhaba, bana MA göstergesi gönderdiler, hemen ihtiyacım olan tüm seviyeler var. Sorun şu ki, fareyi göstergenin (her MA) üzerine getirdiğinizde, bu MA'nın dönemini göstermiyor. Bu an nasıl düzeltilir? GöstergeShortName adını değiştirirken kalıcı sözdizimi hatası ( "MASHKI =)" ); Bana yardım et lütfen.

gösterge arabelleği adı SetIndexLabel kullanılarak ayarlanır

 

1. Bir işlev çağrısının önceki çağrıyla aynı tık üzerinde gerçekleştiğini bulmanın en ucuz yolu nedir?

 bool tick_already_processed()
{
   return ( ??? );
}

void some_func()
{
   if ( tick_already_processed() ) return ;

   // recalculate only once on each tick
}

void OnTick ()
{
   if ( A ) some_func();
   if ( B ) some_func();
   if ( C ) some_func();
}

Time (TimeCurrent), teorik olarak da SymbolInfoTick'ten ms cinsinden aynı kalabilir.

Teklif, talep ve zamanı ms cinsinden karşılaştırmak pahalıdır.

EA'nın kendisinde kontrolü organize etme seçeneği sunmuyoruz, evrensel bağımsız bir işlev elde etmek istiyorum.


2. Alım satım işlemleri için benzer bir soru. Son lansmandan bu yana (açık seviyeler, SL ve TP dahil) emirler/pozisyonlar listesinde bir şeylerin değişip değişmediğini nasıl öğrenebilirim?

İlk beşte, OnTrade'deki bazı bayraklardan oluşan bir takım kendini gösteriyor (ve tamamlandıktan sonra sıfırlama), bunu düşünmemek daha ucuz.

Ama yine de evrensel bir çözüm istiyorum.


Kimin fikirleri var?

 

Andrey Khatimlianskii :  

Örnek https://www.mql5.com/ru/code/16997

Resources.mqh dosyası

IsNewPeriod işlevi


Ana fikir, içinde statik olan bir işlev kullanmaktır.

Keneleri hatırlamak ve kontrol etmek için ID = GetMicroSecondsCount içinde saklanabilir

Siparişlerle aynı şey için - sihri kontrol edin

Aşağıdaki sözde kodu kontrol etmedim :)

 bool IsNewTick( ulong newId) // GetMicrosecondCount() or magic
{
   static ulong id = 0 ;
  
   if (id != newId) 
  {
    id = newId;
     return true ;
  }
  
   return false ; 
}
 
Andrey Khatimlianskii :

2. Alım satım işlemleri için benzer bir soru. Son lansmandan bu yana (açık seviyeler, SL ve TP dahil) emirler/pozisyonlar listesinde bir şeylerin değişip değişmediğini nasıl öğrenebilirim?

İlk beşte, OnTrade'de bir tür bayrak takımı kendini gösteriyor (ve tamamlandıktan sonra sıfırlama), bunu düşünmemek daha ucuz.

Ama yine de evrensel bir çözüm istiyorum.


Kimin fikirleri var?

Şartlarınızı (SL/TP vb.) buraya ekleyin.

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

Sipariş numaralandırma döngüsünün organizasyonu

fxsaber , 2017.10.18 12:29

 struct HISTORY_UNIT
{
   long Ticket;
   int Type;
   double Lots; 
    
  HISTORY_UNIT( void ) : Ticket(:: OrderTicket ()), Type(:: OrderType ()), Lots(:: OrderLots ())
  {
  }

   bool operator !=( const HISTORY_UNIT &Unit ) const
  {
     return (( this .Ticket != Unit.Ticket) || ( this .Type != Unit.Type) || ( this .Lots != Unit.Lots));
  }
      
   bool IsChange( void )
  {
     const HISTORY_UNIT Tmp;
     const bool Res = ( this != Tmp);
    
     if (Res)
       this = Tmp;
      
     return (Res);
  }
};

// Возвращает true только в случае, если с последнего вызова произошли торговые изменения
bool IsChange( void )
{
   static HISTORY_UNIT History[];  

   const int Total = OrdersTotal ();  
   bool Res = ( ArraySize (History) != Total);

   for ( int i = 0 , j = Res ? ArrayResize (History, 0 , Total) : 0 ; i < Total; i++)      
     if ( OrderSelect (i, SELECT_BY_POS ))
    {
       if (Res || (Res = History[j].IsChange()))
         ArrayResize (History, j + 1 , Total);
      
      j++;
    }
  
   return (Res);
}
 
Andrey Khatimlianskii :

1. Bir işlev çağrısının önceki çağrıyla aynı tık üzerinde gerçekleştiğini bulmanın en ucuz yolu nedir?

Time (TimeCurrent), teorik olarak da SymbolInfoTick'ten ms cinsinden aynı kalabilir.

Teklif, talep ve zamanı ms cinsinden karşılaştırmak pahalıdır.

EA'nın kendisinde kontrolü organize etme seçeneği sunmuyoruz, evrensel bağımsız bir işlev elde etmek istiyorum.

Buradaki sorun ucuzluk değil, kene numaralandırmasının güvenilirliğidir. Savaş danışmanında bunu yapıyorum.

 #ifdef __MQL5__
#else // __MQL5__
   // В false-режиме если засекли изменения, то последующие вызовы не делают проверку.  
   static bool IsNotChange( const bool bInit = false )
  {
     static bool IsChange = false ;
     
     if (bInit)
      IsChange = false ;
      
   #ifdef HISTORYTICKS_ISCHANGE
     if (bInit)
      HISTORYTICKS::IsChange();
     else if (!IsChange)
      IsChange = HISTORYTICKS::IsChange();
   #endif // HISTORYTICKS_ISCHANGE
    
     return (!IsChange);
  }
#endif // __MQL5__

bu, işlevin MT4 sürümüdür. Gösterge-casus aracılığıyla numaralandırma.


MT5 için aynı işlevin sürümünü sunmuyorum, çünkü fazlalık çıkarılmalıdır. Ama bu özelliğe göre.

   // Свежие тики с последнего вызова
   static int GetFreshTicks( MqlTick &Ticks[], const datetime dFrom = 0 )
  {
     static long LastTime = 0 ;
     static int LastAmount = 0 ;

     if (dFrom)
    {
     :: Comment ( "Waiting Ticks from " + :: TimeToString (dFrom, TIME_DATE ) + "..." );

      LastAmount = 0 ;
    }
    
    :: ArrayFree (Ticks);
  
     int Size = (dFrom || LastTime) ? :: CopyTicksRange ( _Symbol , Ticks, COPY_TICKS_INFO , dFrom ? ( long )dFrom * 1000 : LastTime) : 0 ;
    
     if (Size > LastAmount)
    {
      LastTime = Ticks[Size - 1 ].time_msc;
       int NewLastAmount = 1 ;
      
       for ( int i = Size - 2 ; (i >= LastAmount) && (Ticks[i].time_msc == LastTime); i--)
        NewLastAmount++;
        
       if (:: ArrayRemove (Ticks, 0 , LastAmount))
        Size -= LastAmount;
        
      LastAmount = NewLastAmount;
    }
     else
      Size = :: ArrayResize (Ticks, 0 );
    
     return (Size);
  }


Sıfır dışında döndürülürse - yeni bir onay işareti.

 
... :

Ana fikir, içinde statik olan bir işlev kullanmaktır.

Keneleri hatırlamak ve kontrol etmek için ID = GetMicroSecondsCount içinde saklanabilir

Teşekkür ederim!

Tüm soru, var olmayan bu benzersiz kimlikte (kene numarası) bulunur.

GetMicroSecondsCount yardımcı olmaz, çünkü çağrılar arasında değişir (bunun için tasarlanmıştır) ve GetTickCount teorik olarak 2 bitişik kene üzerinde değişmeyebilir.

 
fxsaber :

Buradaki sorun ucuzluk değil, kene numaralandırmanın güvenilirliğidir. Savaş danışmanında bunu yapıyorum.

Hayır, kesinlikle teklif/sor/ms karşılaştırmasından daha yavaş olacaktır.

Güvenilirlikle ilgili sorun nedir? Önemli olan bir şeylerin değişmesidir.

 
fxsaber :

Şartlarınızı (SL/TP vb.) buraya ekleyin.

Bu kodu hemen hatırladım.

Ancak görev, tam olarak tüm siparişlerin gereksiz şekilde numaralandırılmasından kaçınmaktır.

Bu döngünün tüm Expert Advisor için yapılabileceği açıktır. Ancak, işlevde değişikliklerin varlığına dair bir işaret iletmeniz gerekir (aynı başarı ile onu arayamazsınız).

 
Andrey Khatimlianskii :

Hayır, kesinlikle teklif/sor/ms karşılaştırmasından daha yavaş olacaktır.

Güvenilirlikle ilgili sorun nedir? Önemli olan bir şeylerin değişmesidir.

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

PROFI'den SUPERPROFI'ye kadar tüm sorularınız - 1.

Andrey Khatimliansky , 2020.03.05 23:46

Time (TimeCurrent) , teorik olarak da SymbolInfoTick'ten ms cinsinden aynı kalabilir.

Teklif, talep ve zamanı ms cinsinden karşılaştırmak pahalıdır.

Bu, özellikle time_msc değiştirme adımının 1000 ms olduğu MT4 için geçerlidir.

 
Andrey Khatimlianskii :

Ancak görev, tam olarak tüm siparişlerin gereksiz şekilde numaralandırılmasından kaçınmaktır.

Bu döngünün tüm Expert Advisor için yapılabileceği açıktır. Ancak, işlevde değişikliklerin varlığına dair bir işaret iletmeniz gerekir (aynı başarı ile onu arayamazsınız).

anlamadım Veritabanında bir şey değiştiyse, öğrenmenin tek yolu onu veritabanının önceki durumuyla karşılaştırmaktır.

Karşılık gelen her bir veritabanı öğesini karşılaştırabilirsiniz. Veya onlardan bir karma hesaplayın ve karmaları karşılaştırın.

Neden: