初期化中のChartNavigate - ページ 6

 
Alexey Viktorov:

この投稿では、https://www.mql5.com/ru/forum/260815/page4#comment_7890492、問題が再現される条件を詳しく説明しました。これは、あなたの主張に基づいて再現することができました。ここに 書いたこと

つまり、条件を少し変えるだけで、着実に再現できるようになったのです。

あなたはなぜかこれに気づかなかった

 
Alexey Viktorov:

P./S.: あなたのコードでCommentの代わりにPrintを使えば、より優しい手順になるだけでなく、より良い結果が得られるでしょう。OnInit()でのプリント 結果は比較しやすいので、コピーしてここに添付する

 
Alexey Viktorov:

私は、すべてがうまくいくことを期待するのではなく、ビルドが同じになるように更新することを提案しました。

Igorさんは、製品版のインジケーターで実験されているのでしょうか、それとも実験的なインジケーターで実験されているのでしょうか?

あそこもあそこも。しかし、この問題がバグなのか、そうでないのか、まだはっきりしたことは言えません。十分に再現性のある条件を見つける必要がありますね。

 
Alexey Viktorov:

どうすればいいのか?

スレッドの最初の投稿の説明によると、それはインジケータであり、それは開いているチャートにハングアップします - それは、すでに履歴が読み込まれていることを意味します。そうだろ?インジケータを掛ける、端末を閉じる、端末を起動 する、---履歴はどこへ行くのか?もし、すでにあったのなら...

次に、EURMXNのシンボルをオープンしました。端末を見ずに、それが何であるか分かりますか?)))

簡単なことです。

  1. インジケータを含むテンプレートはdefault.tplとして保存されます。
  2. 今まで開かなかったチャートシンボルが開かれる。
その結果、まずインジケータが起動し、その後にデータが読み込まれます。イベントの束を1つのパッケージにまとめました。

 
Ihor Herasko:

あそこもあそこも。しかし、それがバグなのかどうか、まだ確信が持てません。十分に再現性のある条件を見つける必要があるのです。

表現が少し残念です。私が引用した のは、再現性のある条件のものです。

もうひとつは、そうですね、おそらくブロックIと IIで 説明したことは、バグではなく端末を再起動 したときのデータの読み込みの特殊性です。

また、1870年代のビルドでは、1861年代のものと再生に違いがありました。

メッセージの組み合わせ(成功とエラー4111)が少し変わりました。例えば、以前、このような安定した再生産があったとしたら。

test 2018 06 26 (GBPUSD,M5)     Alert: Успешно
test 2018 06 26 (GBPUSD,H1)     Alert: Ошибка №4111

さて、同じコードで、エラーメッセージがより顕著になったようです。

test 2018 06 26 (EURNZD,M5)     Alert: Ошибка №4111
test 2018 06 26 (EURNZD,H1)     Alert: Ошибка №4111

test 2018 06 26 (EURNZD,M5)     Alert: Ошибка №4111
test 2018 06 26 (EURNZD,H1)     Alert: Ошибка №4111

test 2018 06 26 (EURNZD,M5)     Alert: Ошибка №4111
test 2018 06 26 (EURNZD,H1)     Alert: Ошибка №4111

test 2018 06 26 (EURNZD,M5)     Alert: Успешно
test 2018 06 26 (EURNZD,H1)     Alert: Ошибка №4111


そして、私のその投稿の ブロックⅢは、1870番で再現できなくなりました。

また、ここに書かれていることを1870年代に再現することもできませんでした。https://www.mql5.com/ru/forum/260815/page5#comment_7901728 Last - たぶん、OSに何らかの依存があるのでしょう(推測として)。すなわち、Vladimirによるこのコードは、私にとって何の問題もなく動作します。

 
Ihor Herasko:

ChartNavigate関数で 問題に遭遇しました。何か間違ったことをしているのか、それとも本当に機能に問題があるのか。よく使っている人は書き込んでください。

つまり、問題の核心は、ChartNavigateがチャートを移動させないということです 端末を起動するとき OnInit()内でこの関数を呼び出した場合。特に何度かドキュメントを読みました。初期化時に関数を呼び出せないとはどこにも書いていない。

コード インジケーター を再生することができます。

プレイまでの手順

  1. チャートの自動再生をオフにする。
  2. インジケーターをチャートに貼り付けます。ChartNavigateは、チャートを希望する位置に移動させることで起動します。
  3. 端末をアンロードする。
  4. 端末を読み込む。オフセットなしでチャートを表示すると、ChartNavigateは動作しません。
関数がエラーを出すようであればOK。でも、そうじゃないんです。すべての呼び出しは成功するが、ターミナルを再読み込みしたときに、チャートが移動しない。

3種類のインジケーターを試し、それぞれの結果を確認します。

1.他のグラフィックコマンドの最後にChartNavigateを配置する

//+------------------------------------------------------------------+
//|                              TryToSetChartSettings_Indicator.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {


//--- отключим автопрокрутку
   ChartSetInteger(0,CHART_AUTOSCROLL,false);
//--- установим отступ правого края графика
   ChartSetInteger(0,CHART_SHIFT,true);
//--- отобразим в виде свечей
   ChartSetInteger(0,CHART_MODE,CHART_CANDLES);
//--- установить режим отображения тиковых объемов
   ChartSetInteger(0,CHART_SHOW_VOLUMES,CHART_VOLUME_TICK); 
//--- Прокрутим от правого края графика на 1000 баров влево
   ChartNavigate(0,CHART_END,-1000);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

2.ChartNavigate 1 - チャートへの他のコマンドはありません。

//+------------------------------------------------------------------+
//|                              TryToSetChartSettings_Indicator.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
/*
//--- отключим автопрокрутку
   ChartSetInteger(0,CHART_AUTOSCROLL,false);
//--- установим отступ правого края графика
   ChartSetInteger(0,CHART_SHIFT,true);
//--- отобразим в виде свечей
   ChartSetInteger(0,CHART_MODE,CHART_CANDLES);
//--- установить режим отображения тиковых объемов
   ChartSetInteger(0,CHART_SHOW_VOLUMES,CHART_VOLUME_TICK); 
*/
//--- Прокрутим от правого края графика на 1000 баров влево
   ChartNavigate(0,CHART_END,-1000);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


3.他のチャートコマンドの前にChartNavigateを置く

//+------------------------------------------------------------------+
//|                              TryToSetChartSettings_Indicator.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {

//--- Прокрутим от правого края графика на 1000 баров влево
   ChartNavigate(0,CHART_END,-1000);
//--- отключим автопрокрутку
   ChartSetInteger(0,CHART_AUTOSCROLL,false);
//--- установим отступ правого края графика
   ChartSetInteger(0,CHART_SHIFT,true);
//--- отобразим в виде свечей
   ChartSetInteger(0,CHART_MODE,CHART_CANDLES);
//--- установить режим отображения тиковых объемов
   ChartSetInteger(0,CHART_SHOW_VOLUMES,CHART_VOLUME_TICK); 

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Rashid Umarov:

そして、3種類のインジケーターを試し、それぞれの結果をご覧ください。

1.他のチャートコマンドの末尾にChartNavigateを配置する。

  1. 自動スクロールを有効にしたM1チャートに添付しています。自動スクロールはオフ、チャートは左に1000本移動しています。
  2. インジケータをチャートから外さずにターミナルを再装填。チャートは現在のローソク足を表示しており、1000本分の左への移動はありません。オートスクロールは使用できないままです。
  3. ステップ2を7回繰り返しましたが、そのうち3回は1000本のろうそくの左側への遷移が完了し、4回は遷移が完了していません。
そのような場合、「更新を待っています」というメッセージが表示されることがあります。つまり、履歴を読み込む際に、端末が強制的に最新の相場までチャートをスクロールさせていると結論付けることができる。また、OnInit()の後に発生するため、予期せぬ結果を得ることができます。

