MQL5を使用したカスタムインディケータ(平均足)の作成方法
はじめに
私たちは皆、チャートを読む必要があり、この作業に役立つツールを待ち望んでいます。チャートを読むのに役立つツールには、価格、出来高、別のテクニカル指標、またはそれらの組み合わせに基づいて計算されるインディケータが含まれますが、取引の世界には多くのアイデアが存在します。取引ターミナルには既製のインディケータが多数組み込まれています。自分の取引スタイルに適した機能を追加する必要がある場合、これらのインディケータは変更できないために課題に直面する可能性があります。さらに、インディケータは取引ターミナルに組み込まれていない場合もあります。
この記事では、iCustom関数を活用し、規約に従い、好みに基づいてカスタムインディケータを作成することで、この課題を克服する方法を紹介します。カスタム平均足テクニカル指標を作成し、このカスタムインディケータを取引システムの例で使用するための例も見ていきます。これについて、次のトピックで説明します。
前のトピックで共有した内容を理解すると、チャートの読み取りを支援し、取引システムで使用できるカスタムインディケータを作成できるようになります。MetaTrader 5取引プラットフォームに組み込まれているMQL5(MetaQuotes言語)を使用して、作成されるインディケータとEAのコードを記述します。ダウンロードして使用する方法がわからない場合は、前の記事のトピック「MetaEditorでMQL5コードを書く」をご覧になると、役立つかもしれません。
カスタムインディケータと平均足の定義
この部分では、カスタムインディケータと平均足インディケータについて詳しく学びます。前のセクションの紹介で述べたように、カスタムインディケータは、MQL5プログラミング言語を使用してユーザーが作成できるテクニカル分析ツールです。MetaTrader 5で市場の動きを分析および理解するために使用でき、情報に基づいた投資決定を支援できるものです。便利な組み込みテクニカル指標が多数ありますが、場合によっては、追加の特定の数学的、統計的、または技術的概念に基づいて市場がどのように機能するかを分析して理解する必要があり、これらの概念が組み込みインディケータに存在しないか、またはこのようなタスクを実行できるインディケータが存在しないことがあります。したがって、そのような場合には、インディケータを自分で作成する必要があります。独自の分析ツールや取引ツールを作成するのに役立つため、これをできることは、MetaTrader 5プラットフォームの特定の好みや目的を満たすための機能の1つです。
カスタムインディケータの作成を開始するために必要な手順を検討してみましょう。
MetaEditor IDEを開き、ナビゲータでIndicatorsフォルダーを選択します。
下の図に示すように、[新規作成]ボタンをクリックして新しいプログラムを作成します。
その後、次のウィンドウが開くので、作成するプログラムの種類を選択します。ここでは[カスタムインディケータ]を選択します。
[次へ]をクリックすると、以下のインディケータの詳細を含むウィンドウが開きます。ここでカスタムインディケータの名前を指定し、[次へ]をクリックします。
次のウィンドウでは、インディケータの詳細を決定します。
環境設定の設定が完了し、[次へ]をクリックしてから[完了]をクリックすると、エディターウィンドウが開きます。ここにインディケータのコードを記述します。
例として平均足を使用してカスタムインディケータを開発する方法を見ていきます。したがって、平均足テクニカル指標についてさらに学ぶ必要があります。平均足テクニカル指標は、市場の動きを提示および分析するために使用できるローソク足タイプのチャート作成方法です。他のツールと併用して効果的でより優れた洞察を得ることができ、これに基づいて、良い取引アイデアとチャンスの可能性を見つけた後、情報に基づいた取引の意思決定をおこなうことができます。
平均足チャートは通常のローソク足テクニカルチャートに似ていますが、これらのローソク足をプロットするための計算が異なります。つまり、異なる2つの方法があります。ご存知のとおり、通常のローソク足チャートでは特定期間の実際の始値、高値、安値、終値に基づいて価格を計算しますが、平均足でローソク足を計算するときには、以前の同様の価格(始値、高値、安値、終値)が考慮されます。
平均足の関連値の計算方法は次のとおりです。
- 始値=(前のローソク足の始値+前のローソク足の終値)/2
- 終値=(現在のローソク足の始値+終値+高値+安値)/4
- 高値=現在の期間の高値、始値、終値の最高値
- 安値=現在の期間の安値、始値、終値の最低値
計算に基づいて、インディケータは強気と弱気のローソク足を構築し、これらのローソク足の色は市場の関連する方向性、つまり強気か弱気かを示します。以下は伝統的な日本のローソク足と平均足を示す例です。視覚的な観点から違いを確認してください。
前のチャートのスクリーンショットでは、上部には従来のローソク足が表示され、下部には市場の方向を定義する青と赤のローソク足として表示される平均足インディケータがあります。このインディケータの計算上の目的は、誤ったシグナルを回避するためにデータを平滑化することにより、市場の動きの一部のノイズをフィルターして除去することです。
シンプルな平均足インディケータ
この部分では、MetaTrader 5で使用する単純な平均足インディケータを作成します。インディケータは価格(始値、高値、安値、終値)を継続的にチェックし、数学的計算を実行してhaOpen、haHigh、haLow、haCloseの値を生成します。計算に基づいて、インディケータはさまざまな色のローソク足としてチャート上に値をプロットします。ローソク足の方向がローソク足の場合は青、弱気の場合は赤です。ローソク足は、従来のチャートの下の別のウィンドウにサブウィンドウとして表示されます。
このカスタムインディケータを作成するために完了する必要があるすべての手順を見てみましょう。
次のように#propertyおよび識別子の値を介して追加のパラメーターを指定して、インディケータの設定を決定します。
- indicator_Separate_window:インディケータを別のウィンドウに表示します。
- indicator_buffers:インディケータ計算用のバッファの数を決定します。
- indicator_plots:インディケータ内のグラフィックシリーズの数を決定します。グラフィックシリーズは、カスタムインディケータの作成時に使用できる描画スタイルです。
- indicator_typeN:ENUM_DRAW_TYPEの値からグラフィックプロットのタイプを決定します。Nは最後のパラメータで決定したグラフィックシリーズの数で、1から始まります。
- indicator_colorN:Nの色を決定します。Nは以前に決定したグラフィックシリーズの数でもあり、1から始まります。
- indicator_widthN:Nまたはグラフィックシリーズの厚さも決定します。
- indicator_labelN:決定されたグラフィックシリーズのNにラベルを設定します。
#property indicator_separate_window #property indicator_buffers 5 #property indicator_plots 1 #property indicator_type1 DRAW_COLOR_CANDLES #property indicator_color1 clrBlue, clrRed #property indicator_width1 2 #property indicator_label1 "Heiken Ashi Open;Heiken Ashi High;Heiken Ashi Low;Heiken Ashi Close"
double型のインディケータの5つのバッファ(haOpen、haHigh、haLow、haClose、haColor)に対して5つの配列を作成します。
double haOpen[]; double haHigh[]; double haLow[]; double haClose[]; double haColor[];
OnInit()内で、この関数は実行中のインディケータを初期化するために使用されます。
int OnInit()
(SetIndexBuffer)関数を使用して、double型の1次元動的配列でインディケータバッファを並べ替えます。パラメータは次の通りです。
- Index:0から始まるインディケータバッファの番号(indicator_buffersの決定されたパラメータで宣言された値より小さい必要がある)
- buffer[]:カスタムインディケータで宣言された配列
- data_typeインディケータ配列に保存する必要があるデータ型
SetIndexBuffer(0,haOpen,INDICATOR_DATA); SetIndexBuffer(1,haHigh,INDICATOR_DATA); SetIndexBuffer(2,haLow,INDICATOR_DATA); SetIndexBuffer(3,haClose,INDICATOR_DATA); SetIndexBuffer(4,haColor,INDICATOR_COLOR_INDEX);
プロパティ識別子を指定する呼び出しのバリアントでIndicatorSetInteger関数を使用して、対応するインディケータプロパティの値を設定します。パラメータは次の通りです。
- prop_id:プロパティの識別子でENUM_CUSTOMIND_PROPERTY_INTEGERのいずれか(INDICATOR_DIGITSを指定)
- prop_value:プロパティの値(_Digitsを指定)
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
プロパティ識別子も指定する呼び出しのバリアントを使用して、対応する文字列型プロパティの値を設定します。パラメータは次の通りです。
- prop_id:プロパティの識別子でENUM_CUSTOMIND_PROPERTY_STRINGのいずれか(インディケータの短縮名を使用するにはINDICATOR_SHORTNAMEを指定)
- prop_value:プロパティの値(「Simple Heiken Ash」を指定)
IndicatorSetString(INDICATOR_SHORTNAME,"Simple Heiken Ashi");
PlotIndexSetDouble関数を使用して、対応するインディケータの対応するdouble型プロパティの値を設定します。パラメータは次の通りです。
- Lot_index:グラフィカルプロットのインデックス(0を指定)
- prop_id:ENUM_PLOT_PROPERTY_DOUBLE値の1つ(描画がない場合はPLOT_EMPTY_VALUE)
- prop_value:プロパティの値
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
次に、OnInit()関数の一部としてINIT_SUCCEEDEDを返し、初期化の成功を返して関数を終了します。
return(INIT_SUCCEEDED);
価格データを処理するためにインディケータで呼び出されるOnCalculate関数内では、現在の時間枠の時系列に基づく計算の種類が変化します。
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[])
整数のstart変数を作成し、後でその値を割り当てます。
int start;
if文を使用して、インデックス値(安値、高値、始値、終値)を返し、prev_calculatedが0に等しい場合は開始値=1を返すか、prev_calculated-1に割り当てられた開始値を返します。
if(prev_calculated==0) { haLow[0]=low[0]; haHigh[0]=high[0]; haOpen[0]=open[0]; haClose[0]=close[0]; start=1; } else start=prev_calculated-1;
計算のメインループにfor文を使用する場合、for演算子は3つの式と実行可能な演算子で構成されます。
3つの式は次のようになります。
- i=start:開始位置
- i<rates_total&&!IsStopped():ループを終了する条件。IsStopped()はインディケータの強制シャットダウンをチェックします。
- i++:1を追加して新しいiにします
ループ中に毎回実行する必要がある操作は次のとおりです。
4つのdouble変数の計算
- haOpenVal:平均足の始値
- haCloseVal:平均足の終値
- haHighVal:平均足の高値
- haLowVal:平均足の安値
前のステップで計算された値を割り当てることは、次の場合と同じです。
- haLow[i]=haLowVal
- haHigh[i]=haHighVal
- haOpen[i]=haOpenVal
- haClose[i]=haCloseVal
平均足の始値が終値を下回るかどうかを確認するには、青色のローソク足を描画するインディケータが必要です。そうでない場合は赤色のローソク足を描画します。
for(int i=start; i<rates_total && !IsStopped(); i++) { double haOpenVal =(haOpen[i-1]+haClose[i-1])/2; double haCloseVal=(open[i]+high[i]+low[i]+close[i])/4; double haHighVal =MathMax(high[i],MathMax(haOpenVal,haCloseVal)); double haLowVal =MathMin(low[i],MathMin(haOpenVal,haCloseVal)); haLow[i]=haLowVal; haHigh[i]=haHighVal; haOpen[i]=haOpenVal; haClose[i]=haCloseVal; //--- set candle color if(haOpenVal<haCloseVal) haColor[i]=0.0; else haColor[i]=1.0; }
次の呼び出しのprev_calculatedとしてrates_totalを返すことにより、関数を終了します。
return(rates_total);
次に、コードをコンパイルしてエラーがないことを確認します。以下は、1つのブロック内の完全なコードです。
//+------------------------------------------------------------------+ //| simpleHeikenAshi.mq5 | //| Copyright 2023, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2023, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #property indicator_separate_window #property indicator_buffers 5 #property indicator_plots 1 #property indicator_type1 DRAW_COLOR_CANDLES #property indicator_color1 clrBlue, clrRed #property indicator_width1 2 #property indicator_label1 "Heiken Ashi Open;Heiken Ashi High;Heiken Ashi Low;Heiken Ashi Close" double haOpen[]; double haHigh[]; double haLow[]; double haClose[]; double haColor[]; int OnInit() { SetIndexBuffer(0,haOpen,INDICATOR_DATA); SetIndexBuffer(1,haHigh,INDICATOR_DATA); SetIndexBuffer(2,haLow,INDICATOR_DATA); SetIndexBuffer(3,haClose,INDICATOR_DATA); SetIndexBuffer(4,haColor,INDICATOR_COLOR_INDEX); IndicatorSetInteger(INDICATOR_DIGITS,_Digits); IndicatorSetString(INDICATOR_SHORTNAME,"Simple Heiken Ashi"); PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0); 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[]) { int start; if(prev_calculated==0) { haLow[0]=low[0]; haHigh[0]=high[0]; haOpen[0]=open[0]; haClose[0]=close[0]; start=1; } else start=prev_calculated-1; for(int i=start; i<rates_total && !IsStopped(); i++) { double haOpenVal =(haOpen[i-1]+haClose[i-1])/2; double haCloseVal=(open[i]+high[i]+low[i]+close[i])/4; double haHighVal =MathMax(high[i],MathMax(haOpenVal,haCloseVal)); double haLowVal =MathMin(low[i],MathMin(haOpenVal,haCloseVal)); haLow[i]=haLowVal; haHigh[i]=haHighVal; haOpen[i]=haOpenVal; haClose[i]=haCloseVal; if(haOpenVal<haCloseVal) haColor[i]=0.0; else haColor[i]=1.0; } return(rates_total); }
エラーなしでコンパイルすると、次の図のように、ナビゲータウィンドウのIndicatorsフォルダーでインディケータが使用できるようになります。
次に、ダブルクリックして目的のチャート上で実行すると、インディケータ情報の共通ウィンドウが表示されます。
[カラー]タブにはデフォルト設定が表示されます。上向きの動きには青色、下向きには赤色が表示されます。必要に応じて、これらの値を編集して好みの色を設定できます。このタブは次のようになります。
[OK]を押すと、インディケータがチャートに接続され、以下の図のように表示されます。
前のチャートでわかるように、別のサブウィンドウのチャートに単純な平均足インディケータが挿入されています。これらのローソク足(強気と弱気)の方向に応じて、青と赤のローソク足があります。これで、MetaTrader 5で作成したカスタムインディケータが完成し、このカスタムインディケータを任意の取引システムで使用できるようになりました。それを簡単におこなう方法については、今後のトピックで説明します。
カスタム平均足インディケータに基づくEA
この部分では、取引システムEAでカスタムインディケータを使用する方法を学びます。インディケータの計算に従って実際の価格と異なることがすでにわかっているため、インディケータの価格(始値、高値、安値、終値)を表示できるシンプルな平均足システムを作成します。
その方法は、新しいEAを作成することを選択することです。以下は完全なコードです。
//+------------------------------------------------------------------+ //| heikenAshiSystem.mq5 | //| Copyright 2023, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2023, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" int heikenAshi; int OnInit() { heikenAshi=iCustom(_Symbol,_Period,"My Files\\Heiken Ashi\\simpleHeikenAshi"); return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { Print("Heiken Ashi System Removed"); } void OnTick() { double heikenAshiOpen[], heikenAshiHigh[], heikenAshiLow[], heikenAshiClose[]; CopyBuffer(heikenAshi,0,0,1,heikenAshiOpen); CopyBuffer(heikenAshi,1,0,1,heikenAshiHigh); CopyBuffer(heikenAshi,2,0,1,heikenAshiLow); CopyBuffer(heikenAshi,3,0,1,heikenAshiClose); Comment("heikenAshiOpen ",DoubleToString(heikenAshiOpen[0],_Digits), "\n heikenAshiHigh ",DoubleToString(heikenAshiHigh[0],_Digits), "\n heikenAshiLow ",DoubleToString(heikenAshiLow[0],_Digits), "\n heikenAshiClose ",DoubleToString(heikenAshiClose[0],_Digits)); }
このコードの違いは次の通りです。
プログラムのタイプはEAです。したがって、このプログラムの構造は次の3つの部分で構成されているため異なります。
- intOnInit():整数値を返す推奨タイプでEAの実行を初期化するために使用
- voidOnDeinit:値を返さないEAの実行を初期化解除するために使用
- voidOnTick():ティックごとに新しいクォートを処理するために使用され、値は返されません。
前の関数の範囲外で、その前に整数変数(heikenAshi)を作成しました。
int heikenAshi;
OnInit()のスコープ内で、iCustom関数の値をheikenAshi変数に割り当てました。iCustom関数は、ここでは単純な平均足となるカスタムインディケータのハンドルを返しますが、Indicatorsフォルダー内の任意のカスタムインディケータを使用できます。パラメータは次の通りです。
- symbol:銘柄(現在の銘柄(_Symbol)を使用)
- period:時間枠(現在の時間枠(_Period)を使用)
- name:カスタムインディケータの名前とMetaTrader5のIndicatorsフォルダー内のパス(「MyFiles\\HeikenAshi\\simpleHeikenAshi」を使用)
次に、初期化が成功した場合にINIT_SUCCEEDEDを返して関数を終了しました。
int OnInit() { heikenAshi=iCustom(_Symbol,_Period,"My Files\\Heiken Ashi\\simpleHeikenAshi"); return(INIT_SUCCEEDED); }
OnDeinit()関数のスコープ内で、print関数を使用して、エキスパートでEAが削除されたことを通知しました。
void OnDeinit(const int reason) { Print("Heiken Ashi System Removed"); }
OnTick()関数のスコープ内で、以下を使用してコードを完成させました。
平均足価格の4つのdouble型変数の作成(始値、高値、安値、終値)
double heikenAshiOpen[], heikenAshiHigh[], heikenAshiLow[], heikenAshiClose[];
CopyBuffer関数を使用してカスタムインディケータのバッファのデータを取得します。パラメータは次の通りです。
- indicator_handle:インディケータハンドル(heikenAshiを使用)
- buffer_num:インディケータバッファ番号(始値の場合は0、高値の場合は1、安値の場合は2、終値の場合は3を使用)
- start_pos:コピーする最初の要素の位置(現在の要素には0を使用)
- count:コピーするデータの量(ここでは1を使用し、それ以上は不必要)
- buffer[]:コピーする配列(始値の場合はheikenAshiOpen、高値の場合はheikenAshiHigh、安値の場合はheikenAshiLow、終値の場合はheikenAshiCloseを使用)。
コメント関数を使用して、現在の平均足価格(始値、高値、安値、終値)を含むチャートのコメントを取得します。
Comment("heikenAshiOpen ",DoubleToString(heikenAshiOpen[0],_Digits), "\n heikenAshiHigh ",DoubleToString(heikenAshiHigh[0],_Digits), "\n heikenAshiLow ",DoubleToString(heikenAshiLow[0],_Digits), "\n heikenAshiClose ",DoubleToString(heikenAshiClose[0],_Digits));
このコードをエラーなしでコンパイルして実行すると、EAがチャートに接続されていることがわかります。次のテスト例でも同じシグナルを受信できます。
前のチャートでわかるように、インディケータの価格がチャートの左上隅にコメントとして表示されています。
平均足-EMAシステム
このトピックでは、別の技術ツールを組み合わせて、結果がより良くなるかどうかを確認します。適用する必要があるアイデアは、価格の指数移動平均を使用してカスタムインディケータのシグナルをフィルターすることです。これをおこなうには多くの方法があります。EMAにさらに機能を追加したい場合は、EMAに別のカスタムインディケータを作成できます。その後、目的のシグナルを取得する場合と同じように、EAでiCustomとして使用できます。インディケータの値を平滑化してからシグナルを取得することで、平滑化されたインディケータを作成することもできます。EAに組み込まれているiMA関数を使用してシグナルを取得できます。ここでは簡単にするためにこの方法を使用します。
私たちがしなければならないことは、EAに現在の2つのEMA(高速および低速)と以前の高速EMAおよび平均足の値を継続的に確認させて、すべての値の位置を決定させることです。以前のheikenAshiCloseが以前のfastEMAarrayより大きく、現在のfastEMAが現在のslowEMA値より大きい場合、EAは買いシグナルとこれらの値をチャート上のコメントとして返します。以前のheikenAshiCloseが以前のfastEMAarrayを下回り、現在のfastEMAが現在のslowEMA値を下回る場合、EAは売りシグナルとこれらの値をチャート上のコメントとして返します。
このEAを作成するための完全なコードは次のとおりです。
//+------------------------------------------------------------------+ //| heikenAsh-EMASystem.mq5 | //| Copyright 2023, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2023, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" input int fastEMASmoothing=9; // Fast EMA Period input int slowEMASmoothing=18; // Slow EMA Period int heikenAshi; double fastEMAarray[], slowEMAarray[]; int OnInit() { heikenAshi=iCustom(_Symbol,_Period,"My Files\\Heiken Ashi\\simpleHeikenAshi"); return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { Print("Heiken Ashi-EMA System Removed"); } void OnTick() { double heikenAshiOpen[], heikenAshiHigh[], heikenAshiLow[], heikenAshiClose[]; CopyBuffer(heikenAshi,0,0,3,heikenAshiOpen); CopyBuffer(heikenAshi,1,0,3,heikenAshiHigh); CopyBuffer(heikenAshi,2,0,3,heikenAshiLow); CopyBuffer(heikenAshi,3,0,3,heikenAshiClose); int fastEMA = iMA(_Symbol,_Period,fastEMASmoothing,0,MODE_SMA,PRICE_CLOSE); int slowEMA = iMA(_Symbol,_Period,slowEMASmoothing,0,MODE_SMA,PRICE_CLOSE); ArraySetAsSeries(fastEMAarray,true); ArraySetAsSeries(slowEMAarray,true); CopyBuffer(fastEMA,0,0,3,fastEMAarray); CopyBuffer(slowEMA,0,0,3,slowEMAarray); if(heikenAshiClose[1]>fastEMAarray[1]) { if(fastEMAarray[0]>slowEMAarray[0]) { Comment("Buy Signal", "\nfastEMA ",DoubleToString(fastEMAarray[0],_Digits), "\nslowEMA ",DoubleToString(slowEMAarray[0],_Digits), "\nprevFastEMA ",DoubleToString(fastEMAarray[1],_Digits), "\nprevHeikenAshiClose ",DoubleToString(heikenAshiClose[0],_Digits)); } } if(heikenAshiClose[1]<fastEMAarray[1]) { if(fastEMAarray[0]<slowEMAarray[0]) { Comment("Sell Signal", "\nfastEMA ",DoubleToString(fastEMAarray[0],_Digits), "\nslowEMA ",DoubleToString(slowEMAarray[0],_Digits), "\nprevFastEMA ",DoubleToString(fastEMAarray[1],_Digits), "\nheikenAshiClose ",DoubleToString(heikenAshiClose[0],_Digits)); } } }
このコードにおける相違点は次の通りです。
ユーザー入力を作成して、ユーザーの好みに応じて高速EMA期間と低速EMA期間を設定します。
input int fastEMASmoothing=9; // Fast EMA Period input int slowEMASmoothing=18; // Slow EMA Period
fastEMAとlowEMA用に2つの配列を作成します。
double fastEMAarray[], slowEMAarray[];
CopyBufferでコピーするデータ量を3に設定して、平均足インディケータの以前の終値を取得します。
CopyBuffer(heikenAshi,0,0,3,heikenAshiOpen); CopyBuffer(heikenAshi,1,0,3,heikenAshiHigh); CopyBuffer(heikenAshi,2,0,3,heikenAshiLow); CopyBuffer(heikenAshi,3,0,3,heikenAshiClose);
移動平均インディケータのハンドルを返すiMAの組み込み関数を使用して、高速EMAと低速EMAを定義します。パラメータは次の通りです。
- symbol:現在の銘柄(_Symbolを使用)
- period:時間枠(現在の時間枠(_Period)を使用)
- ma_period:平均を平滑化するために必要な期間(入力fastEMASmoothingおよびlowEMASmoothingを使用)
- ma_shift:インディケータのシフト(0を使用)
- ma_method:移動平均のタイプ(単純移動平均にはMODE_SMAを使用)
- apply_price:計算に使用する必要な価格タイプ(PRICE_CLOSEを使用)
int fastEMA = iMA(_Symbol,_Period,fastEMASmoothing,0,MODE_SMA,PRICE_CLOSE); int slowEMA = iMA(_Symbol,_Period,slowEMASmoothing,0,MODE_SMA,PRICE_CLOSE);
ArraySetAsSeries関数を使用してAS_SERIESフラグを設定します。パラメータは次の通りです。
- array[]:配列(fastEMAarrayとslowEMAを使用)
- flag:配列のインデックス付けの方向(trueを使用)
ArraySetAsSeries(fastEMAarray,true); ArraySetAsSeries(slowEMAarray,true);
CopyBuffer関数を使用してEMAインディケータのバッファのデータを取得します。
CopyBuffer(fastEMA,0,0,3,fastEMAarray); CopyBuffer(slowEMA,0,0,3,slowEMAarray);
次はif文を使用してシグナルを返す条件です。
買いシグナルの場合
以前のheikenAshiClose>以前のfastEMAarrayおよび現在のfastEMAarray>現在のlowEMAarrayの場合、EAは買いシグナルと次の値を返します。
- fastEMA
- slowEMA
- prevFastEMA
- prevHeikenAshiClose
if(heikenAshiClose[1]>fastEMAarray[1]) { if(fastEMAarray[0]>slowEMAarray[0]) { Comment("Buy Signal", "\nfastEMA ",DoubleToString(fastEMAarray[0],_Digits), "\nslowEMA ",DoubleToString(slowEMAarray[0],_Digits), "\nprevFastEMA ",DoubleToString(fastEMAarray[1],_Digits), "\nprevHeikenAshiClose ",DoubleToString(heikenAshiClose[0],_Digits)); }
売りシグナルの場合
以前のheikenAshiClose<以前のfastEMAarrayおよび現在のfastEMAarray<現在のlowEMAarrayの場合、EAは売りシグナルと次の価格値を返します。
- fastEMA
- slowEMA
- prevFastEMA
- prevHeikenAshiClose
if(heikenAshiClose[1]<fastEMAarray[1]) { if(fastEMAarray[0]<slowEMAarray[0]) { Comment("Sell Signal", "\nfastEMA ",DoubleToString(fastEMAarray[0],_Digits), "\nslowEMA ",DoubleToString(slowEMAarray[0],_Digits), "\nprevFastEMA ",DoubleToString(fastEMAarray[1],_Digits), "\nheikenAshiClose ",DoubleToString(heikenAshiClose[0],_Digits)); } }
このコードをエラー付きでコンパイルして実行すると、次のテスト例に示すようなシグナルを取得できます。
買いシグナルの場合:
前のチャートでわかるように、左上隅にコメントとして次のシグナルがあります。
- 買いシグナル
- fastEMA
- prevFastEMA
- prevHeikenAshiClose
売りシグナルの場合:
チャート上のシグナルとして次の値があります。
- 売りシグナル
- fastEMA
- prevFastEMA
- prevHeikenAshiClose
結論
この記事で説明した内容をすべて理解していれば、独自のカスタム平均足インディケータを作成したり、好みに応じてさらに機能を追加したりできるはずです。これは、チャートを読み、理解に基づいて効果的な意思決定をおこなうのに非常に役立ちます。それに加えて、例として説明して2つの取引システムで使用したため、この作成されたカスタムインディケータをEAとして取引システムで使用できるようになります。
- 平均足システム
- 平均足-EMAシステム
この記事が役に立ち、読者がそのトピックまたは関連トピックについて良い洞察を得られたことを願っています。また、この記事で学んだことを応用してみていただければ幸いです。練習は効果的な教育プロセスにおいて非常に重要な要素であり、実践はプログラミング学習の過程で非常に役立つものとなるからです。なお、この記事や他のリソースで学んだ内容は、自分に合わない場合は有害になる可能性があるため、実際の口座で使用する前に必ずテストする必要があります。この記事の主な目的は教育のみであるため、注意が必要です。
この記事が役に立ち、もっと記事を読みたいと思われた方は、私の他の執筆記事を参照してください。それらも皆さんの役に立つことを願っています。
MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/12510
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索