English Русский 中文 Español Deutsch Português 한국어 Français Italiano Türkçe
数多くのインジケーターバッファーを使った複数通貨対応インジケーターの作成

数多くのインジケーターバッファーを使った複数通貨対応インジケーターの作成

MetaTrader 5インディケータ | 6 10月 2015, 11:21
2 941 0
Alexey Klenov
Alexey Klenov

はじめに

Theoretical Basis of Building Cluster Indicators for FOREXの記事にてクラスターインジケーターについて聞いたころから全てが始まりました。これは、その時私にとってはとても興味深く、そして、私が複数の市場の分析の観点から何か類似したものを描くことを決めました。はじめは、MultiCurrencyIndexと名付けられた、古典的なインジケータ(RSI, MACD, CCI)のレートを計算するために通貨のインデックス値が使用されるインジケーターの自分のバージョンを実行しました。

それでは、CCIを計算する代わりに、より簡潔な確率(確率的オシレーター)のインジケーターを計算するということに関して以外の、MQL5と連携し、どのようにMetaTrader5の新しいプラットフォームにこのインジケーターを移したかについて紹介したいと思います。

それではいくつかの定義から始めましょう。

ドルインデックス - ニュートロンにより提供された公式により計算されたDouble値

USDインデックスを計算するための公式,

USD / YYY に関して、USD / CHF、XXX / USD、EUR / USDなど、全ての建て値があります。

そのほかのインデックスは、USDを含むクローズ通貨ペアの値から計算されます。

メインライン - 現時点のグラフと直接関連する計算データを反映した二行のインジケーター例えば、EURUSDのグラフでは、EURとUSDの通貨になります。

補助的ライン - 現在のグラフとは関連しない、ほかの計算されたインジケーターの行。例えば、同じEURUSEDグラフにおける、GBP、CHF、JPY、CAD、AUDやNZDなどのラインとなります。

クローズ - 必要な通貨ペアにおいて、現在のタイムフレーム(Double型)のバーのクロージング価格の値

それでは始めます。


問題設定

始めるためには、まず問題の設定をする必要があります。

  1. このタイムフレームにおける影響をうける通貨ペアのグラフを同期します。
  2. 7つの通貨ペア:EURUSD、GBPUSD、USDCHF、USDJPY、USDCAD、AUDUSD、NZDUSDのクローズデータへアクセスし、それらを補助計算のため設計されたインジケーターバッファーに格納します。
  3. アイテム(2)にて得られたデータに基づき、現時点のバーのために、以下を計算します。それはドルインデックス値です。
  4. 現在のバーにおける ドルインデックス を知り、残りの通貨インデックスを計算してください。
  5. (アイテム3と4)のデータ計算を履歴の選択された長さの分の必要な回数で行います。
  6. インジケーターの方向に応じて、選択されたインデックスにおける通貨値を計算してください。
    • 相対的強弱値(相対的強弱インデックスRSI):
    • 収中 / 分散 移動平均値 (移動平均 集中 /分散 MACD);
    • 確率的オシレーター(確率的オシレーター);
    • 将来は、そのリストも補われるでしょう。

このために以下が必要です:

31インジケーターバッファー

  • 0-7 インクルーシブ - 最後の行を扱うバッファー
  • 8-14 インクルーシブ - USDを含む主要通貨ペアのバッファー
  • 15-22 インクルーシブ - 通貨インデックスのバッファー
  • 23-30 インクルーシブ - クローズ/平滑化なしのクローズ型による中間確率データのバッファー

インジケーターの方向を選択するために、 列挙型の enum を作成します。 :

enum Indicator_Type
  {
   Use_RSI_on_indexes             = 1, // RSI of the index  
   Use_MACD_on_indexes            = 2, // MACD from the index  
   Use_Stochastic_Main_on_indexes = 3  // Stochastic on the index
  };
次に、入力 コマンドを使用し、インジケーター選択ウィンドウ内リストからユーザーの選択を継承します。
input Indicator_Type ind_type=Use_RSI_on_indexes;  // type of the indicator from the index

「インプット」タブの入力パラメーター名を表示するよりユーザーに優しい方法を作ることも可能です。このためには、同行の入力パラメータの詳細の後に配置されている緊急コメントを使用します。従って、入力パラメータは、ユーザーにとってより理解しやすい名前と比べられます。

同じルールは、リスティングコマンドの enum にも当てはまります。 つまり、 例であるように、もし記憶を助けるように名前がコメントと関連していれば、記憶を呼び起こすような名前の代わりに、このコメントの内容が表示されます。 . これにより、入力パラメーターの明確な記述を持つプログラムを書くための追加の柔軟性が提供されます。

開発者は、コードに何が書かれているかという代わりに、パラメーターの理解されうる名前にすることで、MQL5プログラムを扱う便利な名前をエンドユーザーに提供しようとしています。さらに詳しくは、こちら

図1インジケーターの種類の選択

図1インジケーターの種類の選択

インジケーターとその色を扱うため、必要な通貨の選択をユーザーに提供しています。

input bool USD=true;
input bool EUR=true;
input bool GBP=true;
input bool JPY=true;
input bool CHF=true;
input bool CAD=true;
input bool AUD=true;
input bool NZD=true;

input color Color_USD = Green;            // USD line color
input color Color_EUR = DarkBlue;         // EUR line color
input color Color_GBP = Red;             // GBP line color
input color Color_CHF = Chocolate;        // CHF line color
input color Color_JPY = Maroon;           // JPY line color
input color Color_AUD = DarkOrange;       // AUD line color
input color Color_CAD = Purple;          // CAD line color
input color Color_NZD = Teal;            // NZD line color

図 2インジケーター線の色の選択

図 2インジケーター線の色の選択

いくつかの設定可能なパラメーター:

input string rem000        =  ""; // depending on the type of the indicator
input string rem0000       =  ""; // requires a value :
input int rsi_period       =   9; // period RSI
input int MACD_fast        =   5; // period MACD_fast
input int MACD_slow        =  34; // period MACD_slow
input int stoch_period_k   =   8; // period Stochastic %K
input int stoch_period_sma =   5; // period of smoothing for Stochastics %K
input int shiftbars        = 500; // number of bars for calculating the indicator

図 3. インジケーターパラメータ

図 3. インジケーターパラメータ

インジケーターの計算における500のバーの制限は人工的ですが、計算の概念を紹介するのには十分です。しかし、覚えておくべき点は、それぞれのインジケーターバッファーは、メモリを要し、とても大きな変数のサイズの表示は、コンピューターに十分なメモリを準備できない可能性があります。

インジケーターバッファー:

double  EURUSD[], // quotes
        GBPUSD[],
        USDCHF[],
        USDJPY[],
        AUDUSD[],
        USDCAD[],
        NZDUSD[];   
               
double    USDx[], // indexes
          EURx[],
          GBPx[],
          JPYx[],
          CHFx[],
          CADx[],
          AUDx[],
          NZDx[];
                         
double USDplot[], // results of currency lines
       EURplot[],
       GBPplot[],
       JPYplot[],
       CHFplot[],
       CADplot[],
       AUDplot[],
       NZDplot[]; 

double USDStoch[], // buffers of intermediate data schotastics by the close/close type without smoothing
       EURStoch[],
       GBPStoch[],
       JPYStoch[],
       CHFStoch[],
       CADStoch[],
       AUDStoch[],
       NZDStoch[];
いくつかのグローバル(インジケーターレベルの)変数が必要です:
int              i,ii;
int           y_pos=0; // Y coordinate variable for the informatory objects  
datetime   arrTime[7]; // Array with the last known time of a zero valued bar (needed for synchronization)  
int        bars_tf[7]; // To check the number of available bars in different currency pairs  
int        countVal=0; // Number of executable Rates  
int           index=0;
datetime  tmp_time[1]; // Intermediate array for the time of the bar 

それでは、次の特徴である OnInit関数を紹介し、それを用い目的に応じインジケーターバッファーを分配します。

ドルインデックスから初期の計算が通過するので、USDにおいての通貨インジケーターバッファーのレンダリングを停止する機能を確立します。

このような形です:

if(USD)
  {
   countVal++;
   SetIndexBuffer(0,USDplot,INDICATOR_DATA);               // array for rendering
   PlotIndexSetString(0,PLOT_LABEL,"USDplot");              // name of the indicator line (when selected with a mouse)
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,shiftbars);       // from which we begin rendering
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);         // drawing style (line)
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,Color_USD);       // color of line rendering
   if(StringFind(Symbol(),"USD",0)!=-1)
     {PlotIndexSetInteger(0,PLOT_LINE_WIDTH,wid_main);}    // if the symbol name contains USD 
                                                       // then draw a line of appropriate width 
   else
     {PlotIndexSetInteger(0,PLOT_LINE_STYLE,style_slave);}
   ArraySetAsSeries(USDplot,true);                       // indexation of array as a timeseries   
   ArrayInitialize(USDplot,EMPTY_VALUE);                  // zero values 
   f_draw("USD",Color_USD);                            // rendering in the indicator information window 
  }
SetIndexBuffer(15,USDx,INDICATOR_CALCULATIONS);            // array of dollar index for calculations
                                                      // (is not displayed in the indicator as a line) 
ArraySetAsSeries(USDx,true);                            // indexation of an array as a time series
ArrayInitialize(USDx,EMPTY_VALUE);                       // zero values

if(ind_type==Use_Stochastic_Main_on_indexes)
  {
   SetIndexBuffer(23,USDstoch,INDICATOR_CALCULATIONS);     // if the destination of the indicator as a Use_Stochastic_Main_on_indexes,
                                                           // then this intermediate array is needed
   ArraySetAsSeries(USDstoch,true);                        // indexation of array as a time series
   ArrayInitialize(USDstoch,EMPTY_VALUE);                  // zero values
  }
EUR通過において、 OnInit関数は このような形になります:
if(USD)
  {
   countVal++;
   SetIndexBuffer(0,USDplot,INDICATOR_DATA);              // array for rendering
   PlotIndexSetString(0,PLOT_LABEL,"USDplot");             // name of the indicator line (when selected with a mouse)
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,shiftbars);       // from which we begin rendering
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);         // drawing style (line)
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,Color_USD);       // color of line rendering
   if(StringFind(Symbol(),"USD",0)!=-1)
     {PlotIndexSetInteger(0,PLOT_LINE_WIDTH,wid_main);}    // if the symbol name contains USD 
                                                       // then draw a line of appropriate width 
   else
     {PlotIndexSetInteger(0,PLOT_LINE_STYLE,style_slave);}
   ArraySetAsSeries(USDplot,true);                       // indexation of array as a timeseries
   ArrayInitialize(USDplot,EMPTY_VALUE);                  // zero values 
   f_draw("USD",Color_USD);                             // rendering in the indicator information window 
  }
SetIndexBuffer(15,USDx,INDICATOR_CALCULATIONS);             // array of dollar index for calculations
                                                       // (is not displayed in the indicator as a line) 
ArraySetAsSeries(USDx,true);                             // indexation of an array as a time series
ArrayInitialize(USDx,EMPTY_VALUE);                        // zero values

if(ind_type==Use_Stochastic_Main_on_indexes)
  {
   SetIndexBuffer(23,USDstoch,INDICATOR_CALCULATIONS);      // if the destination of the indicator as a Use_Stochastic_Main_on_indexes,
                                                       // then this intermediate array is needed
   ArraySetAsSeries(USDstoch,true);                      // indexation of array as a time series
   ArrayInitialize(USDstoch,EMPTY_VALUE);                 // zero values
  }

if(EUR)
  {
   countVal++;
   SetIndexBuffer(1,EURplot,INDICATOR_DATA);              // array for rendering
   PlotIndexSetString(1,PLOT_LABEL,"EURplot");             // name of the indicator line (when pointed to with a mouse)
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,shiftbars);       // which we begin rendering from
   PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_LINE);         // drawing style (lines)
   PlotIndexSetInteger(1,PLOT_LINE_COLOR,Color_EUR);       // the color of rendering lines
   if(StringFind(Symbol(),"EUR",0)!=-1)
     {PlotIndexSetInteger(1,PLOT_LINE_WIDTH,wid_main);}    // if the symbol name contains EUR
                                                       // then we draw a line of the appropriate width 
   else
     {PlotIndexSetInteger(1,PLOT_LINE_STYLE,style_slave);}  // if the symbol name does NOT contain EUR,
                                                       // then we draw a line of an appropriate style (on the crosses)
   ArraySetAsSeries(EURplot,true);                       // indexation of the array as a time series
   ArrayInitialize(EURplot,EMPTY_VALUE);                  // zero values
   SetIndexBuffer(8,EURUSD,INDICATOR_CALCULATIONS);        // data of Close currency pair EURUSD
   ArraySetAsSeries(EURUSD,true);                        // indexation of the array as a time series
   ArrayInitialize(EURUSD,EMPTY_VALUE);                   // zero values
   SetIndexBuffer(16,EURx,INDICATOR_CALCULATIONS);         // array of the EURO index for calculations
                                                      // (not displayed on the indicator as a line) 
   ArraySetAsSeries(EURx,true);
   ArrayInitialize(EURx,EMPTY_VALUE);
   if(ind_type==Use_Stochastic_Main_on_indexes)
     {
      SetIndexBuffer(24,EURstoch,INDICATOR_CALCULATIONS);   // if the indicator destination as a Use_Stochastic_Main_on_indexes,
                                                       // then this intermediate array is needed
      ArraySetAsSeries(EURstoch,true);                   // indexation of the array as a time series
      ArrayInitialize(EURstoch,EMPTY_VALUE);              // zero values
     }
   f_draw("EUR",Color_EUR);                            // rendering in the indicator information window
  }
EURと同様、コードは、GBP、JPY、CHF、CAD、AUD、NZDなどの通貨と類似し、インジケーターバッファーのインデックスをシフトさせます。これらの通貨のコードは、インジケーターの添付ファイルに見受けられます。

これにより、インジケーターの初期化の記述を完成させます。

次に、カスタムユーザーの特徴を必要とします:

  • ユーザーのバッファーにおけるRSIの計算
  • MACDの計算
  • ユーザーバッファーのSMAの計算
  • クローズ / 平滑化クローズの確立の計算
  • (情報)オブジェクトのレンダリング
  • インジケーター(ステータスインジケーター)の下部右端のコメント
  • 影響下にあるTF通貨ペアの初期化

これらの簡潔な記述:

  • ユーザーのバッファーにおけるRSIの計算

入力パラメータ:

double f_RSI(double &buf_in[], int period,int shift),

buf_in[] - 配列型のDouble (時系列のような形), period - インジケーターピリオドRSI, shift - そのインデックスバーのために、インジケーターを計算します。Double型の値を返します。

  • MACDの計算

入力パラメータ:

double f_MACD(double &buf_in[], int period_fast,int period_slow,int shift),

buf_in[] - Double型の配列 (時系列のようなもの), period_fast - ピリオドファストMA、 period_slow - ピリオドスローМА, shift - そのインデックスバーのためにインジケーターを計算します。Double型の値を返します。

  • Calculation of SMA

入力パラメータ:

double SimpleMA(const int position,const int period,const double &price[]),

where position - そのインデックスバーのためにインジケーターを計算します。period - インジケーターSMAのピリオド、 price[] - (時系列のような)Double型の配列Double型の値を返します。

  • クローズ / 平滑化クローズの確立の計算

入力パラメータ:

double f_Stoch(double &price[], int period_k, int shift),

where price[] - (時系列のような)double型配列、period_fast - ピリオド %Kインジケーターライン、shift - そのインデックスバーのためにインジケーターを計算しますDouble型の値を返します。

  • オブジェクトのレンダリング

入力パラメータ:

int f_draw(string name, color _color)

where name - オブジェクト名, _color - オブジェクトの色. この関数は、情報提供を目的としています。ウィンドウディスプレイの上部右端から始まり下に下がるように、この関数が影響の受ける通貨の名前を表示します。通貨のテキストは、この通貨に関連するインジケーターのラインと同じ色です。

  • コメントは、インジケーターの下部右端になります。

入力パラメータ:

int f_comment(string text)

text - インジケーターの下部右端に位置する必要のあるテキストインジケーターの処理のステータスバー

最後に、最も重要な機能の一つです:

  • 影響下にあるTF通貨ペアの初期化

入力パラメーター無し

MetaTrader 5では、履歴は、すべてのツールのためにTFの分単位データの形式で保存されています。それゆえ、プログラムを開始する前に、同様のTFの分ごとのデータに基づき必要なグラフが構築されます。構築は、現在のトラッフィクTFが

結果:

  • ターミナルが初めて起動している際、使用される通貨ペアの必要なTFの構築(おそらく、バックグラウンドで見ない場合でも)に時間が少々必要な場合があります。
  • 正確にインジケーターの表示を行うために、影響下にある通貨のために0バーを同期化してください。言い換えれば、もしグラフに新規バーを開く(例えば、時間ばー)新しいティックがあれば、(新しい時間単位の)バーを開くその他の通貨ペアのためのティックを待つ必要があります。それでは、新規バーのためのインジケーターの計算に進みます。

この作業の始めの部分は、 組み込まれている Bars 関数を用い実行されます。 履歴内のこの関数は一致する期間によってバー数をシンボルに返します。以下に示されている関数のバージョンを使用すれば十分です。

int  Bars(
   string          symbol_name,   // symbol name
   ENUM_TIMEFRAMES   timeframe    // period
   );

この配列のために特別に宣言されており、すべての影響下にある通貨ペアのためのバーの数を収集します。必要最小限の量の履歴における変数をチェックします。(インジケーターのパラメーターの「インジケーターの計算のためのバー数」の変数)もし、履歴内のバー数がこの変数の値より少なければ、構築は失敗であり、データの数を再度実験する必要があります。一旦、すべての通貨ペアのための、ユーザーに要求された以上多くの履歴データがあれば、この初期化は成功したと考えられます。

二番目の同期化のタスクは、 CopyTime関数を用いることで実行されます。

この目的のために作成された配列に、それぞれの金融商品の0バーの開始時をコピーし格納します。もし、この配列のすべての要素が同じであり、0と等しくなければ、0バーが同期されたと考え、計算を始めましょう。これがどのように実行されているか詳しく理解するために、添付されたインジケーターのコードを見てください。

これは追加関数の記述をまとめており、 OnCalculate関数の実行に移ります。複数通貨のインジケーターであるので、この関数のリクエストの二番目のバージョンを必要とします。

int OnCalculate(const int     rates_total, // size of incoming time series
                const int prev_calculated, // processing of bars on the previous request
                const datetime&    time[], // Time
                const double&      open[], // Open
                const double&      high[], // High
                const double&       low[], // Low
                const double&     close[], // Close
                const long& tick_volume[], // Tick Volume
                const long&      volume[], // Real Volume
                const int&       spread[]  // Spread
   );

計算に必要なバーの量を決定してください:

int limit=shiftbars;

   if(prev_calculated>0)
     {limit=1;}
   else
     {limit=shiftbars;}

通貨ペアのグラフの同期化:

init_tf();

次に、 CopyClose 関数を使用すると、必要な通貨ペアのクローズデータをコピーし、これに特別要されるインジケーターバッファーへ格納します。(現在のツールやその他のツールのTFのデータへのより多くのアクセスは Help で得られます。)

もし、なんらかの理由で、関数がデータをコピーせず−1の答えを返した場合、通貨ペアエラーメッセージをコメントに表示させ、現金融商品の新しいティックの受信を待ちます。

if (EUR){copied=CopyClose("EURUSD",PERIOD_CURRENT,0,shiftbars,EURUSD); if (copied==-1){f_comment("Wait...EURUSD");return(0);}}
   if (GBP){copied=CopyClose("GBPUSD",PERIOD_CURRENT,0,shiftbars,GBPUSD); if (copied==-1){f_comment("Wait...GBPUSD");return(0);}}
   if (CHF){copied=CopyClose("USDCHF",PERIOD_CURRENT,0,shiftbars,USDCHF); if (copied==-1){f_comment("Wait...USDCHF");return(0);}}
   if (JPY){copied=CopyClose("USDJPY",PERIOD_CURRENT,0,shiftbars,USDJPY); if (copied==-1){f_comment("Wait...USDJPY");return(0);}}
   if (AUD){copied=CopyClose("AUDUSD",PERIOD_CURRENT,0,shiftbars,AUDUSD); if (copied==-1){f_comment("Wait...AUDUSD");return(0);}}
   if (CAD){copied=CopyClose("USDCAD",PERIOD_CURRENT,0,shiftbars,USDCAD); if (copied==-1){f_comment("Wait...USDCAD");return(0);}}
   if (NZD){copied=CopyClose("NZDUSD",PERIOD_CURRENT,0,shiftbars,NZDUSD); if (copied==-1){f_comment("Wait...NZDUSD");return(0);}}  

次に、生産する(0から続く)サイクル:

  • ドルインデックスの計算:
  • 現バーにおけるクローズ、ドルインデックスに基づく、その他の通貨のインデックスの計算
for (i=limit-1;i>=0;i--)
   {
      //calculation of USD index
      USDx[i]=1.0;
      if (EUR){USDx[i]+=EURUSD[i];}         
      if (GBP){USDx[i]+=GBPUSD[i];}
      if (CHF){USDx[i]+=1/USDCHF[i];}
      if (JPY){USDx[i]+=1/USDJPY[i];}
      if (CAD){USDx[i]+=1/USDCAD[i];}
      if (AUD){USDx[i]+=AUDUSD[i];}
      if (NZD){USDx[i]+=NZDUSD[i];}
      USDx[i]=1/USDx[i];
      //calculation of other currency values
      if (EUR){EURx[i]=EURUSD[i]*USDx[i];}
      if (GBP){GBPx[i]=GBPUSD[i]*USDx[i];}
      if (CHF){CHFx[i]=USDx[i]/USDCHF[i];}
      if (JPY){JPYx[i]=USDx[i]/USDJPY[i];}
      if (CAD){CADx[i]=USDx[i]/USDCAD[i];}
      if (AUD){AUDx[i]=AUDUSD[i]*USDx[i];}
      if (NZD){NZDx[i]=NZDUSD[i]*USDx[i];}
   }

データは、適切なインジケーターバッファーに配置されます。 どの種類のインジケーターがユーザーにより初期化中に選択されたかチェックし、それに基づき、関連した計算を生産してください。

もしインデックスのRSIをみたいということが示された場合、以下のコードを実行してください。

if (ind_type==Use_RSI_on_indexes)
   {
      if (limit>1){ii=limit - rsi_period - 1;}
      else{ii=limit - 1;}
      for(i=ii;i>=0;i--)
         {
            if (USD){USDplot[i]=f_RSI(USDx,rsi_period,i);}
            if (EUR){EURplot[i]=f_RSI(EURx,rsi_period,i);}
            if (GBP){GBPplot[i]=f_RSI(GBPx,rsi_period,i);}
            if (CHF){CHFplot[i]=f_RSI(CHFx,rsi_period,i);}
            if (JPY){JPYplot[i]=f_RSI(JPYx,rsi_period,i);}
            if (CAD){CADplot[i]=f_RSI(CADx,rsi_period,i);}
            if (AUD){AUDplot[i]=f_RSI(AUDx,rsi_period,i);}
            if (NZD){NZDplot[i]=f_RSI(NZDx,rsi_period,i);}                  
         }
   }  

インデックスによるMACDを見る場合、こちらをご覧ください(ただ、SimpleMAに基づき実行されているにすぎず、のちにEMAに基づいた実行を行います。)

if (ind_type==Use_MACD_on_indexes)
   {
      if (limit>1){ii=limit - MACD_slow - 1;}
      else{ii=limit - 1;}
      for(i=ii;i>=0;i--)
         {
           if (USD){USDplot[i]=f_MACD(USDx,MACD_fast,MACD_slow,i);}
           if (EUR){EURplot[i]=f_MACD(EURx,MACD_fast,MACD_slow,i);}
           if (GBP){GBPplot[i]=f_MACD(GBPx,MACD_fast,MACD_slow,i);}
           if (CHF){CHFplot[i]=f_MACD(CHFx,MACD_fast,MACD_slow,i);}
           if (JPY){JPYplot[i]=f_MACD(JPYx,MACD_fast,MACD_slow,i);}
           if (CAD){CADplot[i]=f_MACD(CADx,MACD_fast,MACD_slow,i);}
           if (AUD){AUDplot[i]=f_MACD(AUDx,MACD_fast,MACD_slow,i);}
           if (NZD){NZDplot[i]=f_MACD(NZDx,MACD_fast,MACD_slow,i);}                  
         }
   }

確立であれば、line%Kをまず計算し、それから、SimpleMAメソッドによる平滑化してください。最後の平滑化ラインは、グラフに表示されます。

if (ind_type==Use_Stochastic_Main_on_indexes)
   {
      if (limit>1){ii=limit - stoch_period_k - 1;}
      else{ii=limit - 1;}
      for(i=ii;i>=0;i--)
         {
           if (USD){USDstoch[i]=f_Stoch(USDx,rsi_period,i);}
           if (EUR){EURstoch[i]=f_stoch(EURx,stoch_period_k,i);}
           if (GBP){GBPstoch[i]=f_stoch(GBPx,stoch_period_k,i);}
           if (CHF){CHFstoch[i]=f_stoch(CHFx,stoch_period_k,i);}
           if (JPY){JPYstoch[i]=f_stoch(JPYx,stoch_period_k,i);}
           if (CAD){CADstoch[i]=f_stoch(CADx,stoch_period_k,i);}
           if (AUD){AUDstoch[i]=f_stoch(AUDx,stoch_period_k,i);}
           if (NZD){NZDstoch[i]=f_stoch(NZDx,stoch_period_k,i);}                  
         }
      if (limit>1){ii=limit - stoch_period_sma - 1;}
      else{ii=limit - 1;}
      for(i=ii;i>=0;i--)
         {
            if (USD){USDplot[i]=SimpleMA(i,stoch_period_sma,USDstoch);}
            if (EUR){EURplot[i]=SimpleMA(i,stoch_period_sma,EURstoch);}
            if (GBP){GBPplot[i]=SimpleMA(i,stoch_period_sma,GBPstoch);}
            if (CHF){CHFplot[i]=SimpleMA(i,stoch_period_sma,CHFstoch);}
            if (JPY){JPYplot[i]=SimpleMA(i,stoch_period_sma,JPYstoch);}
            if (CAD){CADplot[i]=SimpleMA(i,stoch_period_sma,CADstoch);}
            if (AUD){AUDplot[i]=SimpleMA(i,stoch_period_sma,AUDstoch);}
            if (NZD){NZDplot[i]=SimpleMA(i,stoch_period_sma,NZDstoch);}                  
          }                     
   }      

これでインジケーターの計算終了です。図4-6 異なる種類のインジケーターのいくつかの図を示しています。

図4インデックスによるRSI

図4インデックスによるRSI

図5通貨インデックスによるMACD

図5通貨インデックスによるMACD

図6通貨インデックスによる確率

図6通貨インデックスによる確率


結論

MultiCurrencyIndex インジケーターを実行する中で、コードを単純化するMQL5のインジケーターバッファーを無数に使用しました。この記事は、そのようなアプローチの一つの例となります。インジケーターの信頼されるデータのために、0バーに関連するう異なる金融商品の同期化を行うアルゴリズムを紹介しています。インジケーターと連携するシンボルに関連するその他金融商品からデータへアクセスするアルゴリズムの一つを紹介しました。

この記事の目的は、多くのインジケーターバッファーを利用することについて紹介しましたので、上記のユーザーのデータ配列によるインジケーターの計算を行う関数は、読者に過重な負担を背負わせることを避ける最適な方法ではありませんでした。ただ、必要な計算を実行するには十分だったと思います。

Forex市場のクラスター分析の利点と欠点はたくさんあります。この手法に基づく、トレーディングシステムは、自由に使用可能であり、MQL4.Communityを含めた様々なForumにて議論がなされています。それゆえ、このインジケーターによるトレーディングの原則はこの記事では考察されていません。

MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/83

添付されたファイル |
ポジション中心のMetaTrader5の環境での注文追跡管理機能付き注文マネージャー ポジション中心のMetaTrader5の環境での注文追跡管理機能付き注文マネージャー
このクラスライブラリは、MetaTrader5のエキスパートアドバイザーに追加し、MetaTrader5のポジション中心のアプローチと比べ、MetaTrader4と類似したオーダー中心のアプローチに書き換えることができます。各ポジションの保護のために、ブローカーによるストップを維持する一方、MetaTrader5のターミナルにて注文を管理することで、上記を実現します。
MQL4からMQL5への移植 MQL4からMQL5への移植
本稿はMQL4言語関数の簡単なガイドです。MQL4からMQL5へプログラムを移植するのに役立つことでしょう。MQL4関数(トレーディング関数以外)にはそれぞれ記述とMQL5実装が存在します。そのため移行時間が大幅に削減されます。利便性を考え、MQL4関数はグループ分けされておりMQL4参照に似た形になっています。
平均足インジケーターに基づくトレーディングシステムの例 平均足インジケーターに基づくトレーディングシステムの例
この記事は、トレーディングにおける平均足インジケーターの使用についての疑問を詳しく見ていきます。このインジケーターに基づき、簡単な取引システムが検討され、MQL55アドバイザーが記述されました。取引処理は、Standardクラスライブラリに基づき実行されます。トレーディング戦略のテスト結果は、履歴に基づき、内蔵MetaTrader5ストラテジーテスター使用し、取得されます。
MetaTrader 5:ビログやSNS、専門サイトなどのトレーディング予想とライブトレーディング内容のメール配信 MetaTrader 5:ビログやSNS、専門サイトなどのトレーディング予想とライブトレーディング内容のメール配信
この記事は、Meta Trader 5を使用したトレード予想の投稿に関する完成されたソリューションについて紹介することを目的としています。様々なアイディアをカバーしており、Meta Traderにおける記述文を投稿する専門サイトを使用することから、Webプログラミングなしで視覚的にWebサイトを構築したり、分析者を読者がフォローすることができるSNSサービスとの統合まで行うことができます。ここで紹介されているソリューションは、完全無料提供されており、eメールやftpサービスの基礎的な知識を持っている人なら誰でもセットアップすることが可能です。専門的なホスティング技術や、トレーディング予想サービスと同様のものを使用することができ、全く障害がありません。