初級から中級まで:インジケーター(IV)
はじめに
前回の「初級から中級まで:インジケーター(III)」では、コンパイラディレクティブを使って、あらゆるタイプのインジケーターをシンプルかつ実践的に作成する方法について解説しました。しかし、この方法は常に使えるわけではなく、常に使うべきでもありません。この手法は「静的実装」と呼ばれます。なぜなら、インジケーターの種類が定義されると、その後ユーザーが描画の種類を変更することはできない(と言うよりは、許可されない)からです。
しかし、インジケーターの種類はこれまで紹介してきたものよりもはるかに多く存在します。確かに、幅広い活動においては、これまでの実装方法で十分な場合も多いです。しかし、取引や市場分析の状況によっては、多少異なる種類のインジケーターが必要になる場合があります。
この記事では、いくつかの異なるインジケーターを作成する方法を学びます。これらのインジケーターは、他のトレーダーとのコミュニケーションや、特定の価格変動の自動分析に非常に役立ちます。
では、非常にシンプルで、かつ私個人としても非常に面白いと思うものから始めましょう。この非常に簡単で理解しやすいコンセプトを使うことで、他にも多くのインジケーターを作成することができます。
はらみ足インジケーター
「はらみ足」と呼ばれるものを利用するインジケーター(と言うよりは、取引手法)があります。はらみ足(インサイドバー)とは、文字通り、直前のバーやローソク足の内部に位置するバーやローソク足を指します。ただし、トレーダーや銘柄によっては、必ずしも直前のバーでなくても、別のバーの内部に位置するバーで、価格の動きがそのバーを突破していなければはらみ足と見なすことがあります。多少距離が離れていてもです。しかし、この後者の見方は、多くのトレーダーによって受け入れられている原則ではありません。
いずれにせよ、この取引パターンは実際に存在し、状況によっては非常に有効であることが知られています。しかし、チャートを常に分析して「今見ているバーがはらみ足かどうか」を判断することは、控えめに言っても、多くの人、特に初心者にとってはかなり難しい作業です。そのため、チャートを監視し、チャートが表示されている間に、そのようなパターンが存在するかどうかを示すインジケーターを利用することができます。
重要なポイント:はらみ足は必ずしも十字線ではありません。
「なるほど、でもなぜこのインジケーターの作り方を紹介するのですか?」その理由は非常にシンプルです。多くの初心者トレーダーは、ローソク足やバーに色のパターンを追加するためのインジケーターを作ろうとします。しかし、このような初心者プログラマは、最終的にインジケーターの宣言方法に悩み、作業を諦めてしまうことが多いのです。ローソク足に色パターンを付けること自体は決して難しい作業ではありません。問題は別のところにあります。インジケーターそのものを作成すること自体は、比較的簡単です。
しかし、前回の記事で紹介した他のインジケーターと同様に、バッファの宣言時には注意が必要です。すでにローソク足に色パターンを作ろうとしたことがある方ならよくご存知だと思いますが、初心者にとってはかなり難しい作業になり得ます。そのため、順序を間違えたり、バッファインデックスを間違った順番で入力すると、MetaTrader 5では、チャート上に思った通りの表示がされないことがあります。これはMetaTrader 5やプログラマの責任ではありません。実装内容によっては、ある人にとってはエラーであり、別の人にとってはまさに必要な動作になる場合もあります。
そこで、はらみ足インジケーターを作成する前に、インジケーター自体の宣言から始めます。通常、すべては以下のコードのように、さまざまな方法で宣言することが可能です。
01. //+------------------------------------------------------------------+ 02. #property copyright "Daniel Jose" 03. //+------------------------------------------------------------------+ 04. #property indicator_type1 DRAW_COLOR_CANDLES 05. #property indicator_color1 clrRed, clrRoyalBlue, clrGreen 06. //+----------------+ 07. #property indicator_buffers 5 08. #property indicator_plots 1 09. //+----------------+ 10. double gl_Buff_High[], 11. gl_Buff_Open[], 12. gl_Buff_Close[], 13. gl_Buff_Low[], 14. gl_Buff_Color[]; 15. //+------------------------------------------------------------------+ 16. int OnInit() 17. { 18. SetIndexBuffer(0, gl_Buff_High, INDICATOR_DATA); 19. SetIndexBuffer(1, gl_Buff_Open, INDICATOR_DATA); 20. SetIndexBuffer(2, gl_Buff_Close, INDICATOR_DATA); 21. SetIndexBuffer(3, gl_Buff_Low, INDICATOR_DATA); 22. SetIndexBuffer(4, gl_Buff_Color, INDICATOR_COLOR_INDEX); 23. 24. return INIT_SUCCEEDED; 25. }; 26. //+------------------------------------------------------------------+ 27. 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 &TickVolume[], const long &Volume[], const int &Spread[]) 28. { 29. for (int c = (prev_calculated > 0 ? prev_calculated - 1 : 0); c < rates_total; c++) 30. { 31. gl_Buff_High[c] = High[c]; 32. gl_Buff_Open[c] = Open[c]; 33. gl_Buff_Close[c] = Close[c]; 34. gl_Buff_Low[c] = Low[c]; 35. 36. gl_Buff_Color[c] = (Open[c] > Close[c] ? 0 : 2); 37. } 38. 39. return rates_total; 40. }; 41. //+------------------------------------------------------------------+
コード01
さて、ここで読者の皆さんにお尋ねします。コード01で示されている内容は正しいのでしょうか、それとも正しくないのでしょうか。この質問に対する正しい答えは、それは追求している目的次第だというものです。いずれにせよ、コード01の実装は完全に間違っているわけではありません。コードはコンパイルされ、役立つ場合もあります。しかし、意図した目的によっては、このコードは正しくない可能性があります。したがって、どのチャートでこのコードを使用すると何が起こるのかに注意する必要があります。これは、以下のアニメーションで確認できます。