2.ChartNavigateのみ - チャートへの他のコマンドはありません。

  1. このバージョンでは自動スクロールが自動で無効にならないので、手動で無効にしてインジケータを接続しました。チャートは左に1000本移動しました。
  2. インジケータをチャートから切り離さずに端末を再起動。
  3. 7件中2件はスクロールが実行されています。そして、そのうちの1つでは、予想履歴の表示、現在のローソク足の表示、予想履歴の表示という3段階で起こりました。OnInit()が2回実行されているように見えます。1回目は履歴がロードされる前、2回目はロードされた後です。

3.他のチャートコマンドの前にChartNavigateを配置する。

  1. 自動スクロールを有効にし、インジケータを添付しました。チャートがピクッと動いて、現在のローソク足に戻りました。予想通り、1000小節移動コマンドの後に自動スクロールが無効になります。
  2. インジケータをチャートから切り離さずに端末を再起動(チャートには現在のローソク足が表示される)。
  3. 7つのケースすべてで、チャートは現在のローソクを表示し、スクロールは点滅さえしていません。
自動スクロールをオフにした状態でチャートにインジケーターを 表示せず、履歴の深部にあるどこかを表示した状態で端末を再起動すると、再起動ごとに端末をオフにした場所の表示がされるようになります。ナビゲーションコマンドの実行中のどこかで、現在のロウソクに移動があることが判明したのです。
 
Ihor Herasko:

  1. オートスクロールをオンにしたM1チャートに添付しています。自動スクロールをオフにすると、チャートは左に1000バー移動しました。
  2. インジケータをチャートから外さずにターミナルを再装填。チャートは現在のローソク足を表示しており、1000本分の左への移動はありません。自動スクロールは利用できないままです。
  3. ステップ2を7回繰り返しましたが、そのうち3回は1000本のろうそくの左側への遷移が完了し、4回は遷移が完了していません。
コマンドを完璧に実行していない場合、「Waiting for refresh」と表示されます。つまり、履歴を読み込む際に、端末が強制的に最新の相場までチャートをスクロールさせていると結論付けることができる。また、OnInit()の後に発生するため、予期せぬ結果を得ることができます。

いつも忘れてしまうのですが、あなたのメッセージ・提案は逆から読んでも大丈夫です。古いジョークにあるようなものです。

1917年、10月。
Decembristの孫娘である女性が、ネフスキーにある自分の家に座っています。街で物音を聞いた彼女は、管理人に
を調べてもらう。
- お嬢さん、革命はそこにある!- 管理人が戻ってくる。
-ああ、なんと素晴らしいことでしょう。- 祖父は革命を夢見た!
革命家が何を望んでいるのか調べてこい、親愛なる友よ
- 金持ちはいらないんですよ、奥さん」と、帰ってきた掃除夫が言う。
- でも、祖父は貧乏人がいないことを望んだのです」と、その女性は考え込んでいます。

端末を再起動する前に、時刻表のプロパティを 変更するのでは?
 
Rashid Umarov:

いつも忘れてしまうのですが、あなたのメッセージ・提案は、逆に読まれます。

どういうことですか?3つのインジケーターの動作テストが必要だと書いてありましたね。ターミナルをリロードしてからChartNavigateを使うというトピックなので、このようなテストが行われました。

ターミナルを再起動する前に、チャートのプロパティを 変更するのでは?

ターミナル起動時にChartNavigateが常に動作しないことが問題であるとすれば、なぜでしょうか。まさにその通りです。

 
Ihor Herasko:

問題は、ChartNavigateがターミナル起動時に 常にトリガーされないことでしょうか?ここがポイントです。

あと、プロフィールを変更したときにも。また、ChartNavigate( chart_id, CHART_BEGIN, shift ) で、例えばCHART_FIRST_VISIBLE_BAR を取得すると、あたかも ChartNavigate が動作したかのような結果が得られます。Expert Advisor を削除した場合、次に Expert Advisor を起動したとき(同一または異なる)、このチャートの CHART_FIRST_VISIBLE_BAR の取得結果は、CHARTNavigate に失敗したように表示されることになります。

結果:CHART_FIRST_VISIBLE_BARとの 組み合わせで、ChartNavigateの動作が非常に不安定になる。