Discussão do artigo "Símbolos personalizados: Fundamentos práticos" - página 6

 
Mr David Frederick Roberts #: Como eu disse, estou muito mais familiarizado com o MT4 (cerca de 8 anos) e não tinha percebido que havia duas opções "£Every Tick" no MT5. Eu simplesmente o iniciei, vi que estava definido como "Every Tick" e presumi que, se houvesse ticks reais, ele os usaria. Tinha que ser algo simples e agradeço novamente por ter detectado o problema.
De nada!
 

Talvez haja uma nova versão do EqualVolumeBars em algum lugar? Encontrei dois problemas ao usar esse EA:

1. Ao compilar o EqualVolumeBars, aparece um aviso (facilmente corrigido no Symbol.mqh, substituindo o tempo por _time, por exemplo):

declaration of 'time' hides global variable	Symbol.mqh	28	47

2. as barras desaparecem. Pelo que entendi, isso acontece quando um novo dia chega ao terminal. Por exemplo, a data em TimeCurrent() é 2023.06.03 (o BTCUSD faz ticks nos fins de semana) e a última barra do intervalo foi aberta em 2023 .06.02. Todas as barras de 2023.06.02 desaparecerão.

Você pode reproduzir esse problema em apenas algumas etapas:

  • Altere a linha 360 em EqualVolumeBars (para que o gráfico não se atualize):
//ChartSetSymbolPeriod(id,symbolName,PERIOD_M1);
  • Adicione EqualVolumeBars ao gráfico EURAUD com os seguintes parâmetros:

Obtenha um gráfico como este:

  • Clique com o botão direito do mouse no gráfico e clique em Refresh. Resultado:


 
Andrei Iakovlev #:

Talvez haja uma nova versão do EqualVolumeBars em algum lugar? Encontrei dois problemas ao usar esse Expert Advisor:

1. Ao compilar o EqualVolumeBars, aparece um aviso (facilmente corrigido no Symbol.mqh, substituindo o tempo por _time, por exemplo):

2. as barras desaparecem. Pelo que entendi, isso acontece quando um novo dia chega ao terminal. Por exemplo, a data em TimeCurrent() é 2023.06.03 (o BTCUSD faz ticks nos fins de semana) e a última barra do intervalo foi aberta em 2023 .06.02. Todas as barras de 2023.06.02 desaparecerão.

Você pode reproduzir esse problema em apenas algumas etapas:

  • Altere a linha 360 em EqualVolumeBars (para que o gráfico não se atualize):
  • Adicione EqualVolumeBars ao gráfico EURAUD com os seguintes parâmetros:

Obtenha um gráfico como este:

  • Clique com o botão direito do mouse no gráfico e clique em Refresh (Atualizar). Resultado:


Não há uma nova versão.

Há erros na implementação de caracteres personalizados no terminal, sobre os quais escrevi em algum lugar, mas eles não foram realmente corrigidos.

Nesse caso, você pode dar uma olhada no código - o símbolo existente é completamente preenchido ao iniciar o Expert Advisor, portanto, se algo for deixado a mais ou, ao contrário, o início do dia desaparecer - é assim que a API MQL5 funciona.

Como o código-fonte é aberto, você pode sugerir uma correção para resolver o problema.

 

Oi Stanislav Korotky

Obrigado por tudo o que você fez em relação às várias formas e tipos de tópico "Símbolos personalizados"

Em segundo lugar, desculpe-me por escrever em inglês, já que não sei russo - :)

1 questão levantada no código "RenkoTicks" (tipo de erro)

1

Você poderia, por gentileza, administrar o tempo para remover esse erro?

Atenciosamente

Stanislav Korotky
Stanislav Korotky
  • 2023.04.26
  • www.mql5.com
Trader's profile
 
mntiwana #:

Por gentileza, você pode gerenciar o tempo para remover esse erro?

Basta remover o 0 dentro das chaves. Siga as alterações de sintaxe da MQL5 nos anúncios de notícias. Esse anúncio é um pouco antigo - não consigo me lembrar da referência exata agora.

 
Stanislav Korotky #:

Este é um pouco antigo,

Mais uma vez, levei 3 anos para encontrar esta obra de arte. Se isso é "velho", o velho acabou de se tornar... lento. Ah. Obrigado.

 

Com relação ao RenkoTicks.mq5, tive um problema de conversão de pontos para pips com preços de 3 dígitos. Anteriormente, tive o mesmo problema com alguns utilitários no MT4, por isso implementei a mesma correção:


//em globais, inserir
double _PntsToPips;

//no OnInit, inserir
if(_Digits == 3 || _Digits == 5)
{
 PntsToPips = 10;
}
else
{
 _PntsToPips = 1;
}

//em 2 linhas contendo _Point (não em sendSpread...), insira
* _PntsToPips //2 novas linhas serão:

double Renko::boxPoints = NormalizeDouble(RenkoBoxSize * _Point * _PntsToPips, _Digits);
Renko::setBoxPoints(NormalizeDouble(RenkoBoxSize * _Point * _PntsToPips, _Digits));


 

Aqui está uma melhoria pequena, mas importante, no sinal personalizado baseado no cruzamento de 2 MA. Os objetos indicadores subjacentes mantêm buffers internos com os dados do indicador (não apenas no caso de MA, mas em geral), portanto, chamar m_maFast.Main(ind) ou m_maSlow.Main(ind) leva à leitura de dados um tanto desatualizados (em cache) dos objetos, não dos próprios indicadores, se o seu sistema de negociação operar por ticks (!). Agora isso foi substituído pelas seguintes chamadas para GetData, que é basicamente um invólucro para CopyBuffer direto:

class Signal2MACross : public CExpertSignal
{
    ...
    // funções auxiliares para ler os dados dos indicadores
    double FastMA(int ind) { static double buffer[1]; m_maFast.GetData(ind, 1, 0, buffer); return buffer[0]; }
    double SlowMA(int ind) { static double buffer[1]; m_maSlow.GetData(ind, 1, 0, buffer); return buffer[0]; }
};

O arquivo de cabeçalho atualizado está anexado. Ele deve ser colocado em /MQL5/Include/Expert/Signal/MySignals/. Sem isso, os sinais foram criados por barras concluídas.

Arquivos anexados:
 
<br/ translate="no">

Acabou sendo ainda pior. Algumas vezes, as séries temporais ainda não são recalculadas quando um novo tick é disparado, portanto, o índice da barra deve ser ajustado dinamicamente para a análise do sinal de negociação. Por exemplo (abordagem aproximada):

    double FastMA(int ind)
    {
      MqlTick t;
      SymbolInfoTick(m_symbol.Name(), t);
      bool correction = false;

      if(t.time / 60 * 60 != iTime(m_symbol.Name(), PERIOD_CURRENT, 0) && ind > 0)
      {
        ind--;
        correction = true;
      }
      
      static double buffer[1]; m_maFast.GetData(ind, 1, 0, buffer);
      
      if(correction)
        PrintFormat("F: %s'%03d %s %.5f", TimeToString(t.time, TIME_SECONDS), t.time_msc % 1000, TimeToString(iTime(m_symbol.Name(), PERIOD_CURRENT, 0)), buffer[0]);
        
      return buffer[0]; 
    }

Isso é fundamental para os EAs que negociam na abertura da barra e para símbolos com ticks esparsos.

 

E como criar um gráfico on-line com preço médio usando a fórmula (bid+ask)/2?