Símbolos personalizados. Erros, bugs, perguntas, sugestões. - página 23

 
Slava :

No momento, não é possível formar barras de ferramentas personalizadas com carrapatos de um dia que não seja hoje (ontem, anteontem, no ano passado, etc.).

Mas. Fizemos uma correção.

Ao usar CustomTicksReplace (não CustomTicksAdd! não use CustomTicksAdd para adicionar carrapatos em massa), o último dia de carrapatos adicionados torna-se "atual" se antes não houvesse carrapatos para hoje.

Aguarde a próxima construção. Depois continuaremos as experiências e discussões

Estou usando o Build 2177. Acho que é a mais recente.

Mas eu não posso trabalhar com a CUSTOMSYMBOL. Você pode me dizer quando posso esperar uma construção que me ajude?

Onde posso ver as mudanças na construção?

 

O indicador anexo funciona na construção atual 2177

Este é o seu indicador. Ele é editado, mas o algoritmo é o mesmo. Coloquei o arquivo Symbol.mqh em MQL5Inclui

Mude a linha

#include  <Includes\Symbol.mqh>

de modo a usar seu Symbol.mqh.

As barras são formadas. As carteiras são corretamente aplicadas à história, não apenas no MarketWatch


Arquivos anexados:
 
Slava :

O indicador anexo funciona na construção atual 2177

Este é o seu indicador. Ele é editado, mas o algoritmo é o mesmo. Coloquei o arquivo Symbol.mqh em MQL5Inclui

Mude a linha

de modo a usar seu Symbol.mqh.

As barras são formadas. As carteiras são corretamente aplicadas à história, não apenas no MarketWatch


Vou verificar isso. Talvez alguns problemas no meu código. Mas o código parece bom.

 

Bug 25.

Ao escrever carrapatos em um símbolo personalizado, eles são normalizados de maneira diferente!

sinput datetime inDateFrom = D'2019.12.01';

// Проверка нормализации числа.
bool IsNorm( const double Price )
{
  return(NormalizeDouble(Price, _Digits) == Price);
}

#define  TOSTRING(A) #A + " = " + DoubleToString(A, 16) + " "
#define  PRINT(A) Print(TOSTRING(A) + TOSTRING(NormalizeDouble(A, _Digits)))
#define  ISNORM(A) if (!IsNorm(A)) { PRINT(A); Count++; };

// Распечатка ненормализованных цен тиков.
void CheckNorm( const MqlTick &Ticks[], const int MaxAmount = 10 )
{  
  const int Size = ArraySize(Ticks);
  
  for (int i = 0, Count  = 0; (i < Size) && (Count < MaxAmount); i++)
  {
    ISNORM(Ticks[i].bid)
    ISNORM(Ticks[i].ask)
    ISNORM(Ticks[i].last)
  }
}

// Нормализация цен тика.
void Normalize( MqlTick &Tick, const int digits )
{
  Tick.bid = ::NormalizeDouble(Tick.bid, digits);
  Tick.ask = ::NormalizeDouble(Tick.ask,  digits);
  Tick.last = ::NormalizeDouble(Tick.last, digits);
}

// Нормализация цен тиков.
void Normalize( MqlTick &Ticks[], const int digits )
{
  for (int i = ArraySize(Ticks) - 1; i >= 0; i--)
    Normalize(Ticks[i], digits);
}

void OnStart()
{
  const string Name = "TEMP12345";                                                           // Имя кастомного символа
  const string SymbOrig = "EURUSD";                                                          // Имя оригинального символа

  MqlTick Ticks[];
  
  const int Size = CopyTicksRange(SymbOrig, Ticks, COPY_TICKS_ALL, (long)inDateFrom * 1000); // Считали EURUSD-тики.
    
  if ((Size > 0) && CustomSymbolCreate(Name, NULL, SymbOrig) && SymbolSelect(Name, true))    // Создали символ на основе EURUSD.
  {
    const int digits = (int)SymbolInfoInteger(Name, SYMBOL_DIGITS);
    
    Normalize(Ticks, digits);                                                                // Нормализовали цены тиков.
    
    Print("Check1");
    CheckNorm(Ticks);                                                                        // Проверили, что цены тиков нормализованы.
    
    CustomTicksReplace(Name, 0, LONG_MAX, Ticks);                                            // Поместили в него историю EURUSD.        

    MqlTick NewTicks[];
    
    CopyTicksRange(Name, NewTicks, COPY_TICKS_ALL, (long)inDateFrom * 1000);                 // Считали тики из кастомного символа
    
    Print("Check2");
    CheckNorm(NewTicks);                                                                     // Проверили, что цены тиков нормализованы.
  }
}


Resultado

Check1
Check2
Ticks[i].bid = 1.1024100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1024099999999999 
Ticks[i].bid = 1.1024100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1024099999999999 
Ticks[i].bid = 1.1024100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1024099999999999 
Ticks[i].bid = 1.1024100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1024099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1023099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1023099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1023099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1023099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1023099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble(Ticks[i].bid,_Digits) = 1.1023099999999999 


Parece haver algum tipo de NormalizeDouble dentro do Terminal que difere do padrão. Este bug pode afetar invisivelmente muitos algoritmos.


Por favor, conserte-o. A necessidade natural de escrever preços normalizados não pode ser implementada.

 
fxsaber:

Bug 25.

Ao escrever carrapatos em um símbolo personalizado, eles são misturados!

Resultado

O Terminal parece ter seu próprio NormalizeDouble, diferente do padrão. Este bug pode afetar invisivelmente muitos algoritmos.

Por favor, conserte-o. A necessidade natural de escrever preços normalizados não pode ser implementada.

Você tem uma função Normalizar sobrecarregada
Tente mudar o nome da função.
Talvez isto faça com que a normalização falhe.

 
fxsaber:

Bug 25.

Ao escrever carrapatos em um símbolo personalizado, eles são misturados!


Resultado


O Terminal parece ter seu próprio NormalizeDouble, diferente do padrão. Este bug pode afetar invisivelmente muitos algoritmos.


Por favor, conserte-o. A necessidade natural de escrever preços normalizados não pode ser implementada.

Ambos os casos são o resultado da normalização do ponto decimal.

Você ainda está comparando números reais para uma igualdade absoluta?

Qual servidor é a fonte dos carrapatos originais?

 
Roman:

Você tem uma função Normalizar sobrecarregada
Tente mudar o nome da função.
Talvez seja por isso que a normalização não é correta.

Há um teste de normalização correta no código. Antes de escrever carrapatos em um símbolo personalizado, este teste é bem sucedido. Eu verifiquei o código.

 
Slava:

Ambos os casos são resultados de normalização pelo número de casas decimais.

Você ainda compara números reais para uma igualdade absoluta?

Qual servidor é a fonte dos carrapatos originais?

Servidor MQ-Beta. Mas o servidor não tem nada a ver com esta situação. O que eu faço.

  1. Eu normalizo o conjunto de carrapatos e verifico se é assim.
  2. Eu o escrevo em um símbolo personalizado.
  3. Ler carrapatos escritos a partir do símbolo personalizado.
  4. Verifique se estão normalizadas - não estão normalizadas.
Ou seja, enviei para escrever um tiquetaque, mas eles foram escritos por outra pessoa.
 
Provavelmente por causa dos fechamentos de emergência do Terminal, os rabos são deixados nas bases\Pasta personalizada.
 
fxsaber:

Bug 25.

2280 - fixo, Obrigado.

Razão: