初期化中のChartNavigate - ページ 2

 
Ihor Herasko:

ダニがいなかったら、週末はどうする?そうすると、タイマーを接続する必要があります。

そして、解決すべき問題はただ一つ、ChartNavigateが正常に実行されたかどうかを判断する方法です。trueを返すということは、あくまで「ティック用」であって、実作業では何の役にも立たない。

上に載せたコードをExpert Advisorで確認したいのですが・・・。

 
Vladimir Karputov:

上に載せたコードをEAで確認したいのですが・・・。

EAと何か関係があるのでしょうか?

 
Ihor Herasko:

参議院議員に何の関係があるんだ?

調べないと...

//+------------------------------------------------------------------+
//|                                                  Test EA.mq5.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"
//--- input parameters
input bool redraw=true;
input ENUM_CHART_POSITION position=CHART_BEGIN;
//---
long count=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   count=0;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   count++;
//Comment(count);
   if(count==9 || count==19)
     {
      ResetLastError();
      if(position==CHART_BEGIN)
        {
         if(ChartNavigate(ChartID(),CHART_BEGIN,100))
            Print("Успешно. redraw ",redraw,". position ",EnumToString(position));
         else
            Print("Ошибка №",GetLastError(),". redraw ",redraw,". position ",EnumToString(position));
        }
      if(position==CHART_END)
        {
         if(ChartNavigate(ChartID(),CHART_END,-100))
            Print("Успешно. redraw ",redraw,". position ",EnumToString(position));
         else
            Print("Ошибка №",GetLastError(),". redraw ",redraw,". position ",EnumToString(position));
        }
      if(redraw)
         ChartRedraw();
     }
//--- получим номер самого первого видимого на графике бара (нумерация как в таймсерии) 
   long first_bar=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0);
//--- добавим символ переноса строки 
   string comm="\r\n";
//--- дополним коментарий 
   comm=comm+"Первый бар на графике имеет номер "+IntegerToString(first_bar)+"\r\n";
//--- выведем комментарий 
   Comment(comm);
  }
//+------------------------------------------------------------------+
ファイル:
Test_EA.mq5  6 kb
 

Vladimir Karputov:

このインジケータは、特に9ティックの遅延、2種類のチャートの動き、強制再描画フラグ(オン/オフ)を入れて います。

あなたはビギナーではありません。なぜ誤解を招くようなことをするのですか?なぜ、レナト・ファトフリンの発言を無視するのですか?

あなたのコードでは、ここでも そうですが)ティックごとにコメントを作成することで、ティックごとにチャートを再描画することを強制しています。


すなわち、入力パラメーターのフラグが有効か無効かにかかわらず。


また、入力パラメータにフラグを含めると、この場合、ChartRedraw() による追加再描画が発生するだけです。

すなわち、有用である代わりに、コメントを作成することによって、すでに存在するものにさらなる負荷を与えることになる

P./S:

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

エラー、バグ、質問

レナート・ファットフーリン さん 2017.12.05 02:51

...

MT5では、コメント機能で明示的にチャートが再描画されるのですが...。

その差は、ただそれだけです。


MT4でCommentを呼び出した後、強制的にChartRedraw()をかけると、やはりMT5と同じ動作にはならない。Metatrader 4のChartRedraw()はコメント値を無視し、最後のフレームからチャートを更新するかどうかを自ら決定します。もちろん、チャートデータの無効化を引き起こすような毎秒数百の相場がない場合、ChartRedrawは「なぜ変化のないチャートを描くのか」と判断し、フレームの描画をスキップするのだそうです。

Metatrader 5も同様のシステムですが、無条件レンダリングが優先されるケースが多くなっています。

端末はグラフィカルなアプリケーションであり、1秒間に数百フレームを提供し、パフォーマンスのために無駄のない表示モードで動作させることができます。


それゆえ、ベンチマークを実行する際には、追加の結論が必要となります。

  • ChartRedrawの呼び出しを実際のチャート描画とみなすべきではない。

  • なぜチャートが再描画されるのか」「端末がチャートの再描画を決定するほど、私は市場の内部画像を無効にしているのか」を常に知り、証明しなければならないのです。

  • ベンチマーク中にMT5で複数の結論を出すのではなく、常にレンダリングにどのような影響を与えるかを考えるべき

  • MT5では、チャート上のオブジェクトを変更するシステムがより正しくなっており、読み取り/書き込みコマンドの結果を明確に理解することが必要である。
    読み書きのコマンドを混在させず、一括読み込みと一括書き込みを別々に行うことを推奨します。

  • ベンチマークではグラフの再描画が頻繁に行われるため、グラフィックスカードへの依存度が高くなります。
    ノートパソコンとデスクトップパソコンでテストをした場合、グラフィックカードの速度が3〜5倍遅いだけで、結果が何倍も違ってくることがあるのです。

このような間違いは、誰にでもあることです。


 

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

初期化中のChartNavigate

ウラジミール・カルプトフ さん 2018.06.25 18:52

確認しないと...

...
void OnTick()
  {
//---
   count++;
//Comment(count);
   if(count==9 || count==19)
     {
      ResetLastError();
      if(position==CHART_BEGIN)
        {
         if(ChartNavigate(ChartID(),CHART_BEGIN,100))
            Print("Успешно. redraw ",redraw,". position ",EnumToString(position));
         else
            Print("Ошибка №",GetLastError(),". redraw ",redraw,". position ",EnumToString(position));
        }
      if(position==CHART_END)
        {
         if(ChartNavigate(ChartID(),CHART_END,-100))
            Print("Успешно. redraw ",redraw,". position ",EnumToString(position));
         else
            Print("Ошибка №",GetLastError(),". redraw ",redraw,". position ",EnumToString(position));
        }
      if(redraw)
         ChartRedraw();
     }
//--- получим номер самого первого видимого на графике бара (нумерация как в таймсерии) 
   long first_bar=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0);
//--- добавим символ переноса строки 
   string comm="\r\n";
//--- дополним коментарий 
   comm=comm+"Первый бар на графике имеет номер "+IntegerToString(first_bar)+"\r\n";
//--- выведем комментарий 
   Comment(comm);
  }
//+------------------------------------------------------------------+

追伸: 2つ目のコードに加えて、同じコメントでテキスト入力と公開を更新する前に、データが変更されていないかどうかチェックしてください。そうでない場合は、テキストの更新と公開を延期するのがよいでしょう。

つまり、この場合は、グラフの最初のバーの数字が変わったかどうかということです

 
Vladimir Karputov:

確認しないと...。

うーん。それがどういうことなのか、よくわからないんですけどね。よし、それならインストールしました。CHART_BEGIN モードとCHART_ENDモードで確認しました。 広告の通り動作しています。再起動後、OKです。

それとも、ChartNavigateの後にチャートの最初のバーの番号を確認し、それが正しいものでなければ、もう一度ChartNavigateを実行するという、松葉づえを使う必要があるところまで来ているのでしょうか?

そう、出口はもちろん、私も考えました。しかし、このような端末のフィッシュを常に覚えているのは面倒なことです。やはり、バグである可能性は十分にありますね。

 
Dina Paches:

追伸: 2つ目のコードに加えて、テキストエントリーを更新し、同じコメントで公開する前に、データが変更されていないかどうか確認してください。そうでない場合は、テキストの更新と公開を延期するのがよいでしょう。

すなわち、この場合、チャートの最初のバーの番号が変わったかどうかである

もちろん情報はありがたいのですが、ここでは性能の話はしていないんです。今回議論している問題は少し違う次元の問題で、問題が顕在化したかどうかを確認するためのテストコードです ))

 
Ihor Herasko:

もちろん、情報提供には感謝しますが、ここでは性能の話をしているわけではありません。今回議論している問題は少し違う次元の問題で、問題が現れるかどうかを確認するためのテストコードに過ぎません ))

どういたしまして。しかし、あなたが引用したものは追記であり、私の 他の投稿も 参照してください。

P./S.:切り捨てないでくださいよ。私は、その内容を知っているので、このようなコードを実行することはありません。私の機器は政府発行のものではありません

 
Ihor Herasko:

うーん。それがどういうことなのか、よくわからないんですけどね。よし、それならインストールした。CHART_BEGIN モードとCHART_ENDモードで確認しました。 すべて広告の通りに動作しています。再起動後、OKです。

それとも、ChartNavigateの後にチャートの最初のバーの番号を確認し、それが正しいものでなければ、もう一度ChartNavigateを実行するという、松葉づえを使う必要があるところまで来ているのでしょうか?

そう、出口はもちろん、私も考えました。しかし、このような端末のフィッシュを常に覚えているのは面倒なことです。やはり、バグである可能性は十分にありますね。

以前は作業用ナビがあったんですけどね。今はわざと確認するようになりました。


追記:Commentを気にしないように :)

 
Vladimir Karputov:

以前は私のナビが活躍していました。今はわざと確認するようになりました。


追記:コメント無視 :)

なぜ?無意味なことを書いた/報告した?