
多色ローソク足を作成するためのオプションの探究
はじめに
この記事では、ローソク足チャートを使用してカスタマイズされたインジケーターを作成する可能性について説明し、その長所と短所を指摘します。このテーマについて、次の4つのトピックを取り上げます。
1 - 陽線と陰線を区別せずに、1色のみのローソク足を作成する。
2 - いくつかのビジネスルールに従って色付けされた多色ローソク足を作成する。
3 - ローソク足の塗りつぶしの色と枠線の色を区別して、塗りつぶしのあるローソク足と枠だけのローソク足を作成する。
4 - 塗りつぶしのある多色ローソク足と枠だけの多色ローソク足を作成する。
まず、ローソク足チャートに色付けのルールを実装する理由と、インジケーターを作成するための適切な選択の重要性を明確にする必要があります。各方法には、ユーザーのプログラムとの対話、またはプログラムによるハードウェア使用の最適化のいずれかにより、その特殊性、長所、および短所があります。
最初に、3本の移動された価格ラインで機能する操作のモデルを考えてみましょう。1本目(黒)は価格そのもの、2本目(青)は10期間先にシフトした1期間移動平均、3本目(赤)は20期間先にシフトした1期間移動平均です。価格グラフでのモデルの作成を以下に示します。ここでは、2つの移動平均を挿入し、価格グラフを線に変更しました。
線の色だけでなく線の間の関係も識別する必要があるため、これは一見したところわかりにくいモデルで解釈が困難です。これはしばしば意思決定において混乱やエラーを引き起こします。線の色だけでなく線の間の関係も識別する必要があるという同じ理由で混乱やエラーを引き起こす可能性のある別のモデルは、方向性指数インジケーター(DMI)です。
実際、考慮すべき変数またはインジケーターの数が多いほど、解釈のエラーが頻繁に発生し、意思決定と結果に一貫性がなくなります。このデータをわかりやすい客観的な情報にする限り、インジケーターと変数を必要なだけ使用できます。
色付けルールの使用は、私たちが知りたいこと(いつ売買できるか、そしていつ市場からエグジットするべきか)を正確に伝えるためにすべての情報を凝縮する効率的な方法です。したがって、情報を3色で合成できます。1つは買い、もう1つは売り、もう1つは売買条件がない場合用です。この記事では、買いに緑、売りに赤、その他の場合に黄色を使用します。これは下の表で概要されています。
色 | 方向 |
---|---|
緑 | 買 |
赤 | 売 |
黄色 | 中立 |
この時点で、ローソク足の色付けルールの背後にある取引規則を忘れて、MQL5でローソク足グラフを作成する方法を見てみましょう。MQL5でMetatrader 5のプログラムを作成するのが初めての場合は、Metatrader5開発環境であるMetaEditorの助けを借りることをお勧めします。
ローソク足チャートの作成
この時点で、簡単なローソク足チャートを作成する方法を示し、いくつかの基本的な機能について説明します。ローソク足チャートは、一連のローソク足で構成されています。各ローソク足は、始値、高値、安値、終値の4つの価格で構成されます。問題の期間に高値または安値があるかどうかを知るために、終値が始値よりも高いか低いかが検証されます。高い場合は緑、低い場合は赤に色付けします。
MQLウィザードでインジケーターを作成することから始めましょう。
インジケーターに名前を付け、著作権情報(つまり作成者の名前とWebページのアドレス)を変更します。
始値、高値、安値、終値のシリーズを含むOnCalculate関数を使用します。
インジケーターはローソク足チャートになるので、[Type]で[Candles]チャートを選択し、Candlesのラベルの名前を変更しましょう。この名前は、ユーザーインターフェイスとインジケーターバッファの処理の両方に使用されます。
これは、MQLウィザードによって生成されたコードです。
//+------------------------------------------------------------------+ //| Candles.mq5 | //| Copyright 2021, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #property indicator_chart_window #property indicator_buffers 4 #property indicator_plots 1 //--- plot Candle #property indicator_label1 "Candle" #property indicator_type1 DRAW_CANDLES #property indicator_color1 clrRed #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //--- indicator buffers double CandleBuffer1[]; double CandleBuffer2[]; double CandleBuffer3[]; double CandleBuffer4[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping SetIndexBuffer(0,CandleBuffer1,INDICATOR_DATA); SetIndexBuffer(1,CandleBuffer2,INDICATOR_DATA); SetIndexBuffer(2,CandleBuffer3,INDICATOR_DATA); SetIndexBuffer(3,CandleBuffer4,INDICATOR_DATA); //--- 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); } //+------------------------------------------------------------------+
コードをコンパイルするだけで、CandlesインジケーターがMetaTrader5のファイルブラウザーで利用できるようになります。ただし、価格チャートに配置すると、インジケーターバッファに値が割り当てられないため、正しく表示されません。直しましょう。この最初のメソッドには、CandleBuffer1[]、CandleBuffer2[]、CandleBuffer3[]、CandleBuffer4[]の4つのバッファがあります。 これらのバッファの使用について、次の表で説明します。
バッファ | 価格シリーズ |
---|---|
CandleBuffer1 | 始値 |
CandleBuffer2 | 高値 |
CandleBuffer3 | 安値 |
CandleBuffer4 | 終値 |
バッファの数は、indicator_buffersプロパティを使用してコードで詳しく説明する必要があります。この作業はMQLウィザードによってすでに実行されていますが、インジケーターの必要に応じてバッファの数を変更できます。これは後で行います。
#property copyright "Copyright 2021, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #property indicator_chart_window #property indicator_buffers 4
価格範囲全体を実行するループを使用して、OnCalculated関数のバッファに値を割り当てます。ただし、値が割り当てられると、シリーズのサイズが大きくなったときに値を再割り当てする必要はありません。つまり、ローソク足が関数呼び出しにn個あり、次の呼び出しにn+1個ある場合、最後のローソク足の値を計算するだけです。OnCalcultate関数では、グラフ内のローソク足の数は、rates_totalパラメータによって通知され、関数の最後の呼び出しでグラフ内にあったローソク足の数は、prev_calculatedパラメータによって通知されます。
これは、OnCalculate関数で作業した結果です。
//+------------------------------------------------------------------+ //| 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[]) { //--- int start = prev_calculated; if(start>=rates_total) start = rates_total-1; for(int i = start; i<rates_total; i++) { CandleBuffer1[i]=open[i]; CandleBuffer2[i]=high[i]; CandleBuffer3[i]=low[i]; CandleBuffer4[i]=close[i]; } //--- return value of prev_calculated for next call return(rates_total); }
インジケーターでは、すべてのローソク足が赤で表示されています。これは、MQLウィザードで定義した色で、ユーザーが変更できます。また、コードでindicator_color1プロパティを使用して変更することもできます。MQL5での色の定義と操作の詳細については、Type Colorのデータに関するドキュメントを参照してください。
//--- plot Candle #property indicator_label1 "Candle" #property indicator_type1 DRAW_CANDLES #property indicator_color1 clrRed #property indicator_style1 STYLE_SOLID #property indicator_width1 1
多色ローソク足チャートの作成
これまでは、色や陽線と陰線を区別せずにローソク足チャートを作成してきました。次に、いくつかのビジネスルールに従って多色ローソク足を作成する方法を説明します。ただし、まずルールを使用して、陽線と陰線を色だけで区別します。
Indicator_type1のインジケータープロパティで定義されているDRAW_CANDLES描画タイプを使用していることがわかります。多色ローソク足を使用するためには、このプロパティをDRAW_COLOR_CANDLESに変更できます。DRAW_COLOR_CANDLESの描画では各ローソク足の色を格納する必要があるため、CandleColorと呼ばれる追加のバッファがあります。バッファ数は5に増えます。さらに、indicator_color1プロパティに色を追加する必要があります。
#property copyright "Copyright 2021, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #property indicator_chart_window #property indicator_buffers 5 #property indicator_plots 1 //--- plot Candle #property indicator_label1 "Candle" #property indicator_type1 DRAW_COLOR_CANDLES #property indicator_color1 clrGreen,clrRed #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //--- indicator buffers double CandleBuffer1[]; double CandleBuffer2[]; double CandleBuffer3[]; double CandleBuffer4[]; double CandleColor[];
次に、ローソク足の色を格納する新しいCandleColorバッファを初期化し、このバッファを使用して色を格納することをコンパイラに通知します。これを行うには、関数SetIndexBufferをパラメータINDICATOR_COLOR_INDEXとして渡します。緑と赤の2色の場合、最初の色のインデックスは0、2番目の色のインデックスは1です。Indicator_color1でn色を定義すると、0からn-1までの色インデックスが作成されます。
//+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping SetIndexBuffer(0,CandleBuffer1,INDICATOR_DATA); SetIndexBuffer(1,CandleBuffer2,INDICATOR_DATA); SetIndexBuffer(2,CandleBuffer3,INDICATOR_DATA); SetIndexBuffer(3,CandleBuffer4,INDICATOR_DATA); SetIndexBuffer(4,CandleColor,INDICATOR_COLOR_INDEX); //--- return(INIT_SUCCEEDED); }
MQLウィザードではバッファと必要なバッファの数を定義および初期化するので、これらの変更を直接行うことができます。MQLウィザードウィンドウで、描画タイプパラメータをDRAW_COLOR_CANDLESに変更しその色を変更するだけです。これは、グラフ上に複数のタイプの描写をプロットするインジケーターを操作する場合に非常に便利な手順で、後に説明します。
次に、CandleColorバッファに値を割り当てる必要があります。色のルールとして、ローソク足の始値よりも終値が高い場合に緑色、そうでない場合は赤色にします。OnCalculate関数内でこれがどのように見えるかを見てみましょう。
for(int i = start; i<rates_total; i++) { CandleBuffer1[i]=open[i]; CandleBuffer2[i]=high[i]; CandleBuffer3[i]=low[i]; CandleBuffer4[i]=close[i]; //if the close price is higher than the open price we set the //green color (index 0), otherwise, the red color (index 1) CandleColor[i]=(close[i]>open[i])?0:1;
予想通り、結果は強気と弱気のローソク足を区別する標準的なチャートです。
色付けルールを変えてみましょう。次のトピックで陽線と陰線を区別する別の方法を見るので、陽線と陰線を区別する代わりに、非常に単純な取引ルールを使用します。
記事の冒頭に示した操作モデルについて考えてみましょう。ビジネスルールとして、黒い線(終値)が青線(10期間の終値シフト)および赤線(20期間の終値シフト)よりも高い場合、買うことにします。黒線(終値)が青線と赤線よりも低い場合は売ることにします。それ以外の場合は、市場の方向性の定義を待たなければなりません。このルールは、次の表に要約されています。
取引ルール | ローソク足の色 |
---|---|
close[0] > close[10] and close[0] > close[20] | 緑 |
close[0] < close[10] and close[0] < close[20] | 赤 |
close[0] > close[10] and close[0] < close[20] | 黄色 |
close[0] < close[10] and close[0] > close[20] | 黄色 |
このモデルでは、indicator_color1プロパティにもう1つの色を追加する必要があります。
#property indicator_color1 clrGreen,clrRed,clrYellow
これで、コードでルールを定義し、それに応じて値を割り当てることができます。これは、OnCalculate関数内の結果です。
{ //--- int start = prev_calculated; if(prev_calculated<20) start = 20; if(start>=rates_total) start = rates_total-1; for(int i = start; i<rates_total; i++) { CandleBuffer1[i]=open[i]; CandleBuffer2[i]=high[i]; CandleBuffer3[i]=low[i]; CandleBuffer4[i]=close[i]; //Close[0] > Close[10] and Close[0] > Close[20] bool buy = close[i]>close[i-10] && close[i]>close[i-20]; //Close[0] < Close[10] and Close[0] < Close[20] bool sell = close[i]<close[i-10] && close[i]<close[i-20]; CandleColor[i]=(buy)?0:(sell)?1:2; } //--- return value of prev_calculated for next call return(rates_total); }
新しいインジケーターの結果はこれです。
次に、Metatrader5のインジケーターパラメータウィンドウのユーザーインターフェイスを見てみます。価格チャート内のインジケーターをダブルクリックすると、パラメータウィンドウが開きます。下の画像では、どの色が売買の条件と中立の条件を参照しているかを通知せずに、色がパラメータとして渡されていることがわかります。より多くの色(たとえば6色)で作業したい場合は、ユーザーを混乱させる可能性があるため、各色が何を指しているのかをユーザーに説明する必要があります。これは、この記事の最後のトピックで行います。
塗りつぶしのあるローソク足と枠だけのローソク足のチャートの作成
単色のローソク足を使用して、最初のコードに戻りましょう。4つのバッファを持つDRAW_CANDLES描画タイプを使用したことを思い出してください。Indicator_color1プロパティで2つの色を定義するだけで、塗りつぶしの色とローソク足の枠線の色を区別できます。最初の色はローソク足の枠線に使用され、2番目の色は塗りつぶしに使用されます。デモンストレーションのために、結果を白黒で見てみましょう。
#property indicator_type1 DRAW_CANDLES #property indicator_color1 clrBlack,clrWhite
Indicator_color1プロパティで3色を定義すると、強気のローソク足と弱気のローソク足を区別できるようになります。このローソク足の構成は、この記事で作成した最初の色付けルールに代わるものです。大きな違いは、引き続き4つのバッファで、枠線の色を定義できるということです。この場合、最初の色はローソク足の枠線、2番目は強気のローソク足の塗りつぶし、3番目の色は弱気のローソク足の塗りつぶしに適用されます。この可能性を以下に示します。ここでは、枠線と区別するために3番目の色がダークグレーとして定義されています。
#property indicator_type1 DRAW_CANDLES #property indicator_color1 clrBlack,clrWhite,clrDarkGray
塗りつぶしのあるローソク足と枠だけのローソク足のチャートの作成
MQL5での多色ローソク足の作成に関する調査を終了するために、インジケーターパラメータウィンドウのユーザーインターフェイスがさらに情報を含むようにします。これは、塗りつぶしの有無にかかわらず、多色ローソク足を作成するための中間ステップです。さらに、両方に必要なバッファの数は同じですが、これまでに見られたバージョンのバッファの数よりも多くなっています。これは、すべての色のデザインをプロットするのではなく、各色のデザインをプロットするためです。ここでのモデルでは、記事の冒頭で提案したように、売買とその他の条件用の3つの描写があります。つまり、このモデルを実装するのバッファは12個です。さらに、以前に見られた移動された価格に基づいて、同じビジネスルールを使用します。
ここでも、MQLウィザードを使用して、12個のバッファを定義および初期化する手順をスキップします。ローソク足タイプのデザインの代わりに、売買と中立のデザインを使用します。
すべてが同時に表示されることは望ましくありません。ビジネスルールに従って、1つを表示し、他は非表示にする必要があります。このため、表示しないローソク足バッファは空の値で埋める必要があります。次に、最初の手順は、描写を省略する必要がある値を定義することです。これは、以下に示すようにPlotIndexSetDouble関数を使用して行います。
//+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping SetIndexBuffer(0,BuyBuffer1,INDICATOR_DATA); SetIndexBuffer(1,BuyBuffer2,INDICATOR_DATA); SetIndexBuffer(2,BuyBuffer3,INDICATOR_DATA); SetIndexBuffer(3,BuyBuffer4,INDICATOR_DATA); SetIndexBuffer(4,SellBuffer1,INDICATOR_DATA); SetIndexBuffer(5,SellBuffer2,INDICATOR_DATA); SetIndexBuffer(6,SellBuffer3,INDICATOR_DATA); SetIndexBuffer(7,SellBuffer4,INDICATOR_DATA); SetIndexBuffer(8,NeutralBuffer1,INDICATOR_DATA); SetIndexBuffer(9,NeutralBuffer2,INDICATOR_DATA); SetIndexBuffer(10,NeutralBuffer3,INDICATOR_DATA); SetIndexBuffer(11,NeutralBuffer4,INDICATOR_DATA); PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0); PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0.0); PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0.0); //--- return(INIT_SUCCEEDED); }
この場合、値0.0を使用して、バッファ内の空の値を定義します。PlotIndexSetDouble関数の最初のパラメータとして渡された値0、1、2は、価格グラフにプロットされる描写のインデックスです。このインデックスは、インジケーターデザインのプロパティを宣言する際に使用されるものと同じです。
ここで行う必要があるのは、以前に作成したビジネスルールを適用して、OnCalculate関数で作業することだけです。表示する必要がある描写は1つだけなので、OnCalculate関数が呼び出されるたびに、すべてのローソク足に値0.0を割り当てることで、すべての描写を非表示として定義できます。次に、ビジネスルールに従って、表示するローソク足に始値、高値、安値、終値を割り当てます。作業の結果を以下に示します。
{ //--- int start = prev_calculated; if(prev_calculated<20) start = 20; if(start>=rates_total) start = rates_total-1; for(int i = start; i<rates_total; i++) { //initializing the candles data BuyBuffer1[i]=0.0; BuyBuffer2[i]=0.0; BuyBuffer3[i]=0.0; BuyBuffer4[i]=0.0; SellBuffer1[i]=0.0; SellBuffer2[i]=0.0; SellBuffer3[i]=0.0; SellBuffer4[i]=0.0; NeutralBuffer1[i]=0.0; NeutralBuffer2[i]=0.0; NeutralBuffer3[i]=0.0; NeutralBuffer4[i]=0.0; //Close[0] > Close[10] e Close[0] > Close[20] bool buy= close[i]>close[i-10] && close[i]>close[i-20]; //Close[0] < Close[10] e Close[0] < Close[20] bool sell= close[i]<close[i-10] && close[i]<close[i-20]; //Setting the values to the candles according to the trading rules if(buy) { BuyBuffer1[i]=open[i]; BuyBuffer2[i]=high[i]; BuyBuffer3[i]=low[i]; BuyBuffer4[i]=close[i]; } else if(sell) { SellBuffer1[i]=open[i]; SellBuffer2[i]=high[i]; SellBuffer3[i]=low[i]; SellBuffer4[i]=close[i]; } else { NeutralBuffer1[i]=open[i]; NeutralBuffer2[i]=high[i]; NeutralBuffer3[i]=low[i]; NeutralBuffer4[i]=close[i]; } } //--- return value of prev_calculated for next call return(rates_total); }
視覚的な結果は、DRAW_COLOR_CANDLES描写タイプを使用して以前に表示されたものとまったく同じです。この最後の方法の大きな利点は、必要なバッファの数が大幅に増えたにもかかわらず、ユーザーインターフェイスに含まれる情報がより多いことですが、この利点は、色付けルールでビジネスルールに関する情報だけでなく、強気ローソク足と弱気ローソク足の区別も提供することで拡張できます。これは、前に見たローソク足の枠線と塗りつぶしの色を操作するだけで実行できます。デザインごとに、陰線の枠線と塗りつぶしは同じ色にします。陽線の塗りつぶしには白を使用し、背景が白の価格チャートでは、塗りつぶされていないローソク足のように見せます。このカラーパターンは、次の表で簡略化されています。
取引ルール | 枠線 | 正の塗りつぶし | 負の塗りつぶし |
---|---|---|---|
買 | 緑 | 白 | 緑 |
売 | 赤 | 白 | 赤 |
中立 | 黄色 | 白 | 黄色 |
コードへの変更を以下に示します。
#property indicator_color1 clrGreen,clrWhite,clrGreen
#property indicator_color2 clrRed,clrWhite,clrRed
#property indicator_color3 clrYellow,clrWhite,clrYellow
そこで、この記事の目的は、塗りつぶしの有無にかかわらず、ローソク足チャートに適用するビジネスルールに従って色付けルールを作成する方法のデモンストレーションです。作業の最終結果は下の画像に示されています。
終わりに
DRAW_CANDLESとDRAW_COLOR_CANDLESの2種類のデザインを使用してローソク足チャートを作成できること、取引ルールに基づく色付けルールをローソク足チャートに適用する方法、ローソク足の枠線と塗りつぶしの色を区別する方法を確認しました。これにより、強気のローソク足と弱気のローソク足を区別しながらローソク足に色を付けることができます。陰線と陽線の区別は、カスタマイズされたインジケーターの目的によっては重要でない場合もあり、また、色数が非常に多い場合(たとえば10色)は、最後に示した方法を使用すると、バッファの数が増えすぎてユーザーのハードウェアの使用量が増えるため、便利でない場合があります。
この場合、インジケーターのパラメータウィンドウで各色の適用可能性を説明する代わりに使用できる2つのオプションがあります。DRAW_COLOR_CANDLES描画タイプを使用するか、DRAW_CANDLES描画タイプを使用して陰線の枠線と塗りつぶしを透明にすることで、塗りつぶされていないローソク足のような錯覚を作成できます。一方、陰線の塗りつぶしは価格グラフの背景色になり、ビジネスルールに従って色を適用するために、DRAW_COLOR_CANDLESに重ねて強気と弱気のローソク足を区別できます。
MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/7815





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