Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 350

 
Rustam Bikbulatov:

Salut. Pouvez-vous me dire pourquoi il ne voit pasima=iMA(NULL,60,24,0,1,0,k). Le commentaire indique une cote beaucoup plus élevée que la ligne elle-même. C'est pourquoi il n'affiche pas du tout les valeurs min/max.

Utilisez des identifiants issus d'énumérations, et non des numéros. C'est beaucoup plus clair :

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

Vous pouvez voir tout de suite que vous demandez iMA(). Par exemple :

vous avez iMA(NULL,60,24,0,1,0,k)

et donc iMA(NULL,PERIOD_H1,24,0,MODE_EMA,PRICE_CLOSE,k)

Lequel est le plus clair ?

Vous prenez les données MAK du graphique horaire. Si le programme est exécuté sur le graphique horaire, quelles données pensez-vous obtenir et voir ?

 
Artyom Trishkin:

Utilisez des identifiants issus d'énumérations, et non des numéros. C'est beaucoup plus clair :

Il est immédiatement évident que vous demandez iMA(). Par exemple :

vous avez iMA(NULL,60,24,0,1,0,k)

et donc iMA(NULL,PERIOD_H1,24,0,MODE_EMA,PRICE_CLOSE,k)

Lequel est le plus clair ?

Vous prenez les données MASK du graphique horaire. Si le programme est exécuté sur le graphique horaire, quelles données pensez-vous obtenir et voir ?

J'ai mis ceci sur le graphique des minutes
   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;
     }

Rien ne sort avec k

 
Rustam Bikbulatov:

C'est un pari involontaire. Ça ne change rien. Le point même est qu'il montre le mal avec k !

Même si je ne suis qu'à moitié réveillé et que mes yeux sont flous, il est évident que vous avez les mauvaises valeurs de MA provenant du mauvais côté :-) en dehors de la confusion des délais.

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

Même si je suis à moitié endormi et que mes yeux sont un peu embués, il est évident que vous avez les mauvaises valeurs de MA provenant du mauvais côté :-) à part la confusion des délais


Idée intéressante. Je vais essayer. Il s'agit en fait d'un indicateur stochastique ordinaire. L'idée semble être de prendre les extremums des barres pour une certaine période et les extremums des lignes MA. Il est dans la ligne 100-113. Je pense que cela améliorera l'indicateur

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

Bonjour à tous !

Pouvez-vous me dire ce qu'il faut faire si, par exemple, j'ai défini les paramètres de mon EA aujourd'hui et que, le lendemain, certains de ces paramètres sont vides ?

Cela arrive tous les jours.

 
Valerius:

Bonjour à tous !

Pouvez-vous me dire ce qu'il faut faire si, par exemple, j'ai défini les paramètres de mon EA aujourd'hui et que, le lendemain, certains de ces paramètres sont vides ?

Cela arrive tous les jours.

Si vous avez le code source, alors supprimez l'entrée (ou l'extern) dans le code et modifiez les paramètres à travers le code.

 
Valerius:

Bonjour à tous !

Pouvez-vous me dire ce qu'il faut faire si, par exemple, j'ai défini les paramètres de mon EA aujourd'hui et que, le lendemain, certains de ces paramètres sont vides ?

Cela arrive tous les jours.

Je dois écrire au Service Desk avec le plus d'informations possible sur le problème.

 
Nauris Zukas:

Si vous avez la source, alors supprimez l'entrée (ou l'externe) dans le code et changez les paramètres via le code.


Ce n'est pas sérieux... Pourquoi en avez-vous besoin (input et extern) alors....

 
Artyom Trishkin:

Écrivez à Servicedesk en lui fournissant le plus d'informations possible sur le problème.


Pouvez-vous me donner un lien ?

 
Valerius:

Pouvez-vous me donner un lien ?

Et jetez un coup d'oeil à votre profil... Il y a beaucoup de choses intéressantes.