MQL5でCopyTicksRange()が正しく動作しない。 - ページ 3 1234567 新しいコメント RusPro 2021.09.19 02:33 #21 fxsaber #:ユニットです。 おそらくそうだと思いますが、それでも基本的な機能であり、少なくともデータの書き出しに端末自体が使っているとしたら、端末の信頼性も損なわれてしまいます RusPro 2021.09.19 05:04 #22 添付ファイルのエラー例をお約束します。驚いたことに、Err_SymbolInfoTick2()はしばらくは正常に動作していましたが、その後、nullの日付も返すようになりました。コード内に説明のコメントがあります。 ログです。 2021.09.19 06:01:24.674 ErrorCopyTicks (CustomBR,H1) ---------Err_CopyTicksRange()------------ 2021.09.19 06:01:24.754 ErrorCopyTicks (CustomBR,H1) CopyTicksRange('@BR',Ticks,COPY_TICKS_ALL, 2021.01.29 23:57:00:000, 2021.01.31 23:59:00:000 ); received 109425 ticks 2021.09.19 06:01:24.754 ErrorCopyTicks (CustomBR,H1) 2021.01.29 00:02:14:782 - first tick, 2021.01.29 23:56:43:863 - last tick 2021.09.19 06:01:24.754 ErrorCopyTicks (CustomBR,H1) --------------------- 2021.09.19 06:01:24.754 ErrorCopyTicks (CustomBR,H1) ---------Err_CopyTicks()------------ 2021.09.19 06:01:24.767 ErrorCopyTicks (CustomBR,H1) CopyTicks('@BR',Ticks,COPY_TICKS_ALL, 2021.01.29 23:57:00:000, 100 ); received 100 ticks 2021.09.19 06:01:24.767 ErrorCopyTicks (CustomBR,H1) 2021.01.29 00:02:14:782 - first tick, 2021.01.29 10:00:12:292 - last tick 2021.09.19 06:01:24.767 ErrorCopyTicks (CustomBR,H1) --------------------- 2021.09.19 06:01:24.767 ErrorCopyTicks (CustomBR,H1) ---------Err_CopyTicks()------------ 2021.09.19 06:01:24.906 ErrorCopyTicks (CustomBR,H1) CopyTicks('@BR',Ticks,COPY_TICKS_ALL, 2021.01.29 23:57:00:000, 1000000 ); received 1000000 ticks 2021.09.19 06:01:24.906 ErrorCopyTicks (CustomBR,H1) 2021.01.29 00:02:14:782 - first tick, 2021.02.08 14:17:58:484 - last tick 2021.09.19 06:01:24.906 ErrorCopyTicks (CustomBR,H1) --------------------- 2021.09.19 06:01:24.906 ErrorCopyTicks (CustomBR,H1) ---------Err_SymbolInfoTick1('CustomBR')------------ 2021.09.19 06:01:24.969 ErrorCopyTicks (CustomBR,H1) CopyTicksRange('CustomBR',Ticks,COPY_TICKS_ALL, 2021.09.17 00:00:00:000, 2021.09.17 20:00:00:000 ); received 189530 ticks 2021.09.19 06:01:24.969 ErrorCopyTicks (CustomBR,H1) 2021.09.17 00:02:12:052 - first tick, 2021.09.17 19:59:59:782 - last tick 2021.09.19 06:01:25.029 ErrorCopyTicks (CustomBR,H1) CustomTicksReplace('CustomBR',2021.09.17 00:00:00:000, 2021.09.17 20:00:00:000, Ticks, 189530 ); replaced 189530 ticks 2021.09.19 06:01:25.029 ErrorCopyTicks (CustomBR,H1) ret=1, mt.time_msc=1970.01.01 00:00:00:000 2021.09.19 06:01:25.029 ErrorCopyTicks (CustomBR,H1) --------------------- 2021.09.19 06:01:25.029 ErrorCopyTicks (CustomBR,H1) ---------Err_SymbolInfoTick2('CustomBR')------------ 2021.09.19 06:01:25.091 ErrorCopyTicks (CustomBR,H1) CopyTicksRange('CustomBR',Ticks,COPY_TICKS_ALL, 2021.09.17 00:00:00:000, 2021.09.17 20:00:00:000 ); received 189530 ticks 2021.09.19 06:01:25.091 ErrorCopyTicks (CustomBR,H1) 2021.09.17 00:02:12:052 - first tick, 2021.09.17 19:59:59:782 - last tick 2021.09.19 06:01:25.153 ErrorCopyTicks (CustomBR,H1) CustomTicksAdd('CustomBR',Ticks, 189530 ); added 189530 ticks 2021.09.19 06:01:25.153 ErrorCopyTicks (CustomBR,H1) ret=1, mt.time_msc=1970.01.01 00:00:00:000 2021.09.19 06:01:25.153 ErrorCopyTicks (CustomBR,H1) --------------------- おやつの楽しみ:ターミナルツールでティックを見ると、記録された以上のティックを得ることができます。(写真参照)。そして、「以前」の日付が2021.09.18に減れば、記録される数は少なくなります。 ファイル: untitled.jpg 605 kb ErrorCopyTicks.mq5 16 kb RusPro 2021.09.19 05:05 #23 はい、配列が静的か 動的かは問題ではありません。 fxsaber 2021.09.19 05:59 #24 RusPro #:約束されたエラー例 残念ながら、これらのキャラクターを再現するためのアクセスはありません。 RusPro 2021.09.19 09:08 #25 fxsaber #:残念ながら、これらのシンボルを再現するためのアクセスはありません。 FXを試してみます。 prostotrader 2021.09.19 12:07 #26 RusPro #:MICEXだそうです。 じゃあ、FXでやってみます。 1.MICEXに「@BR」の記号はありません。 カスタムシンボルを使用しているようです。 また、作成にミスがあるかもしれません。 私はオリジナルのMICEXシンボルでCopyTicksとCopyTicksRange関数をよく使いますが、エラーに気づいたことはありません。 2.端末は全ティック履歴を保存していないため、最初の関数呼び出しは要求された期間全体ではないティックを返す可能性があります。 追加以下は、CopyTicksRange関数を使ってティックを読み込むインジケーターの例です。//+------------------------------------------------------------------+ //| Ticks_test.mq5 | //| Copyright 2021 prostotrader | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2021 prostotrader" #property link "https://www.mql5.com" #property version "1.00" #property indicator_separate_window #property indicator_plots 1 #property indicator_buffers 1 enum IND_STAGE { LOAD_TICKS = 0, READ_TICKS = 1, FILL_DATA = 2 }; struct T_DATA { datetime bar_time; int ticks_cnt; MqlTick pr_bar_ticks[]; }; struct MARKET_DATA { int time_cnt; int cnt; IND_STAGE stage; T_DATA t_data[]; MqlTick ticks[]; int live_cnt; int a_cnt; datetime time_array[]; }; MARKET_DATA m_data; datetime start_time, end_time; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping end_time = datetime(SymbolInfoInteger(Symbol(), SYMBOL_EXPIRATION_TIME)); m_data.stage = LOAD_TICKS; //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator Load ticks function | //+------------------------------------------------------------------+ bool LoadTicks(const datetime &a_times[]) { int bars = Bars(Symbol(),PERIOD_M1); datetime cur_time = TimeTradeServer(); if(cur_time > end_time) { cur_time = end_time; } int result = CopyTime(Symbol(), PERIOD_M1, 0, bars, m_data.time_array); if(result > 0) { start_time = m_data.time_array[0]; if(m_data.time_array[result - 1] == a_times[ArraySize(a_times) - 1]) { m_data.time_cnt = result; result = CopyTicksRange(Symbol(), m_data.ticks, COPY_TICKS_INFO, ulong(start_time) * 1000, ulong(cur_time) * 1000); if(result > 0) { if(m_data.ticks[result-1].time >= m_data.time_array[m_data.time_cnt - 1]) { m_data.cnt = result; return(true); } else Print(__FUNCTION__, ": Не хватает тиков ", Symbol(), "!"); } else Print(__FUNCTION__, ": Не получены тики по символу ", Symbol(), "!"); } else Print(__FUNCTION__, ": Не хватает баров по символу ", Symbol(), "!"); } else Print(__FUNCTION__, ": Не скопировано время баров по символу ", Symbol(), "!"); return(false); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate (const int rates_total, const int prev_calculated, const datetime& time[], const double& open[], const double& high[], const double& low[], const double& close[], const long& tick_volume[], const long& volume[], const int& spread[] ) { switch (m_data.stage) { case LOAD_TICKS: if(LoadTicks(time) == true) { Print("All ticks loaded."); m_data.stage = READ_TICKS; return(rates_total); } return(0); break; case READ_TICKS: break; } //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ そして、すべてがうまく読み込まれるのですが、最初の1回だけとは限りません。 RusPro 2021.09.19 13:49 #27 prostotrader #: 1.MICEXに「@BR」シンボルはありません。 以下は、CopyTicksRange関数を使ってティックを読み込むインジケータの例です。 そして、すべてがうまく読み込まれるのですが、最初の1回だけとは限りません。 これは、原油先物ののりです。ブローカーBCS証券会社によって呼び方が異なる場合があります。しかし、まったく同じ問題が他のシンボルにも発生します。 RusPro 2021.09.19 14:07 #28 prostotrader #: この例では、開始時刻が常に既存のバーの開始時刻に等しく(つまりティックが存在することが分かっている)、最後のバーのすべてのティック履歴を一度に読み取るという、呼び出し条件が異なるため、うまくいきます。 ちなみに、私の松葉杖の1つは、あなたと同じような働きをします。また、最初は既存のバーの時間を取得し、それを最大連続区間に分割してティックを取得します。しかし、別の問題が発生します。データ用の受信配列が十分でない場合、残りの再開はタンバリンダンスになります(上記でお話ししたことです)。 また、ダイナミックアレイを扱うと、より遅くなり、メモリの断片化の可能性も考慮しなければなりません。 RusPro 2021.09.19 14:22 #29 prostotrader #: 2.端末はティック履歴全体を保存していないため、最初に関数を呼び出すと、要求された期間全体のティックが返されないことがあります。 全期間が返されなくても問題はありません。問題は、要求された期間ではなく、別の期間が返された場合です。さらに悪いことに,要求されたティックと,その範囲に含まれない他のティックが返される場合です。 例の記号を "SILV-12.21 "に置き換えてみました。同じエラーが出ました。面白いことに、SymbolInfoTickは最後のテストで正しい答えを返しました :) しかし、間違っているときと間違っているときを、どうやって推測すればいいのでしょうか? 2021.09.19 15:27:55.089 ErrorCopyTicks (CustomBR,H1) ---------Err_CopyTicksRange()------------ 2021.09.19 15:27:55.090 ErrorCopyTicks (CustomBR,H1) CopyTicksRange('SILV-12.21',Ticks,COPY_TICKS_ALL, 2021.01.29 23:57:00:000, 2021.01.31 23:59:00:000 ); received 1758 ticks 2021.09.19 15:27:55.090 ErrorCopyTicks (CustomBR,H1) 2021.01.29 00:02:14:782 - first tick, 2021.01.29 23:49:01:540 - last tick 2021.09.19 15:27:55.090 ErrorCopyTicks (CustomBR,H1) --------------------- 2021.09.19 15:27:55.090 ErrorCopyTicks (CustomBR,H1) ---------Err_CopyTicks()------------ 2021.09.19 15:27:55.091 ErrorCopyTicks (CustomBR,H1) CopyTicks('SILV-12.21',Ticks,COPY_TICKS_ALL, 2021.01.29 23:57:00:000, 100 ); received 100 ticks 2021.09.19 15:27:55.091 ErrorCopyTicks (CustomBR,H1) 2021.01.29 00:02:14:782 - first tick, 2021.01.29 11:02:44:891 - last tick 2021.09.19 15:27:55.091 ErrorCopyTicks (CustomBR,H1) --------------------- 2021.09.19 15:27:55.091 ErrorCopyTicks (CustomBR,H1) ---------Err_CopyTicks()------------ 2021.09.19 15:27:55.170 ErrorCopyTicks (CustomBR,H1) CopyTicks('SILV-12.21',Ticks,COPY_TICKS_ALL, 2021.01.29 23:57:00:000, 1000000 ); received 763140 ticks 2021.09.19 15:27:55.170 ErrorCopyTicks (CustomBR,H1) 2021.01.29 00:02:14:782 - first tick, 2021.09.17 23:58:41:031 - last tick 2021.09.19 15:27:55.170 ErrorCopyTicks (CustomBR,H1) --------------------- 2021.09.19 15:27:55.170 ErrorCopyTicks (CustomBR,H1) ---------Err_SymbolInfoTick1('CustomBR')------------ 2021.09.19 15:27:55.178 ErrorCopyTicks (CustomBR,H1) CopyTicksRange('SILV-12.21',Ticks,COPY_TICKS_ALL, 2021.09.17 00:00:00:000, 2021.09.17 20:00:00:000 ); received 42793 ticks 2021.09.19 15:27:55.178 ErrorCopyTicks (CustomBR,H1) 2021.09.17 00:03:04:576 - first tick, 2021.09.17 19:59:32:398 - last tick 2021.09.19 15:27:55.190 ErrorCopyTicks (CustomBR,H1) CustomTicksReplace('CustomBR',2021.09.17 00:00:00:000, 2021.09.17 20:00:00:000, Ticks, 42793 ); replaced 42793 ticks 2021.09.19 15:27:55.190 ErrorCopyTicks (CustomBR,H1) ret=1, mt.time_msc=1970.01.01 00:00:00:000 2021.09.19 15:27:55.190 ErrorCopyTicks (CustomBR,H1) --------------------- 2021.09.19 15:27:55.190 ErrorCopyTicks (CustomBR,H1) ---------Err_SymbolInfoTick2('CustomBR')------------ 2021.09.19 15:27:55.196 ErrorCopyTicks (CustomBR,H1) CopyTicksRange('SILV-12.21',Ticks,COPY_TICKS_ALL, 2021.09.17 00:00:00:000, 2021.09.17 20:00:00:000 ); received 42793 ticks 2021.09.19 15:27:55.196 ErrorCopyTicks (CustomBR,H1) 2021.09.17 00:03:04:576 - first tick, 2021.09.17 19:59:32:398 - last tick 2021.09.19 15:27:55.210 ErrorCopyTicks (CustomBR,H1) CustomTicksAdd('CustomBR',Ticks, 42793 ); added 42793 ticks 2021.09.19 15:27:55.210 ErrorCopyTicks (CustomBR,H1) ret=1, mt.time_msc=2021.09.17 19:59:32:398 2021.09.19 15:27:55.210 ErrorCopyTicks (CustomBR,H1) --------------------- RusPro 2021.09.19 14:39 #30 fxsaber #: К сожалению, нет доступа к этим символам, чтобы воспроизвести. FXで、同じような失敗をする。アルパリ・ブローカー、テストアカウント。EURUSDシンボル EURUSDをベースに作られたカスタムシンボル、名前もそのままに 2021.09.19 15:36:52.417 tester (EURUSD,H1) ---------Err_CopyTicksRange()------------ 2021.09.19 15:36:52.432 tester (EURUSD,H1) CopyTicksRange('EURUSD',Ticks,COPY_TICKS_ALL, 2021.01.29 23:57:00:000, 2021.01.31 23:59:00:000 ); received 102934 ticks 2021.09.19 15:36:52.432 tester (EURUSD,H1) 2021.01.29 00:00:00:139 - first tick, 2021.01.29 23:54:59:930 - last tick 2021.09.19 15:36:52.432 tester (EURUSD,H1) --------------------- 2021.09.19 15:36:52.432 tester (EURUSD,H1) ---------Err_CopyTicks()------------ 2021.09.19 15:36:52.445 tester (EURUSD,H1) CopyTicks('EURUSD',Ticks,COPY_TICKS_ALL, 2021.01.29 23:57:00:000, 100 ); received 100 ticks 2021.09.19 15:36:52.445 tester (EURUSD,H1) 2021.01.29 00:00:00:139 - first tick, 2021.01.29 00:12:52:513 - last tick 2021.09.19 15:36:52.445 tester (EURUSD,H1) --------------------- 2021.09.19 15:36:52.445 tester (EURUSD,H1) ---------Err_CopyTicks()------------ 2021.09.19 15:36:52.577 tester (EURUSD,H1) CopyTicks('EURUSD',Ticks,COPY_TICKS_ALL, 2021.01.29 23:57:00:000, 1000000 ); received 1000000 ticks 2021.09.19 15:36:52.577 tester (EURUSD,H1) 2021.01.29 00:00:00:139 - first tick, 2021.02.15 18:31:34:723 - last tick 2021.09.19 15:36:52.577 tester (EURUSD,H1) --------------------- 2021.09.19 15:36:52.577 tester (EURUSD,H1) ---------Err_SymbolInfoTick1('CustomBR')------------ 2021.09.19 15:36:52.579 tester (EURUSD,H1) CopyTicksRange('EURUSD',Ticks,COPY_TICKS_ALL, 2021.09.17 00:00:00:000, 2021.09.17 20:00:00:000 ); received 78831 ticks 2021.09.19 15:36:52.579 tester (EURUSD,H1) 2021.09.17 00:00:00:349 - first tick, 2021.09.17 19:59:59:088 - last tick 2021.09.19 15:36:52.645 tester (EURUSD,H1) CustomTicksReplace('CustomBR',2021.09.17 00:00:00:000, 2021.09.17 20:00:00:000, Ticks, 78831 ); replaced 78831 ticks 2021.09.19 15:36:52.645 tester (EURUSD,H1) ret=1, mt.time_msc=1970.01.01 00:00:00:000 2021.09.19 15:36:52.645 tester (EURUSD,H1) --------------------- 2021.09.19 15:36:52.645 tester (EURUSD,H1) ---------Err_SymbolInfoTick2('CustomBR')------------ 2021.09.19 15:36:52.658 tester (EURUSD,H1) CopyTicksRange('EURUSD',Ticks,COPY_TICKS_ALL, 2021.09.17 00:00:00:000, 2021.09.17 20:00:00:000 ); received 78831 ticks 2021.09.19 15:36:52.658 tester (EURUSD,H1) 2021.09.17 00:00:00:349 - first tick, 2021.09.17 19:59:59:088 - last tick 2021.09.19 15:36:52.686 tester (EURUSD,H1) CustomTicksAdd('CustomBR',Ticks, 78831 ); added 78831 ticks 2021.09.19 15:36:52.686 tester (EURUSD,H1) ret=1, mt.time_msc=2021.09.17 19:59:59:088 1234567 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
ユニットです。
おそらくそうだと思いますが、それでも基本的な機能であり、少なくともデータの書き出しに端末自体が使っているとしたら、端末の信頼性も損なわれてしまいます
添付ファイルのエラー例をお約束します。驚いたことに、Err_SymbolInfoTick2()はしばらくは正常に動作していましたが、その後、nullの日付も返すようになりました。コード内に説明のコメントがあります。
ログです。
おやつの楽しみ:ターミナルツールでティックを見ると、記録された以上のティックを得ることができます。(写真参照)。そして、「以前」の日付が2021.09.18に減れば、記録される数は少なくなります。
約束されたエラー例
残念ながら、これらのキャラクターを再現するためのアクセスはありません。
残念ながら、これらのシンボルを再現するためのアクセスはありません。
FXを試してみます。
MICEXだそうです。 じゃあ、FXでやってみます。
1.MICEXに「@BR」の記号はありません。
カスタムシンボルを使用しているようです。
また、作成にミスがあるかもしれません。
私はオリジナルのMICEXシンボルでCopyTicksとCopyTicksRange関数をよく使いますが、エラーに気づいたことはありません。
2.端末は全ティック履歴を保存していないため、最初の関数呼び出しは要求された期間全体ではないティックを返す可能性があります。
追加
以下は、CopyTicksRange関数を使ってティックを読み込むインジケーターの例です。
そして、すべてがうまく読み込まれるのですが、最初の1回だけとは限りません。1.MICEXに「@BR」シンボルはありません。
以下は、CopyTicksRange関数を使ってティックを読み込むインジケータの例です。
そして、すべてがうまく読み込まれるのですが、最初の1回だけとは限りません。これは、原油先物ののりです。ブローカーBCS証券会社によって呼び方が異なる場合があります。しかし、まったく同じ問題が他のシンボルにも発生します。
この例では、開始時刻が常に既存のバーの開始時刻に等しく(つまりティックが存在することが分かっている)、最後のバーのすべてのティック履歴を一度に読み取るという、呼び出し条件が異なるため、うまくいきます。
ちなみに、私の松葉杖の1つは、あなたと同じような働きをします。また、最初は既存のバーの時間を取得し、それを最大連続区間に分割してティックを取得します。しかし、別の問題が発生します。データ用の受信配列が十分でない場合、残りの再開はタンバリンダンスになります(上記でお話ししたことです)。
また、ダイナミックアレイを扱うと、より遅くなり、メモリの断片化の可能性も考慮しなければなりません。
2.端末はティック履歴全体を保存していないため、最初に関数を呼び出すと、要求された期間全体のティックが返されないことがあります。
全期間が返されなくても問題はありません。問題は、要求された期間ではなく、別の期間が返された場合です。さらに悪いことに,要求されたティックと,その範囲に含まれない他のティックが返される場合です。
例の記号を "SILV-12.21 "に置き換えてみました。同じエラーが出ました。面白いことに、SymbolInfoTickは最後のテストで正しい答えを返しました :) しかし、間違っているときと間違っているときを、どうやって推測すればいいのでしょうか?
К сожалению, нет доступа к этим символам, чтобы воспроизвести.
FXで、同じような失敗をする。アルパリ・ブローカー、テストアカウント。EURUSDシンボル
EURUSDをベースに作られたカスタムシンボル、名前もそのままに