Errori, bug, domande - pagina 1936

 
Aleksey Vyazmikin:

Non sono ancora pronto a mostrare il codice a causa di

Ma pronto a mostrare i risultati di profilazione da MT5 - come ho capito le funzioni di trading sono fuori questione.



Per l'ambiente OHLC uso le seguenti funzioni

Forse sto facendo qualcosa di sbagliato?

Purtroppo state sbagliando tutto.

Invece di scrivere un codice MQL5 nativo ed efficiente, si usa un emulatore MQL4 terribilmente inefficiente che rallenta l'operazione decine di volte.

La cosa brutta è che non sai nemmeno cosa stai facendo, visto che fai domande sulla velocità.
 
Aleksey Vyazmikin:

il risultato è il seguente codice

https://www.mql5.com/ru/code/18305

Высокопроизводительная библиотека iTimeSeries
Высокопроизводительная библиотека iTimeSeries
  • voti: 19
  • 2017.05.25
  • nicholishen
  • www.mql5.com
Эта библиотека предоставляет молниеносный доступ к таймсериям для реализации привычных методов MQL4 (например, iBarShift) в чувствительных к задержкам приложениях на MQL5.
 

Grazie - ho visto questa libreria - la descrizione era confusa


Lamaggior parte del tempo viene spesa nella fase di inizializzazione. A meno che non abbiate intenzione di accedere più volte ai dati delle serie temporali - più di qualche migliaio di volte durante la formazione delle barre - dovreste considerare metodi alternativi.

Il mio Expert Advisor funziona solo all'apertura della barra - pensi che abbia senso provarlo?
 
Renat Fatkhullin:

Sfortunatamente, state sbagliando tutto.

Invece di scrivere un codice MQL5 nativo ed efficiente si usa un emulatore MQL4 terribilmente inefficiente, che rallenta l'operazione decine di volte.

La cosa brutta è che non capisci nemmeno cosa stai facendo, visto che fai domande sulla velocità.

Naturalmente, stavo cercando una soluzione - come sostituire le funzioni MQL4 con MQL5, in particolare riferendosi alle serie temporali, e ho visto che questo è uno dei problemi incontrati dalla maggior parte delle persone che passano a MQL5.

Di conseguenza, ho trovato la soluzione sullo stesso sito, dove uno degli articoli raccomandava il mio metodo.

Personalmente, non capisco la ragione di escludere una buona e comoda funzione dal linguaggio.

Quindi la mia domanda è: qual è il modo corretto di ricevere informazioni, e come si può trarre vantaggio da MQL5?

 
Aleksey Vyazmikin:

Quindi la mia domanda è: come organizzare correttamente la ricezione dei dati per sentire i vantaggi di MQL5?

Usare le funzioni native e più produttive di MQL5, e non aggrapparsi al codice MQL4. Qualsiasi convertitore/splitter MQL4 -> MQL5 ha prestazioni decine di volte più lente, dal momento che cerca di emulare le microfunzioni ad accesso diretto da MQL4 tramite operazioni in blocco MQL5. E l'emulazione è fatta completamente senza ottimizzazione e caching.

Alla radice dell'uso di una particolare funzione (un po' di codice, incluso il codice di altre persone), ci dovrebbe essere la comprensione di ciò che esattamente viene fatto. Altrimenti si ottiene "Ho appena usato il codice di qualcun altro e la velocità è scesa! Non si può ottenere un buon risultato senza capire lo strumento e ciò che si sta facendo con esso.


Oltre a "come farlo bene", dovrei chiarire che il compito di "imparare a programmare" è estremamente difficile, non appena si supera il livello più elementare di operare (non anche di capire, cioè operare) con un linguaggio. Quindi non vedo altro modo per imparare se non leggere masse di articoli, documentazione, codice pronto in biblioteca e pratica obbligatoria per diversi anni.
 
Renat Fatkhullin:

Usate le funzioni native e più produttive del linguaggio MQL5 e non aggrappatevi al codice MQL4.

Alla base dell'uso di una particolare funzione (un pezzo di codice, incluso il codice di altre persone) dovrebbe esserci la comprensione di ciò che viene fatto. Altrimenti ottieni "Ho appena usato il codice di qualcun altro, guarda - la velocità è diminuita! Senza capire lo strumento e ciò che si sta facendo con esso, non si può ottenere un buon risultato.


Oltre a "come farlo bene", dovrei chiarire che il compito di "imparare a programmare" è estremamente difficile, una volta che si va oltre il livello più elementare di operare (nemmeno capire, ma operare) con il linguaggio. Ecco perché non vedo altro modo per imparare se non leggere articoli, documentazione, codice pronto in biblioteca e fare pratica per diversi anni.

Renat, hai guardato il codice base? Ho del codice con funzioni esattamente adattate dal linguaggio MQL4.

Ti sto chiedendo specificamente di scrivere come ottenere le giuste informazioni sull'ambiente - fare riferimento a libri astratti non è produttivo e rafforza solo la mia idea (probabilmente sbagliata) che questa è solo una scusa che non puoi controllare.

Dire che sono così stupido da non capire il significato di una funzione, che è copiare informazioni in un array, è come dire che la documentazione di accompagnamento di un linguaggio di programmazione è di basso livello. Non capisco il beneficio di questa copia da un array all'altro e perché una funzione che ottiene informazioni da un array come necessario è un codice terribile.

 
Aleksey Vyazmikin:

Naturalmente, stavo cercando una soluzione - come sostituire le funzioni MQL4 con MQL5, in particolare riferendosi alle serie temporali, e ho visto che questo era uno dei problemi incontrati dalla maggior parte delle persone che passano a MQL5.

Di conseguenza, ho trovato la soluzione sullo stesso sito, dove uno degli articoli raccomandava il mio metodo.

Personalmente, non capisco la ragione di escludere una buona e comoda funzione dal linguaggio.

Ecco perché vi chiedo: qual è il modo corretto di ricevere informazioni per farmi sentire i vantaggi di MQL5?

Forse ho cercato male? Qui hai tutto quello che ti serve invece di tutto questo codice in una sola copia

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

Bug, bug, domande

Aleksey Vyazmikin, 2017.07.21 01:20

Grazie - l'ho corretto.

Di conseguenza, il codice è il seguente

//-------------------------------------------------------------------
//==MQL4toMQL5
//+------------------------------------------------------------------+ 
//| Получим Open для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Open(int index)
  {
   double open=0;
   int copied=CopyOpen(Symbol(),0,index,1,Open);
   if(copied>0) open=Open[0];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим Low для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double Low(int index)
  {
   double low=0;
   int copied=CopyLow(Symbol(),0,index,1,Low);
   if(copied>0) low=Low[0];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим High для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double High(int index)
  {
   double high=0;
   int copied=CopyHigh(Symbol(),0,index,1,High);
   if(copied>0) high=High[0];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим Close для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Close(int index)
  {
   double close=0;
   int copied=CopyClose(Symbol(),0,index,1,Close);
   if(copied>0) close=Close[0];
   return(close);
  }


  
//+------------------------------------------------------------------+ 
//| Получим IOpen для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iOpen(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double open=0;
   int copied=CopyOpen(symbol,timeframe,index,1,OpenI);
   if(copied>0) open=OpenI[0];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим iLow для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double low=0;
   int copied=CopyLow(symbol,timeframe,index,1,LowI);
   if(copied>0) low=LowI[0];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим iHigh для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double high=0;
   int copied=CopyHigh(symbol,timeframe,index,1,HighI);
   if(copied>0) high=HighI[0];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим iClose для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iClose(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double close=0;
   int copied=CopyClose(symbol,timeframe,index,1,CloseI);
   if(copied>0) close=CloseI[0];
   return(close);
  }

Il tempo nel tester è aumentato - sono già stanco di aspettare :)

Per usarlo, devi solo capire qual è la struttura

struct MqlRates
  {
   datetime time;         // время начала периода
   double   open;         // цена открытия
   double   high;         // наивысшая цена за период
   double   low;          // наименьшая цена за период
   double   close;        // цена закрытия
   long     tick_volume;  // тиковый объем
   int      spread;       // спред
   long     real_volume;  // биржевой объем
  };


Документация по MQL5: Доступ к таймсериям и индикаторам / CopyRates
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyRates
  • www.mql5.com
Доступ к таймсериям и индикаторам / CopyRates - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov:

Forse non stavo cercando abbastanza? Qui, in una sola copia si ottiene tutto il necessario invece di tutto questo codice

Per usarlo, tutto quello che dovete fare è capire qual è la struttura



Riceviamo la stessa cosa - infatti...

La variante che suggerisci si adatta, ifle:

- Il calcolo avviene solo all'apertura di una barra.

- Si sa in anticipo quante barre sono necessarie

Ho dei cicli nel mio codice, la quantità di calcolo può essere sconosciuta in anticipo.

E che senso ha copiare le informazioni per, diciamo, 300 barre ogni volta che lo apriamo, se sarebbe più ragionevole aggiungere semplicemente le informazioni su una nuova barra - perché lo sviluppatore non ha scelto questa strada?

 
Mi dispiace, ma non ho assolutamente il tempo di occuparmi di insegnare la programmazione a ogni singolo principiante. Soprattutto quando si vede che la persona non ha nemmeno passato le basi della comprensione della programmazione e chiede cose banali.


Ma vi mostrerò la direzione:

  1. Documentazione MQL5
  2. Codebase
  3. Articoli
  4. Forum (non nel modo "scrivi per me, perché non mi insegni e fai il mio lavoro?)
  5. Freelance (possono scriverlo correttamente qui)
  6. Lavoro indipendente con analisi ponderata del "perché questo wrapper dovrebbe rallentare e sprecare risorse, forse riscrivere in modo ottimale?"
  7. Utilizzando un profiler che mostra il consumo reale di risorse in ogni linea di codice
Профилирование кода - Разработка программ - Справка по MetaEditor
Профилирование кода - Разработка программ - Справка по MetaEditor
  • www.metatrader5.com
Профилирование — это сбор характеристик программы, таких как время выполнения отдельных ее фрагментов (функций, строк). В MetaEditor встроена...
 

Non ho alcun desiderio di comunicare in questo modo. Invece di cercare di capire quello che viene detto, di capire cosa succederà, si tirano fuori delle obiezioni incredibili.

Motivazione: