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

 

Dopo le ultime risposte il quadro è diventato più chiaro e il più ovvio è che non sono destinato a diventare un programmatore :-)

Finora ho iniziato con l'elenco più semplice e questo è quello che si è rivelato:


2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[4] = 86.099999999999999999 2018.10.15 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[3] = 85.98999999999999999999 2018.10.16 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[2] = 86.76000000000001 2018.10.17 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[1] = 86.5 2018.10.18 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[0] = 85.72 2018.10.19 00:00:00



In alcuni casi, per qualche motivo, il prezzo supera la dimensione di due cifre significative dopo il punto in entrambe le direzioni.

E questo avviene senza alcun errore di calcolo, è solo l'output del valore del prezzo dal grafico base tmp1[i]=close[i];

C'è un modo per risolvere il problema o semplicemente ignorarlo?



 

Si può togliere da esso tutto ciò che è rilevante per il cinque, e ottenere un modello per il quattro.


Questo può essere scritto da qualcuno che conosce la differenza tra un cinque e un quattro, e sicuramente non sono io :-)


//--- Проверка количества доступных баров
   if(rates_total<fmax(period_ma,4)) return 0;


Da dove viene il numero 4, qual è il suo significato sacro?

 
psyman:


Questo può essere scritto da qualcuno che conosce la differenza tra un cinque e un quattro, e sicuramente non sono io :-)



Da dove viene il numero 4, che significato sacro ha?

Certamente non ascolti o leggi... Lo ero:

Forum sul trading, sistemi di trading automatico e test di strategia

Qualsiasi domanda, assistenza e discussione su algoritmi e codici per i principianti di MQL4

Artyom Trishkin, 2018.10.18 09:26

//+------------------------------------------------------------------+
//| 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[])
  {
//--- Проверка количества доступных баров (1 - минимально, 4 - оптимально для большинства расчётов. Но всё "по месту"...)
   if(rates_total<4) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated; // 0 - пришел новый тик, новый бар формироваться не начал. 1 - пришел новый тик и начал формироваться новый бар.
   if(limit>1) 
               // если вписать "limit>0", то на нулевом баре будет расчёт только нулевого бара, на каждом новом баре будет полный перерасчёт всей истории
               // если вписать "limit>1", то на нулевом баре будет расчёт только нулевого бара, на открытии нового бара - пересчёт первого и нулевого,
               // при подгрузке истории и на первом запуске - перерасчёт всей истории
     {
      limit=rates_total-1;
      // здесь должна быть инициализация всех используемых буферов индикатора необходимыми значениями (обычно EMPTY_VALUE и 0)
     }
//--- Расчёт индикатора
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      // необходимые действия по расчёту индикатора
     }

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

 
psyman:

Dopo le ultime risposte il quadro è diventato più chiaro e il più ovvio è che non sono destinato a diventare un programmatore :-)

Finora ho iniziato con l'elenco più semplice e questo è quello che si è rivelato:


2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[4] = 86.099999999999999999 2018.10.15 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[3] = 85.98999999999999999999 2018.10.16 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[2] = 86.76000000000001 2018.10.17 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[1] = 86.5 2018.10.18 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[0] = 85.72 2018.10.19 00:00:00



In alcuni casi, per qualche motivo, il prezzo supera la dimensione di due cifre significative dopo il punto in entrambe le direzioni.

E questo avviene senza alcun errore di calcolo, è solo l'output del valore del prezzo dal grafico base tmp1[i]=close[i];

C'è un modo per risolvere il problema o semplicemente ignorarlo?



Va bene. Per stampare numeri frazionari, usate semplicemente DoubleToString() con la precisione richiesta. In questo caso la precisione richiesta dovrebbe essere Digits()

 
psyman:

Dopo le ultime risposte il quadro è diventato più chiaro e il più ovvio è che non sono destinato a diventare un programmatore :-)

Finora ho iniziato con l'elenco più semplice e questo è quello che si è rivelato:


2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[4] = 86.099999999999999999 2018.10.15 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[3] = 85.98999999999999999999 2018.10.16 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[2] = 86.76000000000001 2018.10.17 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[1] = 86.5 2018.10.18 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[0] = 85.72 2018.10.19 00:00:00


In alcuni casi, per qualche motivo, il prezzo supera la dimensione di due cifre significative dopo il punto in entrambe le direzioni.

E questo accade senza alcun errore di calcolo, è solo l'output del valore del prezzo dal grafico base tmp1[i]=close[i];

Si può sconfiggere questo in qualche modo o semplicemente ignorarlo?

Questi sono valori normali per un numero reale. si può imparare a scrivere programmi, tutti iniziano lì - basta leggere molto e provare a scrivere e scrivere i propri codici.

L'accuratezza del numero reale, la mantissa, e il modo in cui è tutto immagazzinato nella memoria, puoi cercarlo su Google sul web, i principi di memorizzazione sono gli stessi ovunque.

se volete un bell'output usate DoubleToStr()

 
Igor Makanu:

questi sono valori normali per un numero reale, si può imparare a scrivere programmi, tutti iniziano lì - basta leggere molto e provare a scrivere e scrivere i propri codici

L'accuratezza del numero reale, la mantissa, e il modo in cui è tutto immagazzinato nella memoria, puoi cercarlo su Google sul web, i principi di memorizzazione sono gli stessi ovunque.

se volete un bell'output, usate DoubleToStr()

Quando è possibile utilizzare funzioni compatibili, è meglio offrirle per l'uso. Altrimenti questa epopea ricomincerà da capo. In questo caso: DoubleToString()

 

Come si può evitare che l'EA funzioni sugli stessi strumenti?

Per esempio, l'EA funziona nella finestra eur/usd, ma quando viene eseguito in altre finestre su eur/usd viene visualizzato qualche messaggio di avviso. Vi sarò molto grato per l'aiuto.

 
gans71:

Come si può evitare che l'EA funzioni sugli stessi strumenti?

Per esempio, l'EA funziona nella finestra eur/usd, ma quando viene eseguito in altre finestre su eur/usd viene visualizzato qualche messaggio di avviso. Sarò molto grato per l'aiuto.

Hai bisogno di trasferire dati da un EA a un altro, cerca nel forum

o usare le variabili globali del terminale (questo è il modo più semplice) - lì si può scrivere il valore del primo EA, e le copie successive dell'EA leggeranno questo valore e non verranno eseguitehttps://www.mql5.com/ru/docs/globals

Документация по MQL5: Глобальные переменные терминала
Документация по MQL5: Глобальные переменные терминала
  • www.mql5.com
Глобальные переменные существуют в клиентском терминале 4 недели с момента последнего обращения, после этого автоматически уничтожаются. Обращением к глобальной переменной считается не только установка нового значения, но и чтение значения глобальной переменной.
 
Igor Makanu:

hai bisogno di trasferire dati da un EA a un altro, cerca nel forum

o usare le variabili globali del terminale (questo è il modo più semplice) - lì si può scrivere il valore del primo EA, e le copie successive dell'EA leggeranno questo valore e non verranno eseguitehttps://www.mql5.com/ru/docs/globals

l'EA è lo stesso, è necessario proibirgli di funzionare sugli stessi strumenti
 
gans71:
l'EA è lo stesso, non dovresti permettergli di funzionare sugli stessi simboli

e? non avresti potuto studiare la guida in 2 minuti

Se stai parlando specificamente di come passare una stringa a una variabile globale, l'unico modo è creare un nome per la variabile globale, cioè nel tuo caso esegui un EA su EURUSD, fai un controllo

if(GlobalVariableCheck(_Symbol)) .....

Se non c'è una tale variabile, allora createne una sovradimensionata, come questa

if(GlobalVariableSet(_Symbol,Magic)==0) Print("Error writing to global variable # ",GetLastError());

poi al completamento dell'Expert Advisor, cancellare la variabile glob.variable

così com'è, il terminale non è a portata di mano, e ho tipo indicato la direzione di ricerca