
マウンテンチャートとアイスバーグチャート
はじめに
MetaTrader 5プラットフォームに新しいチャートタイプを追加するというアイデアはいかがでしょうか。このプラットフォームには他のプラットフォームにあるものがいくつかないという声もあります。しかし、実際のところ、MetaTrader 5は他の多くのプラットフォームではできないこと(少なくとも簡単にはできないこと)ができる、非常に実用的なプラットフォームです。
MetaTrader 5で最も多い不満は、チャートの種類がローソク足、バー、ラインと3つしかないことです。本当にそうでしょうか。それとも、そう思うのは、プラットフォームが実際にどう動くのか、MQL5言語がどのような可能性を提供してくれるのかを知らないからでしょうか。
多くの場合、最も文句を言う人は、最もプラットフォームを学んでいない人です。人は皆、すぐに使えるものが欲しいし、すぐに使えないと文句を言い始めます。
今回はあまり長くはなりませんが、この記事では、いつもと違うが便利なスタイルのチャートを作成する方法をご紹介します。これは特に、スイングトレード、ポジショントレード、さらにはポートフォリオトレードなど、特定のスタイルを用いて取引をおこなう場合に役に立ちます。
今日は、「マウンテン」または「アイスバーグ」チャートを見てみます。さらに、もう少し踏み込んで、MQL5との連携について学びます。この記事では、効率的なポジション追跡のための非常に興味深いチャートを開発します。このチャートを使えば、取引が利益を生んでいるかどうかを常に確認する必要がなくなります。チャートを見るだけで、あるポジションで利益が出ているのか、損失が出ているのかを判断することができるのです。
マウンテンチャートは線形表現スタイルと非常によく似ていますが、いくつかの違いがあります。ラインチャート(図01)では、価格が上昇しているか下降しているかという単純な表示だけがあり、それ以上のことはわかりません。マウンテンチャートは、より多くの機能を提供します。図02はマウンテンチャートです。
図01:典型的なラインチャート
図02:典型的なマウンテンチャート
図02に示すチャートは、「マウンテン」チャートの最も一般的なタイプです。いくつかのバリエーションがあり、異なる名称を持つこともあります。基本的なバリエーションの1つを図03に示します。
図03:買いポジションのアイスバーグチャート
図03は、非常に見やすいチャートタイプです。この特定のケースでは、図03に示すチャートは買いポジションのものですが、売りポジションでも同じことが言えます。そのようなチャートを下の図04に示します。
図04:売りポジションのアイスバーグチャート
アイスバーグチャートを見れば、ポジションが儲かっているのか負けているのかがすぐにわかります。チャートは、取引状態(利益/損失)を色分けして表示します。このように、マウンテンのマップに色をつけるだけで、これから市場を勉強しようとする人にとって、より見やすいスタイルを実現することができるのです。特に、長期のポジションを出す必要がある場合に有効です。
面白いのは、このシステムが非常にシンプルであると同時に適応性が高いため、マウンテンチャートやアイスバーグチャートだけでなく、図05に示すようなもっと複雑なラインチャートも作成できることです。
図05:位置解析のためのラインチャート
ラインのスタイルは変更可能で、必ずしも実線である必要はありません。例えば、次のようなチャートを作成することができます。
図06:買いポジションを分析するためのラインチャート
実行や理解が極めて困難な、非常に複雑なコードを作成する必要があると思われるかもしれません。しかし、これから作成するコードは非常にシンプルなため、MQL5言語が初めての方でも理解しやすいと思います。そのため、より難しいものを作る前に、プラットフォームの仕組みについて知りたいという方にとっては、良いスタート地点になるのではないでしょうか。
マウンテンチャートやアイスバーグチャートを作成するためにこのコードがおこなうことは、Heiken-Ashi指標がおこなうことと非常によく似ています。しかし、Heiken-Ashiとは異なり、私たちのチャートシステムは、上記のような100%クリーンなチャートを作成します。MetaTrader 5で表示される標準のデフォルトチャートを含め、余分なものは一切ありません。
さらに、カスタムチャートを作成したからといって、お気に入りの指標を適用できなくなるわけではありません。この新しいチャートスタイルでは、コードを修正することなく、あらゆる指標、エキスパートアドバイザー(EA)、スクリプト、その他のものを使用できます。時間が経てばいろいろなことが起こることを考えると、これは素晴らしいことです。
では、次にMetaTrader 5に新しいチャートシステムを実装する方法を紹介します。
実装
上の図を見てください。チャートの作成は、少なくとも今話していた部分については(図05と図06)どのようなものになるのでしょうか。まず思い浮かぶのは、移動平均線です。図05、図06ともに移動平均が表示されています。これは図01とよく似たものですが、なぜか色が違います。他の形はどうでしょうか。
図02、03、04のチャートの秘密は何でしょうか。MetaTrader 5プラットフォームに負荷をかけずに、同じ機能を実装する方法はあるのでしょうか。
実は、MetaTrader 5のプラットフォームで利用できるデフォルトのラインチャートである図01以外のすべてのチャートは、移動平均を使って同様の方法で作成されているのです。アイスバーグチャートも同じように作られます。
これを理解するために、以下のコードを見てください。非常にシンプルで、次のような行から始まります。
#property copyright "Daniel Jose" #property icon "\\Images\\Icons\\Mountain Chart.ico" #property description "This indicator allows you to create a mountain chart" #property description "Whose average price can be indicated facilitating market analysis" #property version "1.00" #property indicator_chart_window #property indicator_buffers 2 #property indicator_plots 1
この行では、システムのアイコンとして使用される画像ファイルの場所を定義します。また、金融商品のメインチャートウィンドウに指標(言ってみれば、チャートが指標になります)を使用することも示しています。
ここで重要なポイントがあります。2つのバッファを使いますが(この言葉を強調して)、皆さんが考えているような使い方はしませんので、その部分に注意してください。1つの指標をプロットしますが、ここでもすべてが正確に表示されているわけではありません。
マルチカラーラインチャート、アイスバーグチャート、マウンテンチャートの3種類のチャートが可能です。そのため、冒頭で示した情報に固執することはありません。
次に、すべてがうまくいくように、いくつかの簡単で必要な宣言をします。
double Buff1[], Buff2[]; //+------------------------------------------------------------------+ enum eType {Fill, Contour}; //+------------------------------------------------------------------+ input double user01 = 0.0; //Analysis price input eType user02 = Fill; //Type of Mountain //+------------------------------------------------------------------+ struct st0 { long id; color CandleBear, CandleBull, CandleLine, LineUp, LineDown; }_memConfig;
ここでは、使用する2つのバッファを宣言します。次に、チャートの種類(ラインチャート、アイスバーグチャート、マウンテンチャート)を選択するための列挙型を作成します。そして、ユーザーとのインタラクションに特化した「瞬間」がやってきます。チャートがどのように表示されるのか、どのようなタイプが画面に表示されるのかを理解しましょう。以下のような組み合わせがあります。
チャートの種類 | user01に含まれる値 | user02に含まれる値 |
---|---|---|
シングルカラーラインチャート | 値は0 | アウトラインを示す値 |
マルチカラーラインチャート | 閾値価格 | アウトラインを示す値 |
マウンテンチャート | 値は0 | 塗りつぶしを示す値 |
アイスバーグチャート | ウォーターライン価格帯 | 塗りつぶしを示す値 |
この表は、画面に表示するチャートの種類を選ぶ際の参考になります。
さらにわかりやすくするために、記事の最後にそれぞれの設定と結果を示す動画を追加しました。コードを見ただけでは理解しにくいこともあるので、こうすることで理解が深まります。この動画は、可能な限りの組み合わせを理解するのに役立つはずです。記事本文には色の変え方の説明がありませんが、動画ではこのようになっています。
構造は、ある情報を保存するためのメモリとしての役割しかないので、気にする必要はありません。
これで終わりです。それでは、チャートシステムの最初の関数に移りましょう。
int OnInit() { IndicatorSetString(INDICATOR_SHORTNAME, "Mountain Chart"); Init_MountainChart(); return INIT_SUCCEEDED; }
この関数は非常にシンプルで、指標の名前を指定し、チャートを実行する関数を呼び出します。呼び出された関数の中身をここに書いてもいいのですが、物事を分けて、コードをうまく整理したいと思います。
以下が次の関数です。
int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) { for (int c0 = (prev_calculated == 0 ? 0 : prev_calculated - 1); c0 < rates_total; c0++) { Buff1[c0] = price[c0]; Buff2[c0] = (user02 == Fill ? user01 : (price[c0] > user01 ? 0 : 1)); } return rates_total; }
これは非常にシンプルな関数です。価格ティックごと、あるいは価格変動ごとに実行されるため、本当にシンプルであるべきです。MetaTrader 5はイベントを生成し、その結果としてOnCalculateが呼び出されます。そのため、この関数は非常に高速に動作する必要があります。
各関数呼び出しでデータ系列全体を最初から再計算するのを避けるため、前の値を調整する簡単な計算を使用することにします。これにより、最速の実行が可能になります。最初のほうは少し遅れるかもしれませんが、それ以外の計算は非常に速くできるはずです。
MetaTrader 5から取得する値は1種類のみで、この値は指標メッセージボックスで選択されています。MetaTrader 5が指標に送信する可能性のある値は、図08に示されています。
図08:MetaTrader 5から指標に転送される値の種類
この値はbuffer01に実装されます。これが使用するバッファです。Buffer02は、作成するものに応じた値を取得します。なぜこのような実装にしたのでしょうか。
これは、2つの異なる描画スタイルを使用するためです。あるスタイルでは、buffer02は閾値またはウォーターラインである値を受け取ることになります。ウォーターラインの値が0より上にある場合、この値より下で取引できる資産はないため、マイナスの値を持つ資産を保有する意味がないため、このようなことが起こります。フィルモードを使うと、マウンテンチャートが上の図02のようになります。
しかし、ウォーターラインの値が0でない場合は、図03と図04のようなアイスバーグチャートになります。同様に、アウトラインモードでウォーターラインを0にすると、ラインチャートになりますが、これはMetaTrader 5のデフォルトラインチャートとは異なります。
線の太さとスタイルを指定すると、結果的に図05と図06のようなチャートになりますが、そこでの水位線の値はゼロとは異なるため、線の部分によって色が異なるのはそのためです。
以下は別の関数です。
void OnDeinit(const int reason) { ShowBars(); }
単に指標を終了させ、チャートを元の状態に戻すだけです。ここで、もう1つ説明が必要な機能を見てみましょう。
void Init_MountainChart(void) { _memConfig.id = ChartID(); PlotIndexSetInteger(0, PLOT_DRAW_TYPE, (user02 == Fill ? DRAW_FILLING : DRAW_COLOR_LINE)); SetIndexBuffer(0, Buff1, INDICATOR_DATA); SetIndexBuffer(1, Buff2, (user02 == Fill ? INDICATOR_DATA : INDICATOR_COLOR_INDEX)); PlotIndexSetInteger(0, PLOT_COLOR_INDEXES, 2); PlotIndexSetString(0, PLOT_LABEL, "MidPoint"); PlotIndexSetInteger(0, PLOT_LINE_COLOR, 0, clrForestGreen); PlotIndexSetInteger(0, PLOT_LINE_COLOR, 1, clrFireBrick); PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, 0); HideBars(); }
この関数を呼び出した後、指標を取り付けるチャートのIDを取得します。この部分は、チャートをクリアして再スタートする関数で使用されます。これらの関数については、後ほど検討します。ここで注意していただきたいのは、ユーザーがチャートを塗りつぶすことを選択した場合はこのデザインモデルを使用し、アウトラインのみを作成すればよい場合は別のモデルを使用するという点です。
そのため、最初に思ったのとはコードの見た目が少し変わっています。ポイントは細部にあります。どちらのモデルも2つのバッファを使用しますが、DRAW_FILLINGモデルは両方のバッファをデータで使用し、DRAW_COLOR_LINEモデルは1つのバッファをデータ、もう1つのバッファを色に使用します。そのため、指標を表示する役割を担う関数で正しく計算することが重要です。
最初のデータバッファbuffer01は常に使用されます。Buffer02は、何を構築したいかに依存して、データまたはカラーインデックスを含むことができます。buffer02に使用した色が入るとは言っていないので、ご注意ください。色は指定しないでください。このバッファには、使用する色を決定するためのインデックスが指定されます。これが、計算関数では色情報を一切使わず、2色しか扱わないので、値0と1だけにしている理由です。
Buff2[c0] = (user02 == Fill ? user01 : (price[c0] > user01 ? 0 : 1));
さて、さらに話を進めましょう。次におこなうのは、2色の行列を定義することです。ここで使用しているラベルは、ウォーターライン上にマウスを合わせると表示され、色の選択と定義時にも表示されます。この機能は、将来必要になるかもしれない情報を保存する方法を示すために追加しました。
では、ユーザーが変更できないデフォルトカラーを定義してみましょう。まず、指標をチャートに貼り付けてから、色を変更する必要があります。これは記事末尾の動画でも紹介されています。
最後にどのポジションからチャートを作成するかを指定します.。実は、この関数は必要ないのですが、どうすればできるかを示したいだけです。
この後、マイクロチャートシステムの最後の2つの関数に移行することができます。HideBars関数は、MetaTrader 5のデフォルトのチャートレイアウトを非表示にします。MetaTrader 5でチャート自体を非表示にするということです。これをやるのはとても簡単ですが、何かあったときにユーザーを怒らせてはいけないので、元のデータを保存しておき、後で銘柄チャートから指標を削除したときに復元できるようにしておきます。後で簡単に元のカラースキームに戻すことができます。
void HideBars(void) { _memConfig.CandleBear = (color) ChartGetInteger(_memConfig.id, CHART_COLOR_CANDLE_BEAR); _memConfig.CandleBull = (color) ChartGetInteger(_memConfig.id, CHART_COLOR_CANDLE_BULL); _memConfig.CandleLine = (color) ChartGetInteger(_memConfig.id, CHART_COLOR_CHART_LINE); _memConfig.LineUp = (color) ChartGetInteger(_memConfig.id, CHART_COLOR_CHART_UP); _memConfig.LineDown = (color) ChartGetInteger(_memConfig.id, CHART_COLOR_CHART_DOWN); ChartSetInteger(_memConfig.id, CHART_COLOR_CANDLE_BEAR, clrNONE); ChartSetInteger(_memConfig.id, CHART_COLOR_CANDLE_BULL, clrNONE); ChartSetInteger(_memConfig.id, CHART_COLOR_CHART_LINE, clrNONE); ChartSetInteger(_memConfig.id, CHART_COLOR_CHART_UP, clrNONE); ChartSetInteger(_memConfig.id, CHART_COLOR_CHART_DOWN, clrNONE); ChartRedraw(); } //+------------------------------------------------------------------+ void ShowBars(void) { ChartSetInteger(_memConfig.id, CHART_COLOR_CANDLE_BEAR, _memConfig.CandleBear); ChartSetInteger(_memConfig.id, CHART_COLOR_CANDLE_BULL, _memConfig.CandleBull); ChartSetInteger(_memConfig.id, CHART_COLOR_CHART_LINE, _memConfig.CandleLine); ChartSetInteger(_memConfig.id, CHART_COLOR_CHART_UP, _memConfig.LineUp); ChartSetInteger(_memConfig.id, CHART_COLOR_CHART_DOWN, _memConfig.LineDown); ChartRedraw(); }
最終的には、データをリセットした後は、ユーザーが異変に気づくことはありません。また、設定する必要がないため、利便性が向上します。
それでも、指標を外した後、チャートが完全に再描画されるまでには時間がかかるので、ユーザーは少し驚くかもしれません。その結果、金融商品のチャートは、指標を起動する前と同じように表示されます。
デモンストレーション(必見)
結論
この記事では、MQL5とMetaTrader 5プラットフォーム自体の両方が、多くの人の想像をはるかに超えるものを作り出すことができることを示しました。この記事でおこなったことは簡単なことですが、より複雑なことを理解するのに役立ちます。
一番の問題は、プラットフォームについて、あるいはMQL5言語についてあれこれ言う人がいますが、実際にはプラットフォームの能力を探ってもいないし、何ができて何ができないかもよく分かっていないということです。可能性を理解せず、他人の言うことをそのまま言い続けているのです。
MetaTrader 5やMQL5には制限がある、特定の機能が欠けていると言う人がいるたびに、この記事を見せてあげてください。本当に制限されているのは、そのようなユーザーの創造性や知識だけなのです。そのようなユーザーは、プログラミングのことを何も知らず、機能的で安全で高速であるべきだが何よりもプラットフォームであるべきであるというMetaTrader 5プラットフォームの目的を理解していないから、そういうことを言い続けるのです。しかし、このプラットフォームは、カスタマイズの度合いによって、すべての人に合うように柔軟に対応することができるのです。
MetaQuotes Ltdによりポルトガル語から翻訳されました。
元の記事: https://www.mql5.com/pt/articles/11078





- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索