エラー、バグ、質問 - ページ 437 1...430431432433434435436437438439440441442443444...3185 新しいコメント Victor Kirillin 2011.06.28 21:45 #4361 voix_kas:ちょっと料理してみました。批評は歓迎します。専門家になるのだろうから、では。 bool SetSymbols(string); и: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); } 削除済み 2011.06.28 23:07 #4362 MetaDriver: それが保証されることに賭けています。少なくとも私はいつもそれを頼りにしていますし、問題は一度も起きていません。なるほど、とにかく一触即発の状態ですね。ビックおじさんそれはそうですね。でも、私の場合、それは冗長です。#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); }ご覧のように、OnTickの最後のサイクルでツールにエラーがある場合、イテレーションは行われません。 Victor Kirillin 2011.06.29 08:50 #4363 voix_kas:なるほど、とにかく一触即発の状態ですね。ビックおじさんそれはそうですね。でも、私の場合、それは冗長です。ご覧のように、前回のサイクルでツールにエラーがあった場合、OnTickでは1回も反復されません。私は主張しない。ただ、実行結果を確認するのは正しいことです。 削除済み 2011.06.29 09:00 #4364 uncleVic:無理はしない。実行結果を確認するだけでも、正しいことだと思います。 なるほど、とにかくアドバイスありがとうございました。 Yedelkin 2011.06.30 20:23 #4365 こんな仕掛けを発見しました。このスクリプトを実行すると、「ハングアップ」してしまいます。void OnStart() { Print("Start ",TimeLocal()); Sleep(-1000*2764799); Print("Finish ",TimeLocal()); } しかし、同じ3行(コード)をExpert AdvisorのOnInit()関数に最初に挿入し、そのEAをテスト モードで起動すると、次のような結果になります。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 まず、テストモードでは何とかコードが動く。 第二に、(より重要なことですが)テストの最初の数日間の歴史が失われてしまうことです。したがって、上記の例では、テストは2011.01.03に開始されましたが(最初の2行からわかるように)、テスターはコード処理後にすぐに17日分ジャンプし(この場合、これは2行目から3行目)、この17日間を考慮せずにテストが継続されるのです。 Renat Fatkhullin 2011.06.30 20:32 #4366 で算術オーバーフローを起こしたところです。 Sleep(-1000*2764799); その結果、待ち時間は17.5日となりました。 Andrey Dik 2011.06.30 20:42 #4367 Renat: で算術オーバーフローが発生し、17.5日待たされたところです。 ええ、テスターではSleepを 無視して動作しますから。 Yedelkin 2011.06.30 20:48 #4368 Renat: での算術オーバーフローを捕捉しています。 その結果、17.5日待ちとなりました。 わからないから「釣られたオーバーフロー」については論外です :)問題は、このような状況を、コンパイラが抑制するか、テスターがクリティカル・エラーの 出力で抑制するか(あるいは他の方法で)である。ターミナルからの警告がない状態で、プログラムの動作に細心の注意を払う人ばかりではないでしょう。 この問題は、コードがOnInit()の最初の行(つまり、履歴データがダウンロードされる前)に配置されているという事実にも見られます - しかし、何らかの理由で、最初の17.5日間のデータが失われています。 Документация по MQL5: Программы MQL5 / Ошибки выполнения www.mql5.com Программы MQL5 / Ошибки выполнения - Документация по MQL5 Yedelkin 2011.06.30 20:50 #4369 joo: テスターではSleepは無視されるため、動作します。Sleep() が無視されるのは、本当に大丈夫ですか?- 2行目と3行目の終端時間差を見てください。 Andrey Dik 2011.06.30 20:56 #4370 Yedelkin: Sleep()が無視されるのは、本当に大丈夫ですか?- 2行目と3行目の終端時間の差を見てください。 おそらく、コード中にSleepが あるだけで(ない場合と比較して)何らかの形で総実行時間に影響するのでしょうが、テスターではSleepがカウントされないという事実は確かです。 1...430431432433434435436437438439440441442443444...3185 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
ちょっと料理してみました。批評は歓迎します。
専門家になるのだろうから、では。
и:
それが保証されることに賭けています。少なくとも私はいつもそれを頼りにしていますし、問題は一度も起きていません。
なるほど、とにかく一触即発の状態ですね。
ビックおじさん
それはそうですね。でも、私の場合、それは冗長です。
ご覧のように、OnTickの最後のサイクルでツールにエラーがある場合、イテレーションは行われません。
なるほど、とにかく一触即発の状態ですね。
ビックおじさん
それはそうですね。でも、私の場合、それは冗長です。
ご覧のように、前回のサイクルでツールにエラーがあった場合、OnTickでは1回も反復されません。
私は主張しない。ただ、実行結果を確認するのは正しいことです。
無理はしない。実行結果を確認するだけでも、正しいことだと思います。
こんな仕掛けを発見しました。このスクリプトを実行すると、「ハングアップ」してしまいます。
しかし、同じ3行(コード)をExpert AdvisorのOnInit()関数に最初に挿入し、そのEAをテスト モードで起動すると、次のような結果になります。
まず、テストモードでは何とかコードが動く。
第二に、(より重要なことですが)テストの最初の数日間の歴史が失われてしまうことです。したがって、上記の例では、テストは2011.01.03に開始されましたが(最初の2行からわかるように)、テスターはコード処理後にすぐに17日分ジャンプし(この場合、これは2行目から3行目)、この17日間を考慮せずにテストが継続されるのです。
その結果、待ち時間は17.5日となりました。
で算術オーバーフローが発生し、17.5日待たされたところです。
での算術オーバーフローを捕捉しています。
その結果、17.5日待ちとなりました。
わからないから「釣られたオーバーフロー」については論外です :)問題は、このような状況を、コンパイラが抑制するか、テスターがクリティカル・エラーの 出力で抑制するか(あるいは他の方法で)である。ターミナルからの警告がない状態で、プログラムの動作に細心の注意を払う人ばかりではないでしょう。
この問題は、コードがOnInit()の最初の行(つまり、履歴データがダウンロードされる前)に配置されているという事実にも見られます - しかし、何らかの理由で、最初の17.5日間のデータが失われています。
テスターではSleepは無視されるため、動作します。
Sleep()が無視されるのは、本当に大丈夫ですか?- 2行目と3行目の終端時間の差を見てください。