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

 

Ich versuche, den Indikator Puffer vom anderen Ende (ArraySetAsSeries (..., false)) zu füllen, alles funktioniert gut für eine Weile, aber dann passiert etwas mit dem Puffer und der allerletzte Array-Index wird gefüllt, obwohl es nicht sein sollte.
Ich vermute, dass das Terminal den Puffer irgendwann abschneidet und das Gewicht des Puffers sogar mit dem letzten Array-Index gefüllt ist. Vielleicht sollte der Array-Puffer irgendwann freigegeben werden, aber wann? Können Sie das Testbeispiel korrigieren?


#property indicator_buffers 1

double ExtMapBuffer[]; // AQUA   "Line"
int      LastData;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

   SetIndexBuffer(0,ExtMapBuffer);
   SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,7,clrAqua);
   SetIndexEmptyValue(0,0.0);
   SetIndexLabel(0,"Line");

   LastData=0;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   int    i;
   bool Series=false;
   ArraySetAsSeries(ExtMapBuffer,Series);
   ArraySetAsSeries(high,Series);

   i=prev_calculated-1;

   if(i<1) 
     {
      LastData=0;
      i=1;
      while(i<rates_total-1)
        {
         ExtMapBuffer[i]=high[i];
         i++; 
         LastData=i;
        }
     }
   else
     {
      i=LastData;
     }

   while(i<rates_total-1)
     {
      ExtMapBuffer[i]=high[i];
      i++;
      LastData=i;
     }

   return(rates_total);
  }
//+------------------------------------------------------------------+
 

Hallo.

Können Sie mir bitte sagen, warum dieser Indikator nur selten Pfeile in der Historie zeichnet, aber wenn Sie mit dem Handel beginnen, beginnt er häufig zu zeichnen.

Dann, wenn Sie MT4 schließen und öffnen Sie es wieder, dann an der gleichen Stelle, wo in Echtzeit der Indikator wie ein Maschinengewehr zog Geschäfte, ist es wieder 1-2 Geschäfte.

Wenn ich mir die Historie ansehe, scheint es, dass der Indikator gut handeln sollte, aber sobald ich zum Echtzeithandel wechsle, erhalte ich alle Arten von seltsamen Dingen.

Bitte erklären Sie, warum? Hier ist der Code des Indikators:

//---- indicator settings
#property  indicator_chart_window
#property  indicator_buffers 2
#property  indicator_color1  Blue
#property  indicator_color2  Red
//---- indicator parameters
extern int  period = 4; //12
extern int  shift  = 0; //сдвиг по бару
//---- indicator buffers
double BufferUp[],BufferDn[];
int q,st=5;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(2);
//---- drawing settings
   SetIndexStyle(0,DRAW_ARROW,2);
   SetIndexArrow(0,233);
   SetIndexStyle(1,DRAW_ARROW,2);
   SetIndexArrow(1,234);

   SetIndexBuffer(0,BufferUp);//стрелка синяя верх
   SetIndexBuffer(1,BufferDn);//стрелка красная вниз
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("T3MA-ALARM ("+period+")");
//---- initialization done
   if(Digits==3 || Digits==5) q=10;
   st=st*q;
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit()
  {
   ObjectDelete("low");
   ObjectDelete("high");
  }
//+----------------------------------------------------------------------+
//| Moving Average of Oscillator                                         |
//+----------------------------------------------------------------------+
int start()
  {
//---- ArraySetAsSeries --------------------------------------------------  
   double Ma[],MaOn[];
   double y0[],y1[],y2[];
//   int i;
   int    i;
   ArraySetAsSeries(Ma,true);
//---- IndicatorCounted --------------------------------------------------
   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
   int limit1=Bars-counted_bars;
   if(counted_bars==0) limit1-=1+MathMax(period,shift)+2;

   int buffer_size=ArraySize(BufferUp);
   ArrayResize(Ma,buffer_size);
   ArrayResize(MaOn,buffer_size);

   ArrayResize(y0,buffer_size+shift+2);
   ArrayResize(y1,buffer_size+shift+2);
   ArrayResize(y2,buffer_size+shift+2);

   int limit=ArraySize(Ma);
//---- EMA --------------------------------------------------------------- 
   for(i=limit1; i>=0; i--)  Ma[i]  =iMA(NULL,0,period,0,MODE_EMA,PRICE_CLOSE,i);
   for(i=limit1; i>=0; i--)  MaOn[i]=iMAOnArray(Ma,limit,period,0,MODE_EMA,i);

   for(i=limit1; i>=0; i--)
     {
      y0[i+shift]=MaOn[i+shift];
      y1[i+1+shift]=MaOn[i+1+shift];
      y2[i+2+shift]=MaOn[i+2+shift];

      if(y0[i+shift]-y1[i+1+shift]<0 && y1[i+1+shift]-y2[i+2+shift]>0){BufferDn[i+1]=High[i+1]+st*Point;}
      if(y0[i+shift]-y1[i+1+shift]>0 && y1[i+1+shift]-y2[i+2+shift]<0){BufferUp[i+1]=Low[i+1]-st*Point;}
      //---- Signal Trend Up || Dn ---------------------------------------------   
      if(y0[i]-y1[i+1]>0) Comment("\n SWAPLONG = ",MarketInfo(Symbol(),MODE_SWAPLONG),
         "   SWAPSHORT = ",MarketInfo(Symbol(),MODE_SWAPSHORT),"\n BUY TREND ",DoubleToStr(Close[i],Digits));

      else if(y0[i]-y1[i+1]<0) Comment("\n SWAPLONG = ",MarketInfo(Symbol(),MODE_SWAPLONG),
         "   SWAPSHORT = ",MarketInfo(Symbol(),MODE_SWAPSHORT),"\n SELL TREND ",DoubleToStr(Close[i],Digits));
     }

//---- done
   return(0);
  }
//+---------------------------------------------------------------------+
Документация по MQL5: Константы, перечисления и структуры / Константы индикаторов / Стили рисования
Документация по MQL5: Константы, перечисления и структуры / Константы индикаторов / Стили рисования
  • www.mql5.com
При создании пользовательского индикатора можно указать один из 18 типов графического построения (способа отображения на главном окне графика или в подокне графика), значения которых указаны в перечислении ENUM_DRAW_TYPE. В зависимости от стиля рисования, может потребоваться от одного до четырех буферов значений (отмеченных как INDICATOR_DATA...
 

Versuchen Sie, an drei Stellen die 0 durch eine 1 zu ersetzen

   int limit=ArraySize(Ma);
//---- EMA --------------------------------------------------------------- 
   for(i=limit1; i>=1; i--)  Ma[i]  =iMA(NULL,0,period,0,MODE_EMA,PRICE_CLOSE,i);
   for(i=limit1; i>=1; i--)  MaOn[i]=iMAOnArray(Ma,limit,period,0,MODE_EMA,i);

   for(i=limit1; i>=1; i--)
 
Aleksei Stepanenko:

Versuchen Sie, an drei Stellen die 0 durch eine 1 zu ersetzen

   int limit=ArraySize(Ma);
//---- EMA --------------------------------------------------------------- 
   for(i=limit1; i>=1; i--)  Ma[i]  =iMA(NULL,0,period,0,MODE_EMA,PRICE_CLOSE,i);
        // вот сюда
   for(i=limit1; i>=1; i--)  MaOn[i]=iMAOnArray(Ma,limit,period,0,MODE_EMA,i);

   for(i=limit1; i>=1; i--)

Ich würde auch dies verschieben

 
Vitaly, ich habe festgestellt, dass die Leute eine Frage schreiben und sich dann um ihre Angelegenheiten kümmern, während wir uns miteinander amüsieren. Manchmal sind es mehrere Seiten mit Auszügen.
 
Aleksei Stepanenko:

Versuchen Sie, an drei Stellen die 0 durch eine 1 zu ersetzen

Ich danke Ihnen vielmals. Wie schaffe ich es nun, dass die Trades nur am Ende der aktuellen Kerze im aktuellen Zeitrahmen geöffnet werden? :)) Ich weiß nicht, wann das Geschäft eröffnet wird... Die Pfeile scheinen richtig zu sein, und schauen Sie sich die Candlesticks, alles ist in Ordnung, aber Angebote scheinen in der Mitte oder in der Nähe des Endes der Kerze geöffnet werden, im Allgemeinen, überall, aber nicht, wo es gebraucht wird. :(

//---- indicator settings
#property  indicator_chart_window
#property  indicator_buffers 2
#property  indicator_color1  Blue
#property  indicator_color2  Red
//---- indicator parameters
extern int  period = 4; //12
extern int  shift  = 0; //сдвиг по бару
//---- indicator buffers
double BufferUp[],BufferDn[];
int q,st=5;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(2);
//---- drawing settings
   SetIndexStyle(0,DRAW_ARROW,2);
   SetIndexArrow(0,233);
   SetIndexStyle(1,DRAW_ARROW,2);
   SetIndexArrow(1,234);

   SetIndexBuffer(0,BufferUp);//стрелка синяя верх
   SetIndexBuffer(1,BufferDn);//стрелка красная вниз
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("T3MA-ALARM ("+period+")");
//---- initialization done
   if(Digits==3 || Digits==5) q=10;
   st=st*q;
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit()
  {
   ObjectDelete("low");
   ObjectDelete("high");
  }
//+----------------------------------------------------------------------+
//| Moving Average of Oscillator                                         |
//+----------------------------------------------------------------------+
int start()
  {
//---- ArraySetAsSeries --------------------------------------------------  
   double Ma[],MaOn[];
   double y0[],y1[],y2[];
//   int i;
   int    i;
   ArraySetAsSeries(Ma,true);
//---- IndicatorCounted --------------------------------------------------
   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
   int limit1=Bars-counted_bars;
   if(counted_bars==0) limit1-=1+MathMax(period,shift)+2;

   int buffer_size=ArraySize(BufferUp);
   ArrayResize(Ma,buffer_size);
   ArrayResize(MaOn,buffer_size);

   ArrayResize(y0,buffer_size+shift+2);
   ArrayResize(y1,buffer_size+shift+2);
   ArrayResize(y2,buffer_size+shift+2);

   int limit=ArraySize(Ma);
//---- EMA --------------------------------------------------------------- 
   for(i=limit1; i>=1; i--)  Ma[i]  =iMA(NULL,0,period,0,MODE_EMA,PRICE_CLOSE,i);
   for(i=limit1; i>=1; i--)  MaOn[i]=iMAOnArray(Ma,limit,period,0,MODE_EMA,i);

   for(i=limit1; i>=1; i--)
     {
      y0[i+shift]=MaOn[i+shift];
      y1[i+1+shift]=MaOn[i+1+shift];
      y2[i+2+shift]=MaOn[i+2+shift];

      if(y0[i+shift]-y1[i+1+shift]<0 && y1[i+1+shift]-y2[i+2+shift]>0){BufferDn[i+1]=High[i+1]+st*Point;}
      if(y0[i+shift]-y1[i+1+shift]>0 && y1[i+1+shift]-y2[i+2+shift]<0){BufferUp[i+1]=Low[i+1]-st*Point;}
      //---- Signal Trend Up || Dn ---------------------------------------------   
      if(y0[i]-y1[i+1]>0) Comment("\n SWAPLONG = ",MarketInfo(Symbol(),MODE_SWAPLONG),
         "   SWAPSHORT = ",MarketInfo(Symbol(),MODE_SWAPSHORT),"\n BUY TREND ",DoubleToStr(Close[i],Digits));

      else if(y0[i]-y1[i+1]<0) Comment("\n SWAPLONG = ",MarketInfo(Symbol(),MODE_SWAPLONG),
         "   SWAPSHORT = ",MarketInfo(Symbol(),MODE_SWAPSHORT),"\n SELL TREND ",DoubleToStr(Close[i],Digits));
     }

//---- done
   return(0);
  }
//+---------------------------------------------------------------------+
 

Im Allgemeinen ist es üblich, Trades in dem Moment zu eröffnen, in dem sich eine neue Kerze bildet, wenn bereits alle Informationen über die Kerze vorliegen, die gerade geschlossen wurde

datetime LastTime=0;


void OnTick()
   {
   if(LastTime==iTime(symbol,frame,0)) return;
   LastTime=iTime(symbol,frame,0);
 
Vitaly Muzichenko:

Ich würde das auch verschieben.

Sind Sie sicher, dass man Ihnen das gezeigt hat?

 int limit=ArraySize(Ma);
//---- EMA --------------------------------------------------------------- 
// а не вот сюда?
   for(i=limit1; i>=1; i--)  Ma[i]  =iMA(NULL,0,period,0,MODE_EMA,PRICE_CLOSE,i);
        
   for(i=limit1; i>=1; i--)  MaOn[i]=iMAOnArray(Ma,limit,period,0,MODE_EMA,i);

   for(i=limit1; i>=1; i--)
 
Aleksei Stepanenko:

Im Allgemeinen ist es üblich, Trades in dem Moment zu eröffnen, in dem sich eine neue Kerze bildet, wenn bereits alle Informationen über die Kerze vorliegen, die gerade geschlossen wurde

Wo muss ich diesen Code einfügen, damit er richtig funktioniert? Ich verstehe es nicht sehr gut, ich stehe erst am Anfang meiner Reise...
 
Aleksei Stepanenko:
Vitaly, ich habe festgestellt, dass die Leute eine Frage schreiben und sich dann um ihre Angelegenheiten kümmern, während wir uns miteinander amüsieren. Manchmal sind es mehrere Seiten mit Auszügen.
Wie Sie sehen können, ist das nicht immer so. :))