アニメーション01
言い換えれば、結果は完全に期待通りではありませんでした。なぜでしょうか。「理解できません。コード自体は正しいように見えます。バッファ宣言時にミスはしていません。しかし結果は期待通りではありませんでした。バーの色だけでなくフォーマットまで変わってしまいました。何が間違っているのか分かりません。望んだ結果を得るために、何か特別な操作が必要なのでしょうか。」この場合、答えは「はい」です。
コードはバーの色は期待通りに変更されているため、正しいと言えます。しかし、フォーマットの変更に関しては同じことは言えません。目的が「色を変更しつつバーのフォーマットも同時に変更する」ことであれば問題ありません。しかし、今回の目的はそれではありません。原因はまさに、バッファの宣言順序が正しくなかったことにあります。MetaTrader 5はバッファを特定の順序で使用するため、順序が間違っているとバーのフォーマットまで意図せず変更されてしまいます。このことが分かれば、やるべきことはシンプルです。バッファの順序を適切なものに変更するだけです。この簡単な変更は、以下のコードで確認できます。
. . . 18. SetIndexBuffer(1, gl_Buff_High, INDICATOR_DATA); 19. SetIndexBuffer(0, gl_Buff_Open, INDICATOR_DATA); 20. SetIndexBuffer(3, gl_Buff_Close, INDICATOR_DATA); 21. SetIndexBuffer(2, gl_Buff_Low, INDICATOR_DATA); . . .
コード02
なお、コードスニペット02では、変更されたのは各バッファのインデックス値のみです。このバッファの順序(Open、High、Low、Close)を使用することで、コード01で生成された結果は以下の通り確認できます。

アニメーション02
MetaTrader 5が、各バーやローソク足をどのように描画すべきかを理解していることに気づきましたか。これは、解決方法を知っている人にとっては非常に簡単な作業です。しかし、理解していない人にとっては、極めて難しく感じるかもしれません。いずれにせよ、これでやり方が分かり、インジケーター作成や希望する取引システムのモデリングのための色分けパターンの構築に進むことができます。この方法を示すために、次はチャート上で直接はらみ足を示す問題を解決することを考えます。
この問題を解決するために、まず36行目を見てください。ここでは、色のインデックスをどのように計算するかが記述されています。これは、売りバーの場合はインデックス0、買いバーの場合はインデックス2になります。では、このインデックスは私たちにとって何の役に立つのでしょうか。このインデックスは、後で「はらみ足」となるバーのために残しておきます。
ここで重要なポイントです。29行目から始まるループは、チャート上の古いポイント(場合によっては最初のバーかもしれません)から開始し、チャート上に存在する最後のバーまで順番に探索します。これを理解することは非常に重要です。なぜなら、はらみ足としてマークできるのは、特定の条件を満たす前のバーが存在する場合に限られるためです。条件を満たす前のバーがない場合、現在のバーははらみ足としてチャートに表示することはできません。
ここまでで全体像は明確です。あとは、検証条件を実装するだけです。そのために、上記のコードを修正して、バーやローソク足に色を割り当てると同時に、はらみ足の有無をチェックできるようにします。この強化版は、コードスニペット03で示されています。
. . . 36. gl_Buff_Color[c] = (Open[c] > Close[c] ? 0 : 2); 37. if ((c - 1) > 0) 38. gl_Buff_Color[c] = ((High[c - 1] > High[c]) && (Low[c - 1] < Low[c]) ? 1 : gl_Buff_Color[c]); 39. } 40. 41. return rates_total; 42. }; 43. //+------------------------------------------------------------------+
コード03
さて、私たちのインジケーターが受け取る各OnCalculateイベントにおいて、チャート上にはらみ足が存在するかどうかをチェックすることになります。しかし、待ってください。なぜステップごとにこれをおこなう必要があるのでしょうか。理由はシンプルです。取引の過程で、チャート上に新たなはらみ足が出現する可能性があるからです。しかし、正しく構成されない場合も珍しくありません。これは、バーやローソク足がクローズするまで、はらみ足の有無を判断できないためです。その時点まで、チャート上にはらみ足があると断言することは時期尚早だからです。
とはいえ、38行目で定期的に「はらみ足条件が適用できるかどうか」をチェックしているため、最終的には、はらみ足が正しくなくなった場合、そのテストは失敗します。したがって、36行目で既に色を更新している場合、前述の表示はチャート上に表示されなくなります。
この動作は既知の通りですが、実際にどのように起こるかを確認することで、なぜこのように実装したのかを理解するのが理想的です。以下のアニメーションでは、初期のプロセスを観察できます。ただし、2ステップ目、つまり本来はらみ足となるバーが条件を満たさなくなる場面を示すのは簡単ではありません。非常に特定の瞬間が必要で、その正確なポイントを捉えるには多くの時間がかかるからです。

アニメーション03
素晴らしいですね。ここで、はらみ足がどのように見えるべきかを確認できます。しかし、前述の通り、複数のバーを考慮し、新しいバーが前のバーの内部に収まっている限り、すべてをはらみ足として扱うトレーダーもいます。ここで疑問が生じます。前のインジケーターを少し変更するだけで、同じ種類のインジケーターをどのように実装できるでしょうか。
この質問に対する答えは複数あります。正確には、関連するメカニズムの実装方法にはいくつかのアプローチがあります。実際の問題は、コードの精密な実装ではなく、ある値を長期間保持する方法を考えることです。可能なアプローチの一例を以下に示します。もちろん、ケースによっては、より興味深い、あるいは適した方法を採用することも可能です。
プロセスをできるだけ簡単にしたいので、今回はOnCalculateイベントハンドラの実装に1つだけ変更を加えます。これにより、アニメーション03を生成したソースコードは、以下のように修正されます。
. . . 26. //+------------------------------------------------------------------+ 27. 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 &TickVolume[], const long &Volume[], const int &Spread[]) 28. { 29. static double high = DBL_MIN, 30. low = DBL_MAX; 31. 32. for (int c = (prev_calculated > 0 ? prev_calculated - 1 : 0); c < rates_total; c++) 33. { 34. gl_Buff_High[c] = High[c]; 35. gl_Buff_Open[c] = Open[c]; 36. gl_Buff_Close[c] = Close[c]; 37. gl_Buff_Low[c] = Low[c]; 38. 39. gl_Buff_Color[c] = (Open[c] > Close[c] ? 0 : 2); 40. if ((c - 1) > 0) 41. { 42. high = (High[c - 1] > high ? High[c - 1] : high); 43. low = (Low[c - 1] < low ? Low[c - 1] : low); 44. gl_Buff_Color[c] = ((high > High[c]) && (low < Low[c]) ? 1 : gl_Buff_Color[c]); 45. if (gl_Buff_Color[c] != 1) 46. { 47. high = DBL_MIN; 48. low = DBL_MAX; 49. } 50. } 51. } 52. 53. return rates_total; 54. }; 55. //+------------------------------------------------------------------+
コード04
さて、注目してください。コード04に示されたフラグメントを、アニメーション03を生成したコードに組み込むと、結果は前回のアニメーションとは異なります。これを確認するために、下のアニメーションと上のアニメーションを注意深く比較してみましょう。

アニメーション04
アニメーション04では、まさに多くのトレーダーが「はらみ足」と考える動作を行っています。つまり、前のバーやローソク足の高値または安値が突破されない限り、分析対象のバーをはらみ足と見なすわけです。取引やはらみ足の観察に慣れていない方には、少々混乱するかもしれません。しかし、コードスニペット04は、複数のバーが出現し、それらすべてがより古いバーの内部にあったとしても、パターンを認識することができます。
では、このコードスニペットはどのように動作し、アニメーション04のようにはらみ足を検出できるのでしょうか。理解するためには、まず以前の、より単純なインジケーターの動作を把握する必要があります。その上で、今回の処理を理解できます。また、静的変数の仕組みも理解しておく必要があります。このトピックは別の記事ですでに解説済みなので、読者の皆さんは静的変数に慣れていることを前提とします。
まだその記事を読んでいない方は、「初級から中級まで:変数(II)」をご覧ください。コード04を見ると、必要な変更はまさにはらみ足テスト部分におこなわれたことが分かります。テスト自体は依然として実施されています。しかし、テストの位置が変更されました。その理由は、その前に2つの追加テストをおこなうようになったことです。最初は42行目で、高値が突破されていないかをチェックします。43行目では、同様に安値の突破をチェックします。これにより、はらみ足が存在できる範囲を、直前のバーだけでなく、複数のバーに渡って考慮できるようになりました。この境界を理解して初めて、分析対象のバーが内包されたバーかどうかを確認できます。この判定は44行目でおこなわれています。
もう1つ重要なポイントは45行目です。ここでは、44行目のテストがはらみ足の存在を示しているかを確認しています。はらみ足が存在しない場合は、設定していた境界をリセットし、新しいはらみ足形成を検索する必要があります。45行目のチェックをおこなわなければ、誤った判定が常に生成されることになります。
ここで、今回示したはらみ足インジケーターがどのように機能するかを理解するために、以下のアニメーションを見てみましょう。

アニメーション05
アニメーション05では非常に興味深い現象を確認できます。特定の瞬間に、はらみ足が存在していることがわかります。しかし、突破が発生した場合(今回の例では安値を割った場合)、元のはらみ足は消え、通常のバーと同じ扱いになります。さらに、価格が再び元の位置に戻ったとしても、インジケーターははらみ足を再表示しません。以下の図でも確認できます。

図01
この例では、価格が、直前の3本のはらみ足を形成したバー(ローソク足)の範囲内に再び戻っています。しかし、インジケーターで実装された基準によれば、最後のバーはもはやはらみ足として認識されません。まとめると、インジケーター自体は正しく動作しています。しかし、適切で望ましい情報を提供するためには、受け入れる基準を明確に定義する必要があるということです。
さて、これまでローソク足への色付けインジケーターの適用方法を詳細に解説してきました。次は、インジケーターに直接関係する場合もあれば、そうでない場合もある他の問題について考えていきます。ただし、インジケーターというコンセプト自体の性質上、同じタイプのシナリオ内で他の要素も示すことは適切だと考えます。
何を表示し、何を表示しないか
同じ取引手法に対して、異なるプロファイルを市場で使い分けることは珍しくありません。多くのトレーダーは、チャート上にさまざまな情報を常に表示したいと考えます。一方で、最小限の情報だけを表示したいトレーダーもいます。どの情報を表示するかは、トレーダーや作業プロファイルごとの判断に依存します。しかし、私たちプログラマにとっては、この点は本質的な問題ではありません。自分自身がチャートをどのように設定したいかは問題ではありません。私たちが関心を持つのは、誰もが自由にチャートをカスタマイズできる、シンプルで便利なツールを提供することだけです。
MetaTrader 5では、外部アプリケーションを使わなくても、多くのチャート要素を設定できます。しかし、MetaTrader 5のオプションだけでは削除や変更ができない要素も存在します。こうした場合にこそ、プログラミングの出番です。プログラマとして理解しておくべきことは、私たちができることやできないことには、実質的な制限はないということです。実際に存在するのは、プログラマごとの技術力の差だけです。簡単な方法で対応できる人もいれば、より高度なツールを必要とする人もいます。
いずれにせよ目標は、チャートを自分のニーズに応じてカスタマイズできるアプリケーションを開発することです。たとえ他のトレーダーから見れば完全に混乱しているように見えても、自分が作成したものを理解し、取引で利益を上げられるなら、それが最も重要です。
そこで、MQL5を使用することで、チャート上のさまざまな要素を定義して制御できます。まずは、特定のタイミングで興味深いかもしれない、いくつかの簡単な変更をおこなってみましょう。これは、MQL5を使うことで、チャート上のどんな要素に対しても完全な自由と制御が可能であることを示すためです。たとえば、クォートやタイムゾーンが表示されるエリアをチャートから削除できることをご存知でしょうか。MetaTrader 5の設定だけではこれを直接変更することはできません。しかし、コードを使えば可能です。ちなみに、この操作に必要なコードは非常に簡単です。それでは、ここから始めましょう。初期コードは以下のとおりです。
01. //+------------------------------------------------------------------+ 02. #property copyright "Daniel Jose" 03. //+------------------------------------------------------------------+ 04. int OnInit() 05. { 06. ChartSetInteger(0, CHART_SHOW_DATE_SCALE, false); 07. ChartSetInteger(0, CHART_SHOW_PRICE_SCALE, false); 08. 09. return INIT_SUCCEEDED; 10. }; 11. //+------------------------------------------------------------------+ 12. int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) 13. { 14. return rates_total; 15. }; 16. //+------------------------------------------------------------------+
コード05
コード05がいかにシンプルであるかに注目してください。説明はほとんど不要で、何をしているのか一目で理解できます。実際にこのコードをチャート上で実行すると、次のような結果が得られます。

アニメーション06
確かに、この方法はかなり乱暴です。ユーザーの許可なく価格軸や時間軸を削除しているため、インジケーターを削除しても、チャート上に元の状態は戻りません。多くの人はこれを適切と考えるかもしれませんが、別の人はアプリケーションに対する配慮に欠ける行為と見なします。なぜなら、時間軸や価格軸を復元するにはチャートを閉じて再度開く必要があり、多くのユーザーはそれを望まないからです。
そして、疑問が生じます。チャートを元の状態に戻すにはどうすればよいのか?そして、可能であれば、その最適なタイミングはいつなのか?実は、Deinitイベントを利用することでこれを実現する方法があります。ただし、次の点を理解しておく必要があります。「最適なタイミング」というものはなく、「適切なタイミング」があるだけです。理由は、アプリケーションが何らかの理由でMetaTrader 5に強制的にチャートから削除されることがあるためです。この場合、Deinitイベントはトリガーされません。強制的に削除されると、アプリケーションによる変更はすべてチャート上に残り、元の状態に戻すにはチャートを閉じて再度開く必要があります。
したがって、こうした変更は常に慎重に行う必要があります。可能な限り、チャートから何を削除するかをユーザーに選択させるオプションを提供することが望ましいです。特に、アプリケーションがユーザーの作業を支援することを目的としている場合は重要です。
では、アニメーション06で示した操作を、より丁寧に実装する方法を考えましょう。そのために、コード05を次のように修正します。
01. //+------------------------------------------------------------------+ 02. #property copyright "Daniel Jose" 03. //+------------------------------------------------------------------+ 04. input bool user01 = true; //Show time scale 05. input bool user02 = true; //Show price scale 06. //+----------------+ 07. struct st_Mem 08. { 09. long View_DateScale, 10. View_PriceScale; 11. }gl_StyleGraphic; 12. //+------------------------------------------------------------------+ 13. int OnInit() 14. { 15. gl_StyleGraphic.View_DateScale = ChartGetInteger(0, CHART_SHOW_DATE_SCALE); 16. gl_StyleGraphic.View_PriceScale = ChartGetInteger(0, CHART_SHOW_PRICE_SCALE); 17. 18. ChartSetInteger(0, CHART_SHOW_DATE_SCALE, user01); 19. ChartSetInteger(0, CHART_SHOW_PRICE_SCALE, user02); 20. 21. return INIT_SUCCEEDED; 22. }; 23. //+------------------------------------------------------------------+ 24. int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) 25. { 26. return rates_total; 27. }; 28. //+------------------------------------------------------------------+ 29. void OnDeinit(const int reason) 30. { 31. ChartSetInteger(0, CHART_SHOW_DATE_SCALE, gl_StyleGraphic.View_DateScale); 32. ChartSetInteger(0, CHART_SHOW_PRICE_SCALE, gl_StyleGraphic.View_PriceScale); 33. }; 34. //+------------------------------------------------------------------+
コード06
さて、注目してください。今回の修正版では、以前よりもずっと丁寧になったことがわかります。これは、04行目と05行目で、価格軸と時間軸の削除についてユーザーに許可を求めているためです。また、07行目では、元の値を保持する構造体を用意しています。これにより、ユーザーが加えた変更に関わらず、インジケーター適用前の状態にチャートを復元できるようになっています。
ここでの動作は、シンプルで明快だったコード05と似ています。しかし、もうひとつ注意してほしい点があります。Deinitイベントハンドラです。これは29行目にあります。問題は、インジケーターをチャートから削除した後でも、MetaTrader 5が該当チャートを更新するまでに少し時間がかかることです。場合によっては数秒、場合によってはそれ以上かかることもあります。この短い間、一部の情報が一時的に表示されなかったり、削除されるべき情報がまだ残っていたりすることがあります。これによって、プラットフォームの動作が遅い、あるいはユーザーのハードウェアが古いと感じられることがあります。しかし、実際の原因は、MetaTrader 5が別のタスクで処理中であることにあります。
このプロセスをスムーズにするためには、MQL5標準ライブラリの呼び出しを適切なタイミングでおこない、MetaTrader 5にチャートをできるだけ早く更新させる方法があります。状況によっては、これを行う必要がまったくない場合もあります。しかし、イベント間に遅延を感じた場合、この呼び出しを使うことで、MetaTrader 5が現在処理中のイベントキューをスキップすることができます。
必要な変更は、以下のコードスニペットに示されています。
. . . 28. //+------------------------------------------------------------------+ 29. void OnDeinit(const int reason) 30. { 31. ChartSetInteger(0, CHART_SHOW_DATE_SCALE, gl_StyleGraphic.View_DateScale); 32. ChartSetInteger(0, CHART_SHOW_PRICE_SCALE, gl_StyleGraphic.View_PriceScale); 33. ChartRedraw(); 34. }; 35. //+------------------------------------------------------------------+
コード07
33行目を追加するだけで(コード07に示されています)、ユーザーはもちろん、プログラマー自身も、MetaTrader 5の動作が明らかに改善されたと感じるでしょう。ただし、ここで注意すべきは、この改善はあくまで見かけ上のものであるという点です。実際の性能向上があるわけではありません。33行目の呼び出しは、MetaTrader 5に「イベントキューをスキップして、できるだけ早くチャートを更新したい」と伝えるものです。しかし、ここで覚えておくべきことがあります。キューをスキップすると、本来処理されるべき重要なイベントが後回しになる可能性があります。したがって、実行順序を変更する際は慎重におこなう必要があります。
まとめ
本記事では、ローソク足の色付けを簡単に作成して実装する方法を紹介しました。この手法は、多くのトレーダーにとって非常に価値のあるコンセプトです。実装する際には、バーやローソク足が元の見た目を保持し、ローソク足ごとの視認性を妨げないよう注意する必要があります。
さらに、チャート上のさまざまな要素を変更する方法も示しました。記事では、時間軸と価格軸という2つのプロパティのみを扱いましたが、これらの軸は、通常のユーザーが直接操作して削除することはできません。しかし、コードを使えば完全に操作可能です。可能な場合は、チャートを元の状態に戻すことを常に意識しましょう。これにより、ユーザー体験が向上し、アプリケーションが丁寧に設計されていることを示すことができます。
変更可能な属性やプロパティは多数存在し、一つひとつ説明するのは大変です。そのため、MQL5コードを通じてプロパティを使ったり変更したりすることを、実際に練習して実験することを強くおすすめします。これを簡単にするために、チャートプロパティの一覧を参照すると便利です。表示される多くの要素や値は、MQL5コードを通じてのみアクセス可能だからです。また、アプリケーションには、記事で示した学習や練習に本当に必要なコードだけを含めるようにしてください。
MetaQuotes Ltdによりポルトガル語から翻訳されました。
元の記事: https://www.mql5.com/pt/articles/15833
警告: これらの資料についてのすべての権利はMetaQuotes Ltd.が保有しています。これらの資料の全部または一部の複製や再プリントは禁じられています。
この記事はサイトのユーザーによって執筆されたものであり、著者の個人的な見解を反映しています。MetaQuotes Ltdは、提示された情報の正確性や、記載されているソリューション、戦略、または推奨事項の使用によって生じたいかなる結果についても責任を負いません。
深層強化学習を用いたIlanエキスパートアドバイザーの強化
カオス理論アプローチによる買われ過ぎと売られ過ぎのトレンド分析
三角波とのこぎり波:トレーダー向け分析ツール
市場シミュレーション(第14回):ソケット(VIII)
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索