English Русский 中文 Español Deutsch Português
preview
MQL5を使用してカスタムドンチャンチャネル指標を作成する方法

MQL5を使用してカスタムドンチャンチャネル指標を作成する方法

MetaTrader 5トレーディング | 31 7月 2023, 10:18
323 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

はじめに

この記事では、取引において非常に重要な概念であるトレンド識別について説明し、それに役立つテクニカルツールであるドンチャンチャネル指標について学びます。この指標は、これから説明するのと同じトレンドをたどります。

以下のトピックを通じて、そのすべてをカバーします。


免責条項:すべての情報は「現状有姿」で提供され、情報提供のみを目的としており、取引目的やアドバイスを目的としたものではありません。いかなる結果も保証するものではありません。読者がこれらの資料を自分の取引口座で使用する場合、自己責任でおこなってください。


ドンチャンチャネルの定義

このセクションでは、ドンチャンチャネル指標を特定し、効果的に使用するためにその背後にある主な概念を理解します。ドンチャンチャネルはトレーダーであるリチャード・ドンチャンによって開発されました。その主な目的はトレンドを特定することです。つまり、この指標は、トレンドの方向と価格の動きを追跡すると同時に、トレンドフォローおよび遅行指標です。これは、価格を含むチャネルを形成する3つの線で構成されます。チャネルの上の線は特定の期間に記録された最高価格を表し、チャネルの下の線は特定の期間の最低価格を表し、中央の線は上の線と下の線の間の半分の距離を表します。

次のチャートは、ドンチャンチャネルチャートの例です。

指標の例

前のチャートでわかるように、価格の上に線があり、その下に別の線があり、それらの間に3番目の線があります。指標に、便利な別の中間線に加えて、上部線と下部線で価格を含めたり囲んだりするものもあります。この形式の指標に基づいて、たとえば、トレンドの特定、ブレイクアウト、サポートとレジスタンスのレベルの特定など、さまざまな戦略に基づいて使用することで、取引に役立ちます。

この指標を使用する主な目的は、特定の期間にわたる価格の高値と安値を観察して、トレンドや私たちが偏ってもよい方向性を特定することです。価格が特定の時間の最高値を上回っている場合、これは強気の勢力があることを示しており、買いシグナルである可能性があります。価格が特定の時間の最低値を下回っている場合、これは弱気の勢力があることを示しており、売りシグナルである可能性があります。したがって、特定の期間を指定して最高値と最低価格を決定したら、価格が特定の方向に上下に移動し、ここでのシグナルが決定された最高値または最低値を突破するまで観察します。

この指標は、ストップロスとテイクプロフィットのレベルを決定するために使用できます。指標のレベルは非常に明確であり、特に正しいパラメータを使用した場合に重要なレベルを表すため、間違ったレベルの設定を排除して減らすことができます。これは取引において非常に重要で役立ちます。したがって、たとえば、チャネルの安値は、買いポジションのストップロスレベルまたは売りポジションのテイクプロフィットレベルとして使用でき、チャネルの高値は、ショートポジションのストップロスまたは買いポジションの利益目標として使用できます。

次の簡単な手順と同じようにこの指標を計算する方法を提供します。

  • チャネル高値(CH)=最後のN期間の最高値
  • チャネル安値(CL)=最後のN期間の最低値
  • 中央の線(ML)=(チャネル高+チャネル低)/2

望む期間を特定し、その期間の方向を検出して最高価格と最低価格を検出し、観察のためにそれらの隣に線をプロットし、最高値と最低値の間の半分の距離を計算して中間線を取得します。ドンチャンチャネルとボリンジャーバンドには違いがあることにも言及しておきます。前述したように、ドンチャンチャネルは特定の期間の最高高値と最低安値をプロットしますが、ボリンジャーバンドは2つの標準偏差を加算および減算した後の期間の平均をプロットします。さらに詳しい情報が必要な場合は、ボリンジャーバンドに関する私の以前の記事を読んで、ボリンジャーバンドの詳細とそれに基づいた取引システムの作成方法を学ぶことができます。

この指標の概念は、トレンドと方向性を明確に特定するのに役立ち、この指標に基づいてさまざまな戦略を作業およびテストするのに役立ちます。この指標は私たちの取引システムで非常に優れたツールである可能性があり、特にトレンドフォロートレーダーにとって非常に重要であることがわかりました。より良い洞察と結果を得るには、この指標を他の有意義なテクニカル指標と併用するとより良い結果が得られることに留意することが非常に重要です。


