Hatalar, hatalar, sorular - sayfa 435

 
voix_kas :

Sonuçta, eğlenceli.
Bir hevesle, OnDenit işlevinin bir tür yıkıcı olduğunu ve OnInit'in uzman bir kurucu olduğunu düşündüm.

Aslında, OnInit'in çoklu bir olay olduğu ortaya çıktı (bir Uzman Danışmanın ömrü içinde). Uzman Danışmanın işini tamamlamadığı biliniyorsa (örneğin, grafik periyodunda bir değişiklik olması durumunda) neden OnDenit olayını açıkça oluşturduğu açık değil?

Sembolleri değiştirirken, uzmanlar hızlı başlamaları ve önceki yaşamın bilgi tabanını kaydetmeleri için yeniden yüklenir.

Örneğin, çalışan bir Uzman Danışman grafikte asılı kalır, istatistiklerini ve mantığını biriktirir, ardından zaman çerçevesi değiştirilir ve soğuk yeniden başlatma sırasında sıfırdan çalışmaya zorlanır.

Ve başka bir soru.
Başlatmama nedeni REASON_CHARTCHANGE - Grafik sembolü veya nokta değiştirildi.
Grafik sembolünü üzerindeki Expert Advisor'ı silmeden nasıl değiştirebileceğinizi açıklar mısınız?

Sıcak yeniden başlatma modunda.
 

Yedelkin, İlginç, Renat
Açıklama için teşekkürler.

Ayrıca, EA'nın "sıcak" ve "soğuk" yeniden başlatmalarının bir listesini belgelere açıkça dahil etmenin de mantıklı olduğunu düşünüyorum.

Her OnInit'te yeniden başlatmanın olmaması durumunda, çoklu para birimi için küresel bayrak biçiminde bir "koltuk değneği" kullanılması gerekecektir. :(
Kodu biraz sonra ekleyeceğim.

 
Interesting :

Her durumda, Expert Advisor normal başlatma sırasında silinmez, sadece belirli terminal ayarları altında işlem yapmasına izin verilir (ancak bunun için Expert Advisor, sembolün değiştirildiğini anlamalıdır...).

Bu arada, hatırlattı. Uzun zamandır bahsi geçen ayarlar hakkında geliştiricilerle iletişime geçmek istiyorum.

Renat, lütfen zaman çerçevesini değiştirirken ve sembolü değiştirirken ticareti engellemek için iki farklı onay kutusu işaretleyin. Bunlar temelde farklı iki değişikliktir.

Zaman çerçevesi değiştiğinde Uzman Danışmanlarımın ticareti durdurmasını istemem - bu kesinlikle işe yaramaz - zaten her tiki işlerler ve bununla ilgili herhangi bir sorun yoktur.

Ancak karakter değişikliği temelde önemlidir. Bu engellemeyi bırakmak istiyorum ... ama şimdi bu iki ayar bir şekilde senkronize edilmiş ve birlikte düzenlenmiştir.

Bu sorunu programlı olarak çözüyorum (orijinal karakteri statik bir değişkende saklayın ve değişiklikleri init'te kontrol edin). Ancak terminal düzeyinde bloke edilebilirse daha iyi olur.

Expert Advisor çalışırken, onay kutuları ile zaman çerçevesini veya sembolü değiştirme olasılığını kontrol etmek daha da iyi olurdu. Neden aptallık-unutkanlık yüzünden ticaret yapmayı bırakıyorsun?

Onlar. Uzman çizelgede asılıyken bunun yasak olduğu ayarlarda belirtilmişse, zaman çerçevesini ve/veya sembol geçişini (ayrı olarak!) engellemek çok daha iyidir.

// Denerken uygun mesajın verilmesi ile.

Aslında, bu programlı olarak da çözülebilir (zorla bir sembolü veya zaman dilimini yerine geri getirin), ancak terminal düzeyinde gerçekten uygun ayarlarla ilgilendiğinizi düşünüyorum.

 

MetaDriver :

Renat, lütfen zaman çerçevesini değiştirirken ve sembolü değiştirirken ticareti engellemek için iki farklı onay kutusu işaretleyin. Bunlar temelde farklı iki değişikliktir.

Zaman çerçevesi değiştiğinde Uzman Danışmanlarımın ticareti durdurmasını istemem - bu kesinlikle işe yaramaz - zaten her tiki işlerler ve bununla ilgili herhangi bir sorun yoktur.


Fikri destekleyeceğim, başlatmadan arındırma neden kodlarında iki onay kutusu ve bir ayrım yapmalısınız (bu uygun olacaktır).

Ancak TF'yi değiştirme olasılığını engellemekle, nasıl olduğunu bilmiyorum (sembol pahasına), bu yüzden bence bu aşırıya kaçıyor.

Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации
Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации
  • www.mql5.com
Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации - Документация по MQL5
 
MetaDriver :

Bu arada, bu bir hatırlatma. Uzun zamandır bahsedilen ayarlar hakkında geliştiricilerle iletişime geçmek istiyorum.

Renat, lütfen zaman çerçevesini değiştirirken ve sembolü değiştirirken ticareti engellemek için iki farklı onay kutusu işaretleyin. Bunlar temelde farklı iki değişikliktir.

Evet, sembol değiştirme şartı ile zaman dilimini boşuna birleştirmişler gibi görünüyor.

Ben de bunların 2 şarta ayrılmasından yanayım. Zaten servis masasına bir bilet koyun.

 

Aslında, çoklu para birimi için çalışma araçlarını belirleme kodunu ekliyorum. Eleştiri açığız. :)

 input uint    inTimeToRescan = 3600 ; // Интервал времени для принудительного пересканирования рабочих инструментов, в секундах
input string inWorkSymbols  = "USDCHF; GBPUSD; EURUSD; USDJPY; USDCAD; AUDUSD; EURGBP; EURAUD; EURCHF; EURJPY; GBPJPY; GBPCHF" ; // Рабочие инструменты


bool Initialize;


int OnInit () {
   //...
  Initialize = true ;
   //...
}


void OnTick () {
   static ulong   LastScan = 0 ;
   if (( ulong ) TimeCurrent () - LastScan >= inTimeToRescan) Initialize = true ;

   static string Symbol [];
//  static int    Forecast[];
//  static int    Volatile[];

   if (Initialize) {
     Comment ( "Опрос рабочих инструментов..." );
     int SymbolCount_1 = 0 ;
     for ( int i = 0 ; i < SymbolsTotal ( false ); i++)
       if ( StringFind (inWorkSymbols, SymbolName (i, false )) != - 1 )
        SymbolCount_1++;

     if (!SymbolCount_1) return ;
     if ( ArrayResize ( Symbol , SymbolCount_1) != SymbolCount_1) return ;

     int SymbolCount_2 = 0 ;
     for ( int i = 0 ; i < SymbolsTotal ( false ); i++)
       if ( StringFind (inWorkSymbols, SymbolName (i, false )) != - 1 )
         Symbol [SymbolCount_2++] = SymbolName (i, false );

     if (SymbolCount_1 != SymbolCount_2) return ;

     //if (ArrayResize(Forecast, SymbolCount_1) != SymbolCount_1) return;
     //if (ArrayResize(Volatile, SymbolCount_1) != SymbolCount_1) return;

    Initialize = false ;
  }
   //...
}

EA her tik çalışan aletlerin bir listesini almaya çalışır.
Çalışma araçları listesinin güncellenmesi iki koşul altında gerçekleşir: 1) OnInit tetiklenir, 2) EA'nın giriş parametresinde belirtilen süre geçtikten sonra.
Gördüğümüz gibi, bir sonraki başlatmayı algılamak için global bir değişken ( bool Initialize) biçiminde bir "koltuk değneği" kullanılır. Statiğin yeniden başlatılması olsaydı, bu gerekli olmazdı.

Global değişkenlerin kötü olduğunu düşünüyorum, tıpkı koşulsuz atlama operatörü "goto" gibi.

 
voix_kas :

Her OnInit'te yeniden başlatmanın olmaması durumunda, çoklu para birimi için küresel bayrak biçiminde bir "koltuk değneği" kullanılması gerekecektir. :(

İlk başta kodu, ara statik değişkenler şeklinde koltuk değneği bırakmadan dikkatli bir şekilde yazmak daha iyidir.

Çözüm olarak, bu tür verileri sınıf içinde gizleyin. Sınıf öldü - çevre de öldü.

Ve küresel düzeyde, minimum statik değişkenler bırakın.

Документация по MQL5: Основы языка / Переменные / Статические переменные
Документация по MQL5: Основы языка / Переменные / Статические переменные
  • www.mql5.com
Основы языка / Переменные / Статические переменные - Документация по MQL5
 
voix_kas :

Aslında, çoklu para birimi için çalışma araçlarını belirleme kodunu ekliyorum. Eleştiri açığız. :)

Bir ipucu olarak - Sembolü küresel düzeye alın ve OnInit'te geçersiz kılın. Dizi boşsa, başlatma zamanı.

Ve ek bayrak yok.

 
Renat :

Bir ipucu olarak - Sembolü küresel düzeye alın ve OnInit'te geçersiz kılın. Dizi boşsa, başlatma zamanı.

Ve ek bayrak yok.

Muhtemelen paranoyakım. Genel (global) değişkenleri sevmiyorum. Bunu bir hareket olarak görüyorum.
OnInit'in OnTick içinde çalışmasının nasıl tanımlanacağı mümkün mü?
Örneğin, OnTick içinde EA başlatmalarının sayısını depolayan statik bir değişken tanımlayın (eğer MQL5'te böyle veya benzer bir özellik varsa)?

 
voix_kas :

Global değişkenlerin kötü olduğunu düşünüyorum, tıpkı koşulsuz atlama operatörü "goto" gibi.

Muhtemelen paranoyakım. Genel (global) değişkenleri sevmiyorum. Bunu bir hareket olarak görüyorum.

1. Bu neden? Zararlı belirtilerden kurtulmanız gerekir ve kararlı bir şekilde.

2. Değişkenler, diziler ve diğer şeyler ünsüz veya dilin anahtar kelimeleri ile isimlendirilmemelidir (ancak "Sembol" dizisi çok dikkat çekicidir, o zaman kodda bu diziyi veya başka bir şeyi ayrıştırırsınız).

Renat :

Çözüm olarak, bu tür verileri sınıf içinde gizleyin. Sınıf öldü - çevre de öldü.

Ve küresel düzeyde, minimum statik değişkenler bırakın.

İyi öneri. Şimdiden OOP'a geçme zamanı... :)