Símbolos personalizados. Errores, fallos, preguntas, sugerencias. - página 23

 
Slava :

Por el momento, no es posible formar barras de herramientas personalizadas con ticks de un día que no sea hoy (ayer, anteayer, el año pasado, etc.).

Pero. Hemos hecho una corrección.

Cuando se utiliza CustomTicksReplace (¡no CustomTicksAdd! no utilice CustomTicksAdd para añadir ticks de forma masiva), el último día de ticks añadidos se convierte en "actual" si no había ticks para el día anterior.

Espera a la siguiente compilación. Luego continuaremos los experimentos y las discusiones

Estoy usando la Build 2177. Creo que es el más reciente.

Pero no puedo trabajar con CUSTOMSYMBOL. ¿Puede decirme cuándo puedo esperar una construcción que me ayude?

¿Dónde puedo ver los cambios en la construcción?

 

El indicador adjunto funciona en la actual build 2177

Este es su indicador. Se edita, pero el algoritmo es el mismo. He colocado el archivo Symbol.mqh en MQL5\NInclude\NIncludes

Cambiar la línea

#include  <Includes\Symbol.mqh>

para utilizar su Symbol.mqh.

Se forman barras. Los ticks se aplican correctamente al historial, no sólo en MarketWatch


Archivos adjuntos:
 
Slava :

El indicador adjunto funciona en la actual build 2177

Este es su indicador. Se edita, pero el algoritmo es el mismo. He colocado el archivo Symbol.mqh en MQL5\NInclude\NIncludes

Cambiar la línea

para utilizar su Symbol.mqh.

Se forman barras. Los ticks se aplican correctamente al historial, no sólo en MarketWatch


Lo comprobaré. Tal vez algunos problemas en mi código. Pero el código se ve bien.

 

Bug 25.

Cuando se escriben ticks en un símbolo personalizado, se normalizan de forma 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 que hay algún tipo de NormalizeDouble dentro del Terminal que difiere del estándar. Este fallo puede afectar de forma invisible a muchos algoritmos.


Por favor, arréglalo. La necesidad natural de escribir los precios normalizados no puede aplicarse.

 
fxsaber:

Bug 25.

Cuando se escriben garrapatas en un símbolo personalizado, ¡se mezclan!

Resultado

El Terminal parece tener su propio NormalizeDouble, diferente del estándar. Este fallo puede afectar de forma invisible a muchos algoritmos.

Por favor, arréglalo. La necesidad natural de escribir los precios normalizados no puede aplicarse.

Tiene una función de normalización sobrecargada
Prueba a cambiar el nombre de la función.
Esto puede hacer que la normalización falle.

 
fxsaber:

Bug 25.

Cuando se escriben garrapatas en un símbolo personalizado, ¡se mezclan!


Resultado


El Terminal parece tener su propio NormalizeDouble, diferente del estándar. Este fallo puede afectar de forma invisible a muchos algoritmos.


Por favor, arréglalo. La necesidad natural de escribir los precios normalizados no puede aplicarse.

Ambos casos son el resultado de la normalización de los decimales.

¿Sigues comparando números reales para la igualdad absoluta?

¿Qué servidor es la fuente de los ticks originales?

 
Roman:

Tiene una función de normalización sobrecargada
Intente cambiar el nombre de la función.
Quizá por eso la normalización no es correcta.

Hay una prueba de normalización correcta en el código. Antes de escribir ticks en un símbolo personalizado, esta prueba tiene éxito. He comprobado el código.

 
Slava:

En ambos casos se trata de resultados de normalización por el número de decimales.

¿Sigues comparando los números reales para la igualdad absoluta?

¿Qué servidor es la fuente de los ticks originales?

Servidor MQ-Beta. Pero el servidor no tiene nada que ver con esta situación. Lo que hago.

  1. Normalizo el array de ticks y compruebo que es así.
  2. Lo escribo en el símbolo personalizado.
  3. Leer los ticks escritos del símbolo personalizado.
  4. Compruebe si están normalizados: no están normalizados.
Es decir, mandé a escribir una garrapata, pero la escribió otra persona.
 
Probablemente debido a los cierres de emergencia de la Terminal, las colas se quedan en la carpeta bases\Custom.
 
fxsaber:

Bug 25.

2280 - arreglado, gracias.