初心者の方からの質問 MQL4 MT4 MetaTrader 4 - ページ 227

 

ハイ、問題はゼロクロスではなく、あるバッファから別のバッファへのクロスにあると思われます。あるバーでシグナルが終了し、次のバーでシグナルがすでに別のバッファにある場合、隣接する2つのバーの間にどのような色を表示させたいですか?明確ではありません。

欲を言えば、黄色いラインで3つ目のバッファーを作って、この2つの下に置くと綺麗ですねー。

 
Aleksei Stepanenko:

ハイ、問題はゼロクロスではなく、あるバッファから別のバッファへのクロスにあると思われます。あるバーでシグナルが終了し、次のバーでシグナルがすでに別のバッファにある場合、隣接する2つのバーの間にどのような色を表示させたいですか?明確ではありません。

なんなら、黄色い線で3つ目のバッファを作って、この2つの下に置くと、きれいですよ

Alexeyさん、ありがとうございます。

3色も必要ない、2色で十分だ。空いたスペースは前の色の線で描いてほしい。あるバーで信号が終わり、次のバーで信号が別のバッファに ある」という意味がよくわかりません。各バーで、バッファの1つに値があるので、チャートにも表示されるはずなのですが、何か見落としているのでしょうか?

 

見てください、時間はチャート上では不連続で、最小単位は1バールです。つまり、いわば小節間の部分的な時間がないのである。レンダリングを棒グラフに置き換えると、2本の棒、つまり色の異なる2本の棒ができます。しかし、二人の間には何もない。そして、同じバッファの値を結び、異なるバッファの値を結ばないような線が引かれている(そのような性質が作られている)。だから、穴があいているのです。

もし、美しさを求めるのであれば、両方のバッファで終了値をオーバーラップさせて与えてみるとよいでしょう。新しいバッファに信号を送っても、古い方のバーには信号が送られます。

しかし、そのようなインジケータからExpert Advisorに 信号を取り込むと、不正確なものになります。


あるいはヒストグラムがあれば、余計な手間がかからず良い。棒グラフに一票。

 
Grigori.S.B:

Alexeiさん、ありがとうございました。

3色も必要ない、2色で十分だ。空いたスペースは前の色の線で描いてほしい。あるバーで信号が終了し、次のバーで信号がすでに別のバッファに ある」という意味がよくわかりません。各バーで、バッファの1つに値がある場合、それはチャートに表示されるべきということです。それとも、私は何かを見逃しているのでしょうか?

一方のバッファを無条件で残し、もう一方のバッファに条件付でオーバーレイさせる

#property strict
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 clrGreen
#property indicator_color2 clrRed

//---- input parameters
extern int    FastEMA=12;  
extern int    SlowEMA=26;  
extern int    Signal=9;  

//---- buffers
double DiffBuffer_up[];
double DiffBuffer_dn[];
//
double MainBuffer[];
double SignalBuffer[];

ENUM_TIMEFRAMES TimeFrame;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{
   int    draw_begin=MathMax(FastEMA,SlowEMA);
   string short_name="MACD Stephen";
   //---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,DiffBuffer_up);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,DiffBuffer_dn);
   short_name=StringConcatenate(short_name," ("+(string)FastEMA+","+(string)SlowEMA+","+(string)Signal+")");
   IndicatorShortName(short_name);
   SetIndexDrawBegin(0,draw_begin);
   SetIndexDrawBegin(1,draw_begin);
   SetIndexLabel(0,"Up");
   SetIndexLabel(1,"Down");
   IndicatorDigits(6);
   SetLevelValue(0,0);
   
   TimeFrame=GetTF();
   
   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
{

   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
  int limit, iChart, iTF, delta=0;
  datetime TimeArray[];
  //if(TimeFrame>Period()) delta=(int)MathCeil(TimeFrame/Period());
  int counted_bars=IndicatorCounted();
  //---- check for possible errors
  if(counted_bars<0) return(-1);
  //---- the last counted bar will be recounted
  if(counted_bars>0) counted_bars--;
  limit=Bars-counted_bars+delta;

  ArrayCopySeries(TimeArray,MODE_TIME,Symbol(),TimeFrame);
  ArraySetAsSeries(MainBuffer,true);
  ArraySetAsSeries(SignalBuffer,true);
  ArrayResize(MainBuffer,  100000);
  ArrayResize(SignalBuffer,100000);
  
  iTF=0;
  for(iChart=0; iChart<limit; iChart++)
  {
      while(Time[iChart]<TimeArray[iTF]) iTF++;
      MainBuffer[iChart]=EMPTY_VALUE;
      SignalBuffer[iChart]=EMPTY_VALUE;
      MainBuffer[iChart]  =iMACD(Symbol(),TimeFrame,FastEMA,SlowEMA,Signal,PRICE_CLOSE,MODE_MAIN,iTF);
      SignalBuffer[iChart]=iMACD(Symbol(),TimeFrame,FastEMA,SlowEMA,Signal,PRICE_CLOSE,MODE_SIGNAL,iTF);
      double diff=MainBuffer[iChart]-SignalBuffer[iChart];
      DiffBuffer_up[iChart]=diff;
      
      
      if (diff>0) //{
        DiffBuffer_dn[iChart]=diff; 
         //DiffBuffer_dn[iChart]=EMPTY_VALUE;
      //}
      //else {
         
         //DiffBuffer_up[iChart]=EMPTY_VALUE;
      //}
  }
  return(0);
}
 
Aleksei Stepanenko:

見てください、時間はチャート上では不連続で、最小単位は1バールです。つまり、いわば小節間の部分的な時間がないのである。レンダリングを棒グラフに置き換えると、2本の棒、つまり色の異なる2本の棒ができます。しかし、二人の間には何もない。そして、同じバッファの値を結び、異なるバッファの値を結ばないような線が引かれている(そのような性質が作られている)。だから、穴があいているのです。

もし、美しさを求めるのであれば、両方のバッファで終了値をオーバーラップさせて与えてみるとよいでしょう。新しいバッファに信号を送っても、古い方のバーには信号が送られます。

しかし、そのようなインジケータからExpert Advisorに 信号を取り込むと、不正確なものになります。

あるいはヒストグラムがあれば、余計な手間がかからず良い。棒グラフに一票。

アレクセイに心から 感謝します。

これで頭の中まで整理がつきました。自分でもできたが、その後のユーリのアドバイスのように短く、エレガントにはできない。

 
Iurii Tokman:

一方のバッファを無条件に残し、もう一方のバッファに条件をつけてオーバーレイさせる

ユーリ、脱帽です。

このようなエレガントで簡潔なソリューションは、私には想像もできませんでした。

 
Grigori.S.B:

ユーリ、脱帽です。

これほどまでにエレガントで簡潔なソリューションは想像もできませんでした。

それは私の考えではありませんでした、ここでフォーラムで、同様にあなたが学んだように
コードベースのソリューションの多く、およびだけでなく、そのような

 
Grigori.S.B:


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

 
なぜ私の質問は無視され続けるのでしょうか?
 
darirunu1:
なぜ私の質問は無視され続けるのでしょうか?

は、質問内容によって異なりますが...。