Discussão do artigo "Migrando do MQL4 para o MQL5" - página 4

 
Interesting :

Comecei a duvidar muito da funcionalidade desse design. Por mais que eu tentasse entender a lógica do bloco, não conseguia (e me esforcei muito)....

Qual é a dúvida? Ele conta corretamente.

//+------------------------------------------------------------------+
//|teste.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);
  }
//+------------------------------------------------------------------+
[Excluído]  
DC2008 :

Qual é o problema? Ele está contando corretamente.

E agora vamos ao hocus-pocus


1. No MT4, escrevemos esta linha e executamos o código no H4

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

Em seguida, fazemos o mesmo com o MT5 e a string.

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

Como resultado, obtemos 8.


2. Depois disso, fazemos exatamente a mesma operação, mas com D1.

Como resultado, o MT4 retorna - 1 e o MT5 retorna 0.

Agora, quem pode me dizer o quanto essa implementação do iBarShiftMQL4 corresponde ao necessário...

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);
  }
 

Experimente este:

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);
  }
 

Novamente, você já leu sobre a função sobre a qual está escrevendo???

No mcl4, ela está escrita exatamente

double iClose( string symbol, int timeframe, int shift)
Retorna o valor do preço de fechamento da barra do gráfico correspondente(símbolo, período de tempo) especificado pelo parâmetro shift. Em caso de erro, a função retorna 0. Para obter mais informações sobre o erro, chame a função GetLastError().
Para o gráfico atual, as informações sobre os preços de fechamento estão na matriz Close[] predefinida.

e você tem....

return(-1);

o que os moderadores estão vendo...

 

Obrigado, CoreWinTT.

Funções corrigidas : iClose, iLow, iHigh, iOpen, iTime, iVolume. Elas retornam 0 em vez de -1 em caso de erro.

 

e quando eles estarão na biblioteca????

para que eles estivessem pelo menos

Porque se você abri-lo, a pergunta surgirá e o significado do que foi escrito acima????.

e também, pelo menos, coletar as funções para as quais todas as perguntas foram resolvidas e continuar a estudar os erros nas demais.

 
bool  SetIndexBuffer(
   int                    index,         // índice do buffer
   double                 buffer[],      // matriz
   ENUM_INDEXBUFFER_TYPE  data_type      // o que vamos armazenar
   );

Outro dia, alguém sugeriu um meio inteligente de criar um ambiente μl4

usando matrizes de

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

mas será difícil usá-los porque eles têm estado constante.

Não é possível criar buffers globais

porque eles devem ser declarados com a ajuda de

SetIndexBuffer

Associa o buffer do indicador especificado a uma matriz dinâmica unidimensional do tipo double declarada globalmente.

O tipo double é o único tipo de buffer que pode ser declarado, mas somente o tipo double, e volumes e matrizes do tipo data-hora não serão aprovados.

A única coisa que resta é iniciar essas matrizes dentro do módulo mql4.

o que é praticamente igual a reescrever o indicador....

 
CoreWinTT:

e quando eles estarão na biblioteca????

Já estão.
 
está vazio e estava vazio e apenas um monte de definições e nada mais....
[Excluído]  
CoreWinTT:

e quando eles estarão na biblioteca????

para que eles estivessem pelo menos

Porque se você abri-lo, a pergunta surgirá e o significado do que foi escrito acima????.

e também, pelo menos, coletar as funções para as quais todas as perguntas foram resolvidas e continuar a estudar os erros no restante.

Há muitas soluções sobre esse tópico em bibliotecas particulares há muito tempo.

Eu, por exemplo, tenho usado IsTesting() e coisas semelhantes desde o início, e também tudo foi resolvido com data e hora por um longo tempo (é claro que há outras soluções)....

Outra coisa é a presença de tais "soluções desatualizadas" no próprio MT5...