Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 350

 
Rustam Bikbulatov:

Ciao. Potete dirmi perché non vedeima=iMA(NULL,60,24,0,1,0,k). Il commento mostra una citazione molto più alta della linea stessa. Ecco perché non mostra affatto il min/max.

Non usare numeri, ma identificatori delle enumerazioni. È molto più chiaro:

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

Si vede subito che si sta chiedendo a iMA(). Per esempio:

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

e quindi iMA(NULL,PERIOD_H1,24,0,MODE_EMA,PRICE_CLOSE,k)

Qual è più chiaro?

Stai prendendo i dati MAK dal grafico orario. Se il programma è in esecuzione sul grafico orario, quali dati si aspetta di ottenere e vedere?

 
Artyom Trishkin:

Usare identificatori da enumerazioni, non numeri. È molto più chiaro:

È immediatamente ovvio che state chiedendo iMA(). Per esempio:

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

e quindi iMA(NULL,PERIOD_H1,24,0,MODE_EMA,PRICE_CLOSE,k)

Cosa è più chiaro?

Stai prendendo i dati MASK dal grafico orario. Se il programma è in esecuzione sul grafico orario, quali dati si aspetta di ottenere e vedere?

Ho messo questo sul grafico a minuti
   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;
     }

Non esce niente con k

 
Rustam Bikbulatov:

È una scommessa involontaria. Non cambia nulla. Il punto è che si mostra sbagliato con k!

Anche se sono mezza addormentata e ho la vista offuscata, è abbastanza ovvio che hai i valori MA sbagliati che provengono dal lato sbagliato :-) a parte la confusione del timeframe

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

Anche se sono mezzo addormentato e il mio occhio è un po' confuso, è abbastanza ovvio che hai i valori MA sbagliati che provengono dal lato sbagliato :-) a parte la confusione del timeframe


Idea interessante. Farò un tentativo. Semmai è un normale indicatore stocastico. L'idea sembrava prendere gli estremi delle barre per un certo periodo e gli estremi delle linee MA. È nella linea 100-113. Penso che questo migliorerà l'indicatore

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

Buon pomeriggio a tutti!

Potete dirmi per favore cosa fare, se per esempio ho impostato le impostazioni nel mio EA oggi, poi il giorno successivo alcune delle impostazioni appaiono vuote?

Succede ogni giorno.

 
Valerius:

Buon pomeriggio a tutti!

Potete dirmi per favore cosa fare, se per esempio ho impostato le impostazioni nel mio EA oggi, poi il giorno successivo alcune delle impostazioni appaiono vuote?

Succede ogni giorno.

Se hai il codice sorgente, allora rimuovi l'input (o extern) nel codice e cambia i parametri attraverso il codice.

 
Valerius:

Buon pomeriggio a tutti!

Potete dirmi per favore cosa fare, se per esempio ho impostato le impostazioni nel mio EA oggi, poi il giorno successivo alcune delle impostazioni appaiono vuote?

Succede ogni giorno.

Dovrei scrivere al Service Desk con più informazioni possibili sul problema.

 
Nauris Zukas:

Se avete il sorgente, allora rimuovete l'input (o extern) nel codice e cambiate i parametri tramite il codice.


Questo non è serio... Perché avete bisogno di loro (input ed extern) allora....

 
Artyom Trishkin:

Scrivete a servicedesk con più informazioni possibili sul problema.


Puoi darmi un link?

 
Valerius:

Puoi darmi un link?

E dai un'occhiata al tuo profilo... C'è un sacco di roba interessante lì.

Motivazione: