Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 350

 
Rustam Bikbulatov:

Hola. ¿Puedes decirme por qué no veima=iMA(NULL,60,24,0,1,0,k). El comentario muestra una cotización mucho más alta que la propia línea. Por eso no muestra en absoluto el mínimo/máximo.

No utilice números, sino identificadores de las enumeraciones. Es mucho más claro:

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;
     }

Se puede ver de inmediato que se está pidiendo a iMA(). Por ejemplo:

tienes iMA(NULL,60,24,0,1,0,k)

y así iMA(NULL,PERIOD_H1,24,0,MODE_EMA,PRICE_CLOSE,k)

¿Qué es más claro?

Estás tomando los datos de MAK del gráfico horario. Si el programa se ejecuta en el gráfico horario, ¿qué datos espera obtener y ver?

 
Artyom Trishkin:

Utilice identificadores de enumeraciones, no números. Es mucho más claro:

Es inmediatamente obvio que está preguntando a iMA(). Por ejemplo:

tienes iMA(NULL,60,24,0,1,0,k)

y así iMA(NULL,PERIOD_H1,24,0,MODE_EMA,PRICE_CLOSE,k)

¿Qué es más claro?

Estás tomando los datos de la máscara del gráfico horario. Si el programa se ejecuta en el gráfico horario, ¿qué datos espera obtener y ver?

Puse esto en el gráfico de minutos
   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;
     }

No sale nada con k

 
Rustam Bikbulatov:

Es una apuesta involuntaria. No cambia nada. ¡El punto mismo es que se muestra mal con k!

Aunque estoy medio mosca y tengo los ojos borrosos, es bastante obvio que tienes los valores de la MA equivocados viniendo del lado equivocado :-) aparte de la confusión del marco temporal

   // основной цикл
   // перебираем бары от последнего нерасчитанного к актуальному
   // (просто пример - поэтому инициализация и заполнение буферов пропущенны!!)
   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:

Aunque estoy medio dormido y tengo el ojo un poco turbio, es bastante obvio que tienes los valores de MA equivocados viniendo del lado equivocado :-) aparte de la confusión de los plazos


Una idea interesante. Lo intentaré. En todo caso es un indicador estocástico ordinario. La idea parecía ser tomar los extremos de las barras para algún periodo y los extremos de las líneas MA. Está en la línea 100-113. Creo que esto mejorará el indicador

//+------------------------------------------------------------------+
///+------------------------------------------------------------------+
//|                                                   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);
  }
//+------------------------------------------------------------------+
 

¡Buenas tardes a todos!

¿Puede decirme qué hacer si, por ejemplo, he configurado los ajustes en mi EA hoy, y al día siguiente algunos de los ajustes aparecen vacíos?

Ocurre todos los días.

 
Valerius:

¡Buenas tardes a todos!

¿Puede decirme qué debo hacer si, por ejemplo, he configurado los ajustes en mi EA hoy, y al día siguiente algunos de los ajustes aparecen vacíos?

Ocurre todos los días.

Si tienes el código fuente, entonces elimina la entrada (o el externo) en el código y cambia los parámetros a través del código.

 
Valerius:

¡Buenas tardes a todos!

¿Puede decirme qué hacer si, por ejemplo, he configurado los ajustes en mi EA hoy, y al día siguiente algunos de los ajustes aparecen vacíos?

Ocurre todos los días.

Debería escribir al Service Desk con toda la información posible sobre el problema.

 
Nauris Zukas:

Si tienes el código fuente, entonces elimina la entrada (o el externo) en el código y cambia los parámetros a través del código.


Esto no es serio... Por qué los necesita (input y extern) entonces....

 
Artyom Trishkin:

Escribe a servicedesk con toda la información posible sobre el problema.


¿Puede darme un enlace?

 
Valerius:

¿Puede darme un enlace?

Y echa un vistazo a tu perfil... Hay muchas cosas interesantes.