Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 987

 

Ciao, enorme rispetto a tutti coloro che mi aiutano a capire le caratteristiche di MT5. Senza di voi è molto difficile farlo... Stupore, singhiozzo, correre in cerchio. Quindi, RISPETTO e complimenti a voi.


Domanda. Qual è il modo migliore per collegare ilimiti di rates_total e della history bar? L'ho collegato correttamente nel codice? Grazie per la risposta, suggerimento, suggerimento.

//--- Проверка количества доступных баров
   if(rates_total<24) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     
      limit=rates_total-1;

//Показать историю за CountPeriods недель барах по Н1

int bars=PeriodSeconds(PERIOD_W1)/PeriodSeconds(PERIOD_H1)*CountPeriods;  //  CountPeriods=4; В глобальных переменных

//РЕШИЛ ТАК НО ПО-МОЕМУ ЧУШЬ...

int lm=iBarShift(NULL,PERIOD_H1,iTime(NULL,PERIOD_CURRENT,limit));      //rates_total-1 в днях
int start=lm-(lm-bars);

Comment(start,"    bars    ",bars);  //Равенство значений есть

STAVO GUARDANDO LA NUOVA ORA. TUTTO SEMBRA FUNZIONARE BENE.

Poi una domanda: ero corretto nel mio codice in termini di tassi_totali ?

 

Leggere attentamente l'aiuto per la funzione Bars:

"

Se i parametri start_time e stop_time sono specificati, la funzione restituisce il numero di barre nell'intervallo di date. Se questi parametri non sono specificati, la funzione restituisce il numero totale di barre.

"

L'aiuto non dice se le date di inizio o fine devono essere incluse o meno, di conseguenza non si sa cosa aspettarsi dalla funzione.

Ciò che è sorprendente è il modo in cui la funzione funziona:

   datetime         StartDt=StringToTime("2018.01.04 10:00");
   datetime         StopDt=StringToTime("2018.01.03 23:49");
//datetime         StopDt=StringToTime("2018.01.04 10:00");
//datetime         StopDt=StringToTime("2018.01.04 10:01");
   int              BarsGo=Bars(Symbol(),PERIOD_CURRENT,StartDt,StopDt);
   Print("BarsGo=",BarsGo);

Con qualsiasi opzione, comprese quelle commentate, StopDt ottiene un valore di 2!

Particolarmente sorprendente è l'opzione quando la data di inizio (2018.01.04 10:00) è più tardi nel tempo della data di fine (2018.01.03 23:49) nella seconda espressione - perché nessun errore o almeno 1 è dato?

Se la data d'inizio e la data di fine sono le stesse, allora ha senso dare ancora un 1 e non un 2!

Controllo lo strumento Si su FORTS, grafico a un minuto.

 

