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

 

Buon internet e buona salute a tutti.


Domanda: cosa sto sbagliando? Gli array (STATIC) sono riempiti, ma il calcolo dà 0 (zero). Puoi dirmi cosa non ho nel mio codice? Perché gli elementi dell'array non vengono confrontati e aggiunti...? Grazie


 double Open[60],High[60],Lo[60,Close[60]; int to_copy=60;
if(CopyOpen(NULL,PERIOD_H4,1,to_copy,Open)<to_copy)return(0);
   if(CopyHigh(NULL,PERIOD_H4,1,to_copy,High)<to_copy)return(0);
   if(CopyLow(NULL,PERIOD_H4,1,to_copy,Low)<to_copy)return(0);
   if(CopyClose(NULL,PERIOD_H4,1,to_copy,Close)<to_copy)return(0);
//----   
   //int start=to_copy*PeriodSeconds(PERIOD_H4)/PeriodSeconds(_Period);
   int start=to_copy;
   
   if(Tf==true)
     {
      if(prev_calculated==0)
         for(int j=1; j<=start; j++)
           {
            if(Open[j]>Close[j])
               candle+=Open[j]-Close[j];
            if(Close[j]>Open[j])
               candle+=Close[j]-Open[j];
            candleHL+=High[j]-Low[j];
            br+=1;
           } //for 
Comment(High[10],". ",candle);
candle дает результат 0 ноль
 
kopeyka2:

Buon internet e buona salute a tutti.


Domanda: cosa sto sbagliando? Gli array (STATIC) sono riempiti, ma il calcolo dà 0 (zero). Puoi dirmi cosa non ho nel mio codice? Perché gli elementi dell'array non vengono confrontati e aggiunti...? Grazie


1) Il ciclo va oltre l'array - se la dimensione del buffer è 60, l'ultimo indice è 59, perché il primo indice è 0

2) Il codice non è completo - ad esempio, come è definito Tf e con cosa è stata inizializzata la candela?


* quando si copiano i prezzi l'indicizzazione è spostata di uno, perché si copiano 60 elementi partendo dal primo indice, cioè i prezzi della prima barra chiusa saranno già sotto l'indice 0

 

Come funziona la funzione

IsStopped();

... e quale elenco di compiti esegue?


Nell'aiuto è scritto - "Controlla la terminazione forzata del programma mql5". Cioè, è una specie di "sguardo" su un certo numero di linee di codice avanti e controlla se qualcosa è corretto? Come è impostata la sua area di responsabilità (ad esempio per linea o 10 linee)?


Pensavo che impedisse solo al ciclo di andare oltre l'array, ma l'ho visto di nuovo nel codice FAMA prima di copiare i prezzi High e Low

 
Alexandr Sokolov:

Come funziona la funzione

... e quale elenco di compiti esegue?


Nell'aiuto è scritto - "Controlla la terminazione forzata del programma mql5". Cioè, è una specie di "sguardo" su un certo numero di linee di codice avanti e controlla se qualcosa è corretto? Come è impostata la sua area di responsabilità (ad esempio per linea o 10 linee)?


Pensavo che impedisse solo al ciclo di andare oltre l'array, ma l'ho visto ancora nel codice FAMA prima di copiare i prezzi High e Low

Non sembra da nessuna parte... È scritto chiaramente lì. Controlla la bandiera... Rileggerlo.

Документация по MQL5: Проверка состояния / IsStopped
Документация по MQL5: Проверка состояния / IsStopped
  • www.mql5.com
Возвращает true, если в системной переменной _StopFlag содержится значение, отличное от 0. Ненулевое значение записывается в переменную _StopFlag, если поступила команда завершить...
 
Alexandr Sokolov:

Come funziona la funzione

... e quale elenco di compiti esegue?


Nell'aiuto è scritto - "Controlla la terminazione forzata del programma mql5". Cioè, è una specie di "sguardo" su un certo numero di linee di codice avanti e controlla se qualcosa è corretto? Come è impostata la sua area di responsabilità (ad esempio per linea o per 10 linee)?


Pensavo che impedisse solo al ciclo di andare oltre l'array, ma l'ho visto nel codice FAMA prima di copiare i prezzi High e Low

se avviene un arresto di un programma MQL, la _StopFlag sarà impostata, e può essere controllata sia utilizzando una variabile predefinita o la funzione IsStopped() - qualunque cosa sia conveniente, usatela in questo modo.

dopo aver impostato _StopFlag , il programma MQL ha un po' di tempo per fermarsi, e poi il terminale lo scarica forzatamente

l'uso più diffuso - script in loop, non si dovrebbe

while(true)
{
...
}

è meglio scriverlo in questo modo:

while(!IsStopped())
{
...
}

Beh, a volte nei calcoli dei costi o nei grandi cicli usano

for(int i=0; i<1 e6 && !IsStopped(); i++)
{

}
 

Ciao a tutti.

Potete dirmi se è possibile fare un ciclo attraverso variabili con nomi: L1, L2, L3 ... Ln per scrivere in un array bidimensionale

extern string L1       = "1.15110;1.14105;1.13240;1.12370;1.11640;1.11170;1.10655;1.09895;1.08850;1.07850;1.06475;";
extern string L2       = "1.32130;1.31030;1.29860;1.29042;1.27985;1.25605;1.24725;1.23565;1.22505;1.20815;1.20115;1.18850;1.16690;1.14465;"; 
extern string L3       = "0.94947;0.93222;0.91472;0.90077;0.89075;0.88658;0.86814;0.84687;0.82795;0.81132;0.79022;0.75976;"; 

...

extern string Ln      = " ... ";    
 
Alexandr Sokolov:

1) Nel ciclo c'è un overrun dell'array - se la dimensione del buffer è 60, allora l'ultimo indice è 59, poiché il primo indice è 0

2) Il codice non è completo - ad esempio, come è definito Tf e con cosa è stata inizializzata la candela?


* quando si copiano i prezzi l'indicizzazione è spostata di uno, poiché si copiano 60 elementi a partire dal primo indice, cioè i prezzi della prima barra chiusa saranno già sotto l'indice 0

GRAZIE per la vostra risposta. Codice completo. Ha aumentato la dimensione statica dell'array. Rimossa la voce di controllo zero negli operatori. Comune "manichino". Sto ancora cercando di capire perché non si aggiunge. Cosa non c'è nel mio codice ora? Grazie per i suggerimenti. Non ho ancora lavorato con gli array statici in mql5.....

HO AGGIORNATO IL CODICE. La domanda è la stessa...

//+------------------------------------------------------------------+
//|                                                          123.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2020, "
//---- номер версии индикатора
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots   0
//----
input int       nBars = 20;
//----
int    limit=0,br=0,to_copy=nBars;
double corrHL,corrOC;
double averpips,averpipsH;
double candle,candleHL;
double opn,hgh,lw,cls;
double Open[65],High[65],Low[65],Close[65];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   
   Comment("");
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
   

      //+------------------------------------------------------------------+
//| Поиск события и установка меток  на графике                      |
//+------------------------------------------------------------------+
   if(CopyOpen(NULL,PERIOD_H4,0,to_copy,Open)<to_copy)
      return(0);
   if(CopyHigh(NULL,PERIOD_H4,0,to_copy,High)<to_copy)
      return(0);
   if(CopyLow(NULL,PERIOD_H4,0,to_copy,Low)<to_copy)
      return(0);
   if(CopyClose(NULL,PERIOD_H4,0,to_copy,Close)<to_copy)
      return(0);
     int indexmass=ArraySize(Open);
//----
   if(Tf==true)
     {
      if(prev_calculated==0)
         for(int j=1; j<=to_copy; j++) // поменять на ноль?????
           {
            opn=Open[j];
            hgh=High[j];
            lw=Low[j];
            cls=Close[j];
            if(opn>cls)
               candle+=opn-cls;
            if(cls>opn)
               candle+=cls-opn;
            candleHL+=hgh-lw;
            br+=1;
           } //for j
      if(br>0)
        {
         averpips=candle/br;
         averpips=NormalizeDouble(averpips,_Digits);
         averpipsHL=candleHL/br;
         averpipsHL=NormalizeDouble(averpipsHL,_Digits);
        }
      }
   Comment("indexmass  ",indexmass,"  Open ",Open[10],"  candle  ",candle,"  averpipsHL ",averpipsHL);
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Comment("indexmass  ",indexmass,"  Open ",Open[10],"  candle  ",candle,"  averpips ",averpips);
I valori degli elementi della matrice sono maggiori di zero. Nei calcoli, zero
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Допускается объявление не более чем 4-мерного массива. При объявлении динамического массива (массива с неуказанным значением в первой паре квадратных скобок) компилятор автоматически создает переменную указанной выше структуры (объект динамического массива) и обеспечивает код для правильной инициализации.   Статические массивы При явном...
 
stepystr:

Ciao a tutti.

Potete dirmi se è possibile fare un ciclo attraverso variabili con nomi: L1, L2, L3 ... Ln per scrivere in un array bidimensionale

cancellato il post - conosci gli array

ma ancora non è possibile

come opzione per scrivere una sostituzione macro, scrivi un esempio specifico - forse qualcuno scriverà una macro per il tuo compito, io sono pessimo a scrivere macro.

 

Gente!!! (Suggerimento ... )))

Codice completo. Aumentata la dimensione dell'array statico. Rimosso il controllo dello zero in scrittura negli operatori... Comune "manichino". Voglio ancora capire perché non conta l'addizione. Cosa manca ora nel mio codice? Grazie per i suggerimenti. Non ho ancora lavorato con gliarray statici in mql5.....

HO AGGIORNATO IL CODICE. La domanda è la stessa...

I valori degli elementi della matrice sono maggiori di zero. Nei calcoli, zero
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Допускается объявление не более чем 4-мерного массива. При объявлении динамического массива (массива с неуказанным значением в первой паре квадратных скобок) компилятор автоматически создает переменную указанной выше структуры (объект динамического массива) и обеспечивает код для правильной инициализации.   Статические массивы При явном...
 
kopeyka2:

GRAZIE per la risposta. Codice completo. Aumentata la dimensione dell'array statico. Rimossa la voce di controllo zero negli operatori... Comune "manichino". Sto ancora cercando di capire perché non si aggiunge. Cosa non c'è nel mio codice ora? Grazie per i suggerimenti. Non ho ancora lavorato con gli array statici in mql5.....

HO AGGIORNATO IL CODICE. La domanda è la stessa...

Non ho familiarità con gli indicatori, ma è semplicemente inutile. Ce l' ho già ))))

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[])
  {
   

      //+------------------------------------------------------------------+
//| Поиск события и установка меток  на графике                      |
//+------------------------------------------------------------------+
   if(CopyOpen(NULL,PERIOD_H4,0,to_copy,Open)<to_copy)
      return(0);
   if(CopyHigh(NULL,PERIOD_H4,0,to_copy,High)<to_copy)
      return(0);
   if(CopyLow(NULL,PERIOD_H4,0,to_copy,Low)<to_copy)
      return(0);
   if(CopyClose(NULL,PERIOD_H4,0,to_copy,Close)<to_copy)
      return(0);
     int indexmass=ArraySize(Open);
Motivazione: