MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 1878

 
Mihail Matkovskij # :

ENUM_TIMEFRAMES içinde minimum ve maksimum değerler bilinmektedir. Bu nedenle, açıkça belirtilebilirler.

Diğer numaralandırmalarla, yaklaşık değer aralıklarını bilmek yeterlidir. Enum bildiriminde herhangi bir sabit belirtilmemişse, buradaki değerler genellikle 0'dan başlar. i_max_enum herhangi bir iki basamaklı veya üç basamaklı sayıya ayarlanabilir: 50, 100, 255.

Minimum ve maksimum enum değerlerini de deneysel olarak alabilirsiniz. Bunları bir yere yazın ve en uygun hız için StringToEnum'da belirtin:

 int nEnum;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template < typename T>
bool enumFindMinMax( const T _enum, int &__min, int &__max, int _minEnum, int _maxEnum) {
  T enum_;
   int min, max;
  min = INT_MAX ; max = INT_MIN ;
  nEnum = 0 ;
   for ( int i = _minEnum; i <= _maxEnum && ! IsStopped (); i++) {
    enum_ = (T)i;
     if ( StringFind ( EnumToString (enum_), "::" , 0 ) >= 0 )
       continue ;
     if (i < min)
      min = i;
     if (i > max)
      max = i;
    nEnum++;
  }
   if (min != INT_MAX && max != INT_MIN ) {
    __min = min;
    __max = max;
     return true ;
  }
   return false ;
}

template < typename T>
bool enumFindMinMax( const T _enum, int &__min, int &__max) { return enumFindMinMax(_enum, __min, __max, INT_MIN , INT_MAX ); }

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart () {
   int min, max;
   if (enumFindMinMax(( ENUM_ACCOUNT_INFO_DOUBLE ) 0 , min, max, - 500 , 500 ))
     printf ( "enumFindMinMax ENUM_ACCOUNT_INFO_DOUBLE min: %d, max: %d, Count: %d" , min, max, nEnum);
   else
     Print ( "enumFindMinMax Error!" );
}

Komut dosyasının sonucu:

enumFindMinMax ENUM_ACCOUNT_INFO_DOUBLE min: 37 , max: 52 , Count: 14

ENUM_ACCOUNT_INFO_DOUBLE dosyasını açın ve bakın. Sabitlerin sayısı Count(14) şeklindedir. Böylece uygulama başladığında, gerekli tüm numaralandırmaları işlemek, minimum ve maksimum değerlerini yazmak ve StringToEnum'da karşılık gelen min ve max'ı en optimum hızda kullanmak mümkündür.

Not INT_MIN ve INT_MAX ile ikinci seçenek enumFindMinMax gerçekten çok yavaştır. Önce denedim. Ve sonra enumFindMinMax'in tamamlanmasını beklemekten yoruldum   ve -500 ile 500 arasında değerler koydum

 if (enumFindMinMax(( ENUM_ACCOUNT_INFO_DOUBLE ) 0 , min, max, - 500 , 500 ))

Böylece, tüm int aralığını kullanmanın gerekli olmadığı sonucuna vardım.

Dosyalar:
 

Terminalin garip davranışıyla karşı karşıya kaldı.

Durum şudur: Bir Uzman Danışman, belirli bir anda başka bir çizelge açan ve yeni çizelgede belirli bir şablon belirleyen bir çizelge üzerinde çalışır. Bu şablon, yeni bir çizelgede ikinci Uzman Danışmanın lansmanını içerir.

Hafta ortasında her şey yolunda gidiyor, ancak kapalı bir piyasada, hafta sonları yeni bir grafikte yeni bir şablon başlatılıyor (bu, grafiğin görünümündeki değişiklikten görülebilir) ve ikinci Uzman Danışman bunu yapıyor. ondan başlamayın. İkinci Uzman Danışmanı "zorlamanın" tek yolu, herhangi bir komut dosyasını, tamamen boş olsa bile herhangi bir grafikte manuel olarak çalıştırmaktır. Ardından yeni çizelgedeki ikinci Uzman Danışman çalışmaya başlar.

Bu kodu ilk Expert Advisor'da ve ChartOpen ve ChartApplyTemplate fonksiyonlarının yardımıyla ve CChart sınıfının yardımıyla yazdım - her zaman aynı çıkıyor, kapalı bir piyasada yeni bir grafikte ikinci Expert Advisor başlamıyor terminali bir şekilde manuel olarak "itene kadar".

Kim benzerleriyle karşılaşabilir? Bununla nasıl başa çıkılır, hangi yönde "kazılır"?

 
akskarabey ChartApplyTemplate fonksiyonlarının yardımıyla ve CChart sınıfının yardımıyla yazdım - her zaman aynı çıkıyor, kapalı bir piyasada yeni bir grafikte ikinci Expert Advisor başlamıyor terminali bir şekilde manuel olarak "itene kadar".

Kim benzerleriyle karşılaşabilir? Bununla nasıl başa çıkılır, hangi yönde "kazılır"?

Başlamadığını nasıl belirlediniz, bu nasıl görülebilir?

not

böyle dene

 int OnInit ()
{
....
....

 ChartRedraw ();
   return ( INIT_SUCCEEDED );
}
 
Mihail Matkovskij # :

Bir numaralandırma işlevi kullanarak ( ile aynı), EnumToString kullanarak çevirerek ve aradığınız ile karşılaştırarak bir sabiti bulabilirsiniz. Sadece sonucu döndürmek için kalır.

Ama yine de bir örneğiniz (veya en azından bir anahtar satırınız) olabilir mi, yoksa aklınıza bir şey gelmez mi? Ayrıca, soldakiler arasından ihtiyacınız olanları eleyerek büyük bir değerler listesi üzerinde yinelenecek mi, yoksa sadece yararlı değerlerin bir listesi mi var? Şu anda bana öyle geliyor ki, elenecek bir şey yok, listede solcu yok ... ama fikre tutunamıyorum.

 
x572intraday # :

Ama yine de bir örneğiniz (veya en azından bir anahtar satırınız) olabilir mi, yoksa aklınıza bir şey gelmez mi? Ayrıca, soldakiler arasından ihtiyacınız olanları eleyerek büyük bir değerler listesi üzerinde yinelenecek mi, yoksa sadece yararlı değerlerin bir listesi mi var? Şu anda bana öyle geliyor ki, elenecek bir şey yok, listede solcu yok ... ama fikre tutunamıyorum.

Mümkün olan tüm enum değerlerinin tekrar etmemesi için (gerçekten uzun olduğu için) aşağıdaki hazırlıklar yapılmalıdır (caching gibi bir şey). Ayrıca, bu işlevi kullanarak, bir dizgiyi/dizeleri, gerekli tüm numaralandırmaların aralıklarını bilerek bir numaralandırmaya kolayca dönüştürebilirsiniz. Veya nispeten dar olan aralığında numaralandırmayı arayın.

 template < typename T>
bool StringToEnum( const string i_str, T &o_val, int i_min_enum, int i_max_enum)
{
   for ( int i = i_min_enum; i <= i_max_enum && ! IsStopped (); i++) {
     o_val = (T)i;
     if (i_str == EnumToString (o_val))
       return ( true );
   }
   o_val = WRONG_VALUE ;
   return ( false );
}


template < typename T>
bool StringToEnum( const string i_str, T &o_val) { return StringToEnum(i_str, o_val, INT_MIN , INT_MAX ); } // медленный вариант
 
Vitaly Muzichenko # :

Başlamadığını nasıl belirlediniz, bu nasıl görülebilir?

not

böyle dene

OnInit bölümündeki ikinci Uzman Danışman, günlüğe sonuçlar çıkarır ve bunlar günlükte değildir. Günlükte Expert Advisor'ın başlamasıyla ilgili terminalden gelen bir mesaj bile yok. Ve uzmanın adı sağ üst köşedeki çizelgede görünmüyor.

 
12345678902003 # :
Bunun için hangi işlev kullanılır? mqlrate? Ve eğer ObjectGet aracılığıyla, o zaman orada nesnenin özelliğini belirtmeliyim, eğer OBJPROP_PRICE alırsak, o zaman fiyatı mevcut çubuğa nasıl getireceğini.

Alın. Ve nesnenin belirli bir özelliğini elde etmek için bir nesneden bir çubuktaki fiyatı veya zamanı ada veya nesne türüne ve adına göre alma işlevi vardır. Bir çubuk numarası değil, sıfırdan bir ofset kullanılır.

 
Valeriy Yastremskiy # :

Alın. Ve nesnenin belirli bir özelliğini elde etmek için bir nesneden bir çubuktaki fiyatı veya zamanı ada veya nesne türüne ve adına göre alma işlevi vardır. Bir çubuk numarası değil, sıfırdan bir ofset kullanılır.

Bunu ObjectGetValueByTime() işlevini kullanarak yapabilirsiniz.

Misal

double p = ObjectGetValueByTime( 0,"имя объекта...",Time[0]);
 
Benim sorunum şu: Terminal\MQL4\Indicators klasöründeki göstergeler listesinde göstergeler var, ancak doğrudan MQL4 terminalinin kendi listesinde, bu göstergelerin çizelgeye sürüklendiği listede, aynı göstergeler orada değil. Bu göstergeler, terminal tablosunda kullanılabilecekleri şekilde terminalin kendi listelerinde görünecek şekilde nasıl yapılır?   MQL4? Ekranın sağ tarafında , terminalde bulunan göstergeler bunlardır.     MQL4 ve solundaki klasördeki aynı terminalin göstergeleridir.   MQL4 4\Göstergeler (örnek olarak)
Dosyalar:
 
Halina Okopna-Pecuch # :
Benim sorunum şu: Terminal\MQL4\Indicators klasöründeki göstergeler listesinde göstergeler var, ancak doğrudan MQL4 terminalinin kendi listesinde, bu göstergelerin çizelgeye sürüklendiği listede, aynı göstergeler orada değil. Bu göstergeler, terminal tablosunda kullanılabilecekleri şekilde terminalin kendi listelerinde görünecek şekilde nasıl yapılır?   MQL4? Ekranın sağ tarafında , terminalde bulunan göstergeler bunlardır.     MQL4 ve solundaki klasördeki aynı terminalin göstergeleridir.   MQL4 4\Göstergeler (örnek olarak)

Bunların gösterge olmaması muhtemeldir.