インディケータ: MACD発散 - ページ 5

 
Alain Verleyen:

あなたはポイントを見逃しました。あなたが言及している投稿は、EAからシグナルを取得する方法に関するもので、直近の2本のローソク足の値を取得するだけでは明らかに取得できません。

ダイバージェンスを検出するには、ピーク/トラフが必要であり、そのためには、クローズする追加のローソク足が必要であるため、早期にシグナルを得ることは不可能です。つまり、ローソク足0がオープンしたばかりのときは、ローソク足1がクローズしていることを意味し、ローソク足2でピーク/トラフを確認することができます。もし、未確定のピーク/トラフを利用して早期にシグナルを出すようにインジケータを修正したい人がいれば、それは可能ですが、それは悪いシグナルがたくさん出てしまうので、私はそのようなことには協力しません。

ローソク足1本目、あるいはローソク足0本目にシグナルを出すこともできますが、それでは何も変わりません。

コードを変更してみましたが、おっしゃるとおりです。あなたは実際のダイバージェンスの前に偽の動きを取得します。お忙しい中、ありがとうございました。
 
Alain Verleyen:

あなたはポイントを見逃しました。あなたが言及している投稿は、EAからシグナルを取得する方法に関するもので、直近の2本のローソク足の値を取得するだけでは明らかに取得できません。

ダイバージェンスを検出するには、ピーク/トラフが必要であり、そのためには、クローズする追加のローソク足が必要であるため、早期にシグナルを得ることは不可能です。つまり、ローソク足0がオープンしたばかりのときは、ローソク足1がクローズしていることを意味し、ローソク足2でピーク/トラフを確認することができます。もし、未確定のピーク/トラフを利用して早期にシグナルを出すようにインジケータを修正したい人がいれば、それは可能ですが、それは悪いシグナルがたくさん出てしまうので、私はそのようなことには協力しません。

ローソク足1本目、あるいはローソク足0本目にシグナルを出すこともできますが、それでは何も変わりません。

しかし、これでは何も変わりません。

renkoチャートの場合、現在のバーは(ほとんど)すでに閉じているので、ローソク足を1本減らす必要があります。それとも、私が何かを見逃しているのでしょうか?

 
アラン、とても良いインジケーターだね。アラート機能があるのは良いことですが、私に欠けているのは、携帯電話にプッシュ通知を送信 する機能です。ポップアップアラートに表示されるメッセージと同じものをスマホに送信させたいのです。この機能を追加することはできますか?そうしていただけると助かります。
 
アラン、ありがとう。
 

取引、自動取引システム、取引戦略のテストに関するフォーラム

マックダイブジェンス

エネザ・ピーター・ムキラムウェニ, 2021.09.12 12:26

このインジケーターは3つのバーの後にアラートを表示しますが、1つのバーの直後にアラートを表示したいのですが。


//+------------------------------------------------------------------+
//|MACD_Divergence.mq5
//|アラン・ヴェルレーエン
//|http:alamga.be|//www.alamga.be
//+------------------------------------------------------------------+
#property copyright     "Alain Verleyen (mql5) - Original author FX5 (mql4)"
#property link          "http://codebase.mql4.com/1115"
#property version       "1.01"
#property description   "The original indicator was totally rewrite to improve performance and"
#property description   "to correct a little bug. Also it's more funny that simply converting it."

#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots   4

//--- プロット1:強気 
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrGreen
#property indicator_label1  "Bullish divergence"
//--- プロット2:弱気
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrRed
#property indicator_label2  "Bearish divergence"
//--- プロット3:MACDメイン
#property indicator_type3   DRAW_LINE
#property indicator_style3  STYLE_SOLID
#property indicator_width3   2
#property indicator_color3  clrMagenta
#property indicator_label3  "Main"
//--- プロット4:MACDシグナル
#property indicator_type4   DRAW_LINE
#property indicator_style4  STYLE_SOLID
#property indicator_width4   1
#property indicator_color4  clrNONE
#property indicator_label4  "Signal"
//--- 入力パラメータ
input string s1="-----------------------------------------------";      // ----------- MACDの設定 ----------------------
input int    fastEMA                 = 12;
input int    slowEMA                 = 26;
input int    signalSMA               = 9;
input string s2="-----------------------------------------------";      // インジケーターの設定
input bool   drawIndicatorTrendLines = true;
input bool   drawPriceTrendLines     = true;
input bool   displayAlert            = true;
//--- 定数
#define  OBJECT_PREFIX       "MACD_DivergenceLine"
#define  ARROWS_DISPLACEMENT 0.0001
//--- バッファ
double bullishDivergence[];
double bearishDivergence[];
double macdBuffer[];
double signalBuffer[];
//--- ハンドル
int    macdHandle=INVALID_HANDLE;
//--- グローバル変数
static datetime lastAlertTime;
//+------------------------------------------------------------------+
//| カスタムインジケータ初期化関数
//+------------------------------------------------------------------+
int OnInit()
  {
//--- インジケーター・ハンドル 
   macdHandle=iMACD(NULL,0,fastEMA,slowEMA,signalSMA,PRICE_CLOSE);
   if(macdHandle==INVALID_HANDLE)
     {
      Print("The iMACD handle is not created: Error ",GetLastError());
      return(INIT_FAILED);
     }
//--- インジケータ・バッファのマッピング
   SetIndexBuffer(0,bullishDivergence);
   SetIndexBuffer(1,bearishDivergence);
   SetIndexBuffer(2,macdBuffer);
   SetIndexBuffer(3,signalBuffer);
//--- 矢印のコードhttp://www.mql5.com/en/docs/constants/objectconstants/wingdings を参照
   PlotIndexSetInteger(0,PLOT_ARROW,233);
   PlotIndexSetInteger(1,PLOT_ARROW,234);
//--- インジケータのプロパティ
   string indicatorName=StringFormat("MACD_Divergence(%i, %i, %i)",fastEMA,slowEMA,signalSMA);
   PlotIndexSetInteger(3,PLOT_DRAW_BEGIN,signalSMA);
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits+2);
   IndicatorSetString(INDICATOR_SHORTNAME,indicatorName);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| チャートの洗浄|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectDeleteByName("MACD_DivergenceLine");
  }
//+------------------------------------------------------------------+
//| カスタム・インジケータ反復関数|
//+------------------------------------------------------------------+
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[])
  {
//--- インジケータは、合計の再描画を除き、新しいローソク足でのみ更新されます。
   static datetime lastCandleTime=0;
   if(lastCandleTime==time[rates_total-1])
      return(rates_total);
   else
      lastCandleTime=time[rates_total-1];
//--- 最初の計算またはバーの数が変更された
   int start;
   if(prev_calculated<=0)
     {
      start=slowEMA;
      ArrayInitialize(bullishDivergence,EMPTY_VALUE);   // ダイバージェンス・バッファは初期化されなければならない
      ArrayInitialize(bearishDivergence,EMPTY_VALUE);
     }
   else
     {
      start=prev_calculated-2;
      bullishDivergence[rates_total-1]=EMPTY_VALUE;
      bearishDivergence[rates_total-1]=EMPTY_VALUE;
     }
//--- コピーするデータ(macdバッファ)数 
   int toCopy=rates_total-prev_calculated+(prev_calculated<=0 ? 0 : 1);
//--- すべてのデータが計算されるとは限らない
   int calculated=BarsCalculated(macdHandle);
   if(calculated<rates_total)
     {
      Print("Not all data of macdHandle is calculated (",calculated,"bars ). Error",GetLastError());
      return(0);
     }
//--- メインMACDバッファの取得
   if(IsStopped()) return(0); //停止フラグのチェック
   if(CopyBuffer(macdHandle,MAIN_LINE,0,toCopy,macdBuffer)<=0)
     {
      Print("Getting MACD Main is failed! Error : ",GetLastError());
      return(0);
     }
//--- シグナルMACDバッファの取得
   if(IsStopped()) return(0); //停止フラグのチェック
   if(CopyBuffer(macdHandle,SIGNAL_LINE,0,toCopy,signalBuffer)<=0)
     {
      Print("Getting MACD Signal is failed! Error : ",GetLastError());
      return(0);
     }
//--- 計算のメインループ
   for(int shift=start; shift<rates_total-2; shift++)
     {
      int currentExtremum,lastExtremum;
      bool isBullishDivergence,isBearishDivergence;
      string divergenceMsg;
      ENUM_LINE_STYLE divergenceStyle=0;

      //--- 強気ダイバージェンス
      isBullishDivergence=false;

      if(macdBuffer[shift]<=macdBuffer[shift-1] && 
         macdBuffer[shift]<macdBuffer[shift-2] && 
         macdBuffer[shift]<macdBuffer[shift+1])
         //--- 現在のmacdメインがボトム(前2回、次1回より低い)なら
        {
         currentExtremum=shift;
         lastExtremum=GetIndicatorLastTrough(shift);
         //--- 
         if(macdBuffer[currentExtremum]>macdBuffer[lastExtremum] && 
            low[currentExtremum]<low[lastExtremum])
           {
            isBullishDivergence=true;
            divergenceMsg="Classical bullish divergence on: ";
            divergenceStyle=STYLE_SOLID;
           }
         //--- 
         if(macdBuffer[currentExtremum]<macdBuffer[lastExtremum] && 
            low[currentExtremum]>low[lastExtremum])
           {
            isBullishDivergence=true;
            divergenceMsg="Reverse bullish divergence on: ";
            divergenceStyle=STYLE_DOT;
           }
         //--- 強気の乖離が見つかる
         if(isBullishDivergence)
           {
            bullishDivergence[currentExtremum]=macdBuffer[currentExtremum]-ARROWS_DISPLACEMENT;
            //---
            if(drawPriceTrendLines==true)
               DrawTrendLine(TRENDLINE_MAIN,time[currentExtremum],time[lastExtremum],low[currentExtremum],low[lastExtremum],Green,divergenceStyle);
            //---
            if(drawIndicatorTrendLines==true)
               DrawTrendLine(TRENDLINE_INDICATOR,time[currentExtremum],time[lastExtremum],macdBuffer[currentExtremum],macdBuffer[lastExtremum],Green,divergenceStyle);
            //---
            if(displayAlert==true && shift>=rates_total-3 && time[currentExtremum]!=lastAlertTime)
               DisplayAlert(divergenceMsg,time[currentExtremum]);
           }
        }
      //--- ベアリッシュ・ダイバージェンス
      isBearishDivergence=false;

      if(macdBuffer[shift]>=macdBuffer[shift-1] && 
         macdBuffer[shift]>macdBuffer[shift-2] && 
         macdBuffer[shift]>macdBuffer[shift+1])
         //--- 現在のmacdメインがトップ(前2回と次1回より高い)なら
        {
         currentExtremum=shift;
         lastExtremum=GetIndicatorLastPeak(shift);
         //--- 
         if(macdBuffer[currentExtremum]<macdBuffer[lastExtremum] && 
            high[currentExtremum]>high[lastExtremum])
           {
            isBearishDivergence=true;
            divergenceMsg="Classical bearish divergence on: ";
            divergenceStyle=STYLE_SOLID;
           }
         if(macdBuffer[currentExtremum]>macdBuffer[lastExtremum] && 
            high[currentExtremum]<high[lastExtremum])
           {
            isBearishDivergence=true;
            divergenceMsg="Reverse bearish divergence on: ";
            divergenceStyle=STYLE_DOT;
           }
         //--- 弱気の乖離が見つかる
         if(isBearishDivergence)
           {
            bearishDivergence[currentExtremum]=macdBuffer[currentExtremum]+ARROWS_DISPLACEMENT;
            //---
            if(drawPriceTrendLines==true)
               DrawTrendLine(TRENDLINE_MAIN,time[currentExtremum],time[lastExtremum],high[currentExtremum],high[lastExtremum],Red,STYLE_SOLID);
            //---
            if(drawIndicatorTrendLines==true)
               DrawTrendLine(TRENDLINE_INDICATOR,time[currentExtremum],time[lastExtremum],macdBuffer[currentExtremum],macdBuffer[lastExtremum],Red,STYLE_SOLID);
            //---
            if(displayAlert==true && shift>=rates_total-3 && time[currentExtremum]!=lastAlertTime)
               DisplayAlert(divergenceMsg,time[currentExtremum]);
           }
        }
     }
//--- 次の呼び出しのためにprev_calculatedの値を返す
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| 最後の谷を検索|
//+------------------------------------------------------------------+
int GetIndicatorLastTrough(int shift)
  {
   for(int i=shift-5; i>=2; i--)
     {
      if(signalBuffer[i] <= signalBuffer[i-1] && signalBuffer[i] <= signalBuffer[i-2] &&
         signalBuffer[i] <= signalBuffer[i+1] && signalBuffer[i] <= signalBuffer[i+2])
        {
         for(int j=i; j>=2; j--)
           {
            if(macdBuffer[j] <= macdBuffer[j-1] && macdBuffer[j] < macdBuffer[j-2] &&
               macdBuffer[j] <= macdBuffer[j+1] && macdBuffer[j] < macdBuffer[j+2])
               return(j);
           }
        }
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| 最後のピークを検索|
//+------------------------------------------------------------------+
int GetIndicatorLastPeak(int shift)
  {
   for(int i=shift-5; i>=2; i--)
     {
      if(signalBuffer[i] >= signalBuffer[i-1] && signalBuffer[i] >= signalBuffer[i-2] &&
         signalBuffer[i] >= signalBuffer[i+1] && signalBuffer[i] >= signalBuffer[i+2])
        {
         for(int j=i; j>=2; j--)
           {
            if(macdBuffer[j] >= macdBuffer[j-1] && macdBuffer[j] > macdBuffer[j-2] &&
               macdBuffer[j] >= macdBuffer[j+1] && macdBuffer[j] > macdBuffer[j+2])
               return(j);
           }
        }
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| DrawTrendLineで使用されるENUM_TRENDLINE_TYPE。
//+------------------------------------------------------------------+
enum ENUM_TRENDLINE_TYPE
  {
   TRENDLINE_MAIN,
   TRENDLINE_INDICATOR
  };
//+------------------------------------------------------------------+
//| メインチャートまたはインジケータにトレンドラインを引く。
//+------------------------------------------------------------------+
void DrawTrendLine(ENUM_TRENDLINE_TYPE window,datetime x1,datetime x2,double y1,double y2,color lineColor,ENUM_LINE_STYLE style)
  {
   string label=OBJECT_PREFIX+"#"+IntegerToString(window)+DoubleToString(x1,0);
   int subwindow=(window==TRENDLINE_MAIN) ? 0 : ChartWindowFind();
   ObjectDelete(0,label);
   ObjectCreate(0,label,OBJ_TREND,subwindow,x1,y1,x2,y2,0,0);
   ObjectSetInteger(0,label,OBJPROP_RAY,false);
   ObjectSetInteger(0,label,OBJPROP_COLOR,lineColor);
   ObjectSetInteger(0,label,OBJPROP_STYLE,style);
  }
//+------------------------------------------------------------------+
//| 乖離が見つかったらアラートを表示する|
//+------------------------------------------------------------------+
void DisplayAlert(string message,const datetime alertTime)
  {
   lastAlertTime=alertTime;
   Alert(message,Symbol()," , ",EnumToString(Period())," minutes chart");
  }
//+------------------------------------------------------------------+
//| インジケータによって描画されたすべてのオブジェクトを削除します。
//+------------------------------------------------------------------+
void ObjectDeleteByName(string prefix)
  {
   int total=ObjectsTotal(0),
   length=StringLen(prefix);

//--- インジケータが使用するすべてのオブジェクトの削除
   for(int i=total-1; i>=0; i--)
     {
      string objName=ObjectName(0,i);
      if(StringSubstr(objName,0,length)==prefix)
        {
         ObjectDelete(0,objName);
        }
     }
  }
//+------------------------------------------------------------------+



 

取引、自動取引システム、取引戦略のテストに関するフォーラム

インジケーターMACDダイバージェンス

Alain Verleyen, 2013.11.05 19:14

とてもフレンドリーですね。

シグナルはローソク足の終値で表示されます。それは正常であり、それが動作するように持っている方法です。ダイバージェンスは、極端(トップ/ボトム)の研究に基づいています。もし現在のローソク足で極値を検出する方法をお持ちでしたら、プログラミングを学び、私たちに無料でこの素晴らしい技術革新を提供することをお勧めします。

ご意見ありがとうございました。


 
こんにちは、アラン。とても良いインジケーターだ。正しいシグナルを出してくれる。
ところで、"//---弱気のダイバージェンスが 見つかった "の部分は、"STYLE_SOLID "ではなく、"divergenceStyle "のはずでした。

インジケータは全く再描画しない。そこで、インジケータの最後のバーをダイバージェンスシグナルと同様に再描画できるように少し修正することにしました。
これは前のバーのダイバージェンスシグナルを表示するもので、再描画可能なシグナルであることは確かです。バーが閉じる直前にシグナルを使用することは、速いタイムフレームでは役に立つでしょう。

変更を加えました:

- "//---トータル再描画を除き、新しいローソク足でのみ更新されるインジケーター" の部分をすべて削除。
- "start=prev_calculated-2; "を "start=prev_calculated-1; "に変更。
- "//--- 計算のメインループ "の "for(int shift=start; shift<rates_total-2; shift++) "は "for(int shift=start; shift<rates_total-1; shift++) "に変更されました。

ダイバージェンスシグナルが前のバーで表示されるようになりましたが、表示された瞬間にフリーズしてしまい、このバーのインジケータラインに従いません。
これを解決する方法を教えてください。
 

この部分を変更して解決した。もっと簡単でいい方法があるかもしれないが、うまくいった。矢印は1小節先に移動した。矢印のない線は未確認シグナルです。

//--- インジケータは、合計の再描画を除き、新しいローソク足でのみ更新されます。
 // static datetime lastCandleTime=0;
 // if(lastCandleTime==time[rates_total-1])
 // return(rates_total);
 // さもなければ
 // lastCandleTime=time[rates_total-1];
//--- 最初の計算またはバーの数が変更された
   int start;
   if(prev_calculated<=0)
     {
      start=slowEMA;
      ArrayInitialize(bullishDivergence,EMPTY_VALUE);   // ダイバージェンス・バッファは初期化されなければならない
      ArrayInitialize(bearishDivergence,EMPTY_VALUE);
     }
   else
     { 
      start=prev_calculated-1;
      bullishDivergence[rates_total-1]=EMPTY_VALUE;
      bearishDivergence[rates_total-1]=EMPTY_VALUE;
     }
//--- コピーするデータ(macdバッファ)数 
   int toCopy=rates_total-prev_calculated+(prev_calculated<=0 ? 0 : 1);
//--- すべてのデータが計算されるとは限らない
   int calculated=BarsCalculated(macdHandle);
   if(calculated<rates_total)
     {
      Print("Not all data of macdHandle is calculated (",calculated,"bars ). Error",GetLastError());
      return(0);
     }
//--- メインMACDバッファの取得
   if(IsStopped()) return(0); //停止フラグのチェック
   if(CopyBuffer(macdHandle,MAIN_LINE,0,toCopy,macdBuffer)<=0)
     {
      Print("Getting MACD Main is failed! Error : ",GetLastError());
      return(0);
     }
//--- シグナルMACDバッファの取得
   if(IsStopped()) return(0); //停止フラグのチェック
   if(CopyBuffer(macdHandle,SIGNAL_LINE,0,toCopy,signalBuffer)<=0)
     {
      Print("Getting MACD Signal is failed! Error : ",GetLastError());
      return(0);
     }
//--- 計算のメインループ
   for(int shift=start; shift<rates_total; shift++)
     {
      int currentExtremum,lastExtremum;
      bool isBullishDivergence,isBearishDivergence;
      string divergenceMsg;
      ENUM_LINE_STYLE divergenceStyle=0;
      
      //--- 強気ダイバージェンス
      isBullishDivergence=false;
               
      if(macdBuffer[shift-1]<=macdBuffer[shift-2] && 
         macdBuffer[shift-1]<macdBuffer[shift-3] && 
         macdBuffer[shift-1]<macdBuffer[shift])
         //--- 現在のmacdメインがボトム(前2回、次1回より低い)なら
        {
         currentExtremum=shift;
         lastExtremum=GetIndicatorLastTrough(shift);
         //--- 
         if(macdBuffer[currentExtremum-1]>macdBuffer[lastExtremum] && 
            low[currentExtremum-1]<low[lastExtremum])
           {
            isBullishDivergence=true;
            divergenceMsg="Classical bullish divergence on: ";
            divergenceStyle=STYLE_SOLID;
           }
         //--- 
         if(macdBuffer[currentExtremum-1]<macdBuffer[lastExtremum] && 
            low[currentExtremum-1]>low[lastExtremum])
           {
            isBullishDivergence=true;
            divergenceMsg="Reverse bullish divergence on: ";
            divergenceStyle=STYLE_DOT;
           }
         //--- 強気の乖離が見つかる
         if(isBullishDivergence)
           {
            bullishDivergence[currentExtremum]=macdBuffer[currentExtremum]-ARROWS_DISPLACEMENT;
            //---
            if(drawPriceTrendLines==true)
               DrawTrendLine(TRENDLINE_MAIN,time[currentExtremum-1],time[lastExtremum],low[currentExtremum-1],low[lastExtremum],Green,divergenceStyle);
            //---
            if(drawIndicatorTrendLines==true)
               DrawTrendLine(TRENDLINE_INDICATOR,time[currentExtremum-1],time[lastExtremum],macdBuffer[currentExtremum-1],macdBuffer[lastExtremum],Green,divergenceStyle);
            //---
            if(displayAlert==true && shift>=rates_total-3 && time[currentExtremum-1]!=lastAlertTime)
               DisplayAlert(divergenceMsg,time[currentExtremum-1]);
           }
        }
      //--- ベアリッシュ・ダイバージェンス
      isBearishDivergence=false;

      if(macdBuffer[shift-1]>=macdBuffer[shift-2] && 
         macdBuffer[shift-1]>macdBuffer[shift-3] && 
         macdBuffer[shift-1]>macdBuffer[shift])
         //--- 現在のmacdメインがトップ(前2回と次1回より高い)なら
        {
         currentExtremum=shift;
         lastExtremum=GetIndicatorLastPeak(shift);
         //--- 
         if(macdBuffer[currentExtremum-1]<macdBuffer[lastExtremum] && 
            high[currentExtremum-1]>high[lastExtremum])
           {
            isBearishDivergence=true;
            divergenceMsg="Classical bearish divergence on: ";
            divergenceStyle=STYLE_SOLID;
           }
         if(macdBuffer[currentExtremum-1]>macdBuffer[lastExtremum] && 
            high[currentExtremum-1]<high[lastExtremum])
           {
            isBearishDivergence=true;
            divergenceMsg="Reverse bearish divergence on: ";
            divergenceStyle=STYLE_DOT;
           }
         //--- 弱気の乖離が見つかる
         if(isBearishDivergence)
           {
            bearishDivergence[currentExtremum]=macdBuffer[currentExtremum]+ARROWS_DISPLACEMENT;
            //---
            if(drawPriceTrendLines==true)
               DrawTrendLine(TRENDLINE_MAIN,time[currentExtremum-1],time[lastExtremum],high[currentExtremum-1],high[lastExtremum],Red,divergenceStyle);
            //---
            if(drawIndicatorTrendLines==true)
               DrawTrendLine(TRENDLINE_INDICATOR,time[currentExtremum-1],time[lastExtremum],macdBuffer[currentExtremum-1],macdBuffer[lastExtremum],Red,divergenceStyle);
            //---
            if(displayAlert==true && shift>=rates_total-3 && time[currentExtremum-1]!=lastAlertTime)
               DisplayAlert(divergenceMsg,time[currentExtremum-1]);
           }
        }
     }
//--- 次の呼び出しのためにprev_calculatedの値を返す
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| 最後の谷を検索|
//+------------------------------------------------------------------+
int GetIndicatorLastTrough(int shift)
  {
   for(int i=shift-6; i>=2; i--)
     {
      if(signalBuffer[i] <= signalBuffer[i-1] && signalBuffer[i] <= signalBuffer[i-2] &&
         signalBuffer[i] <= signalBuffer[i+1] && signalBuffer[i] <= signalBuffer[i+2])
        {
         for(int j=i; j>=2; j--)
           {
            if(macdBuffer[j] <= macdBuffer[j-1] && macdBuffer[j] < macdBuffer[j-2] &&
               macdBuffer[j] <= macdBuffer[j+1] && macdBuffer[j] < macdBuffer[j+2])
               return(j);
           }
        }
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| 最後のピークを検索|
//+------------------------------------------------------------------+
int GetIndicatorLastPeak(int shift)
  {
   for(int i=shift-6; i>=2; i--)
     {
      if(signalBuffer[i] >= signalBuffer[i-1] && signalBuffer[i] >= signalBuffer[i-2] &&
         signalBuffer[i] >= signalBuffer[i+1] && signalBuffer[i] >= signalBuffer[i+2])
        {
         for(int j=i; j>=2; j--)
           {
            if(macdBuffer[j] >= macdBuffer[j-1] && macdBuffer[j] > macdBuffer[j-2] &&
               macdBuffer[j] >= macdBuffer[j+1] && macdBuffer[j] > macdBuffer[j+2])
               return(j);
           }
        }
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| DrawTrendLineで使用されるENUM_TRENDLINE_TYPE。
//+------------------------------------------------------------------+
 
Vladimir Karputov #:

ダイバージェンスゼロラインも価格形成HLボトム(価格は再びLLを作らなかった場合)ヒストグラムを下回ると、他の任意の5 30 60 240 tf 3 tfは実りあるに署名した。

 

こんにちは、アラン、

この素晴らしいインジケーターをありがとうございます!

このインジケータのデータウィンドウの値をEAの中で使おうとしています(添付ファイルをご覧ください)。

4つの指標全てに同じロジックを使用していますが、最後の2つ(MainとSignal)のみ正しい値を得ることができます。


最初の2つについては、常に固定値が表示されます。

添付の例では、1つは正しい値で、もう1つは0/空白のはずです。


なぜこのような問題が起こるのかわかりますか?


ありがとうございました。

ファイル:
Screenshot.PNG  85 kb