Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 729

 
Artyom Trishkin:
In qualche modo (soluzione di @fxsaber):

//+------------------------------------------------------------------+
//| Возвращает смещение бара по времени                              |
//+------------------------------------------------------------------+
int GetBarShift(const string symbol_name, const ENUM_TIMEFRAMES timeframe, const datetime time) {
   int res=-1;
   datetime last_bar;
   if(SeriesInfoInteger(symbol_name,timeframe,SERIES_LASTBAR_DATE,last_bar)) {
      if(time>last_bar) res=0;
      else {
         const int shift=Bars(symbol_name,timeframe,time,last_bar);
         if(shift>0) res=shift-1;
         }
      }
   return(res);
}
//+------------------------------------------------------------------+
Qualcuno ha scritto da qualche parte che nella linea selezionata si dovrebbe fare così: if (time>=last_bar) res=0;

Non l'ho controllato, ad essere onesti - non lo ricevo sempre. Controllate e scrivete il risultato, per favore.
L'ho scritto io. Ed è logico, perché se il tempo coincide con il tempo di apertura della barra corrente, anche il suo indice sarà 0. Sì, la soluzione fxsaber pura funzionerà con errori.
 
Alexey Kozitsyn:
Non so se la mia soluzione è più "facile", ma provate questa: https://www.mql5.com/ru/forum/160945#comment_4053382

Non c'è una funzione standard nella lingua e ognuno deve costruire la propria moto e poi misurare le proprie prestazioni?

Sembra che ho trovato tutto tranne questo, ma dopo aver guardato diverse soluzioni, è ovvio che sono "chi può fare cosa".

 
Vitaly Muzichenko:

Non c'è una funzione standard nella lingua e ognuno deve costruire la propria moto e poi misurare le proprie prestazioni?

Mi sembra di averli trovati tutti tranne questo, ma dopo aver guardato le diverse soluzioni, è ovvio che sono "chi può fare cosa".

Non c'è uno standard. Hai fornito una variante dell'articolo https://www.mql5.com/ru/articles/81. La "stampella" è descritta anche lì.
Переход с MQL4 на MQL5
Переход с MQL4 на MQL5
  • 2010.05.11
  • Sergey Pavlov
  • www.mql5.com
Данная статья, построенная в форме справочника по функциям MQL4, призвана помочь переходу с MQL4 на MQL5. Для каждой функции языка MQL4 приведено описание и представлен способ ее реализации на MQL5, что позволит вам значительно ускорить перевод своих программ с MQL4 на MQL5. Для удобства функции разбиты на группы, как в документации по MQL4.
 

Un'ultima domanda. Oggi nel codebase ho visto un codice di un "master", quindi usa questo:

   double open_1=iOpen(1);
   double open_2=iOpen(2);
   double high_0=iHigh(0);
   double high_1=iHigh(1);
   double high_2=iHigh(2);
   double high_3=iHigh(3);
   double low_0=iLow(0);
   double low_1=iLow(1);
   double low_2=iLow(2);
   double low_3=iLow(3);
   double close_1=iClose(1);
   double close_2=iClose(2);


Proprio ieri ne ho scritto uno simile, ma in questo modo:

ArraySetAsSeries(Tick,true);
if(CopyRates(dSymbol,0,1,3,Tick)<0) return;
  open1 = Tick[0].open;  open2 = Tick[1].open;  open3 = Tick[2].open;
  high1 = Tick[0].high;  high2 = Tick[1].high;  high3 = Tick[2].high;
  low1  = Tick[0].low;   low2  = Tick[1].low;   low3  = Tick[2].low;
  close1= Tick[0].close; close2= Tick[1].close; close3= Tick[2].close;


Dopo quello che ho visto oggi, in qualche modo ho cominciato a dubitare della correttezza della mia decisione.

Domanda: quale opzione è migliore, perché sto appena imparando?

 
Vitaly Muzichenko:

Un'ultima domanda. Oggi nel codebase ho visto un codice di un "master", quindi usa questo:

   double open_1=iOpen(1);
   double open_2=iOpen(2);
   double high_0=iHigh(0);
   double high_1=iHigh(1);
   double high_2=iHigh(2);
   double high_3=iHigh(3);
   double low_0=iLow(0);
   double low_1=iLow(1);
   double low_2=iLow(2);
   double low_3=iLow(3);
   double close_1=iClose(1);
   double close_2=iClose(2);


