Discussione sull’articolo "Migrazione da MQL4 a MQL5" - pagina 3

 

Propongo di migrare double MarketInfo(string symbol, int type) come un insieme di funzioni che restituiscono diversi tipi di dati, in base alla specifica dei parametri di input.


Ad esempio, queste funzioni:

int MarketInfoInt(simbolo stringa, tipo int );

string MarketInfoStr(simbolo stringa, tipo int )....

Una volta ho comunicato agli sviluppatori la questione dei RIFERIMENTI e dei risultati delle funzioni, ma si sono rifiutati di farlo (ed è un peccato).


PS

Su questa base, penso che la soluzione migliore per il momento sia la libreria MarketInfo, che conterrà tutte le funzioni necessarie.

A proposito, questo è esattamente ciò che ho fatto nella mia libreria :)

 
Interesting:

A mio parere, sono necessarie due funzioni per gestire il TF in un ambiente di migrazione:

1. Converte il numero di secondi in TF - diciamo ENUM_TIMEFRAMES SecondToPeriod (int Value);

2. Converte il periodo in secondi - diciamo int PeriodToSecond(ENUM_TIMEFRAMES Value).


Cosa che ho fatto con successo nel mio modulo di migrazione all'inizio (c'è anche un'opzione DLL).


PS

Per massimizzare la conformità con MQL4, personalmente mi sono sbarazzato di tutti i periodi non standard per esso



la funzione è buona e utile, ma l'esecuzione....

Lo farei in questo modo

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void FixTF(int &tf)
  {
   switch(tf)
     {
      case 0: tf = 0;break;
      case 1: tf = PERIOD_M1;break;
      case 5: tf = PERIOD_M5;break;
      case 15: tf = PERIOD_M15;break;
      case 30: tf = PERIOD_M30;break;
      case 60: tf = PERIOD_H1;break;
      case 240: tf= PERIOD_H4;break;
      case 1440: tf=PERIOD_D1;break;
      case 10080: tf = PERIOD_W1;break;
      case 43200: tf = PERIOD_MN1;break;
      default: tf=0;break;
     }
  }
//+------------------------------------------------------------------+



in tutte le funzioni è sufficiente definire le dimensioni degli array

proprio come az buki vedi.

 
CoreWinTT:

la funzione è buona e utile, ma l'esecuzione..... è un'eresia.

il vostro lavoro?

DOVE BREAK!!!!!! programmatori di dolore!!!!


In che modo return è peggiore di break?
 
Mi scuso.
 
CoreWinTT:

in tutte le funzioni basta definire la dimensione degli array
semplicemente come az'buki vedi.

Non sempre, si veda la sezione Accesso alle serie temporali e agli indicatori:

Funzioni per lavorare con le serie temporali e gli indicatori. Una serie temporale si differenzia da un normale array per il fatto che l'indicizzazione degli elementi della serie temporale avviene dalla fine dell'array all'inizio (dal dato più recente a quello più vecchio). Si raccomanda di utilizzare solo array dinamici per copiare i valori delle serie temporali e degli indicatori, perché le funzioni di copia allocano le dimensioni necessarie degli array-ricevitori di valori in modo indipendente.

Esiste un'importante eccezione aquesta regola : se la copia dei valori delle serie temporali e degli indicatori deve essere effettuata frequentemente, ad esempio a ogni chiamata di OnTick() negli Expert Advisor o a ogni chiamata di OnCalculate() negli indicatori, allora in questo caso è meglio utilizzare array distribuiti staticamente, perché le operazioni di allocazione della memoria per gli array dinamici richiedono un tempo aggiuntivo e ciò influisce sui test e sull'ottimizzazione degli Expert Advisor.

 

Come dimostra la mia pratica, è meglio farlo che non farlo.

Altrimenti si verifica un errore di accesso ai dati

soprattutto con gli array globali.


In primo luogo, perché in un array con una dimensione definita l'indicizzazione è statica e non ci sono questi momenti pericolosi di array di inversioni.

In secondo luogo, lo spazio per gli array viene allocato con maggiore parsimonia.

e in terzo luogo, la probabilità di un errore di accesso all'array si riduce di molte volte.

Per questo motivo ritengo che queste funzioni necessitino semplicemente di una funzione per determinare la dimensione dell'array.

 
CoreWinTT:

la funzione è buona e utile, ma ecco l'esecuzione....

Io lo farei in questo modo

L'articolo è stato modificato:

  • ripristinato la funzione TFMigrate() nella sua forma originale
  • modificato le funzioni nella sezione 18
 
Aggiunta la funzione iMAOnArray(...) al Manuale di riferimento
 
Corretta la funzione iMAOnArray. In modalità MODE_SMA il tempo di calcolo è notevolmente ridotto.
 

Ho iniziato a dubitare molto della funzionalità di questo progetto. Per quanto mi sforzassi di capire la logica del blocco, non ci riuscivo (e ci ho provato molto)....

int iBarShiftMQL4(string symbol,
                  int tf,
                  datetime time,
                  bool exact=false)
  {
   if(time<0) return(-1);
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   datetime Arr[],time1;
   CopyTime(symbol,timeframe,0,1,Arr);
   time1=Arr[0];
   if(CopyTime(symbol,timeframe,time,time1,Arr)>0)
      return(ArraySize(Arr)-1);
   else return(-1);
  }