O que atualiza o RefreshRates() - página 2

 
iClose: zero - erro. A função não dá um erro. Ele dá um valor que atualmente é obsoleto.
 
Eu li aqui que " iClose() obtém o valor do servidor do corretor" Se os dados destas funções são gerados por corretores honestos, então tudo se encaixa no lugar)))) Acontece que só podemos confiar no tick atual.
 
Artyom Trishkin:
Não, não é. O que está escrito na função ajuda sobre o valor de retorno?
iClose

Valor retornado

Valor do preço de fechamento da barra (especificado pelo parâmetro de deslocamento) do gráfico correspondente ou 0 em caso de erro. Ligue para GetLastError() para obter mais informações sobre o erro.

Diz que se não for 0, então não há erro. Mas o valor também não muda..., portanto não se atualiza sem RefreshRates(); o que me surpreendeu.
 
Mikhail Nazarenko:

E se você mudar o cronograma para um diferente do atual, os dados não serão atualizados a tempo, mesmo com RefreshRates(). Assim, as funções fundamentais do iClose etc. no MT4 produzem besteiras irrelevantes. Tenho certeza de que 80% das informações não levam em conta estas características únicas do MT4. Como viver?)))

Mudar o cronograma não fará nada. O valor atual do iClose é igual ao valor do Bid, independentemente do período do gráfico.
 
Alexey Viktorov:
A mudança não vai dar nada. O valor atual do iClose é igual ao valor do Bid, independentemente do período do gráfico.

Eu fiz um EA e o executei no M5 por um dia. Na mudança de hora desenha linhas horizontais para cada um dos valores: iClose(símbolo, PERÍODO_H1,1),iClose(símbolo, PERÍODO_ M5,1), iClose(símbolo, PERÍODO_ M1,1 ),Close[1],Bid

  1. iClose(símbolo, PERÍODO_ M5,1 ),Close[1] - mostrava exatamente como no gráfico
  2. A licitação estava próxima, este é o próximo tique
  3. iClose(símbolo,PERÍODO_H1,1),iClose(símbolo,PERÍODO_ M1,1) - algumas vezes eles eram os mesmos, e algumas vezes, especialmente nas horas da noite, eles mostravam uma merda completa, mesmo depois que o RefreshRates() foi conectado.

Pergunta para os desenvolvedores. Por que precisamos da funçãoiClose na MQL4, se ela não fornece as informações corretas e não há como atualizar seus dados?

 
Mikhail Nazarenko:

Eu fiz um EA e o executei no M5 por um dia. Na mudança de hora desenha linhas horizontais para cada um dos valores: iClose(símbolo, PERÍODO_H1,1),iClose(símbolo, PERÍODO_ M5,1), iClose(símbolo, PERÍODO_ M1,1 ),Close[1],Bid

  1. iClose(símbolo, PERÍODO_ M5,1 ),Close[1] - mostrava exatamente como no gráfico
  2. A licitação estava perto, este é o próximo tique
  3. iClose(símbolo,PERÍODO_H1,1),iClose(símbolo,PERÍODO_ M1,1) - algumas vezes eles eram os mesmos, e algumas vezes, especialmente nas horas da noite, eles mostravam uma merda completa, mesmo depois que o RefreshRates() foi conectado.

Pergunta para os desenvolvedores. Por que a MQL4 precisa das funçõesiClose, se elas não fornecem informações confiáveis e não há maneira de atualizar seus dados?

Isto é um absurdo. A chamada RefreshRates() só é necessária se a execução foi atrasada por qualquer motivo. Tais casos como ciclo longo ou apenas atualização de preços no momento do envio de um pedido para abrir um pedido. Não deve haver nenhum problema em sua variante. É melhor postar um exemplo de código que obtém valores de preço tão errados.

Estou executando o seguinte código agora

double close_H1,
       close_M1;

/*******************Expert initialization function*******************/
int OnInit()
 {
  return(INIT_SUCCEEDED);
 }/*******************************************************************/

/************************Expert tick function************************/
void OnTick()
 {
  if(NewBar(PERIOD_M5))
   {
    close_H1 = iClose(_Symbol, PERIOD_M5, 1);
    close_M1 = iClose(_Symbol, PERIOD_M1, 1);
    if(close_H1 != close_M1)
      Print(close_H1, " != ", close_M1);
   }
  Comment(close_H1, "\n",
          close_M1, "\n"
         );
 }/******************************************************************/

/**********************Expert OnDeinit function**********************/
void OnDeinit(const int reason)
 {
  Comment("");
 }/******************************************************************/

bool NewBar(ENUM_TIMEFRAMES tf)
  {
   static datetime nt = 0;
   datetime tm = iTime(_Symbol, tf, 0);
   if(tm == 0)
      return false;
   if(tm != nt)
     {
      nt = tm;
      return true;
     }
   return false;
 }/******************************************************************/
Na verdade, o fechamento por minuto deve coincidir com qualquer período alto no gráfico. Verificarei mais tarde para ver se há algo escrito no diário de bordo.
 
Mikhail Nazarenko:

E se você mudar o cronograma para um diferente do atual, os dados deixarão de ser atualizados a tempo, mesmo com RefreshRates().

Existe algum código de teste para confirmar esta declaração? Eu mesmo ainda não notei. Ao trocar a TF, simplesmente esperamos que a história seja trocada e depois trabalhamos.


Assim, o iClose e outras funções fundamentais no MT4 produzem disparates irrelevantes.

Esta é uma afirmação muito forte. Às vezes é possível, mas é para isso que servem os códigos de erro. Se você não verificá-los, nunca saberá se pode usar o resultado obtido.


Tenho certeza de que 80% dos infoprodutos não levam em conta estas características únicas do MT4. Como viver?)))

Direi mais: quase todos os programas não levam estas características em consideração. É por isso que suas novas versões são lançadas. Assim que um produto não é mais suportado, ele se torna inutilizável.

Документация по MQL5: Константы, перечисления и структуры / Коды ошибок и предупреждений
Документация по MQL5: Константы, перечисления и структуры / Коды ошибок и предупреждений
  • www.mql5.com
Коды ошибок и предупреждений - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov:

Isto é um absurdo. Só é necessário chamar RefreshRates() se tiver havido um atraso na execução por qualquer motivo. Casos como um ciclo longo ou apenas a atualização de preços no momento do envio de um pedido para abrir um pedido. Não deve haver nenhum problema em sua variante. É melhor postar um exemplo de código que obtém valores de preço tão errados.

Estou executando tal código agora

Em essência, o minuto de fechamento deve coincidir com qualquer período alto no gráfico. Mais tarde verei se há algo escrito no diário de bordo.

Meu código é semelhante a este. Há um erro no OnTick.

close_H1 = iClose(_Symbol, PERIOD_M5, 1);

Deve ser

close_H1 = iClose(_Symbol, PERIOD_H1, 1);
close_M5 = Close[1];
 if(close_H1 != close_M5)
	 Print(close_H1, " != ", close_M5);
if(close_M1 != close_M5)
	 Print(close_M1, " != ", close_M5);


Se tivermos o cronograma atual M5, devemos comparar M5 com H1 e M1

O cronograma atual M5 é exibido corretamente. O problema era com H1 e M1.

Verifiquei na Alpari real EURCHF M5, mas em vez de imprimir, desenhei barras horizontais em cada um dos níveis.

 
Ihor Herasko:

Existe algum código de teste para apoiar esta declaração? Eu não notei isso comigo mesmo. Ao trocar de TFs, nós apenas esperamos que a história seja trocada e depois trabalhamos.


Esta é uma declaração muito alta. Em alguns casos isso é possível, mas é para isso que servem os códigos de erro. Se você não verificá-los, nunca saberá se pode usar o resultado obtido.


Direi mais: quase todos os programas não levam algo em conta. É por isso que suas novas versões são lançadas. Assim que um produto não é mais suportado, ele é incapaz de ser utilizado.

Aqui está o código, coloque-o dentro e confira-o. Não tenho um fósforo em todas as velas. Alpari real EURCHF M5.

double close_H1,close_M5,
       close_M1;

/*******************Expert initialization function*******************/
int OnInit()
 {
  return(INIT_SUCCEEDED);
 }/*******************************************************************/

/************************Expert tick function************************/
void OnTick()
 {
  if(NewBar(PERIOD_M5))
   {
    close_H1 = iClose(_Symbol, PERIOD_H1, 1);
    close_M1 = iClose(_Symbol, PERIOD_M1, 1);
    close_M5 = Close[1];
    
    if(close_H1 != close_M5)
      Print(close_H1, " H1 != M5 ", close_M5);
    if(close_M1 != close_M5)
      Print(close_M1, " M1 != M5 ", close_M5);
   
     Comment(
               close_H1, " H1\n",
               close_M1, " M1\n",
               close_M5, " M5\n"
            );
         
  }       
 }/******************************************************************/

/**********************Expert OnDeinit function**********************/
void OnDeinit(const int reason)
 {
  Comment("");
 }/******************************************************************/

bool NewBar(ENUM_TIMEFRAMES tf)
  {
   static datetime nt = 0;
   datetime tm = iTime(_Symbol, tf, 0);
   if(tm == 0)
      return false;
   if(tm != nt)
     {
      nt = tm;
      return true;
     }
   return false;
 }/******************************************************************/

 
Mikhail Nazarenko:
iClose: zero - erro. A função não informa um erro. Produz um valor que é atualmente obsoleto.

Se você suspeitar de erros nas funções iXXXXXXX, use as funções SymbolInfoXXXXXXXX