Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 350

 
Rustam Bikbulatov:

Hi. Você pode me dizer por que não vêima=iMA(NULL,60,24,0,1,0,k). O comentário mostra uma cotação muito mais alta do que a própria linha. É por isso que não mostra min/max de forma alguma.

Utilizar identificadores das enumerações, não números. É muito mais 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;
     }

Você pode ver imediatamente que você está perguntando ao iMA(). Por exemplo:

você tem iMA(NULL,60,24,0,1,0,k)

e assim iMA(NULL,PERÍODO_H1,24,0,MODE_EMA,PREÇO_CLOSE,k)

O que é mais claro?

Você está tirando os dados MAK da tabela horária. Se o programa estiver rodando na tabela horária, que dados você espera obter e ver?

 
Artyom Trishkin:

Utilizar identificadores das enumerações, não números. É muito mais claro:

É imediatamente óbvio que você está perguntando ao iMA(). Por exemplo:

você tem iMA(NULL,60,24,0,1,0,k)

e assim iMA(NULL,PERÍODO_H1,24,0,MODE_EMA,PREÇO_CLOSE,k)

O que é mais claro?

Você está tirando os dados do MASK da tabela horária. Se o programa estiver rodando na tabela horária, que dados você espera obter e ver?

Coloco isto na tabela 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;
     }

Nada sai com k

 
Rustam Bikbulatov:

É uma aposta não intencional. Isso não muda nada. A questão é que isso se mostra errado com a k!

Embora eu esteja meio-semana e meus olhos estejam desfocados, é bastante óbvio que você tem os valores de Mestrado errados vindo do lado errado :-) além da confusão de tempo

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

Embora eu esteja meio adormecido e meu olho esteja um pouco enlameado, é bastante óbvio que você tem os valores de Mestrado errados vindo do lado errado :-) além da confusão de tempo


Idéia interessante. Vou tentar. Se alguma coisa é um indicador estocástico comum. A idéia parecia tomar extremos de barras por algum período e extremos de linhas MA. Está na linha 100-113. Acho que isso vai melhorar o 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);
  }
//+------------------------------------------------------------------+
 

Boa tarde a todos!

Você pode me dizer o que fazer se, por exemplo, eu tiver definido as configurações em minha EA hoje, então no dia seguinte algumas das configurações parecem estar vazias?

Isso acontece todos os dias.

 
Valerius:

Boa tarde a todos!

Você pode me dizer o que fazer se, por exemplo, eu tiver definido as configurações em minha EA hoje, então no dia seguinte algumas das configurações parecem estar vazias?

Isso acontece todos os dias.

Se você tiver o código fonte, então remova a entrada (ou externa) no código e altere os parâmetros através do código.

 
Valerius:

Boa tarde a todos!

Você pode me dizer o que fazer se, por exemplo, eu tiver definido as configurações em minha EA hoje, então no dia seguinte algumas das configurações parecem estar vazias?

Isso acontece todos os dias.

Eu deveria escrever ao Service Desk com o máximo de informações possíveis sobre o problema.

 
Nauris Zukas:

Se você tiver fonte, então remova a entrada (ou externa) no código e mude os parâmetros via código.


Isto não é sério... Por que você precisa deles (entrada e externa) então....

 
Artyom Trishkin:

Escreva para Servicedesk com o máximo de informações possíveis sobre o problema.


Você pode me dar um link?

 
Valerius:

Você pode me dar um link?

E dê uma olhada em seu perfil... Há muitas coisas interessantes lá.