Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 350

 
Rustam Bikbulatov:

Hallo. Können Sie mir sagen, warumima=iMA(NULL,60,24,0,1,0,k) nicht angezeigt wird?Der Kommentar enthält eine viel höhere Quote als die Zeile selbst. Deshalb werden auch keine Min-/Max-Werte angezeigt.

Verwenden Sie Bezeichner aus Aufzählungen, keine Nummern. Es ist viel klarer:

for(i=pos; i<rates_total && !IsStopped(); i++)
     {
      double dmin= DBL_MAX;
      double dmax=-DBL_MAX;
      for(k=i-InpKPeriod+1; k<=i; k++)
        {double ima=iMA(NULL,PERIOD_M1,60,0,MODE_EMA,PRICE_CLOSE,k);
         if(ima<dmin)  dmin=ima;
         if(ima>dmax)  dmax=ima;
         Comment("pos="+(string)pos+", k="+(string)k+", iMA="+DoubleToString(ima,Digits()));
        }
      ExtLowesBuffer[i]=dmin;
      ExtHighesBuffer[i]=dmax;
     }

Sie können sofort sehen, dass Sie iMA() abfragen. Zum Beispiel:

Sie haben iMA(NULL,60,24,0,1,0,k)

und somit iMA(NULL,PERIOD_H1,24,0,MODE_EMA,PRICE_CLOSE,k)

Was ist deutlicher?

Sie nehmen die MAK-Daten aus dem Stundenchart. Wenn das Programm auf dem Stundenchart läuft, welche Daten erwarten Sie zu sehen?

 
Artyom Trishkin:

Verwenden Sie Bezeichner aus Aufzählungen, keine Nummern. Es ist viel klarer:

Es ist sofort ersichtlich, dass Sie iMA() abfragen. Zum Beispiel:

Sie haben iMA(NULL,60,24,0,1,0,k)

und somit iMA(NULL,PERIOD_H1,24,0,MODE_EMA,PRICE_CLOSE,k)

Was ist klarer?

Sie übernehmen die MASK-Daten aus dem Stundenchart. Wenn das Programm auf dem Stundenchart läuft, welche Daten erwarten Sie zu sehen?

Ich habe dies auf dem Minutendiagramm
   for(i=pos; i<rates_total && !IsStopped(); i++)
     {
      double dmin=1000000.0;
      double dmax=-1000000.0;
      for(k=i-InpKPeriod+1; k<=i; k++)
        {double ima=iMA(Symbol(),1,60,0,1,0,k);
         if(dmin>ima)  dmin=ima;
         if(dmax<ima)  dmax=ima;
         Comment(dmax);
        }
      ExtLowesBuffer[i]=dmin;
      ExtHighesBuffer[i]=dmax;
     }

Bei k kommt nichts heraus

 
Rustam Bikbulatov:

Es ist eine ungewollte Wette. Es ändert sich nichts. Der eigentliche Punkt ist, dass es sich bei k!

Auch wenn ich halbwegs bei Sinnen bin und meine Augen verschwommen sind, ist es ziemlich offensichtlich, dass Sie die falschen MA-Werte haben, die von der falschen Seite kommen :-) abgesehen von der Verwirrung des Zeitrahmens

   // основной цикл
   // перебираем бары от последнего нерасчитанного к актуальному
   // (просто пример - поэтому инициализация и заполнение буферов пропущенны!!)
   for(int bar=prev_calculated;bar<rates_total && !IsStopped();bar++) {
      // bar использовать для обращения к массивам, i - к таймсериям
      int i=rates_total-bar-1;
      // считаем min,max от некой MA за DEPTH баров
      double min=DBL_MAX;
      double max=DBL_MIN;
      if (bar<DEPTH) {
         // данных ещё недостаточно
         continue;
      }
      for(int t=0;t<DEPTH;t++) {
         double ma=iMA(_Symbol,_Period,MA_PERIOD,0,MA_METHOD,MA_PRICE,i+t); // берём значение MA (! как в таймсериях 0-последнее)
         if (ma>0) {
            if (min<ma) min=ma;
            if (max>ma) max=ma;
         }
      }
      if (min!=DBL_MAX && max!=DBL_MIN) {
         // что-то делаем с полученными максимум/минимум MA
      }
   }
 
Maxim Kuznetsov:

Auch wenn ich im Halbschlaf bin und mein Auge etwas getrübt ist, ist es ziemlich offensichtlich, dass Sie die falschen MA-Werte haben, die von der falschen Seite kommen :-) abgesehen von der Verwirrung des Zeitrahmens


Interessante Idee. Ich werde es ausprobieren. Wenn überhaupt, handelt es sich um einen gewöhnlichen stochastischen Indikator. Die Idee schien, die Extremwerte der Balken für einen bestimmten Zeitraum und die Extremwerte der MA-Linien zu nehmen. Sie befindet sich in der Zeile 100-113. Ich denke, dies wird den Indikator verbessern.

//+------------------------------------------------------------------+
///+------------------------------------------------------------------+
//|                                                   Stochastic.mq4 |
//|                   Copyright 2005-2014, MetaQuotes Software Corp. |
//|                                              http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright   "2005-2014, MetaQuotes Software Corp."
#property link        "http://www.mql4.com"
#property description "Stochastic Oscillator"
#property strict