Proprio ieri ho scritto una cosa simile, ma in questo modo:

ArraySetAsSeries(Tick,true);
if(CopyRates(dSymbol,0,1,3,Tick)<0) return;
  open1 = Tick[0].open;  open2 = Tick[1].open;  open3 = Tick[2].open;
  high1 = Tick[0].high;  high2 = Tick[1].high;  high3 = Tick[2].high;
  low1  = Tick[0].low;   low2  = Tick[1].low;   low3  = Tick[2].low;
  close1= Tick[0].close; close2= Tick[1].close; close3= Tick[2].close;


Dopo quello che ho visto oggi, in qualche modo ho cominciato a dubitare della correttezza della mia decisione.

Domanda: quale variante è migliore, perché sto appena imparando?

In questo caso la vostra implementazione dovrebbe funzionare più velocemente - poiché ci sono meno chiamate da copiare - copiate tre valori in una volta sola invece di uno.

Anche se nessuno vi impedisce di convertire il codice per ottenere un valore alla volta:

//+------------------------------------------------------------------+
//| Get Close for specified bar index                                |
//+------------------------------------------------------------------+
double iClose(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   double Close[1];
   double close=0;
   int copied=CopyClose(symbol,timeframe,index,1,Close);
   if(copied>0) close=Close[0];
   return(close);
  }

nel codice per ottenere più valori in una volta. Sono solo pigro :)

 
Vladimir Karputov:

In questo caso la vostra implementazione dovrebbe funzionare più velocemente - poiché ci sono meno chiamate di copia - copiate tre valori alla volta invece di uno alla volta.

Anche se nessuno vi impedisce di convertire il codice per ottenere un valore alla volta:

//+------------------------------------------------------------------+
//| Get Close for specified bar index                                |
//+------------------------------------------------------------------+
double iClose(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  }

nel codice per ottenere più valori in una volta. Sono solo pigro :)

Grazie per la risposta!

Quindi, è meglio applicare la soluzione che ho postato? C'è abbastanza un controllo, non ci saranno errori?

 
Vitaly Muzichenko:

Grazie per la risposta!

Quindi, è meglio applicare la soluzione che ho postato? Un controllo è sufficiente, non ci saranno errori?

CopyRates ha bisogno di almeno due controlli:

  1. controllo degli errori (se ... <0)
  2. controllare se la funzione ha restituito la giusta quantità (cosa succede se hai chiesto tre, e ha restituito solo due?)
Anche molto auspicabile: controllare i prezzi per la spazzatura (è possibile che restituisca "0" invece del prezzo)

 
Vitaly Muzichenko:

Grazie per la risposta!

Quindi, è meglio applicare la soluzione che ho postato? Un controllo è sufficiente, non ci saranno errori?

Anche la tua soluzione non è ottimale, perché inizializzi un mucchio di variabili con i valori dell'array che hai già. La domanda è: perché? Quando si può usare solo un array? Chiamatelo Bars e sarete felici:

ArraySetAsSeries(Bars, true);
if(CopyRates(Symbol(), 0, 1, 3, Bars)<0) return;
double value = Bars[0].open;
...
 
Vasiliy Sokolov:

Anche la tua soluzione non è ottimale, perché inizializzi un mucchio di variabili con valori di un array già derivato. La domanda è: perché? Quando si può usare solo un array? Chiamatelo semplicemente Bars e sarete felici:

ArraySetAsSeries(Bars, true);
if(CopyRates(Symbol(), 0, 1, 3, Bars)<0) return;
double value = Bars[0].open;
...

Lo chiamiBars e il compilatore ti dà uno schiaffo. Hai controllato questo costrutto o hai solo supposto che dovrebbe funzionare, o sto facendo qualcosa di sbagliato?

 
Vitaly Muzichenko:

ChiamatoBars, il compilatore è rimproverato come l'inferno. Hai testato questo progetto o hai solo supposto che dovrebbe funzionare?

barre[]
Motivazione: