Fragen von Anfängern MQL4 MT4 MetaTrader 4 - Seite 227

 

Hallo, das Problem ist wahrscheinlich nicht der Nulldurchgang, sondern der Übergang von einem Puffer zum anderen. Bei einem Balken endet das Signal und beim nächsten Balken befindet sich das Signal bereits in einem anderen Puffer. Welche Farbe möchten Sie zwischen den beiden benachbarten Balken sehen? Das ist nicht klar.

Wenn Sie einen dritten Puffer mit einer gelben Linie machen und ihn unter diese beiden setzen wollen, wäre das wunderschön!

 
Aleksei Stepanenko:

Hallo, das Problem ist wahrscheinlich nicht der Nulldurchgang, sondern der Übergang von einem Puffer zum anderen. Bei einem Balken endet das Signal und beim nächsten Balken befindet sich das Signal bereits in einem anderen Puffer. Welche Farbe möchten Sie zwischen den beiden benachbarten Balken sehen? Das ist nicht klar.

Wenn Sie wollen, machen Sie einen dritten Puffer mit einer gelben Linie und legen Sie ihn unter diese beiden, es wird schön sein!

Alexey, danke für die Hilfe.

Ich brauche keine drei Farben, zwei reichen völlig aus. Ich möchte, dass die leeren Stellen mit einer Linie in der vorherigen Farbe gezeichnet werden. Ich verstehe nicht, was Sie mit "Bei einem Takt ist das Signal vorbei, und beim nächsten Takt ist das Signal in einem anderen Puffer" meinen. Bei jedem Balken befindet sich ein Wert in einem der Puffer, also sollte er auch im Diagramm angezeigt werden, oder übersehe ich etwas?

 

Sehen Sie, die Zeit ist diskret auf dem Diagramm, die kleinste Einheit ist 1 bar. Das heißt, es gibt sozusagen keine Teilzeit zwischen den Takten. Wenn Sie das Rendering durch ein Balkendiagramm ersetzen, erhalten Sie zwei Balken - zwei Balken mit unterschiedlichen Farben. Aber da ist nichts zwischen ihnen. Und die Linie wird so gezeichnet (eine solche Eigenschaft wird gemacht), dass sie Werte desselben Puffers verbindet, aber nicht unterschiedliche. Deshalb gibt es auch Löcher.

Wenn Sie es schön haben wollen, können Sie versuchen, die Endwerte in beiden Puffern überlappend zu geben. Sie signalisieren dem neuen Puffer, aber immer noch dem alten Balken.

Wenn Sie jedoch das Signal eines solchen Indikators in einen Expert Advisor übernehmen, wird es ungenau sein.


Auch ein Histogramm ist eine gute Option, ohne dass Sie sich extra anstrengen müssen. Ich stimme für das Balkendiagramm.

 
Grigori.S.B:

Alexej, ich danke dir für deine Hilfe.

Ich brauche keine drei Farben, zwei reichen völlig aus. Ich möchte, dass die leeren Bereiche mit einer Linie in der vorherigen Farbe gezeichnet werden. Ich verstehe nicht, was Sie mit "Bei einem Takt endet das Signal, und beim nächsten Takt ist das Signal bereits in einem anderen Puffer" meinen. Bei jedem Balken gibt es einen Wert in einem der Puffer, es bedeutet, dass es auf dem Diagramm angezeigt werden sollte, oder bin ich etwas übersehen?

einen Puffer ohne Bedingungen belassen und den zweiten Puffer mit Bedingungen über den ersten Puffer legen

#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:

Sehen Sie, die Zeit ist diskret auf dem Diagramm, die kleinste Einheit ist 1 bar. Das heißt, es gibt sozusagen keine Teilzeit zwischen den Takten. Wenn Sie das Rendering durch ein Balkendiagramm ersetzen, erhalten Sie zwei Balken - zwei Balken mit unterschiedlichen Farben. Aber da ist nichts zwischen ihnen. Und die Linie wird so gezeichnet (eine solche Eigenschaft wird gemacht), dass sie Werte desselben Puffers verbindet, aber nicht unterschiedliche. Deshalb gibt es auch Löcher.

Wenn Sie es schön haben wollen, können Sie versuchen, die Endwerte in beiden Puffern überlappend zu geben. Sie signalisieren dem neuen Puffer, aber immer noch dem alten Balken.

Wenn Sie jedoch das Signal eines solchen Indikators in einen Expert Advisor übernehmen, wird es ungenau sein.

Auch ein Histogramm ist eine gute Option, ohne dass Sie sich extra anstrengen müssen. Ich stimme für das Balkendiagramm.

Vielen Dank, Alexey.

Jetzt ist sogar mein Kopf wieder in Ordnung. Ich hätte es auch selbst machen können, aber nicht so kurz und elegant wie Yuris anschließender Rat.

 
Iurii Tokman:

einen Puffer ohne Bedingungen zu belassen und den zweiten mit Bedingungen zu überlagern

Ich ziehe den Hut vor Ihnen, Yuri.

Eine so elegante und prägnante Lösung hätte ich mir nicht vorstellen können.

 
Grigori.S.B:

Hut ab, Juri.

Eine so elegante und prägnante Lösung hätte ich mir nicht vorstellen können.

es war nicht meine Idee, hier auf dem Forum, sowie Sie gelernt
in der Code-Basis eine Menge von Lösungen, und nicht nur solche

 
Grigori.S.B:


Vielen Dank für den Dank!

 
Warum werden meine Fragen immer wieder ignoriert?
 
darirunu1:
Warum werden meine Fragen immer wieder ignoriert?

hängt von den Fragen ab...