エラー、バグ、質問 - ページ 2146 1...213921402141214221432144214521462147214821492150215121522153...3185 新しいコメント A100 2018.02.26 15:17 #21451 fxsaber: OnCalculate - このチャートでは実行されません。ハンドルネームを作ったからには、そこに住まわなければならない。これでダメなら......右のサブウィンドウで普通に描画(バッファ描画)されるのはなぜ? Slava 2018.02.26 15:32 #21452 A100:インジケーターに ::ChartWindowFind()が-1を返す(言い換えれば、機能しない)インジケータは初期化されるまで、動作するサブウィンドウの番号を知りません。初期化に成功した場合のみ、ウィンドウにアタッチされる つまり、インジケーターのOnInitでChartWindowFind()を呼んでも 意味がないのです A100 2018.02.26 15:46 #21453 Slava: つまり、インジケーターのOnInitでChartWindowFind()を呼んでも 意味がありません。インジケーターのOnInitでChartWindowFind() を呼び出す(同じ インジケーター) void OnStart() { string name = "Test_i"; int sub_window = 1; ChartIndicatorAdd( 0, sub_window, iCustom( NULL, PERIOD_CURRENT, name )); } 結果:1:true:0 2:1:0 すべてうまく検出されたので、インジケーターのOnInitの コードを思い出してみましょう。 void OnInit() { //... ResetLastError(); int sub_window = ChartWindowFind(); Print( "2:", sub_window, ":", GetLastError()); } fxsaber 2018.02.26 16:17 #21454 A100:そうでない場合 - 必要なサブウィンドウに正常に描画(バッファ描画)されるのはなぜですか?つまり、指標の計算と その描画部分は別物なんですね。ChartWindowFindは、インジケータの描画を担当する機構への参照です。つまり、インジケーターそのものでもないのです。 A100 2018.02.26 16:35 #21455 Slava:インジケータは初期化されるまでは、動作するサブウィンドウの番号を知らない。初期化に成功した場合のみ、ウィンドウにアタッチされます。OnInit後のChartWindowFind() の呼び出し(OnCalculateより)//Test.mq5//Скрипт void OnStart() { string name = "Test_i"; ObjectCreate( 0, name, OBJ_CHART, 0, 0, 0 ); long chart_id = ObjectGetInteger( 0, name, OBJPROP_CHART_ID ); int sub_window = 1; ChartIndicatorAdd( chart_id, sub_window, iCustom( NULL, PERIOD_CURRENT, name )); }//Test_i.mq5//Индикатор void OnInit() { Print( __FUNCTION__, ":end" ); } int OnCalculate( const int, const int, const int, const double& [] ) { Print( __FUNCTION__ ); ResetLastError(); int sub_window = ChartWindowFind(); Print( "3:", sub_window, ":", GetLastError()); return 0; }結果:OnInit。終了 OnCalculate 3:-1:4113 つまり、インジケータはすでに動作しているサブウィンドウの番号を知っているが、それを報告することはない fxsaber 2018.02.26 16:46 #21456 A100:言い換えれば、インジケータはすでに動作中のウィンドウの番号を知っているが、それを報告することはないChartID() を知っているか? A100 2018.02.26 16:48 #21457 fxsaber:ChartID()を知っているか? 必須ではありません -ChartWindowFind()関数、パラメータなし fxsaber 2018.02.26 16:50 #21458 A100: 必須ではありません -ChartWindowFind()関数、パラメータなしただ、ChartID()も知らないのは確かです(パラメータなし)。 A100 2018.02.26 17:19 #21459 fxsaber:ChartID()も知らない(パラメータがない)はず。これは明らかな欠陥であり、特に操作不能は以下の場合にのみ発生します。 ObjectCreate( 0, name, OBJ_CHART, 0, 0, 0 ); long chart_id = ObjectGetInteger( 0, name, OBJPROP_CHART_ID ); でないと long chart_id = ChartOpen( NULL, PERIOD_CURRENT );例えば、手動でチャートウィンドウを追加し、そこにインジケータを取り付けた場合、すべてOKです。 しかし、自動でやるとうまくいきません これは、アルゴトレーディングのコンセプトそのものに反するものです fxsaber 2018.02.26 18:21 #21460 A100:特に、以下の場合は操作できないので、これは目に余る欠点です。 でないと 例えば、手動でチャートウィンドウを追加し、そこにインジケータを取り付けた場合、すべてOKです。 しかし、自動でやるとうまくいきません これは、アルゴトレーディングのコンセプトそのものに反するものです指標のアーキテクチャが明確になってきたのは良いことだと思います。ドキュメントに情報が少ないのが不思議なくらいです。 インジケーターの計算部分と描画部分は別の存在である。ハンドルは計算部分です。計算する方は、描く方のことを何も知らないし、知らないはずです。 ハンドルを作成したが、1つではなく、2つのチャートに配置したと想像してください。明らかに、インジケータは1つですが、ChartIDとSubWindowが異なる2つのチャートに描画されています。ハンドル・インジケータは、このインジケータがどこに描かれているか、描かれているかどうかを全く知らないので、これを気にすることはありません。レンダリングを担当するのはインジケーターではありません。 手動でチャートに配置したり、テンプレートを使ってインジケータを配置すると、全く異なる動作が起こります。ハンドルは描画部分と一緒に作成されます。同じシンボルと期間を持つ別のチャートで、同じ入力パラメータを持つインジケータを手動で起動すると、描画部分で別のハンドルが作成されます。 MQLの場合はそうではありません。1つのインジケータを作成した後、別のインジケータを作成しても、再び何も作成されません。計算部分はそのままです。 MQLでインジケータを実行する場合、新しいチャートまたはOBJ_CHARTなどで、手で実行するのと同じように、LoadTemplateを実行するのが唯一の方法です。 1...213921402141214221432144214521462147214821492150215121522153...3185 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
OnCalculate - このチャートでは実行されません。ハンドルネームを作ったからには、そこに住まわなければならない。
これでダメなら......右のサブウィンドウで普通に描画(バッファ描画)されるのはなぜ?
インジケーターに
::ChartWindowFind()が-1を返す(言い換えれば、機能しない)
インジケータは初期化されるまで、動作するサブウィンドウの番号を知りません。初期化に成功した場合のみ、ウィンドウにアタッチされる
つまり、インジケーターのOnInitでChartWindowFind()を呼んでも 意味がないのです
つまり、インジケーターのOnInitでChartWindowFind()を呼んでも 意味がありません。
インジケーターのOnInitでChartWindowFind() を呼び出す(同じ インジケーター)
結果:1:true:0
2:1:0
すべてうまく検出されたので、インジケーターのOnInitの コードを思い出してみましょう。
そうでない場合 - 必要なサブウィンドウに正常に描画(バッファ描画)されるのはなぜですか?
つまり、指標の計算と その描画部分は別物なんですね。ChartWindowFindは、インジケータの描画を担当する機構への参照です。つまり、インジケーターそのものでもないのです。
インジケータは初期化されるまでは、動作するサブウィンドウの番号を知らない。初期化に成功した場合のみ、ウィンドウにアタッチされます。
OnInit後のChartWindowFind() の呼び出し(OnCalculateより)
結果:OnInit。終了
つまり、インジケータはすでに動作しているサブウィンドウの番号を知っているが、それを報告することはないOnCalculate
3:-1:4113
言い換えれば、インジケータはすでに動作中のウィンドウの番号を知っているが、それを報告することはない
ChartID() を知っているか?
ChartID()を知っているか?
必須ではありません -ChartWindowFind()関数、パラメータなし
ただ、ChartID()も知らないのは確かです(パラメータなし)。
ChartID()も知らない(パラメータがない)はず。
これは明らかな欠陥であり、特に操作不能は以下の場合にのみ発生します。
でないと
例えば、手動でチャートウィンドウを追加し、そこにインジケータを取り付けた場合、すべてOKです。
しかし、自動でやるとうまくいきません
これは、アルゴトレーディングのコンセプトそのものに反するものです
特に、以下の場合は操作できないので、これは目に余る欠点です。
でないと
例えば、手動でチャートウィンドウを追加し、そこにインジケータを取り付けた場合、すべてOKです。
しかし、自動でやるとうまくいきません
これは、アルゴトレーディングのコンセプトそのものに反するものです
指標のアーキテクチャが明確になってきたのは良いことだと思います。ドキュメントに情報が少ないのが不思議なくらいです。
インジケーターの計算部分と描画部分は別の存在である。ハンドルは計算部分です。計算する方は、描く方のことを何も知らないし、知らないはずです。
ハンドルを作成したが、1つではなく、2つのチャートに配置したと想像してください。明らかに、インジケータは1つですが、ChartIDとSubWindowが異なる2つのチャートに描画されています。ハンドル・インジケータは、このインジケータがどこに描かれているか、描かれているかどうかを全く知らないので、これを気にすることはありません。レンダリングを担当するのはインジケーターではありません。
手動でチャートに配置したり、テンプレートを使ってインジケータを配置すると、全く異なる動作が起こります。ハンドルは描画部分と一緒に作成されます。同じシンボルと期間を持つ別のチャートで、同じ入力パラメータを持つインジケータを手動で起動すると、描画部分で別のハンドルが作成されます。
MQLの場合はそうではありません。1つのインジケータを作成した後、別のインジケータを作成しても、再び何も作成されません。計算部分はそのままです。
MQLでインジケータを実行する場合、新しいチャートまたはOBJ_CHARTなどで、手で実行するのと同じように、LoadTemplateを実行するのが唯一の方法です。