Si prega di aiutare, un pezzo di indicatore

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

   ArraySetAsSeries(time,true);

   datetime Fp=0,Ep=0,pFp=0,pEp=0,Arr[];
   int Count=0,bars=0,dt=0;

   int limit;
   if(prev_calculated==0 || prev_calculated<0 || prev_calculated>rates_total)
      limit=Nbar;
   else
      limit=rates_total-prev_calculated;

   for(int i=limit;i>=0;i--)
     {

      if(CopyTime(NULL,TimeFrame,time[i],1,Arr)>0)Ep=Arr[0]-1*PeriodSeconds(PERIOD_CURRENT);
      else return(0);

A volte l'array time[i] trabocca, per esempio di notte quando il mercato è chiuso.

2019.01.25 00:06:35.191 i-Regr4_05i (Si Splice,H1)      array out of range in 'i-Regr4_05i.mq5' (134,38)

Come risolvere questo problema?

 

Un indizio dopo una dichiarazione come questa.

double Price[]; 

La dimensione dell'array è sempre 0?

 
pivomoe:

Un indizio dopo una dichiarazione come questa.

La dimensione dell'array è sempre 0?

Sì.

 
Artyom Trishkin, come moderatore professionale e responsabile, mi piacerebbe molto sentire da te, soprattutto in riferimento al manuale, la giustificazione del comportamento della funzione Bars, piuttosto che le congetture!
 
Aleksey Vyazmikin:

Si prega di aiutare, un pezzo di indicatore

A volte l'array time[i] trabocca, per esempio di notte quando il mercato è chiuso.

Come risolvere questo problema?

Per esempio per calcolare correttamente il parametroNbar:

   if(prev_calculated==0 || prev_calculated<0 || prev_calculated>rates_total)
      limit=Nbar;
 
Aleksey Vyazmikin:

Leggere attentamente l'aiuto per la funzione Bars:

"

Se i parametri start_time e stop_time sono specificati, la funzione restituisce il numero di barre nell'intervallo di date. Se questi parametri non sono specificati, la funzione restituisce il numero totale di barre.

"

L'aiuto non dice se le date di inizio o fine devono essere incluse o meno, di conseguenza non si sa cosa aspettarsi dalla funzione.

Ciò che è sorprendente è il modo in cui la funzione funziona:

Con qualsiasi opzione, comprese quelle commentate, StopDt ottiene un valore di 2!

Particolarmente sorprendente è l'opzione quando la data di inizio (2018.01.04 10:00) è più tardi nel tempo della data di fine (2018.01.03 23:49) nella seconda espressione - perché nessun errore o almeno 1 è dato?

Se la data di inizio e la data di fine sono le stesse, allora ha senso dare ancora un 1 e non un 2!

Controllo lo strumento Si su FORTS, è un grafico a minuti.

Prima di discutere delle incongruenze, dovremmo mostrare che ci sono più barre sul grafico di quelle restituite dalla funzione.

Lavoro spesso con questa funzione e non ho nessun problema. Sono molto sorpreso che iBarShift e altre funzioni simili siano state incluse in mql5.

Il fatto che la funzione scambi i tempi 'from' e 'to' se il programmatore sbaglia improvvisamente è incluso nella nozione di "Foolproof".

E un consiglio: per far lavorare la funzione più velocemente, mettete un tempo di inizio barra. Un paio di righe in più garantiranno la velocità. Questo è particolarmente importante per un tester.

 
Vladimir Karputov:

Per esempio, calcolare correttamente il parametroNbar:

Ho già fatto un controllo per me stesso, ma questo controllo è per aggirare l'errore di questa funzione, l'aiuto non dice affatto della necessità di un controllo, il che significa che dovrebbe essere incorporato.

E poi, stai parlando di controllo dell'indicatore, mentre io uso Bars per calcolare il corretto tempo di inizio barra, come iBarShift è nella mia mente e solo adatto per il forex, dove non ci sono frequenti fallimenti con la storia a causa di compensazione e sessioni di trading non per tutto il giorno.

 
Alexey Viktorov:

Prima di parlare di incongruenze, dovreste mostrare che ci sono più barre sul grafico di quante ne restituisca la funzione.

Lavoro spesso con questa funzione e non ho nessun problema. Sono rimasto molto sorpreso dal perché hanno messo iBarShift e funzioni simili in mql5.

Il fatto che la funzione cambi i tempi 'from' e 'to' in alcuni punti se il programmatore li confonde improvvisamente è anche parte della nozione di "Foolproof".

Vorrei anche consigliare: per far funzionare più velocemente la funzione, mettete l'ora di inizio della barra. Un paio di linee in più forniranno velocità. Questo è particolarmente importante per un tester.

Questa non è una protezione ma un ostacolo al rilevamento di un errore nel codice!

Inoltre, non è affatto logico restituire il numero 2 se le date coincidono - qual è la logica qui?

L'ora di inizio di una barra su FORTS può non coincidere, il che porta ad errori nei calcoli, per esempio, una barra si apre non alle 14:00, ma alle 14:05 - ne ho sofferto anch'io.

Motivazione: