Discussione sull’articolo "Migrazione da MQL4 a MQL5" - pagina 4

 
Interesting :

Ho iniziato a dubitare molto della funzionalità di questo progetto. Per quanto mi sforzassi di capire la logica del blocco, non ci riuscivo (e ci ho provato con tutte le mie forze)....

Qual è il dubbio? Conta correttamente.

//+------------------------------------------------------------------+
//|test.mq5 |
//+------------------------------------------------------------------+
#include <InitMQL4.mqh>
double   close[];
int      total,count;
datetime time[];
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnStart()
  {
   count=Bars(_Symbol,_Period);
   total=CopyClose(_Symbol,_Period,0,count,close);
   total=CopyTime(_Symbol,_Period,0,count,time);
   ArraySetAsSeries(time,true);
   ArraySetAsSeries(close,true);
   int N=7;
   int shift=iBarShiftMQL4(_Symbol,_Period,time[N]);
   Print("TIME",time[N],"BAR=",shift," CLOSE=",close[shift]);
  }
//+------------------------------------------------------------------+
int iBarShiftMQL4(string symbol,
                  int tf,
                  datetime time,
                  bool exact=false)
  {
   if(time<0) return(-1);
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   datetime Arr[],time1;
   CopyTime(symbol,timeframe,0,1,Arr);
   time1=Arr[0];
   if(CopyTime(symbol,timeframe,time,time1,Arr)>0)
      return(ArraySize(Arr)-1);
   else return(-1);
  }
//+------------------------------------------------------------------+
[Eliminato]  
DC2008 :

Qual è il problema? Sta contando correttamente.

E ora il gioco di prestigio


1. Nella MT4 scriviamo questa riga ed eseguiamo il codice su H4

Print(iBarShift(Symbol(),Period(),1274356800,false)); //data 20.05.2010 12:00 pm

Poi facciamo lo stesso con la MT5 e la stringa.

int shift=iBarShiftMQL4(_Symbol,_Period,StringToTime("20.05.2010 12:00"),false);

Come risultato otteniamo 8.


2. Successivamente eseguiamo esattamente la stessa operazione, ma con D1.

Come risultato MT4 restituisce - 1 e MT5 restituisce 0.

Ora chi può dirmi quanto questa implementazione di iBarShiftMQL4 corrisponda al necessario...

int iBarShiftMQL4(string symbol,
                  int tf,
                  datetime time,
                  bool exact=false)
  {
   if(time<0) return(-1);
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   datetime Arr[],time1;
   CopyTime(symbol,timeframe,0,1,Arr);
   time1=Arr[0];
   if(CopyTime(symbol,timeframe,time,time1,Arr)>0)
      return(ArraySize(Arr)-1);
   else return(-1);
  }
 

Provate questo:

int iBarShiftMQL4(string symbol,
                  int tf,
                  datetime time,
                  bool exact=false)
  {
   if(time<0) return(-1);
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   datetime Arr[],time1;
   CopyTime(symbol,timeframe,0,1,Arr);
   time1=Arr[0];
   if(CopyTime(symbol,timeframe,time,time1,Arr)>0)
     {
      if(ArraySize(Arr)>2) return(ArraySize(Arr)-1);
      if(time<time1) return(1);
      else return(0);
     }
   else return(-1);
  }
 

Ancora una volta, hai letto la funzione di cui stai scrivendo?????

Su mcl4 è scritto esattamente

double iClose( string symbol, int timeframe, int shift)
Restituisce il valore del prezzo di chiusura della barra dal grafico corrispondente(simbolo, timeframe) specificato dal parametro shift. In caso di errore, la funzione restituisce 0. Per ottenere maggiori informazioni sull'errore, richiamare la funzione GetLastError().
Per il grafico corrente, le informazioni sui prezzi di chiusura sono contenute nell'array predefinito Close[].

e si ha....

return(-1);

cosa stanno guardando i moderatori...

 

Grazie, CoreWinTT.

Funzioni corrette : iClose, iLow, iHigh, iOpen, iTime, iVolume. Restituiscono 0 invece di -1 in caso di errore.

 

e quando saranno in biblioteca?

in modo che fossero almeno

Perché se si apre, la domanda sorge, e il significato di quanto sopra scritto????.

e anche almeno raccogliere le funzioni per le quali tutte le domande sono risolte e procedere allo studio degli errori nelle altre.

 
bool  SetIndexBuffer(
   int                    index,         // indice del buffer
   double                 buffer[],      // array
   ENUM_INDEXBUFFER_TYPE  data_type      // cosa memorizzare
   );

l'altro giorno, qualcuno ha suggerito un modo intelligente per creare un ambiente μl4

utilizzando gli array di

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[])

ma sarà difficile utilizzarli perché hanno uno stato costante.

Non è possibile creare buffer globali

perché devono essere dichiarati con l'aiuto di

SetIndexBuffer

Associa al buffer indicatore specificato un array dinamico monodimensionale di tipo double dichiarato globalmente.

ma solo di tipo double, mentre i volumi e gli array di tipo date-time non passano.

L'unica cosa che resta da fare è avviare questi array all'interno del modulo mql4.

il che equivale praticamente a riscrivere l'indicatore....

 
CoreWinTT:

e quando saranno in biblioteca?

Ci sono già.
 
è vuoto ed era vuoto e solo un mucchio di definizioni e niente di più....
[Eliminato]  
CoreWinTT:

e quando saranno in biblioteca?

in modo che fossero almeno

Perché se si apre, la domanda sorge, e il significato di quanto sopra scritto????.

e anche almeno raccogliere le funzioni per le quali sono state risolte tutte le domande e procedere allo studio degli errori nelle altre.

Ci sono molte soluzioni su questo argomento nelle biblioteche private da molto tempo.

Io, per esempio, ho usato IsTesting() e cose simili fin dall'inizio, inoltre tutto è stato risolto con data e ora per molto tempo (naturalmente, ci sono altre soluzioni)....

Un'altra cosa è la presenza di tali "soluzioni obsolete" nella stessa MT5...