【解説】【MQL5 community】 Accelerator/Decelerator (アクセレーター): トレンドの方向と強さを表示する指標で、カオス・アクセラレーター・オシレーターとも呼ばれている。MACDとよく似た、オシレーター系の指標。
基本的に0.000を境に、上回ってきた場合は上昇トレンド、下回ってきた場合は下降トレンドと見ます。
また上昇トレンドにおいて、バーの色が緑色から赤色に変化した時に、上昇力が弱まったと判断し、逆に下降トレンドにおいて、バーの色が赤色から緑色に変化した時に、下降力が弱まったと見ます。
【計算法】
AO =(短期移動平均−長期移動平均)/ 2、
AC = AO − AOの短期移動平均
ACが前期よりも大きければ、緑色、小さければ、赤色。
【シグナル】
0.000を上回った場合に「買い」、0.000を下回った場合に「売り」。 そして色が変化した時が決済のポイント。
また色が緑色から赤色から変化した時に買われすぎ、 赤色から緑色に変化した時に、売られすぎ転換点と判断し、逆バリでエントリーするといった方法もあります。
//+------------------------------------------------------------------+ //| Accelerator.mq5 | //| Copyright 2009, MetaQuotes Software Corp. | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "2009, MetaQuotes Software Corp." #property link "http://www.mql5.com" #property description "Accelerator/Decelerator" //---- indicator settings #property indicator_separate_window #property indicator_buffers 6 #property indicator_plots 1 #property indicator_type1 DRAW_COLOR_HISTOGRAM #property indicator_color1 Green,Red #property indicator_width1 2 #property indicator_label1 "AC" //--- indicator buffers double ExtACBuffer[]; double ExtColorBuffer[]; double ExtFastBuffer[]; double ExtSlowBuffer[]; double ExtAOBuffer[]; double ExtSMABuffer[]; //--- handles for MAs int ExtFastSMAHandle; int ExtSlowSMAHandle; //--- bars minimum for calculation #define DATA_LIMIT 37 //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ void OnInit() { //--- indicator buffers mapping SetIndexBuffer(0,ExtACBuffer,INDICATOR_DATA); SetIndexBuffer(1,ExtColorBuffer,INDICATOR_COLOR_INDEX); SetIndexBuffer(2,ExtFastBuffer,INDICATOR_CALCULATIONS); SetIndexBuffer(3,ExtSlowBuffer,INDICATOR_CALCULATIONS); SetIndexBuffer(4,ExtAOBuffer,INDICATOR_CALCULATIONS); SetIndexBuffer(5,ExtSMABuffer,INDICATOR_CALCULATIONS); //--- set accuracy IndicatorSetInteger(INDICATOR_DIGITS,_Digits+2); //--- sets first bar from what index will be drawn PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,DATA_LIMIT); //--- name for DataWindow IndicatorSetString(INDICATOR_SHORTNAME,"AC"); //--- get handles ExtFastSMAHandle=iMA(NULL,0,5,0,MODE_SMA,PRICE_MEDIAN); ExtSlowSMAHandle=iMA(NULL,0,34,0,MODE_SMA,PRICE_MEDIAN); //--- initialization done } //+------------------------------------------------------------------+ //| Accelerator/Decelerator Oscillator | //+------------------------------------------------------------------+ 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 &TickVolume[], const long &Volume[], const int &Spread[]) { //--- check for rates total if(rates_total<DATA_LIMIT) return(0); // not enough bars for calculation //--- not all data may be calculated int calculated=BarsCalculated(ExtFastSMAHandle); if(calculated<rates_total) { Print("Not all data of ExtFastSMAHandle is calculated (",calculated,"bars ). Error",GetLastError()); return(0); } calculated=BarsCalculated(ExtSlowSMAHandle); if(calculated<rates_total) { Print("Not all data of ExtSlowSMAHandle is calculated (",calculated,"bars ). Error",GetLastError()); return(0); } //--- we can copy not all data int to_copy; if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total; else { to_copy=rates_total-prev_calculated; if(prev_calculated>0) to_copy++; } //--- get FastSMA buffer if(CopyBuffer(ExtFastSMAHandle,0,0,to_copy,ExtFastBuffer)<=0) { Print("Getting fast SMA is failed! Error",GetLastError()); return(0); } //--- get SlowSMA buffer if(CopyBuffer(ExtSlowSMAHandle,0,0,to_copy,ExtSlowBuffer)<=0) { Print("Getting slow SMA is failed! Error",GetLastError()); return(0); } //--- calculations int i,limit; //--- first calculation or number of bars was changed if(prev_calculated<=33) { for(i=0;i<33;i++) { ExtACBuffer[i]=0.0; ExtAOBuffer[i]=0.0; } limit=33; } else limit=prev_calculated-1; //--- main loop of calculations for(i=limit;i<DATA_LIMIT;i++) { ExtACBuffer[i]=0.0; ExtAOBuffer[i]=ExtFastBuffer[i]-ExtSlowBuffer[i]; } for(; i<rates_total; i++) { ExtAOBuffer[i]=ExtFastBuffer[i]-ExtSlowBuffer[i]; double sumAO=0.0; for(int j=0;j<5;j++) sumAO+=ExtAOBuffer[i-j]; ExtSMABuffer[i]=sumAO/5.0; ExtACBuffer[i]=ExtAOBuffer[i]-ExtSMABuffer[i]; if(ExtACBuffer[i]>=ExtACBuffer[i-1]) ExtColorBuffer[i]=0.0; // set color Green else ExtColorBuffer[i]=1.0; // set color Red } //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+
【表示結果】
概ねシグナルの通り。
Back to Meta Trader