Hatalar, hatalar, sorular - sayfa 437

 
voix_kas :

Delirmiş gibi görünüyor. Eleştiri açığız.

Görünüşe göre, bir uzman hakkında konuşacağız, o zaman:

    bool    SetSymbols( string );

ve:

CSymbolList slMain;

int OnInit ()
  {
   if(!slMain.SetSymbols(inWorkSymbols)) return(-1);
   for ( int i = 0 ; i < slMain.GetSymbolCount(); i++)
       Print (slMain.GetSymbolName(i));
//--- ok
   return(0);
  }
 
MetaDriver :
Bahse girerim garantilidir. En azından sürekli buna güveniyorum ve sorun hiç ortaya çıkmadı.

Apaçık. Her iki durumda da, hassas bir an.

amcaVic

İşte bu. Ama benim durumumda bu gereksiz:

 #include <CSymbolList.mqh>

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

CSymbolList slMain;

int OnInit () {
  slMain.SetSymbols(inWorkSymbols);
   return 0 ;
}

void OnTick () {
   static long LastScan = 0 ;
   if (!slMain.GetSymbolCount() || (( long ) TimeCurrent () - LastScan >= inTimeToRescan)) {
     Comment ( "Идентификация рабочих инструментов..." );
    slMain.SetSymbols(inWorkSymbols);
    LastScan = ( long ) TimeCurrent ();
     return ;
  }

   static string Information;
  Information = TimeToString ( TimeCurrent (), TIME_DATE|TIME_SECONDS);

   for ( int i = 0 ; i < slMain.GetSymbolCount(); i++) {
     if (! SymbolSelect (slMain.GetSymbolName(i), true ) || ! SymbolIsSynchronized (slMain.GetSymbolName(i))) continue ;
     //
     StringConcatenate (Information, Information, "\n" , slMain.GetSymbolName(i));
  }
   Comment (Information);
}

Gördüğünüz gibi son döngüde araçlarda bir hata varsa OnTik'te yineleme olmayacaktır.

 
voix_kas :

Apaçık. Her iki durumda da, hassas bir an.

amcaVic

İşte bu. Ama benim durumumda bu gereksiz:

Gördüğünüz gibi son döngüde araçlarda bir hata varsa OnTik'te yineleme olmayacaktır.

Evet ısrar etmiyorum. Sadece yürütmenin sonucunu kontrol etmek doğru.

 
uncleVic :

Evet ısrar etmiyorum. Sadece yürütmenin sonucunu kontrol etmek doğru.

Apaçık. Her durumda, tavsiye için teşekkürler.
 

Bu numarayı buldum. Bu betiği burada çalıştırırsanız, "kilitlenir".

 void OnStart ()
  {
   Print ( "Start  " , TimeLocal ());
   Sleep (- 1000 * 2764799 );
   Print ( "Finish " , TimeLocal ());
  }

Ancak aynı üç satır (kod) ilk önce Expert Advisor'ın OnInit() işlevine eklenirse ve böyle bir Expert Advisor test modunda başlatılırsa, aşağıdakine benzer bir şey elde edilir:

NS 0 Core 2 14:23:49 2011.01.03 00:00:00   Ye00-01-2Event5.mq5 OnInit: терминал (470), разрешение на торговлю (true), TERMINAL_MAXBARS=10000000, компилятор (470)
PD 0 Core 2 14:23:49 2011.01.03 00:00:00   Start  2011.01.03 00:00:00
NP 0 Core 2 14:24:18 2011.01.20 17:02:48   Finish 2011.01.20 17:02:48
II 0 Core 2 14:24:18 2011.01.20 17:02:48   MisFunciones.mqh FileInit: Поиск bin-файла Y.bin

İlk olarak, kod bir şekilde test modunda çalışır.

İkincisi ve daha da önemlisi, testin ilk birkaç gününün geçmişi kaybolur. Bu nedenle, yukarıdaki örnekte, test 2011.01.03 (ilk iki satırdan görülebilir) tarihinden itibaren ayarlanmıştır, ancak kodu işledikten sonra (bu durumda, bunlar 2-3 satırdır), test cihazı hemen atlar. 17 gün ileri ve ardından test bu 17 günü hesaba katmadan devam ediyor.

 
Tritely bir aritmetik taşma yakaladın
 Sleep (- 1000 * 2764799 );
sonuç olarak 17,5 gün beklemeyi kendilerine ayarladılar.
 
Renat :
Tritely bir aritmetik taşma yakaladın
sonuç olarak 17,5 gün beklemeyi kendilerine ayarladılar.
evet, ancak test cihazında çalışır, çünkü Uyku içinde yok sayılır.
 
Renat :
Tritely bir aritmetik taşma yakaladın
sonuç olarak 17,5 gün beklemeyi kendilerine ayarladılar.

Evet, "bir taşma yakaladı" hakkında tartışmıyorum, çünkü bilmiyorum :) Soru şu ki, böyle bir durumu kritik bir hata vererek derleyici veya test cihazı tarafından durdurmanın istenmesidir ( veya başka bir şekilde). Terminalden gelen uyarılar olmadığında herkes programlarının nasıl çalıştığını titizlikle anlayamaz.

Ayrıca, kodun ilk satırlarda OnInit() içinde ayarlanmış olması (yani, herhangi bir geçmiş veri yüklenmeden önce) sorununu görüyorum - ancak bir nedenden dolayı ilk 17.5 günün verileri kayboluyor.

Документация по MQL5: Программы MQL5 / Ошибки выполнения
Документация по MQL5: Программы MQL5 / Ошибки выполнения
  • www.mql5.com
Программы MQL5 / Ошибки выполнения - Документация по MQL5
 
joo :
evet, ancak test cihazında çalışır, çünkü Uyku içinde yok sayılır.
Sleep() öğesinin yok sayıldığından bu kadar emin misiniz? - 2. ve 3. satırlar arasındaki terminal süresi farkına bakın.
 
Yedelkin :
Sleep() öğesinin yok sayıldığından bu kadar emin misiniz? - 2. ve 3. satırlar arasındaki terminal süresi farkına bakın.
Belki de kodda Sleep'in varlığı (yokluğuna kıyasla) bir şekilde genel yürütme süresini etkiler, ancak Sleep'in test cihazında dikkate alınmadığı kesin.