Analogo a iBarShift - pagina 15

 
Alexey Kozitsyn:
A proposito, riguardo alla funzione Bars(). Potrebbe essere la causa del clincher.
Questo è facile da controllare. Cambiare tutte le barre con le mie iBar. Se il cuneo scompare, allora il problema è in quella funzione. Anch'io non riuscivo a capire il motivo di alcuni dei miei indicatori che si bloccavano. Si è rivelato essere questo particolare bug, ora tutto vola.
 
fxsaber:

I cotypes possono andare per tutti i personaggi tranne quello di interesse.

OK, ho guardato il nuovo codice sorgente. Ho visto che le modifiche che sono state discusse non sono state fatte. Uscire.

Ha senso usare SYMBOL_TIME solo quando il simbolo richiesto non è nella finestra di Market Watch. Allora TimeCurrent non farà il suo lavoro. Ma questa variante di utilizzo di Bars mi sembra improbabile. Ma il prezzo per ottenere l'ora corrente tramite SYMBOL_TIME è molto più alto perché SymbolInfoInteger(symbol_name,SYMBOL_TIME) richiede quasi un ordine di grandezza in più. Certo, puoi controllare se il simbolo è nel rapporto di mercato e a seconda del risultato usareTimeCurrent o SYMBOL_TIME, ma non è gratis, inoltre devi sempre monitorare se un nuovo simbolo viene aggiunto o cancellato dal rapporto di mercato. Quindi è più facile fare una clausola che per il corretto funzionamento di iBars è ragionevole avere il simbolo richiesto nella relazione di mercato.

Perquanto riguarda SERIES_LASTBAR_DATE penso che ti sbagli.SymbolInfoInteger(symbol_name,SYMBOL_TIME) è il male minore.

La funzione SeriesInfoInteger non causa alcuna paginazione della storia. Se c'è qualcosa che lo causa, è una richiesta di Bars, il che è logico. E la fonte dei freni può essere vista in questo breve script, se lo si esegue

void OnStart()
  {
   Print("1");
   Print(Bars(_Symbol,PERIOD_W1,D'2020.01.01 00:00',UINT_MAX));
   Print("2");
  }
 

In generale un bug molto strano. Ho controllato l'effetto della cronologia dei download su di esso quando ho trovato che improvvisamente oggi sul simbolo EURUSD quasi non si è presentato.

Mi ha costretto a scaricare tutta la storia. E l'insetto è apparso di nuovo.

Immagino che la cronologia dei download non abbia alcun effetto su questo bug.

Non capisco perché questo bug sia in circolazione.

Ho usato questo script per testarlo:

File:
TestiBars.mq5  11 kb
 
Nikolai Semko:

Non capisco perché questo bug sia in circolazione.

La SD è al corrente di tutto questo argomento?

 
In generale, penso che il caricamento/caricamento dei dati sia il punto debole del terminale.
 
Alexey Kozitsyn:

La SD è al corrente di tutto questo argomento?

Sì, già scritto lì il 30.03.2018 - finora silenzio.

Alexey Kozitsyn:
In generale, penso che il caricamento/caricamento dei dati sia il punto debole del terminale.

D'accordo, ma è anche uno dei compiti più difficili.

 
Nikolai Semko:

La funzione iBars è abbastanza ingombrante, ma raccomando comunque di usarla al posto della normale Bars, finché MQ non risolve il bug di blocco in essa presente.

L'iBar si blocca quando logicamente dovrebbe restituire 0. Di regola, lo restituisce per più di 10 secondi. Non c'è un tale bug in MQL4.

Nella maggior parte dei compiti, iBars lavorerà più velocemente del normale Bars poiché non solo eviterà il bug, ma cercherà di non usare le funzioni Bars e SeriesInfoInteger quando possibile a causa dell'algoritmo di salvataggio dei valori precedenti.

Ho testato questa funzione su e giù. Sembra essere una copia completa di Bars.

Forse può essere fatto in un modo più elegante. Se avete un desiderio, siete i benvenuti. Se trovate degli errori, li correggeremo.

Quindi...

Allora l'analogo completo della funzione iBarsShift avrà la seguente forma:

E la variante senza l'ultimo parametro, che è usata nella stragrande maggioranza dei casi, avrà questo aspetto:

Uso il tuo codice iBarsShift+iBars (e altri iBarsShift) e ottengo 0 da iBarsShift, e un errore quando TF chart H1 e calcolo su H1

2018.04.21 14:38:01.059 SVA_LinearRegression_test (Si Splice,H1)        zero divide in 'SVA_LinearRegression_test.mq5' (176,44)

che corrisponde a questa linea di codice

   if(timeframe<PERIOD_W1) TimeCur-=TimeCur% PerSec;

Ecco il codice dell'indicatore nel suo insieme

#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots   3

//--- plot Label1
#property indicator_label1  "LR_line"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrGold
#property indicator_style1  STYLE_DOT
#property indicator_width1  1
//--- plot Label2
#property indicator_label2  "Sup_line"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrAquamarine
#property indicator_style2  STYLE_DOT
#property indicator_width2  1
//--- plot Label3
#property indicator_label3  "Res_line"
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrOrangeRed
#property indicator_style3  STYLE_DOT
#property indicator_width3  1


//--- input parameters
input ENUM_TIMEFRAMES TF=PERIOD_D1;
input int Bar=3;
input bool UseClose = true;


//--- indicator buffers
double LR_line_Ind[];
double Sup_line_Ind[];
double Res_line_Ind[];

//---
int limit,start;

//Список переменных:
static datetime TimeN=0;
int  barsToCount=0;

int InpChannelPeriod=1000;
double OpenI[];
double HighI[];
double LowI[];
double CloseI[];
double arr[];

double Calc_LR_line=0.0;
double Calc_Sup_line=0.0;
double Calc_Res_line=0.0;


//////////////////////////////////////////////////////////////////////

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,LR_line_Ind,INDICATOR_DATA);
   SetIndexBuffer(1,Sup_line_Ind,INDICATOR_DATA);
   SetIndexBuffer(2,Res_line_Ind,INDICATOR_DATA);   
//--- set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//--- set first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpChannelPeriod);
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpChannelPeriod);
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,InpChannelPeriod);   
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                         |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{


}
//+------------------------------------------------------------------+
//| 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[])
  {
   ArraySetAsSeries(LR_line_Ind,true); 
   ArraySetAsSeries(Sup_line_Ind,true); 
   ArraySetAsSeries(Res_line_Ind,true); 
   ArraySetAsSeries(time,true); 

//--- check for rates
   if(rates_total<InpChannelPeriod) return(0);
//--- preliminary calculations
   if(prev_calculated==0) limit=InpChannelPeriod;
   else limit=prev_calculated;
//--- the main loop of calculations
   for(int C=limit;C<rates_total && !IsStopped();C++)
     {
       LRegrf(C);
       LR_line_Ind[C]=Calc_LR_line;
       Sup_line_Ind[C]=Calc_Sup_line;
       Res_line_Ind[C]=Calc_Res_line;    
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
  
//+------------------------------------------------------------------+
double LRegrf(int index)
{
int Day_Shift=iBarShift(_Symbol,TF,iTime(_Symbol,PERIOD_CURRENT,index),false);

Print(iTime(_Symbol,PERIOD_CURRENT,index));
Print(Day_Shift);

return (0);
}
//-------------------------------------------------------------------
//==MQL4toMQL5
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
datetime iTime(string symbol,ENUM_TIMEFRAMES tf,int index)
  {
   if(index < 0) return(-1);
//   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   //ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT;
   datetime Arr[];
   if(CopyTime(symbol,tf,index,1,Arr)>0)
      return(Arr[0]);
   else return(-1);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int iBarShift(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time,bool exact=false)
  {
   int Res=iBars(Symb,TimeFrame,time+1,UINT_MAX);
   if(exact) if((TimeFrame!=PERIOD_MN1 || time>TimeCurrent()) && Res==iBars(Symb,TimeFrame,time-PeriodSeconds(TimeFrame)+1,UINT_MAX)) return(-1);
   return(Res);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int iBars(string symbol_name,ENUM_TIMEFRAMES  timeframe,datetime start_time,datetime stop_time)
  {
   static string LastSymb=NULL;
   static ENUM_TIMEFRAMES LastTimeFrame=0;
   static datetime LastTime=0;
   static datetime LastTime0=0;
   static int PerSec=0;
   static int PreBars=0;
   static datetime LastBAR=0;
   static datetime LastTimeCur=0;
   datetime TimeCur;
   if(stop_time<start_time) {TimeCur=stop_time; stop_time=start_time; start_time=TimeCur; }
   TimeCur=TimeCurrent();
   if(LastTimeFrame!=timeframe) if(timeframe==PERIOD_MN1) PerSec=2419200; else PerSec=::PeriodSeconds(timeframe);
   if(timeframe<PERIOD_W1) TimeCur-=TimeCur%PerSec;
   if(start_time>TimeCur) {LastSymb=NULL; return(0);}
   if(LastTimeFrame!=timeframe || LastSymb!=symbol_name || ((TimeCur-LastBAR)>0 && TimeCur!=LastTimeCur))
      LastBAR=(datetime)SeriesInfoInteger(symbol_name,timeframe,SERIES_LASTBAR_DATE);

   LastTimeCur=TimeCur;
   if(PerSec==0) return(0);
   if(start_time>LastBAR)
     {LastTimeFrame=timeframe; LastSymb=symbol_name; return(0);}

   datetime tS,tF=0;
   bool check=true;
   if(timeframe<PERIOD_W1) tS=start_time-(start_time-1)%PerSec-1;
   else if(timeframe==PERIOD_W1) tS=start_time-(start_time-259201)%PerSec-1;
   else
     {
      PerSec=2678400;
      MqlDateTime dt;
      TimeToStruct(start_time-1,dt);
      tS=dt.year*12+dt.mon;
     }
   if(stop_time<=LastBAR)
     {
      if(timeframe<PERIOD_W1) tF=stop_time-(stop_time)%PerSec;
      else if(timeframe==PERIOD_W1) tF=stop_time-(stop_time-259200)%PerSec;
      else
        {
         MqlDateTime dt0;
         TimeToStruct(stop_time,dt0);
         tF=dt0.year*12+dt0.mon;
        }
      if(tS==tF) {PreBars=0; check=false;}
     }
   if((LastTimeFrame!=timeframe || LastSymb!=symbol_name || tS!=LastTime || tF!=LastTime0) && check)
      PreBars=Bars(symbol_name,timeframe,start_time,stop_time);
   LastTime=tS; LastTime0=(datetime)tF;
   LastTimeFrame=timeframe;
   LastSymb=symbol_name;
   return(PreBars);
  }

PerchéPrint(Day_Shift) restituisce sempre zero, mentre data e ora sono corrette?

Sembra essere un effetto del fine settimana, dato che l'altro giorno tutto funzionava correttamente (anche se con una funzione diversa, ma non funziona nemmeno oggi).

 
Aleksey Vyazmikin:

Uso il tuo codice iBarsShift+iBars (e altri iBarsShift) e ottengo 0 da iBarsShift, e quando TF chart H1 e calcolo su H1 un errore

che corrisponde a questa linea di codice

Ecco il codice dell'indicatore nel suo insieme

PerchéPrint(Day_Shift) restituisce sempre zero, mentre data e giorno sono corretti?

Sembra essere un effetto del fine settimana, dato che tutto funzionava correttamente l'altro giorno (anche se con una funzione diversa, ma non funziona anche oggi).

Mi scuso per aver lasciato il codice nella forma sbagliata.

Ho notato l'imprecisione allora e l'ho quasi sistemata, ma c'era ancora un piccolo problema facilmente risolvibile.
Ho appena abbandonato il codice a causa del fatto che ora sto studiando e sono iniziati gli esami e semplicemente non ho tempo. L'ultimo esame è il 24 aprile.
Dopo di che sistemerò tutto e lo posterò su CB.

Ho già iniziato a pubblicarlo, ma l'ho messo in attesa.


 
Nikolai Semko:

Mi scuso per aver lasciato il codice nella forma sbagliata.

Ho notato il lavoro impreciso allora e l'ho quasi corretto, ma c'era ancora un piccolo problema facilmente risolvibile.
Ho appena abbandonato il codice perché ora sto studiando e il tempo degli esami è iniziato e semplicemente non ho tempo. L'ultimo esame è il 24 aprile.
Dopo di che sistemerò tutto e lo posterò su CB.

Ho già iniziato a postare ma l'ho messo in attesa.


Aspetterò le correzioni nella forma finale, grazie per aver risposto.

Buona fortuna per gli esami!

 
Aleksey Vyazmikin:

Aspetterò le correzioni nella forma finale, grazie per aver risposto.

Buona fortuna per gli esami!

Grazie))