
グラフィックコントロールオプションを用いたインディケータ作成
はじめに
マーケットの動きに通じた方はMACDインディケータ(移動平均収束拡散)をご存じでしょう。価格の変動を分析するのに力強いツールで、コンピュータ分析手法が登場したごく初期段階からトレーダーに利用されているものです。
私はチャートで位置を勝ち取ったMACDについて長らく研究をしてきました。異なるオプションや計算アルゴリズムを伴う異なるタイプのインディケータをたくさん見てきました。そして、知っている限りのタイプを一つのインディケータにまとめようと決めました。
MACDインディケータのタイプ
インディケータには従来のMACDラインとoSMA ヒストグラムがあります。MACDの主な変更を明確にします。
- エルダーのMACDはまたインパルスシステムとして知られています。
- 変動ラインによってチェックされないエルダーのMACD
- oSMAは成長や低下を異なる色でプロットされます。
- oSMAヒストグラムのみプロットされます。
- MACDラインのみプロットされます。
インディケータの初期設定
計算には以下のパラメータが必要です。
- ファーストMACDラインの値
- スローMACDラインの値
- シグナルMACDラインの値
- エルダー手法によるトレンド特定ラインの値
このインディケータをプロットするには、以下が必要です。
- MACDライン
- シグナルイン
- 3色OSMAヒストグラム
MQL5ウィザードのメニューに移動します。
図1 MQL5ウィザードを用いたインディケータ作成
図2 MQL5ウィザードでの共通インディケータパラメータの定義
図32 MQL5ウィザードでのインディケータの描画プロパティの定義
インディケータの作成
インディケータの初期テンプレートを入手しました。まず、われわれのインディケータでMACDラインを計算します。
このラインの計算にあたり、あまり厳密に式を深く掘り下げません。iMACD関数を使用します。
int iMACD ( string symbol, // symbol name ENUM_TIMEFRAMES period, // time period int fast_ema_period, // fast averaging period int slow_ema_period, // slow averaging period int signal_period, // averaging period of a signal line ENUM_APPLIED_PRICE applied_price // type of price or a handle )
この関数はインディケータの適切なコピーのハンドルを返します。このハンドルを使用すると、インディケータの計算されたデータ取得が可能です。インディケータバッファからのデータ(テクニカルインディケータはインディケータにより5個まで自身の内部バッファに計算されたデータを保持します)は、CopyBuffer()関数によってコピーが可能です。
次にiMACD関数を使って、MACDデータを要求します。
int MACDhadling = iMACD(NULL,0,Fast,Slow,Signal,PRICE_CLOSE);
それはインディケータコピーのハンドルを返します。
CopyBuffer関数により必要なバッファにデータをコピーします。
int CopyBuffer( int indicator_handle, // indicator's handle int buffer_num, // buffer number of the indicator int start_pos, // start position int count, // number of data to copy double buffer[] // target array for the data to copy );
ここで、インディケータのMACDラインを要求します。
CopyBuffer(MACDhadling,0,0,NewData,MACDlineBuffer);
インディケータのシグナルラインを取得します。
CopyBuffer(MACDhadling,1,0,NewData,SignallineBuffer);
すべてを集めて取得したものがなにか確認します。
int MACDhadling=iMACD(NULL,0,Fast,Slow,Signal,PRICE_CLOSE); CopyBuffer(MACDhadling,0,0,rates_total,MACDlineBuffer); CopyBuffer(MACDhadling,1,0,rates_total,SignallineBuffer);
今手元にあるのは計算したMACDとシグナルラインです。
それでは続けましょう。
以下からのデータは下記のようである事実により
MACDlineBuffer
バッファと
SignallineBuffer
バッファはコピーにより取得され、そのインデックスはチャートの最後からきています。
これまでの経験から価格配列データへのアクセスはデータの最後から行われます。物理的には、新規データは常に配列の最後尾に書かれますが、現在の(未完了)バーインデックスは常にゼロとなっています。時間連続配列における0に等しいインデックスは、現在バーのデータを指し、それは時間枠の未完了の時間インターバルに対応しています。
すべてのバッファ内で同一のインデックス方向を使用するには、その他のバッファを時系列として定義する必要があります
ArraySetAsSeries(HistogramBuffer,false); ArraySetAsSeries(HistogramColors,false);
ヒストグラムデータを取得する必要があります。それはMACDラインからのシグナルラインの減算を使って計算されます。
for(int i=0;i<rates_total;i++) { HistogramBuffer[i]=MACDlineBuffer[i]-SignallineBuffer[i]; }
すべてを組み合わせます。
ArraySetAsSeries(HistogramBuffer,false); ArraySetAsSeries(HistogramColors,false); int MACDhadling=iMACD(NULL,0,Fast,Slow,Signal,PRICE_CLOSE); CopyBuffer(MACDhadling,0,0,rates_total,MACDlineBuffer); CopyBuffer(MACDhadling,1,0,rates_total,SignallineBuffer); for(int i=0;i<rates_total;i++) { HistogramBuffer[i]=MACDlineBuffer[i]-SignallineBuffer[i]; HistogramColors[i]=1; }
インディケータコントロールのグラフィックシステム作成
このインディケータには5種類あります。
まず、 №3と№4を取り入れます。
3. oSMAヒストグラムのみプロットされます。
4. MACDラインのみプロットされます。
適切なボタンを作成します。
No.4に
ObjectCreate(0,"ShowMACD",OBJ_BUTTON,ChartWindowFind(),100,100); //creating the button ObjectSetInteger(0,"ShowMACD",OBJPROP_XDISTANCE,75); //assign the coordinates ObjectSetInteger(0,"ShowMACD",OBJPROP_YDISTANCE,5); ObjectSetInteger(0,"ShowMACD",OBJPROP_CORNER,CORNER_RIGHT_UPPER); // and an anchor point ObjectSetString(0,"ShowMACD",OBJPROP_TEXT,"ShowMACD"); // button label ObjectSetInteger(0,"ShowMACD",OBJPROP_FONTSIZE,8); ObjectSetInteger(0,"ShowMACD",OBJPROP_XSIZE,70); // size of buttons ObjectSetInteger(0,"ShowMACD",OBJPROP_YSIZE,20); ObjectSetInteger(0,"ShowMACD",OBJPROP_SELECTABLE,false); // to make it selectable
誤ってボタンを削除した場合、または次のティックで位置が変わった場合、ボタンは元に戻ります。
No.3には
ObjectCreate(0,"ShowOsMA",OBJ_BUTTON,ChartWindowFind(),100,100); ObjectSetInteger(0,"ShowOsMA",OBJPROP_XDISTANCE,75); ObjectSetInteger(0,"ShowOsMA",OBJPROP_YDISTANCE,30); ObjectSetInteger(0,"ShowOsMA",OBJPROP_CORNER,CORNER_RIGHT_UPPER); ObjectSetString (0,"ShowOsMA",OBJPROP_TEXT,"Show OsMA"); ObjectSetInteger(0,"ShowOsMA",OBJPROP_FONTSIZE,8); ObjectSetInteger(0,"ShowOsMA",OBJPROP_XSIZE,70); ObjectSetInteger(0,"ShowOsMA",OBJPROP_YSIZE,20); ObjectSetInteger(0,"ShowOsMA",OBJPROP_SELECTABLE,false);
条件4でボタンが押されるあるいは押されないの場合にそなえ実装を作成します。
これはバッファインデックスの閲覧を要求します。
SetIndexBuffer(0,MACDlineBuffer,INDICATOR_DATA); SetIndexBuffer(1,SignallineBuffer,INDICATOR_DATA); SetIndexBuffer(2,HistogramBuffer,INDICATOR_DATA); SetIndexBuffer(3,HistogramColors,INDICATOR_COLOR_INDEX);
if(ObjectGetInteger(0,"ShowMACD",OBJPROP_STATE)!=1) { PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_NONE); // the buffer with index 0 isn't plotted PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_NONE); // the buffer with index 1 isn't plotted } else { PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE); // the buffer with index 0 is plotted as line PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_LINE); // the buffer with index 1 is plotted as line }
MACDラインのみプロットされます。
条件3でボタンが押されるあるいは押されないの場合にそなえ実装を作成します。
if(ObjectGetInteger(0,"ShowOsMA",OBJPROP_STATE)!=1) { //the buffer with index 2 isn't plotted PlotIndexSetInteger(2,PLOT_DRAW_TYPE,DRAW_NONE); } else { //the buffer with index 2 is plotted as a color histogram PlotIndexSetInteger(2,PLOT_DRAW_TYPE,DRAW_COLOR_HISTOGRAM); }
ボタンを2つ作成します。『2色』および『インパルス』、そしてチャートの右下の角に配置します。
ObjectCreate(0,"2color",OBJ_BUTTON,ChartWindowFind(),100,100); ObjectSetInteger(0,"2color",OBJPROP_XDISTANCE,75); ObjectSetInteger(0,"2color",OBJPROP_YDISTANCE,50); ObjectSetInteger(0,"2color",OBJPROP_CORNER,CORNER_RIGHT_LOWER); ObjectSetInteger(0,"2color",OBJPROP_FONTSIZE,8); ObjectSetInteger(0,"2color",OBJPROP_XSIZE,70); ObjectSetInteger(0,"2color",OBJPROP_YSIZE,20); ObjectSetInteger(0,"2color",OBJPROP_SELECTABLE,false); ObjectSetString (0,"2color",OBJPROP_TEXT,"MultiColor"); ObjectCreate(0,"Impulse",OBJ_BUTTON,ChartWindowFind(),100,100); ObjectSetInteger(0,"Impulse",OBJPROP_XDISTANCE,75); ObjectSetInteger(0,"Impulse",OBJPROP_YDISTANCE,25); ObjectSetInteger(0,"Impulse",OBJPROP_CORNER,CORNER_RIGHT_LOWER); ObjectSetInteger(0,"Impulse",OBJPROP_FONTSIZE,8); ObjectSetInteger(0,"Impulse",OBJPROP_XSIZE,70); ObjectSetInteger(0,"Impulse",OBJPROP_YSIZE,20); ObjectSetInteger(0,"Impulse",OBJPROP_SELECTABLE,false);
エルダーシステムによるImpuse確認には、EldersMA値が配置される場所に新規配列を追加します。
そのため、バッファの総数をone.+によって増やす必要があります。
#property indicator_buffers 4
は以下に変更する必要があります。
#property indicator_buffers 5
そして新規バッファを宣言します。
double EldersiEMA[];
それを内部計算用バッファと定義します。
SetIndexBuffer(4,EldersiEMA,INDICATOR_CALCULATIONS);
それでは、バッファに指数移動平均値をコピーします。
// you can do all in single line CopyBuffer(iMA(NULL,0,EldersEMA,0,MODE_EMA,PRICE_CLOSE),0,0,rates_total,EldersiEMA);
バッファはコピー関数によって取得されるため、そのインデックスはチャート上の他のバッファと同様、チャートのentからです。
ここで、2色OsMAの条件を書きます。
if (ObjectGetInteger(0,"2color",OBJPROP_STATE)) { for(int i=1;i<rates_total;i++) { // if the histogram rises, the color is set to 0 if(HistogramBuffer[i] > HistogramBuffer[i-1]) HistogramColors[i]=0; // if the histogram falls, the color is set to 1 if(HistogramBuffer[i] < HistogramBuffer[i-1]) HistogramColors[i]=1; } } else { ObjectSetString(0,"2color",OBJPROP_TEXT,"MultiColor"); // Here are the conditions for multi-color OSMA }
色のインデックスは行で指定されます。
#property indicator_label3 "Histogram" #property indicator_type3 DRAW_COLOR_HISTOGRAM #property indicator_color3 DeepSkyBlue,Red,Green
最初の色のインデックスは0です。二色目のインデックスは1、となっていきます。
インパルス システムのバリエーションについての条件を書きます。
if (ObjectGetInteger(0,"Impulse",OBJPROP_STATE)) // // "Impulse" button is checked { ObjectSetString(0,"Impulse",OBJPROP_TEXT,"Impulse"); // checking for a trend using the MACD-Line for(int i=1;i<rates_total;i++) { // the histogram rises and MACD-line rises if((HistogramBuffer[i]>HistogramBuffer[i-1]) && (MACDlineBuffer[i]>MACDlineBuffer[i-1])) HistogramColors[i]=0; else { // the histogram falls and MACD-line falls if((HistogramBuffer[i]<HistogramBuffer[i-1]) && (MACDlineBuffer[i]<MACDlineBuffer[i-1])) HistogramColors[i]=1; else HistogramColors[i]=2; // if there isn't any conditions satisfied } } } else { ObjectSetString(0,"Impulse",OBJPROP_TEXT,"Elder's"); // checking for a trend using the EMA-line for(int i=1;i<rates_total;i++) { // the histogram rises and EMA-line rises if((HistogramBuffer[i]>HistogramBuffer[i-1]) && (EldersiEMA[i]>EldersiEMA[i-1])) HistogramColors[i]=0; else { // the histogram falls and EMA-line falls if((HistogramBuffer[i]<HistogramBuffer[i-1]) && (EldersiEMA[i]<EldersiEMA[i-1])) HistogramColors[i]=1; else HistogramColors[i]=2;// if there isn't any conditions satisfied } } }
OsMA plotting 条件にインパルスシステム条件を追加します。
if (ObjectGetInteger(0,"2color",OBJPROP_STATE)) { for(int i=1;i<rates_total;i++) { if(HistogramBuffer[i] > HistogramBuffer[i-1]) HistogramColors[i]=0; if(HistogramBuffer[i] < HistogramBuffer[i-1]) HistogramColors[i]=1; } } else { ObjectSetString(0,"2color",OBJPROP_TEXT,"MultiColor"); if(ObjectGetInteger(0,"Impulse",OBJPROP_STATE)) { ObjectSetString(0,"Impulse",OBJPROP_TEXT,"Impulse"); for(int i=1;i<rates_total;i++) { if((HistogramBuffer[i]>HistogramBuffer[i-1]) && (MACDlineBuffer[i]>MACDlineBuffer[i-1])) HistogramColors[i]=0; else { if((HistogramBuffer[i]<HistogramBuffer[i-1]) && (MACDlineBuffer[i]<MACDlineBuffer[i-1])) HistogramColors[i]=1; else HistogramColors[i]=2; } } } else { ObjectSetString(0,"Impulse",OBJPROP_TEXT,"Elder's"); for(int i=1;i<rates_total;i++) { if((HistogramBuffer[i]>HistogramBuffer[i-1]) && (EldersiEMA[i]>EldersiEMA[i-1])) HistogramColors[i]=0; else { if((HistogramBuffer[i]<HistogramBuffer[i-1]) && (EldersiEMA[i]<EldersiEMA[i-1])) HistogramColors[i]=1; else HistogramColors[i]=2; } } } }
不要なボタンフラッシュを防ぐ条件を書きます。
if (ObjectGetInteger(0,"2color",OBJPROP_STATE)) ObjectSetString (0,"2color",OBJPROP_TEXT,"2ColorMACD"); else ObjectSetString(0,"2color",OBJPROP_TEXT,"MultiColor"); if (ObjectGetInteger(0,"Impulse",OBJPROP_STATE)) ObjectSetString (0,"Impulse",OBJPROP_TEXT,"Impulse"); else ObjectSetString(0,"Impulse",OBJPROP_TEXT,"Elder's")
コードを削除しました。それはボタンのテクストを変えます。
すべてを組み合わせます。
//+------------------------------------------------------------------+ //| MACD_By_CoreWinTT.mq5 | //| Copyright 2010, MetaQuotes Software Corp. | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "2010, MetaQuotes Software Corp." #property link "http://www.mql5.com" #property version "1.00" #property indicator_separate_window #property indicator_buffers 5 #property indicator_plots 3 //---- plot MACDline #property indicator_label1 "MACDline" #property indicator_type1 DRAW_LINE #property indicator_color1 Green #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //---- plot Signalline #property indicator_label2 "Signalline" #property indicator_type2 DRAW_LINE #property indicator_color2 Red #property indicator_style2 STYLE_SOLID #property indicator_width2 1 //---- plot Histogram #property indicator_label3 "Histogram" #property indicator_type3 DRAW_COLOR_HISTOGRAM #property indicator_color3 DeepSkyBlue,Red,Green #property indicator_style3 STYLE_SOLID #property indicator_width3 2 //--- input parameters input int Fast=12; input int Slow=26; input int Signal=9; input int EldersEMA=13; //--- indicator buffers double MACDlineBuffer[]; double SignallineBuffer[]; double HistogramBuffer[]; double HistogramColors[]; double EldersiEMA[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping SetIndexBuffer(0,MACDlineBuffer,INDICATOR_DATA); SetIndexBuffer(1,SignallineBuffer,INDICATOR_DATA); SetIndexBuffer(2,HistogramBuffer,INDICATOR_DATA); SetIndexBuffer(3,HistogramColors,INDICATOR_COLOR_INDEX); SetIndexBuffer(4,EldersiEMA,INDICATOR_CALCULATIONS); //--- return(0); } //+------------------------------------------------------------------+ //| 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[]) { ArraySetAsSeries(HistogramBuffer,false); ArraySetAsSeries(HistogramColors,false); int MACDhadling=iMACD(NULL,0,Fast,Slow,Signal,PRICE_CLOSE); CopyBuffer(MACDhadling,0,0,rates_total,MACDlineBuffer); CopyBuffer(MACDhadling,1,0,rates_total,SignallineBuffer); for(int i=0;i<rates_total;i++) { HistogramBuffer[i]=MACDlineBuffer[i]-SignallineBuffer[i];HistogramColors[i]=1; } ObjectCreate(0,"ShowMACD",OBJ_BUTTON,ChartWindowFind(),100,100); ObjectSetInteger(0,"ShowMACD",OBJPROP_XDISTANCE,75); ObjectSetInteger(0,"ShowMACD",OBJPROP_YDISTANCE,5); ObjectSetInteger(0,"ShowMACD",OBJPROP_CORNER,CORNER_RIGHT_UPPER); ObjectSetString(0,"ShowMACD",OBJPROP_TEXT,"ShowMACD"); ObjectSetInteger(0,"ShowMACD",OBJPROP_FONTSIZE,8); ObjectSetInteger(0,"ShowMACD",OBJPROP_XSIZE,70); ObjectSetInteger(0,"ShowMACD",OBJPROP_YSIZE,20); ObjectSetInteger(0,"ShowMACD",OBJPROP_SELECTABLE,false); ObjectCreate(0,"ShowOsMA",OBJ_BUTTON,ChartWindowFind(),100,100); ObjectSetInteger(0,"ShowOsMA",OBJPROP_XDISTANCE,75); ObjectSetInteger(0,"ShowOsMA",OBJPROP_YDISTANCE,30); ObjectSetInteger(0,"ShowOsMA",OBJPROP_CORNER,CORNER_RIGHT_UPPER); ObjectSetString(0,"ShowOsMA",OBJPROP_TEXT,"Show OsMA"); ObjectSetInteger(0,"ShowOsMA",OBJPROP_FONTSIZE,8); ObjectSetInteger(0,"ShowOsMA",OBJPROP_XSIZE,70); ObjectSetInteger(0,"ShowOsMA",OBJPROP_YSIZE,20); ObjectSetInteger(0,"ShowOsMA",OBJPROP_SELECTABLE,false); if(ObjectGetInteger(0,"ShowMACD",OBJPROP_STATE)!=1) { PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_NONE); PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_NONE); } else { PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE); PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_LINE); } if(ObjectGetInteger(0,"ShowOsMA",OBJPROP_STATE)!=1) { PlotIndexSetInteger(2,PLOT_DRAW_TYPE,DRAW_NONE); } else { PlotIndexSetInteger(2,PLOT_DRAW_TYPE,DRAW_COLOR_HISTOGRAM); } ObjectCreate(0,"2color",OBJ_BUTTON,ChartWindowFind(),100,100); ObjectSetInteger(0,"2color",OBJPROP_XDISTANCE,75); ObjectSetInteger(0,"2color",OBJPROP_YDISTANCE,50); ObjectSetInteger(0,"2color",OBJPROP_CORNER,CORNER_RIGHT_LOWER); ObjectSetInteger(0,"2color",OBJPROP_FONTSIZE,8); ObjectSetInteger(0,"2color",OBJPROP_XSIZE,70); ObjectSetInteger(0,"2color",OBJPROP_YSIZE,20); ObjectSetInteger(0,"2color",OBJPROP_SELECTABLE,false); ObjectSetString(0,"2color",OBJPROP_TEXT,"MultiColor"); ObjectCreate(0,"Impulse",OBJ_BUTTON,ChartWindowFind(),100,100); ObjectSetInteger(0,"Impulse",OBJPROP_XDISTANCE,75); ObjectSetInteger(0,"Impulse",OBJPROP_YDISTANCE,25); ObjectSetInteger(0,"Impulse",OBJPROP_CORNER,CORNER_RIGHT_LOWER); ObjectSetInteger(0,"Impulse",OBJPROP_FONTSIZE,8); ObjectSetInteger(0,"Impulse",OBJPROP_XSIZE,70); ObjectSetInteger(0,"Impulse",OBJPROP_YSIZE,20); ObjectSetInteger(0,"Impulse",OBJPROP_SELECTABLE,false); ObjectSetString(0,"Impulse",OBJPROP_TEXT,"Impulse"); if(ObjectGetInteger(0,"2color",OBJPROP_STATE)) ObjectSetString(0,"2color",OBJPROP_TEXT,"2ColorMACD"); else ObjectSetString(0,"2color",OBJPROP_TEXT,"MultiColor"); if(ObjectGetInteger(0,"Impulse",OBJPROP_STATE)) ObjectSetString(0,"Impulse",OBJPROP_TEXT,"Impulse"); else ObjectSetString(0,"Impulse",OBJPROP_TEXT,"Elder's"); CopyBuffer(iMA(NULL,0,EldersEMA,0,MODE_EMA,PRICE_CLOSE),0,0,rates_total,EldersiEMA); if(ObjectGetInteger(0,"2color",OBJPROP_STATE)) { for(int i=1;i<rates_total;i++) { if(HistogramBuffer[i] > HistogramBuffer[i-1]) HistogramColors[i]=0; if(HistogramBuffer[i] < HistogramBuffer[i-1]) HistogramColors[i]=1; } } else { if(ObjectGetInteger(0,"Impulse",OBJPROP_STATE)) { for(int i=1;i<rates_total;i++) { if((HistogramBuffer[i]>HistogramBuffer[i-1]) && (MACDlineBuffer[i]>MACDlineBuffer[i-1])) HistogramColors[i]=0; else { if((HistogramBuffer[i]<HistogramBuffer[i-1]) && (MACDlineBuffer[i]<MACDlineBuffer[i-1])) HistogramColors[i]=1; else HistogramColors[i]=2; } } } else { for(int i=1;i<rates_total;i++) { if((HistogramBuffer[i]>HistogramBuffer[i-1]) && (EldersiEMA[i]>EldersiEMA[i-1])) HistogramColors[i]=0; else { if((HistogramBuffer[i]<HistogramBuffer[i-1]) && (EldersiEMA[i]<EldersiEMA[i-1])) HistogramColors[i]=1; else HistogramColors[i]=2; } } } } //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+
アルゴリズムのブロック図は図4として示しています。
図4 インディケータアルゴリズムのブロック図
結果は図5~図7に表示しています。
図5
図6
図7
おわりに
本稿は、価格のコンピュータ分析を使ったマーケット学習と簡単なインディケータのグラフィカルコントロール手法の実装を学習する初心者のためのガイドとみなしていただけます。
本稿がみなさんのグラフィカルコントロールシステム製作の技術スキルを伸ばし、余計なものを表示しないことで 独自の『市場ビジョン』の発見に役立つことを願っています。
MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/42





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