Errori, bug, domande - pagina 1030

 
Al_key:

E ho anche ottenuto il barshift usando la libreria del compositore. Non ci sono strumenti integrati nella Metatrader?

In realtà iBarShift() in MT4 probabilmente funziona allo stesso modo della libreria del compilatore, ma sarebbe meglio averla integrata - funzionerebbe più velocemente (perché è in C++).
 
MetaDriver:

Il tuo caso è trattato con un piccolo slittamento.

Il mio è peggio (a proposito, il tuo caso senza Slip funzionava, ha smesso qualche settimana fa).

Lo stesso schema ha smesso di funzionare senza scivoloni inquietanti su altri grafici (non attuali):

Codice da qui: https://www.mql5.com/ru/code/224

Gufi installati, vedi.

Su quello attuale lancio standard. AMA sul grafico, poke ricalcolo (a Sleep da 0 a 2350) - scendo a M1 e non torno più. Dopo alcuni secondi. AMA appare, e questo è tutto.

Cerco di usare le bandiere (devo memorizzare due bandiere, corrente e m1? Se ho già usato quella corrente (bandiera) e ora sto usando m1 (bandiera 2), allora...).

ma ne dubito... Le zecche di lunedì arriveranno prima che io torni a quella attuale :)

Aggiornare sì, ho un centinaio di oggetti sul grafico, e più AMA, cioè, è così pesante.

 
MetaDriver:

"Dobbiamo farlo, Fedya. Dobbiamo farlo".

(c) Shurik.

--

Un tale errore si verifica, per esempio, se la memoria per il buffer dinamico non è allocata (in questo caso, sotto ActualBuffer). Questo frammento di codice non lo rende chiaro.

Qui.

E come allocare la memoria per il buffer dinamico?

Immagino che quando lo scoprirò, la domanda sparirà.

Ecco tutto il codice

#include <TimeSeries.mqh>

#property indicator_separate_window
#property indicator_buffers 3
#property indicator_plots   3
//--- plot Actual
#property  indicator_label1  "Actual"
#property  indicator_type1   DRAW_LINE
#property  indicator_color1  clrLime
#property  indicator_style1  STYLE_SOLID
#property  indicator_width1  1
//--- plot Consensus
#property  indicator_label2  "Consensus"
#property  indicator_type2   DRAW_LINE
#property  indicator_color2  clrPeachPuff
#property  indicator_style2  STYLE_SOLID
#property  indicator_width2  1
//--- plot Previous
#property  indicator_label3  "Previous"
#property  indicator_type3   DRAW_LINE
#property  indicator_color3  clrLightCyan
#property  indicator_style3  STYLE_SOLID
#property  indicator_width3  1
//--- indicator buffers
double         ActualBuffer[];
double         ConsensusBuffer[];
double         PreviousBuffer[];
//--- indicator vars
string sDatetime;
string sActual;
string sConsensus;
string sPrevious;
int file_handle;
int barshift;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ActualBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ConsensusBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,PreviousBuffer,INDICATOR_DATA);
   file_handle = FileOpen("CSV - макроэкономика и госкорпстат/Existing Home Sales Change.csv",FILE_READ|FILE_CSV|FILE_ANSI,',');
   while(!FileIsEnding(file_handle))
        {
         sDatetime  = FileReadString(file_handle);
         sActual    = FileReadString(file_handle);
         sConsensus = FileReadString(file_handle);
         sPrevious  = FileReadString(file_handle);
         
         barshift = iBarShift(Symbol(), Period(), datetime(formatdatetime(sDatetime)), false);
         if(StringToDouble(formatstring(sActual)) > 0 && StringToDouble(formatstring(sActual)) < 10000) ActualBuffer[barshift] = StringToDouble(formatstring(sActual));
         Print(formatdatetime(sDatetime));
         Print("iBarShift = ", barshift, " Datetime = ", formatstring(sDatetime), " sActual = ", sActual, " sConsensus = ", sConsensus, " sPrevious = ", sPrevious);
        }
    
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
   
  }
//+------------------------------------------------------------------+
//--- Функции форматирования
string formatstring(string strparam)
   {
      string result = StringSubstr(strparam,1, StringLen(strparam) - 2);
      return(result);
   }
string formatdatetime(string strparam)
   {
      string result = StringSubstr(strparam, 1, 4) + "." + StringSubstr(strparam, 5, 2) + "." + StringSubstr(strparam, 7, 11);
      
      return(result);
   }
 
Al_key:

Qui.

Come si alloca la memoria per un buffer dinamico?

Immagino che una volta che l'avrò scoperto, la domanda sparirà.

Ecco tutto il codice

Ps.

Ho letto di Array Resize lì...ecco una copia

"Dopo il collegamento, un array dinamico buffer[]sarà indicizzato come negli array regolari, anche se l'array da collegare è preimpostato per essere indicizzato come nelle serie temporali. Se volete cambiare l'ordine di accesso agli elementi dell'array di indicatori, dovreste applicare la funzione ArraySetAsSeries() dopo aver legato l'array usando la funzione SetIndexBuffer(). Si dovrebbe tenere a mente che gli array dinamici che sono stati assegnati come buffer di indicatori dalla funzione SetIndexBuffer() non dovrebbero essere ridimensionati. Per i buffer indicatori, tutte le operazioni di ridimensionamento sono eseguite dal sottosistema di esecuzione del terminale".

Sono confuso.

 
Silent:
Salva il profilo configurato come predefinito File - Profili - Predefinito
Tipo di default, ancora nessun dato da caricare. Per la prima volta in un paio d'ore è andato tutto bene.
 
Al_key:

Qui.

Come si alloca la memoria per un buffer dinamico?

Immagino che una volta che l'avrò scoperto, la domanda sparirà.

Ecco l'intero codice

INDICATOR_DATA è il dato da disegnare. Questo buffer (dimensione) è monitorato dal terminale (da rates_total, come ho capito).

Aggiungere buffer per i calcoli intermedi (INDICATOR_CALCULATIONS). Per loro impostare la dimensione.

PS ho #include <TimeSeries.mqh> non può aprire per qualche motivo, non compila.

Upd Monday deve aspettare, c'è qualcosa che non va qui.

 
Silent:

INDICATOR_DATA è il dato da disegnare. Questo buffer (dimensione) è monitorato dal terminale (da rates_total, come ho capito).

Aggiungere buffer per i calcoli intermedi (INDICATOR_CALCULATIONS). Per loro impostare la dimensione.

PS Ho #include <TimeSeries.mqh> non può aprire per qualche motivo, non compila.

Upd Monday deve aspettare, c'è qualcosa che non va qui.

Già provato a cambiare, ancora lo stesso errore. Proverò almeno a mettere i valori in un array regolare, forse qualcosa funzionerà.
 
Al_key:
Ho provato a cambiarlo, ma ho ancora lo stesso errore. Proverò almeno a mettere i valori in un array regolare, forse qualcosa funzionerà.

Eccone uno semplice che funziona. In INDICATOR_DATA si scrive da INDICATOR_CALCULATIONS.

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   1
//--- plot Label1
#property  indicator_label1  "Label1"
#property  indicator_type1   DRAW_LINE
#property  indicator_color1  clrOrangeRed
#property  indicator_style1  STYLE_SOLID
#property  indicator_width1  1
//--- input parameters
input string   s="EURUSD";
input ENUM_TIMEFRAMES      tf;          // D1
input int      countBars=100;          // count
//--- put parameters
int   copied,i;
//--- indicator buffers
double         Label1Buffer[];
//--- buffers
double         p_Symbol[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,p_Symbol,INDICATOR_CALCULATIONS);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
//---
   if(prev_calculated==0)
     {
      ArrayInitialize(Label1Buffer,EMPTY_VALUE);
      ArrayInitialize(p_Symbol,EMPTY_VALUE);
      ArraySetAsSeries(Label1Buffer,true);
      ArraySetAsSeries(p_Symbol,true);
      ArraySetAsSeries(price,true);
     };
   ArrayCopy(p_Symbol,price,0,0,countBars);
   if(_LastError!=0) {Print(_LastError); return(prev_calculated);};
   if(_LastError==0)
     {
      for(i=countBars;i>0;i--)
        {
         Label1Buffer[i]=p_Symbol[i];
         Print("limitBars i = "+IntegerToString(i));
        };
     };
//--- return value of prev_calculated for next call
   return(rates_total);
  }
 
Silent:

INDICATOR_DATA è il dato da disegnare. Questo buffer (dimensione) è monitorato dal terminale (da rates_total, come ho capito).

Aggiungere buffer per i calcoli intermedi (INDICATOR_CALCULATIONS). Per loro impostare la dimensione.

PS ho #include <TimeSeries.mqh> non può aprire per qualche motivo, non compila.

Upd Monday deve aspettare, c'è qualcosa che non va qui.

Prendi qui: https://www.mql5.com/ru/code/1008

L'ho appena trovato, ecco perché non ho ancora sentito il codice. E non funzionerà ancora - il pubblico qui mi sta spingendo a fare acquisti.

Penso che tutto funzionerà, se il codice problematico sarà spostato da OnInit() a OnCalculate(). Per molto tempo ho conosciuto la caratteristica di Five - nessun codice in OnInit funziona bene. È probabile che la reale autodistribuzione dei buffer registrati attraverso SetIndexBuffer() sia garantita per finire solo dopo l'uscita da OnInit(), perché deve avvenire in background (è automatico, giusto?).

TimeSeries - Библиотека функций для работы с таймсериями
TimeSeries - Библиотека функций для работы с таймсериями
  • voti: 12
  • 2012.08.24
  • Andrey Khatimlianskii
  • www.mql5.com
Библиотека функций для работы с таймсериями: iBars, iTime, iOpen, iHigh, iLow, iClose, iVolume, iHighest, iLowest, iBarshift. Для всех функций доступен краткий вариант вызова (с символом и периодом текущего графика).
 

Ho notato che solo 3 agenti su 8 possono funzionare contemporaneamente quando ricevono compiti dal cloud.
Anche se se si esegue il test in parallelo, anche gli altri agenti sono abilitati.

È così che dovrebbe essere?