カスタムドンチャンチャネル

このトピックでは、MQL5でカスタムドンチャンチャネル指標を作成するために使用できるメソッドを共有します。次の手順でわかるように、上部線、下部線、中央線の形式で指標を作成します。 

次の値の識別子を使用して追加のパラメータを作成します。

  • Indexer_chart_window:指標を表示するチャートウィンドウ
  • indicator_buffers:指標計算のバッファの数(3を使用)
  • Indexer_plots:指標内のグラフィックシリーズの数  (3を使用)
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots 3

次のように、期間に関する2つの入力と指標の線の色に関する2つの入力を作成します。

  • 整数変数indPeriodを作成し、デフォルト値として20を割り当てますが、ユーザーの入力に従って異なる値にすることもできます。
  • color型変数indColorにデフォルト値として青色を割り当てますが、ユーザーの入力に従って異なる値にすることもできます。
input int indPeriod=20; //Period
input color indColor=clrBlue; //Color

次と同じようにグローバル変数を作成します。

  • upperBuff、lowerBuff、middleBuffのdouble型配列
  • upperLine、lowerLine、middleLineのdouble型変数
  • startとbarの整数型変数
double upperBuff[];
double lowerBuff[];
double middleBuff[];
double upperLine,lowerLine,middleLine;
int start, bar;

voidを使用して指標のカスタム関数を作成し、何も返さず、3つのパラメータ(インデックス、動的配列としてのバッファ、指標の各行の文字列としてのラベル)を持つindInitの変数を作成します。関数の本体では、次のことをおこないます。

  • 指定された指標を1次元の動的配列にリンクするSetIndexBuffer関数を使用します。そのパラメータは次のとおりです。
    • Index:指標バッファの番号(インデックス変数を使用)
    • buffer[]:作成された動的配列
    • data_type:保存する必要があるデータ(デフォルト値INDICATOR_DATA)
  • コードでわかるように、異なるprop-idパラメータとprop_valueパラメータを指定してPlotIndexSetInteger関数を5回使用すると、対応する指標ラインの値を設定します。指標のプロパティは整数である必要があります。そのすべてのパラメータは次と同じです。
    • Lot_index:グラフィックプロットのインデックス(インデックス変数を使用)
    • prop_id:プロパティ識別子の値(ENUM_PLOT_PROPERT_INTEGERのいずれか)
    • prop_value:prop_idで決定されたプロパティの値
  • 対応する文字列プロパティ指標の値を設定するPlotIndexSetString関数を使用します。そのパラメータはPlotIndexSetInteger関数と同じですが、ここでの指標プロパティは文字列である必要があります。
  • PlotIndexSetDouble関数を使用して、対応するdoubleプロパティ指標の値を設定します。パラメータも同じですが、指標のプロパティはdouble型である必要があります。
void indInit(int index, double &buffer[],string label)
  {
   SetIndexBuffer(index,buffer,INDICATOR_DATA);
   PlotIndexSetInteger(index,PLOT_DRAW_TYPE,DRAW_LINE);
   PlotIndexSetInteger(index,PLOT_LINE_WIDTH,2);
   PlotIndexSetInteger(index,PLOT_DRAW_BEGIN,indPeriod-1);
   PlotIndexSetInteger(index,PLOT_SHIFT,1);
   PlotIndexSetInteger(index,PLOT_LINE_COLOR,indColor);
   PlotIndexSetString(index,PLOT_LABEL,label);
   PlotIndexSetDouble(index,PLOT_EMPTY_VALUE,EMPTY_VALUE);
  }

その後、OnInit()本体で、指標の3行に対して指標のカスタム関数を3回使用します。これは次と同じになります。

   indInit(0,upperBuff,"Donchian Channel");
   indInit(1,lowerBuff,"Donchian Channel");
   indInit(2,middleBuff,"Middle Donchian");

ここでIndicatorSetString関数を使用して指標のテキストラベルを設定します。

IndicatorSetString(INDICATOR_SHORTNAME,"Donchian ("+IntegerToString(indPeriod)+")");

OnCalculate部分では、次の手順を実行して指標を計算します。

rate_totalがユーザーの入力期間+1より小さいかどうかを確認し、そうであればプログラムはゼロを返す必要があります。

   if(rates_total<indPeriod+1)
     {
      return 0;
     }

三項演算子?を使用して、開始変数の値を割り当てます。start=prev_calculated==0がtrueの場合、演算子はindPeriodによって設定され、falseの場合、演算子はprev_calculated-1によって設定されます。

start=prev_calculated==0? indPeriod: prev_calculated-1;

for関数を使用して指標を計算するループを作成すると、式1は(bar=start)、式2は(bar<rate_total)、バーを1つ増やす式3は(bar++)になります。forループの演算子は次と同じになります。

  • 配列内の最大値を検索するArrayMinimum関数を使用してhighの最大値を検出し、upperLineを計算します。
  • 配列内の最小値を検索するArrayMinimum関数を使用してlowの最小値を検出し、lowerLineを計算します。
  • upperLineとlowerLineの結果を2減算してmiddleLineを計算します。
  • upperBuff[bar]、lowerBuff[bar]、middleBuff[bar}の値を割り当てます。
   for(bar=start;bar<rates_total;bar++)
   {
      upperLine=high[ArrayMaximum(high,bar-indPeriod+1,indPeriod)];
      lowerLine=low[ArrayMinimum(low,bar-indPeriod+1,indPeriod)];
      middleLine=(upperLine+lowerLine)/2;
      
      upperBuff[bar]=upperLine-(upperLine-lowerLine);
      lowerBuff[bar]=lowerLine+(upperLine-lowerLine);
      middleBuff[bar]=middleLine;

   }

1つのブロック内の完全なコードは次のとおりです。

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots 3
input int indPeriod=20; //Period
input color indColor=clrBlue; //Color
double upperBuff[];
double lowerBuff[];
double middleBuff[];
double upperLine,lowerLine,middleLine;
int start, bar;
void indInit(int index, double &buffer[],string label)
  {
   SetIndexBuffer(index,buffer,INDICATOR_DATA);
   PlotIndexSetInteger(index,PLOT_DRAW_TYPE,DRAW_LINE);
   PlotIndexSetInteger(index,PLOT_LINE_WIDTH,2);
   PlotIndexSetInteger(index,PLOT_DRAW_BEGIN,indPeriod-1);
   PlotIndexSetInteger(index,PLOT_SHIFT,1);
   PlotIndexSetInteger(index,PLOT_LINE_COLOR,indColor);
   PlotIndexSetString(index,PLOT_LABEL,label);
   PlotIndexSetDouble(index,PLOT_EMPTY_VALUE,EMPTY_VALUE);
  }
int OnInit()
  {
   indInit(0,upperBuff,"Donchian Channel");
   indInit(1,lowerBuff,"Donchian Channel");
   indInit(2,middleBuff,"Middle Donchian");
   IndicatorSetString(INDICATOR_SHORTNAME,"Donchian ("+IntegerToString(indPeriod)+")");

   return(INIT_SUCCEEDED);
  }
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[])
  {
   if(rates_total<indPeriod+1)
     {
      return 0;
     }
   start=prev_calculated==0? indPeriod: prev_calculated-1;
   for(bar=start;bar<rates_total;bar++)
   {
      upperLine=high[ArrayMaximum(high,bar-indPeriod+1,indPeriod)];
      lowerLine=low[ArrayMinimum(low,bar-indPeriod+1,indPeriod)];
      middleLine=(upperLine+lowerLine)/2;
      
      upperBuff[bar]=upperLine-(upperLine-lowerLine);
      lowerBuff[bar]=lowerLine+(upperLine-lowerLine);
      middleBuff[bar]=middleLine;
   }
   return(rates_total);
  }

このコードをコエラーや警告を出さずにコンパイルした後、指標フォルダー内の取引ターミナルのナビゲーターウィンドウに指標が表示されます。実行すると、ウィンドウが表示されるので次のように入力できます。

指標入力

前の図からわかるように、2つの入力があります。

  • Period:指標の計算に使用する必要がある時間の長さ(デフォルト値として20が表示されますが、ユーザーが更新できます)
  • Color:指標の線の色(デフォルト値は青ですが、更新することもできます)

好みに応じてこれら2つの入力を決定し、[OK]を押すと、次のようにチャートに接続された指標が表示されます。

指標接続

前のチャートでわかるように、指標には3本の線があり、上下から価格を囲む2本の線がチャネルを形成し、中央の線はチャネルの距離の半分を表します。


ドンチャンチャネルEA

このセクションでは、指標の動きや動作に基づいてシグナルを生成するために使用できるエキスパートアドバイザー(EA)を作成することにより、このカスタムドンチャンチャネル指標を取引システムで使用します。これは2つの異なる方法を使用しておこなうことができます。1つ目はEAに指標概念のコードを記述すること、2つ目はiCustom関数を使用して、作成した指標をEAに接続することです。ここでは、概念と、指標の作成方法を学んだ2番目の方法に基づいてこれらのシステムを改善する方法を理解するために、非常に単純なシステムを設計します。

これらのEAについては次のとおりです。

ドンチャンチャネルシンプルEA

指標の値(チャネル高、チャネル中間、およびチャネル低)を含むチャート上のコメントを返すために使用できる最初のシステムの作成を開始します。したがって、これらの値を継続的にチェックおよび監視し、コメントとしてチャートに出力するプログラムが必要です。

このタイプのEAを作成する手順は次のとおりです。

デフォルト値(20)を使用して指標期間の入力変数を作成しますが、ユーザーはEAの入力からそれを更新できます。 

input int indPeriod=20; //Period

donChianChannelの整数グローバル変数を作成します。

int donchianChannel;

OnInit()の部分では、作成されたカスタムDonchianChannel指標のハンドルを返すiCustom関数をそれに割り当てて、donchianChannelを更新します。パラメータは次の通りです。

  • symbol_name:銘柄(現在の銘柄に適用される_Symbolを使用)
  • period:時間枠(現在の時間枠に適用されるPERIOD_CURRENTを使用)
  • name:指標の文字列名とそのパス
  • その後、指標の入力(ここでは指標の期間)を指定します。
donchianChannel=iCustom(_Symbol,PERIOD_CURRENT,"My Files\\Donchian_Channel\\Donchian_Channel",indPeriod);

OnDeinit()部分では、Print関数を使用して、EAを削除するときに「Donchian Channel EA Removed」というメッセージをEAに返します。

Print("Donchian Channel EA Removed");

OnTick()の部分では、channelBuff、channelBuff1、middleBuffの3つの配列を作成します。

double channelBuff[],channelBuff1[], middleBuff[];

CopyBuffer関数を使用して、カスタムドンチャンチャネル指標のすべてのバッファのデータを取得します。そのパラメータは次の通りです。

  • indicator_handle:指標ハンドル(3つのバッファすべてに対して作成されたdonchianChannelハンドルを使用)
  • buffer_num:バッファ番号を(channelBuffの場合は0、channelBuff1の場合は1、middleBuffの場合は2)
  • start_pos:コピーする最初の要素の位置(3つのバッファすべてに0を設定)
  • count:コピーするデータ数(3つのバッファすべてに3を使用)
  • buffer[]:コピーするターゲット配列を指定するために、3つのバッファ(channelBuff、channelBuff1、middleBuff)を指定します。
   CopyBuffer(donchianChannel,0,0,3,channelBuff);
   CopyBuffer(donchianChannel,1,0,3,channelBuff1);
   CopyBuffer(donchianChannel,2,0,3,middleBuff);

全員に対してdouble変数を作成した後、各行の現在の値を定義します。

   double channelHigh=channelBuff1[0];
   double channelMiddle=middleBuff[0];
   double channelLow=channelBuff[0];

Comment関数を使用して、3つの値をそれぞれ別の行に含むチャート上のコメントを返します。

Comment("Channel High: ",channelHigh,"\nChannel Middle: ",channelMiddle,"\nChannel Low: ",channelLow);

以下は1つのブロック内の完全なコードです。

input int indPeriod=20; //Period
int donchianChannel;
int OnInit()
  {
   donchianChannel=iCustom(_Symbol,PERIOD_CURRENT,"My Files\\Donchian_Channel\\Donchian_Channel",indPeriod);
   return(INIT_SUCCEEDED);
  }
void OnDeinit(const int reason)
  {
   Print("Donchian Channel EA Removed");
  }
void OnTick()
  {
   double channelBuff[],channelBuff1[], middleBuff[];
   CopyBuffer(donchianChannel,0,0,3,channelBuff);
   CopyBuffer(donchianChannel,1,0,3,channelBuff1);
   CopyBuffer(donchianChannel,2,0,3,middleBuff);
   double channelHigh=channelBuff1[0];
   double channelMiddle=middleBuff[0];
   double channelLow=channelBuff[0];
   Comment("Channel High: ",channelHigh,"\nChannel Middle: ",channelMiddle,"\nChannel Low: ",channelLow);
  }

このコードをエラーや警告なしでコンパイルすると、ExpertAdvisorフォルダーの下のナビゲーターウィンドウでコードを見つけることができます。目的のチャートに対して実行すると、次のような入力ウィンドウが表示されます。

dcSimpleEA入力ウィンドウ

実行後、ドンチャンチャネル指標のレベルに加えて、以下と同じコメントとしてEAがチャートに添付されていることがわかります。

送信されます。dcSimpleEAが接続され、信号が送信されます。

チャート上に目的のシグナルが表示されていることがわかります。これは、指標の3つの値(チャネル高、チャネル中、チャネル低)の各値を別の行にコメントしたものです。

確認のために、EAのシグナル値と指標の値を比較できます。次の図で、指標が挿入されており、データウィンドウ内のその値が次の図と同じEAのシグナル値と同じであることを確認できます。

dcSimpleEA信号はindと同じ


指標の動きとレベルに基づいてシグナルを見つけるためにこのEAを改善したい場合、これは、売買のシグナルを受信する指標の概念に基づいて条件を設定することによって、次の取引システム(EA)を通じて実行しようとすることになります。

ドンチャンチャネルブレイクアウトEA

このバージョンのEAでは、指標の3つの値すべてを継続的にチェックするプログラムが必要です。また、価格(売呼値)がチャネルの高値を突破した場合、チャート上のコメントとして買いシグナルを受け取る必要があります。もう1つのシナリオでは、価格(買呼値)がチャネルの安値を突破した場合、チャート上のコメントとして売りシグナルを受け取る必要があります。他に何かがあっても、何も受け取る必要はありません。

以下は、このタイプの取引システム(EA)を作成するための完全なコードです。

input int indPeriod=20; //Period
int donchianChannel;
int OnInit()
  {
   donchianChannel=iCustom(_Symbol,PERIOD_CURRENT,"My Files\\Donchian_Channel\\Donchian_Channel",indPeriod);
   return(INIT_SUCCEEDED);
  }
void OnDeinit(const int reason)
  {
   Print("Donchian Channel EA Removed");
  }
void OnTick()
  {
   double channelBuff[],channelBuff1[], middleBuff[];
   CopyBuffer(donchianChannel,0,0,3,channelBuff);
   CopyBuffer(donchianChannel,1,0,3,channelBuff1);
   CopyBuffer(donchianChannel,2,0,3,middleBuff);
   double channelHigh=channelBuff1[0];
   double channelMiddle=middleBuff[0];
   double channelLow=channelBuff[0];
   double ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   double bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);
   if(ask>channelHigh)
     {
      Comment("Buy Signal");
     }
     else if(bid<channelLow)
     {
      Comment("Sell Signal");
     }
     else Comment(" ");
  }

このコードの違いは、次の通りとなります。

SymbolInfoDouble関数を使用して売呼値と買呼値を定義し、double変数を作成した後にプロパティ(ask、bit)値を返します。

   double ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   double bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);

戦略の条件は次の通りです。

買いの場合

askとchannelHighをチェックしてそれらの位置を決定するプログラムが必要です。askがchannelHighを上回った場合、これが買い条件となり、この条件が満たされたら、EAがチャート上のコメントとして買いシグナルを返す必要があります。

   if(ask>channelHigh)
     {
      Comment("Buy Signal");
     }

売りの場合

bitとchannelLowをチェックして順位を決定するプログラムが必要です。bitがchannelLowレベルよりも低い場合、これが売り条件となり、この条件が満たされたら、EAがチャート上のコメントとして売りシグナルを返す必要があります。

     else if(bid<channelLow)
     {
      Comment("Sell Signal");
     }

何もない場合

売買条件以外に何かがあっても、EAは何も返さないようにする必要があります。

else Comment(" ");

このコードをエラーや警告なしでコンパイルした後、目的のチャートにドラッグ&ドロップすることでコードを実行し、次の例と同じ戦略に基づいてシグナルを取得できます。

買いシグナルの場合

dcブレイクアウト買いシグナル

前のチャートの左上隅にあるように、チャネルの高値を上値までブレイクした後に買いシグナルがあります。

売りシグナルの場合

dcブレイクアウト売りシグナル

前のチャートの左上隅にあるように、チャネルを下値までブレイクした後に売りシグナルがあります。

何もない場合

DCブレークアウト信号なし

ご覧のとおり、価格がチャネル内で移動するときにシグナルはありません。これは、価格がチャネル高値を下回り、チャネル安値を上回っていることを意味します。

ドンチャンチャネルとMAブレイクアウト

ここで、戦略の条件に移動平均を追加してシグナルをフィルタリングすることでEAを少し改善する必要があります。これがこの取引システムでおこなうことです。200期間EMA(指数移動平均)が売呼値を下回っている場合に備えて、価格(売呼値)がチャネル高値を上回ったときに買いシグナルを受け取る必要があります。売りシグナルの場合は、買呼値がチャネル安値を下回り、同時に200期間EMAが買呼値を上回っていることを確認する必要があります。それ以外の場合には、何も受け取る必要はありません。

このタイプの取引システムを作成する完全なコードは次のとおりです。

input int indPeriod=20; //Period
input int maPeriod=200; //Moving Average Period
int donchianChannel;
int EMA;
double emaArray[];
int OnInit()
  {
   donchianChannel=iCustom(_Symbol,PERIOD_CURRENT,"My Files\\Donchian_Channel\\Donchian_Channel",indPeriod);
   EMA = iMA(_Symbol,_Period,maPeriod,0,MODE_EMA,PRICE_CLOSE);
   return(INIT_SUCCEEDED);
  }
void OnDeinit(const int reason)
  {
   Print("Donchian Channel EA Removed");
  }
void OnTick()
  {
   double channelBuff[],channelBuff1[], middleBuff[];
   CopyBuffer(donchianChannel,0,0,3,channelBuff);
   CopyBuffer(donchianChannel,1,0,3,channelBuff1);
   CopyBuffer(donchianChannel,2,0,3,middleBuff);
   ArraySetAsSeries(emaArray,true);
   CopyBuffer(EMA,0,0,3,emaArray);
   double channelHigh=channelBuff1[0];
   double channelMiddle=middleBuff[0];
   double channelLow=channelBuff[0];
   double EMAValue=NormalizeDouble(emaArray[0],_Digits);
   double ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   double bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);
   if(ask>channelHigh&&ask>EMAValue)
     {
      Comment("Buy Signal","\nAsk above Channel High","\nAsk above (",maPeriod,") EMA");
     }
     else if(bid<channelLow&&bid<EMAValue)
     {
      Comment("Sell Signal","\nBid below Channel Low","\nBid Below (",maPeriod,") EMA");
     }
     else Comment(" ");
  }

このコードの違いは、次の通りとなります。

maPeriodの整数変数の別の入力をデフォルト値(200)で作成しますが、ユーザーは好みに応じて更新できます。

input int maPeriod=200; //Moving Average Period

EMAのグローバル整数変数を作成します。

int EMA;

emaArray[]の配列を作成します。

double emaArray[];

iMA関数を使用してEMA変数を更新し、移動平均指標のハンドルを返します。そのパラメータは次のとおりです。

  • symbol:現在の銘柄に適用(_Symbolを使用)
  • period:現在の時間枠に適用(_periodを使用)
  • ma_period:平均期間(ユーザー入力maPeriodを使用)
  • ma_shift:シフトがあるかどうか(シフトする必要がないため0を使用)
  • ma_method:移動平均の平滑化タイプ(指数移動平均が必要なのでMODE_EMAを使用)
  • apply_price:価格タイプ(PRICE_CLOSE)を使用)
EMA = iMA(_Symbol,_Period,maPeriod,0,MODE_EMA,PRICE_CLOSE);

ArraySetAsSeries関数を使用してAS_SERIESを設定すると、そのパラメータは次のとおりです。

  • array[]:配列(emaArrayを使用)
  • flag:配列のインデックス付けの方向(trueを使用)
ArraySetAsSeries(emaArray,true);

CopyBuffer関数を使用して移動平均のバッファからデータを取得します。

CopyBuffer(EMA,0,0,3,emaArray);

EMA値を定義して正規化します。

double EMAValue=NormalizeDouble(emaArray[0],_Digits);

戦略の条件は次の通りです。

買いの場合

価格>チャネルの高値の場合、チャートに次のコメントが必要です。

  • Buy signal
  • Ask above Channel High
  • Ask above (period) EMA
   if(ask>channelHigh&&ask>EMAValue)
     {
      Comment("Buy Signal","\nAsk above Channel High","\nAsk above (",maPeriod,") EMA");
     }

売りの場合

価格<チャネルの安値の場合、チャートに次のコメントが必要です。

  • Sell signal
  • Bid below Channel Low
  • Bid below (period) EMA
     else if(bid<channelLow&&bid<EMAValue)
     {
      Comment("Sell Signal","\nBid below Channel Low","\nBid Below (",maPeriod,") EMA");
     }

シグナルがない場合

else Comment(" ");

エラーや警告なしでこのコードをコンパイルすると、この取引システムで次のようなシグナルが見つかります。

買いシグナルの場合

DC&EMABブレイクアウト買いシグナル

前の例でわかるように、買いシグナルと、価格がチャネル高値を上回っており、200EMAが満たされているというこのシグナルの条件が必要に応じてチャート上にコメントされています。

売りシグナルの場合

DC&EMABブレイクアウト売りシグナル

前の例でわかるように、売りシグナルと、価格がチャネル安値を下回っており、200EMAが満たされているというこのシグナルの条件が必要に応じてチャートにコメントされます。

シグナルがない場合

DC&EMABブレークアウトシグナルなし

ご覧のとおり、価格が200EMAを下回っているため売り設定をおこなっている場合でも、価格がチャネル安値を上回り、チャネル高値を下回っているため、条件が満たされていないことを示すシグナルはチャート上にありません。


結論

この記事で言及されたトピックを通じて学んだように、特に指標の概念に基づいて取引システムを作成することに加えて、カスタム指標として自分で作成した後、ドンチャンチャネル指標がどれほど便利で価値のあるツールであるかを確認しました。好みに応じてカスタムのドンチャンチャネル指標をご自分で作成して、取引に適したツールにしてください。さらに、iCustom関数を使用して取引システムを作成し、指標の解釈に基づいて取引またはシグナルを取得できることだけでなく、特定の条件を追加したり、別のテクニカルツールを使用してより良い洞察を得ることで結果を強化したりすることに基づいてこの取引システム(EA)を改善できるはずです。

より良い結果と洞察を得るという点でこの記事が読者の取引の旅に役立つことを願っています、または少なくともこの記事が役に立ち、他の関連する概念についての良い洞察が得られたことを願っています。すべての人に適したツールはありません。繰り返しの確認になりますが、この記事の内容を実際の口座で使用する前に、必ず利益が得られるかテストしてください。 

この記事が役に立ったと思われ、さらに記事を読みたい方は、こちらの出版リンクから私の他の記事を読むことができます。最も人気のあるテクニカル指標に基づいて取引システムを作成する方法に関する連載やその他の記事もお役に立てば幸いです。

MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/12711

添付されたファイル |
dcSimpleEA.mq5 (0.74 KB)
dcBreakout.mq5 (0.91 KB)
MQL5.comでシグナルプロバイダーとして成功する方法 MQL5.comでシグナルプロバイダーとして成功する方法
この記事の主な目的は、MQL5.comでトップのシグナルプロバイダーになるための手順を簡単かつ正確に説明することです。私の知識と経験に基づいて、優れた戦略を見つけ、テストして最適化する方法など、成功するシグナルプロバイダーになるために何が必要かを説明します。さらに、シグナルの公開、説得力のある説明の作成、シグナルの効果的な宣伝と管理に関するヒントも提供します。
時系列の周波数領域表現:パワースペクトル 時系列の周波数領域表現:パワースペクトル
この記事では、周波数領域での時系列分析に関連する方法について説明します。予測モデルを構築する際に、時系列のパワースペクトルを調べることの有用性を強調します。この記事では、離散フーリエ変換(dft)を用いて時系列を周波数領域で分析することで得られる有用な視点のいくつかを説明します。
MQL5の圏論(第9回):モノイド作用 MQL5の圏論(第9回):モノイド作用
MQL5における圏論の実装についての連載を続けます。ここでは、前の記事で説明したモノイドを変換する手段としてモノイド作用を継続し、応用の増加につなげます。
Rebuyのアルゴリズム:多通貨取引シミュレーション Rebuyのアルゴリズム:多通貨取引シミュレーション
本稿では、多通貨の価格設定をシミュレートする数理モデルを作成し、前回理論計算から始めた取引効率を高めるメカニズム探求の一環として、分散原理の研究を完成させます。