
MQL5におけるインディケータemissionの描写
はじめに
トレーダーやトレーディング戦略開発者の多くが以下のような質問に関心があるのは事実です。
- 強いマーケットの動向はどのように出現するのか?
- これから起こる変化の正しい方向性はどうやって判断するのか?
- 取引について利益を上げるポジションをオープンする方法は?
- 最大の利益を上げてポジションをクローズするには?
それに対する答えは、新しいマーケット リサーチへの取り組みに導びいてくれます。すなわちインディケータ エミッションの構築と分析です。それを明確にするため、次の図を見ていきます。
図1 DCMVエミッション インディケータ
図2 iMAエンベロープを基にしたインディケータ エミッション
これは異なるインディケータ エミッションを示すものですが、コンストラクションの原理は同じです。ティックのあとに異なる色や形のポイントが多数表示されます。それらは星雲、雲、軌道、線、アーチなど様々なクラスターを形成します。こういった形は市場価格を左右する見えないバネや力を検出するのに役立ちます。こういったエミッションの検索と分析は手相見と似ています。
エミッションとプロパティ
エミッションとはインディケータの指定された点が交わる場所にあるポイントのセットです。
エミッションのプロパティはまだ明らかではありませんが、研究が待たれるところです。以下はすでに知られているプロパティのリストです。
- クラスタの同じタイプの傾向を示すポイント
- エミッションには方向があります。それは現時点から将来、あるいは過去という方向です。
- クラスタは重要なものです。密度の高いクラスタは魅力があり、逆は価格を反発させる可能性があります。
インディケータエミッションの計算
例を使って、エミッション計算の基本について考察していきます。インディケータを2つ取ります。 - iBandsとiMAです。これら直線の交点を見つけます。それを使ってエミッションのポイントを描きます。そのためにはグラフィックオブジェクトが必要です。Expert Advisorsにアルゴリズムが実装されますが、それはインディケータによって可能となります。
初期インディケータは図3に示されています。
図3 iBands (グリーン)とiMA (赤)インディケータ
エミッションポイントを作成するのにはExpert Advisorが必要です。Expert Advisorテンプレートを作成するには、MQL5ウィザードを使用するのがよいでしょう。
図4 MQL5ウィザードを使用したExpert Advisorテンプレートの作成
//+------------------------------------------------------------------+ //| Emission of Bands && MA.mq5 | //| Copyright DC2008 | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "DC2008" #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(0); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- } //+------------------------------------------------------------------+
最初に、予備プロッティングがいくらか必要です。波線を使ってインディケータラインを続けます。(図5)それにより、計算の正確性とエミッションポイントの可視化ができます。その後、チャートからこういった線を取り除きます。
図5 予備プロッティング波線を使ってインディケータラインを続行
そうして、Expert Advisorのコードにグラフィックオブジェクト(水平の傾向線)を追加します。
input bool H_line=true; // flag to enable drawing of the horizontal lines input bool I_line=true; // flag to enable drawing of the indicator's lines //--- string name; //---- indicator buffers double MA[]; // array for iMA indicator double BBH[]; // array for iBands indicator - UPPER_BAND double BBL[]; // array for iBands indicator - LOWER_BAND double BBM[]; // array for iBands indicator - BASE_LINE datetime T[]; // array for time coordinates //---- handles for indicators int MAHandle; // iMA indicator handle int BBHandle; // iBands indicator handle //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- MAHandle=iMA(Symbol(),0,21,0,MODE_EMA,PRICE_CLOSE); BBHandle=iBands(Symbol(),0,144,0,2,PRICE_CLOSE); //--- if(H_line) // Horizontal lines of iBands indicator { //--- iBands - UPPER_BAND name="Hi"; ObjectCreate(0,name,OBJ_HLINE,0,0,0); ObjectSetInteger(0,name,OBJPROP_COLOR,Red); ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_DOT); ObjectSetInteger(0,name,OBJPROP_WIDTH,1); //--- iBands - LOWER_BAND name="Lo"; ObjectCreate(0,name,OBJ_HLINE,0,0,0); ObjectSetInteger(0,name,OBJPROP_COLOR,Blue); ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_DOT); ObjectSetInteger(0,name,OBJPROP_WIDTH,1); //--- iBands - BASE_LINE name="MIDI"; ObjectCreate(0,name,OBJ_HLINE,0,0,0); ObjectSetInteger(0,name,OBJPROP_COLOR,DarkOrange); ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_DOT); ObjectSetInteger(0,name,OBJPROP_WIDTH,1); } //--- if(I_line) // Indicator lines { //--- iMA name="MA"; ObjectCreate(0,name,OBJ_TREND,0,0,0,0); ObjectSetInteger(0,name,OBJPROP_COLOR,Red); ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_SOLID); ObjectSetInteger(0,name,OBJPROP_WIDTH,2); ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,1); ObjectSetInteger(0,name,OBJPROP_RAY_LEFT,1); //--- iBands - UPPER_BAND name="BH"; ObjectCreate(0,name,OBJ_TREND,0,0,0,0); ObjectSetInteger(0,name,OBJPROP_COLOR,MediumSeaGreen); ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_SOLID); ObjectSetInteger(0,name,OBJPROP_WIDTH,1); ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,1); ObjectSetInteger(0,name,OBJPROP_RAY_LEFT,1); //--- iBands - LOWER_BAND name="BL"; ObjectCreate(0,name,OBJ_TREND,0,0,0,0); ObjectSetInteger(0,name,OBJPROP_COLOR,MediumSeaGreen); ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_SOLID); ObjectSetInteger(0,name,OBJPROP_WIDTH,1); ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,1); ObjectSetInteger(0,name,OBJPROP_RAY_LEFT,1); //--- iBands - BASE_LINE name="BM"; ObjectCreate(0,name,OBJ_TREND,0,0,0,0); ObjectSetInteger(0,name,OBJPROP_COLOR,MediumSeaGreen); ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_SOLID); ObjectSetInteger(0,name,OBJPROP_WIDTH,1); ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,1); ObjectSetInteger(0,name,OBJPROP_RAY_LEFT,1); } return(0); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- filling the arrays with current values CopyBuffer(MAHandle,0,0,2,MA); ArraySetAsSeries(MA,true); CopyBuffer(BBHandle,0,0,2,BBM); ArraySetAsSeries(BBM,true); CopyBuffer(BBHandle,1,0,2,BBH); ArraySetAsSeries(BBH,true); CopyBuffer(BBHandle,2,0,2,BBL); ArraySetAsSeries(BBL,true); CopyTime(Symbol(),0,0,10,T); ArraySetAsSeries(T,true); //--- Horizontal lines of iBands indicator (correction) if(H_line) { name="Hi"; ObjectSetDouble(0,name,OBJPROP_PRICE,BBH[0]); name="Lo"; ObjectSetDouble(0,name,OBJPROP_PRICE,BBL[0]); name="MIDI"; ObjectSetDouble(0,name,OBJPROP_PRICE,BBM[0]); } //--- Indicator's lines (correction) if(I_line) { name="MA"; //--- iMA ObjectSetInteger(0,name,OBJPROP_TIME,T[1]); ObjectSetDouble(0,name,OBJPROP_PRICE,MA[1]); ObjectSetInteger(0,name,OBJPROP_TIME,1,T[0]); ObjectSetDouble(0,name,OBJPROP_PRICE,1,MA[0]); name="BH"; //--- iBands - UPPER_BAND ObjectSetInteger(0,name,OBJPROP_TIME,T[1]); ObjectSetDouble(0,name,OBJPROP_PRICE,BBH[1]); ObjectSetInteger(0,name,OBJPROP_TIME,1,T[0]); ObjectSetDouble(0,name,OBJPROP_PRICE,1,BBH[0]); name="BL"; //--- iBands - LOWER_BAND ObjectSetInteger(0,name,OBJPROP_TIME,T[1]); ObjectSetDouble(0,name,OBJPROP_PRICE,BBL[1]); ObjectSetInteger(0,name,OBJPROP_TIME,1,T[0]); ObjectSetDouble(0,name,OBJPROP_PRICE,1,BBL[0]); name="BM"; //--- iBands - BASE_LINE ObjectSetInteger(0,name,OBJPROP_TIME,T[1]); ObjectSetDouble(0,name,OBJPROP_PRICE,BBM[1]); ObjectSetInteger(0,name,OBJPROP_TIME,1,T[0]); ObjectSetDouble(0,name,OBJPROP_PRICE,1,BBM[0]); } } //+------------------------------------------------------------------+エミッションは将来あるいは過去に向かう線なので、傾向線であるプロパティ は以下のようなものです。
- OBJPROP_RAY_LEFT = 1, (Ray goes left);
- OBJPROP_RAY_RIGHT = 1, (Ray goes right).
結果として、線を追加したチャートは図6のように表示されます。
準備段階は完了しました。これからエミッション処理に進んでいきます。以下の線の交点にある最初の連続点を作成します。
- "MA" (iMA)線と"BH"線(iBands = UPPER_BAND)間
- "MA" (iMA)線と"BL"線(iBands = LOWER_BAND)間
- "MA" (iMA)線と"BM"線(iBands = BASE_BAND)間
図6 予備プロッティング直線を使ったインディケータラインの続行
それでは、エミッションポイントを描くために交点の座標を計算します。関数を作成します。
void Draw_Point( string P_name, // Object name (OBJ_ARROW) double P_y1, // Y-coordinate of the 1st line at the [1] bar double P_y0, // Y-coordinate of the 1st line at the [0] bar double P_yy1, // Y-coordinate of the 2nd line at the [1] bar double P_yy0, // Y-coordinate of the 2nd line at the [0] bar char P_code1, // Char at the right side of the [0] bar char P_code2, // Char at the left side of the [0] bar color P_color1, // Color of point at the right side of the [0] bar color P_color2 // color of point at the left side of the [0] bar ) { double P,X; datetime P_time; if(MathAbs((P_yy0-P_yy1)-(P_y0-P_y1))>0) { P=P_y1+(P_y0-P_y1)*(P_y1-P_yy1)/((P_yy0-P_yy1)-(P_y0-P_y1)); X=(P_y1-P_yy1)/((P_yy0-P_yy1)-(P_y0-P_y1)); if(X>draw_period) { P_time=T[0]+(int)(X*PeriodSeconds()); ObjectCreate(0,P_name,OBJ_ARROW,0,0,0); ObjectSetDouble(0,P_name,OBJPROP_PRICE,P); ObjectSetInteger(0,P_name,OBJPROP_TIME,P_time); ObjectSetInteger(0,P_name,OBJPROP_WIDTH,0); ObjectSetInteger(0,P_name,OBJPROP_ARROWCODE,P_code1); ObjectSetInteger(0,P_name,OBJPROP_COLOR,P_color1); if(X<0) { ObjectSetInteger(0,P_name,OBJPROP_ARROWCODE,P_code2); ObjectSetInteger(0,P_name,OBJPROP_COLOR,P_color2); } } } }
そして、OnTick関数に以下のようなコード行を追加します。
//+------------------------------------------------------------------+ int GTC=GetTickCount(); //+------------------------------------------------------------------+ name="H"+(string)GTC; Draw_Point(name,BBH[1],BBH[0],MA[1],MA[0],170,178,Red,Red); name="L"+(string)GTC; Draw_Point(name,BBL[1],BBL[0],MA[1],MA[0],170,178,Blue,Blue); name="M"+(string)GTC; Draw_Point(name,BBM[1],BBM[0],MA[1],MA[0],170,178,Green,Green); //--- ChartRedraw(0);
ではExpert Advisorを実行し、結果を見てみましょう。(図7)
結果は良好ですね。しかしまだ他にも交点の例はあります。まだ考察していない例です。たとえば、iBandsインディケータには互いに交わる直線が3本あり、それで全体像が完成します。
図7 iMAインディケータとiBands iインディケータのエミッション(3つの交点)
それでは、計算して得たエミッションにもうひとつづきのポイントを付け加えます。以下の直線の交点です。- "BH" (iBands = UPPER_BAND) 線と"BL"線(iBands = LOWER_BAND)間
- "BH" (iBands = UPPER_BAND) 線と"BM"線(iBands = BASE_BAND)間
- "BL"(iBands = LOWER_BAND) 線と"BM"線(iBands = BASE_BAND)間
上記交点により、3つの点を得ますが、それらはすべて同じ座標です。ゆえに、"BH"線と"BL"線間で得られる1交点を使用すれば十分です。
われわれのExpert Advisorにこれら直線を追加し結果を見てみましょう。(図8)
name="B"+(string)GTC; Draw_Point(name,BBH[1],BBH[0],BBL[1],BBL[0],170,178,Magenta,Magenta);
図8 iMAインディケータとiBands iインディケータのエミッション(4つの交点)
エミッションは取得しましたが、まだ何か重要な事柄が抜けているような気がします。何が足りないのでしょうか?
なぜそのような入力パラメータだけ使ったのでしょうか?パラメータを変更すると何が得られるのでしょうか?また、エミッションにおけるパラメータの役割とはなにでしょうか?
単一度数に対応して取得したエミッションはインディケータの入力パラメータから得られた結果でした。複数度数スペクトラムをフルに計算するには、他の度数についても同じ計算をする必要があります。私が考えうる限りのエミッションスペクトラムをここに例示します。
//---- handles for indicators int MAHandle[5]; // handles array of iMA indicators int BBHandle[7]; // handles array of iBands indicator //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- MAHandle[0]=iMA(NULL,0,21,0,MODE_EMA,PRICE_CLOSE); MAHandle[1]=iMA(NULL,0,34,0,MODE_EMA,PRICE_CLOSE); MAHandle[2]=iMA(NULL,0,55,0,MODE_EMA,PRICE_CLOSE); MAHandle[3]=iMA(NULL,0,89,0,MODE_EMA,PRICE_CLOSE); MAHandle[4]=iMA(NULL,0,144,0,MODE_EMA,PRICE_CLOSE); //--- BBHandle[0]=iBands(NULL,0,55,0,2,PRICE_CLOSE); BBHandle[1]=iBands(NULL,0,89,0,2,PRICE_CLOSE); BBHandle[2]=iBands(NULL,0,144,0,2,PRICE_CLOSE); BBHandle[3]=iBands(NULL,0,233,0,2,PRICE_CLOSE); BBHandle[4]=iBands(NULL,0,377,0,2,PRICE_CLOSE); BBHandle[5]=iBands(NULL,0,610,0,2,PRICE_CLOSE); BBHandle[6]=iBands(NULL,0,987,0,2,PRICE_CLOSE); //--- return(0); }
可能な組合せを考察するため、Expert Advisorに以下のコードを追加します。
//+------------------------------------------------------------------+ CopyTime(NULL,0,0,10,T); ArraySetAsSeries(T,true); int GTC=GetTickCount(); //+------------------------------------------------------------------+ int iMax=ArraySize(BBHandle)-1; int jMax=ArraySize(MAHandle)-1; for(int i=0; i<iMax; i++) { for(int j=0; j<jMax; j++) { //--- filling the arrays with current values CopyBuffer(MAHandle[j],0,0,2,MA); ArraySetAsSeries(MA,true); CopyBuffer(BBHandle[i],0,0,2,BBM); ArraySetAsSeries(BBM,true); CopyBuffer(BBHandle[i],1,0,2,BBH); ArraySetAsSeries(BBH,true); CopyBuffer(BBHandle[i],2,0,2,BBL); ArraySetAsSeries(BBL,true); name="H"+(string)GTC+(string)i+(string)j; Draw_Point(name,BBH[1],BBH[0],MA[1],MA[0],250,158,Aqua,Aqua); name="L"+(string)GTC+(string)i+(string)j; Draw_Point(name,BBL[1],BBL[0],MA[1],MA[0],250,158,Blue,Blue); name="M"+(string)GTC+(string)i+(string)j; Draw_Point(name,BBM[1],BBM[0],MA[1],MA[0],250,158,Green,Green); name="B"+(string)GTC+(string)i+(string)j; Draw_Point(name,BBH[1],BBH[0],BBL[1],BBL[0],250,158,Magenta,Magenta); } } //--- ChartRedraw(0);
エミッションスペクトラムに多くの度数が含まれるほど、 チャート表示は良くなりますが、あまり多用しないことです。なぜならコンピュータのリソースを消費し、チャートに混乱を招く一番の原因になるからです。度数は実験的に判断可能です。 グラブをよりよく見せるには、描写スタイルに気を配る必要があります。
図9 複度数エミッションスペクトラム
Ofエミッション描写スタイル
MQL5言語により、エミッション描写のための幅広いウェブカラーと曲線キャラクタ が入手可能です。それについての考え方を共有したいと思います。- グラフ画像については各々感じ方があることでしょう。なので、エミッションをカスタマイズするのに少々時間をかけることも必要です。
- 図9の『混乱』からは画像パターンになんの規則性も見出せません。これはひどい描写の一例です。
- 虹色スペクトラムの近くにある色を使ってみます。
- 過去に関するキャラクタ コード( [0] バーの左側から)と将来に関するキャラクタ コード( [0] バーの右側から)は異なるはずです。
- 色とポイント型の組合せがうまくいくと、エミッションは傑作になります。取引を行うのに役立つだけでなく見るのも楽しみになるでしょう。
name="H"+(string)GTC+(string)i+(string)j; Draw_Point(name,BBH[1],BBH[0],MA[1],MA[0],250,158,Aqua,Aqua); name="L"+(string)GTC+(string)i+(string)j; Draw_Point(name,BBL[1],BBL[0],MA[1],MA[0],250,158,Blue,Blue); name="M"+(string)GTC+(string)i+(string)j; Draw_Point(name,BBM[1],BBM[0],MA[1],MA[0],250,158,Magenta,Magenta); name="B"+(string)GTC+(string)i+(string)j; Draw_Point(name,BBH[1],BBH[0],BBL[1],BBL[0],250,158,DarkOrchid,DarkOrchid);
iMAとiBandsのエミッション ギャラリー
エミッション画像はチャプターに示されています。
図10
図11
図12
図13
図14
図15
図16
図17
エミッション分析
エミッション分析は別のタスクです。リアルタイムで動きを見るのがもっとも有用です。そしてそれは様々な効果とパターンを理解するのに最適な方法です。
価格修正に注意を払ってください。あたかもエミッションが目標価格を『知って』いるようです。また、サポート、レジスタンス、均衡価格レベルを見ることもできます。
おわりに
- インディケータのエミッションは、市場サーチや分析の新しい手法を探しているトレーダーやトレードシステム開発者にとって興味をひかれるものです。
- 初歩を紹介するのが目的の本稿としては、すぐに使えるソリューションは提供していません。ただ、ここで述べたエミッション計算技術は他のインディケータやその組合せにも適用することが可能です。
- 本稿を準備するにあたり、私は回答数に勝る質問を収集しました。そのいくつかをご紹介します。エミッション描写のアルゴリズムを最適化する方法は?エミッションのストラクチャにおけるエミッションスペクトラム特性の役割は?自動化されたトレーディングでエミッションを利用する方法は?
MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/26





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