#property indicator_separate_window
#property indicator_minimum    0
#property indicator_maximum    100
#property indicator_buffers    2
#property indicator_color1     LightSeaGreen
#property indicator_color2     Red
#property indicator_level1     20.0
#property indicator_level2     80.0
#property indicator_levelcolor clrSilver
#property indicator_levelstyle STYLE_DOT
//--- input parameters
input int InpKPeriod=60; // K Period
input int InpDPeriod=60; // D Period
input int InpSlowing=1; // Slowing
//--- buffers
double ExtMainBuffer[];
double ExtSignalBuffer[];
double ExtHighesBuffer[];
double ExtLowesBuffer[];
//---
int draw_begin1=0;
int draw_begin2=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(void)
  {
   string short_name;
//--- 2 additional buffers are used for counting.
   IndicatorBuffers(4);
   SetIndexBuffer(2, ExtHighesBuffer);
   SetIndexBuffer(3, ExtLowesBuffer);
//--- indicator lines
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0, ExtMainBuffer);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1, ExtSignalBuffer);
//--- name for DataWindow and indicator subwindow label
   short_name="Sto("+IntegerToString(InpKPeriod)+","+IntegerToString(InpDPeriod)+","+IntegerToString(InpSlowing)+")";
   IndicatorShortName(short_name);
   SetIndexLabel(0,short_name);
   SetIndexLabel(1,"Signal");
//---
   draw_begin1=InpKPeriod+InpSlowing;
   draw_begin2=draw_begin1+InpDPeriod;
   SetIndexDrawBegin(0,draw_begin1);
   SetIndexDrawBegin(1,draw_begin2);
//--- initialization done
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Stochastic 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 &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int    i,k,pos;
//--- check for bars count
   if(rates_total<=InpKPeriod+InpDPeriod+InpSlowing)
      return(0);
//--- counting from 0 to rates_total
   ArraySetAsSeries(ExtMainBuffer,false);
   ArraySetAsSeries(ExtSignalBuffer,false);
   ArraySetAsSeries(ExtHighesBuffer,false);
   ArraySetAsSeries(ExtLowesBuffer,false);
   ArraySetAsSeries(low,false);
   ArraySetAsSeries(high,false);
   ArraySetAsSeries(close,false);
//---
   pos=InpKPeriod-1;
   if(pos+1<prev_calculated)
      pos=prev_calculated-2;
   else
     {
      for(i=0; i<pos; i++)
        {
         ExtLowesBuffer[i]=0.0;
         ExtHighesBuffer[i]=0.0;
        }
     }
//--- calculate HighesBuffer[] and ExtHighesBuffer[]
   for(i=pos; i<rates_total && !IsStopped(); i++)
     {
      double dmin=1000000.0;
      double dmax=-1000000.0;
      for(k=i-InpKPeriod+1; k<=i; k++)
        {double ima=iMA(Symbol(),1,60,0,1,0,k);
         if(dmin>ima)  dmin=ima;
         if(dmax<ima)  dmax=ima;
         Comment(ima);
        }
      ExtLowesBuffer[i]=dmin;
      ExtHighesBuffer[i]=dmax;
     }
//--- %K line
   pos=InpKPeriod-1+InpSlowing-1;
   if(pos+1<prev_calculated)
      pos=prev_calculated-2;
   else
     {
      for(i=0; i<pos; i++)
         ExtMainBuffer[i]=0.0;
     }
//--- main cycle
   for(i=pos; i<rates_total && !IsStopped(); i++)
     {
      double sumlow=0.0;
      double sumhigh=0.0;
      for(k=(i-InpSlowing+1); k<=i; k++)
        {
         sumlow +=(close[k]-ExtLowesBuffer[k]);
         sumhigh+=(ExtHighesBuffer[k]-ExtLowesBuffer[k]);
        }
      if(sumhigh==0.0)
         ExtMainBuffer[i]=100.0;
      else
         ExtMainBuffer[i]=sumlow/sumhigh*100.0;
     }
//--- signal
   pos=InpDPeriod-1;
   if(pos+1<prev_calculated)
      pos=prev_calculated-2;
   else
     {
      for(i=0; i<pos; i++)
         ExtSignalBuffer[i]=0.0;
     }
   for(i=pos; i<rates_total && !IsStopped(); i++)
     {
      double sum=0.0;
      for(k=0; k<InpDPeriod; k++)
         sum+=ExtMainBuffer[i-k];
      ExtSignalBuffer[i]=sum/InpDPeriod;
     }
//--- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

Guten Tag zusammen!

Können Sie mir bitte sagen, was zu tun ist, wenn ich zum Beispiel die Einstellungen in meinem EA heute gesetzt habe und am nächsten Tag einige der Einstellungen leer erscheinen?

Das passiert jeden Tag.

 
Valerius:

Guten Tag zusammen!

Können Sie mir bitte sagen, was zu tun ist, wenn ich zum Beispiel die Einstellungen in meinem EA heute gesetzt habe und am nächsten Tag einige der Einstellungen leer erscheinen?

Das passiert jeden Tag.

Wenn Sie den Quellcode haben, dann entfernen Sie input (oder extern) im Code und ändern Sie Parameter durch den Code.

 
Valerius:

Guten Tag zusammen!

Können Sie mir bitte sagen, was zu tun ist, wenn ich zum Beispiel die Einstellungen in meinem EA heute gesetzt habe und am nächsten Tag einige der Einstellungen leer erscheinen?

Das passiert jeden Tag.

Ich sollte dem Service Desk so viele Informationen wie möglich über das Problem geben.

 
Nauris Zukas:

Wenn Sie den Quellcode haben, dann entfernen Sie input (oder extern) im Code und ändern Sie die Parameter über den Code.


Das ist nicht ernst gemeint... Wozu braucht man sie (input und extern) dann....

 
Artyom Trishkin:

Schreiben Sie an servicedesk und geben Sie so viele Informationen wie möglich über das Problem an.


Können Sie mir einen Link geben?

 
Valerius:

Können Sie mir einen Link geben?

Und werfen Sie einen Blick auf Ihr Profil... Es gibt dort eine Menge interessanter Dinge.

Grund der Beschwerde: