Simboli personalizzati. Errori, bug, domande, suggerimenti. - pagina 23

 
Slava :

Al momento, non è possibile formare barre degli strumenti personalizzate con tick di un giorno diverso da oggi (ieri, l'altro ieri, l'anno scorso, ecc.).

Ma. Abbiamo fatto una correzione.

Quando si usa CustomTicksReplace (non CustomTicksAdd! non usare CustomTicksAdd per aggiungere zecche in blocco), l'ultimo giorno di zecche aggiunto diventa "attuale" se non c'erano zecche per oggi prima.

Aspettate la prossima build. Poi continueremo gli esperimenti e le discussioni

Sto usando la build 2177. Credo che questo sia il più recente.

Ma non posso lavorare con CUSTOMSYMBOL. Potete dirmi quando posso aspettarmi una build che mi aiuti?

Dove posso vedere i cambiamenti nella build?

 

L'indicatore allegato funziona nell'attuale build 2177

Questo è il tuo indicatore. È modificato, ma l'algoritmo è lo stesso. Ho messo il file Symbol.mqh in MQL5\Include\Includes

Cambia la linea

#include  <Includes\Symbol.mqh>

in modo da utilizzare il vostro Symbol.mqh.

Le barre sono formate. I tick sono applicati correttamente alla storia, non solo in MarketWatch


File:
 
Slava :

L'indicatore allegato funziona nell'attuale build 2177

Questo è il tuo indicatore. È modificato, ma l'algoritmo è lo stesso. Ho messo il file Symbol.mqh in MQL5\Include\Includes

Cambia la linea

in modo da utilizzare il vostro Symbol.mqh.

Le barre sono formate. Le zecche sono applicate correttamente alla storia, non solo in MarketWatch


Lo controllerò. Forse qualche problema nel mio codice. Ma il codice sembra buono.

 

Bug 25.

Quando si scrivono le zecche su un simbolo personalizzato, esse sono diversamente normalizzate!

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);                                                                     // Проверили, что цены тиков нормализованы.
  }
}


Risultato

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 


Sembra che ci sia un qualche tipo di NormalizeDouble all'interno del terminale che differisce da quello standard. Questo bug può colpire invisibilmente molti algoritmi.


Per favore, correggetelo. La necessità naturale di scrivere prezzi normalizzati non può essere implementata.

 
fxsaber:

Bug 25.

Quando si scrivono zecche su un simbolo personalizzato, sono mescolate!

Risultato

Il terminale sembra avere il proprio NormalizeDouble, diverso da quello standard. Questo bug può colpire invisibilmente molti algoritmi.

Per favore, correggetelo. La necessità naturale di scrivere prezzi normalizzati non può essere implementata.

Hai una funzione Normalize sovraccaricata
Prova a cambiare il nome della funzione.
Forse questo farà fallire la normalizzazione.

 
fxsaber:

Bug 25.

Quando si scrivono zecche su un simbolo personalizzato, sono mescolate!


Risultato


Il terminale sembra avere il proprio NormalizeDouble, diverso da quello standard. Questo bug può colpire invisibilmente molti algoritmi.


Per favore, correggetelo. La necessità naturale di scrivere prezzi normalizzati non può essere implementata.

Entrambi i casi sono i risultati della normalizzazione dei punti decimali.

State ancora confrontando i numeri reali per l'uguaglianza assoluta?

Quale server è la fonte delle zecche originali?

 
Roman:

Hai una funzione Normalize sovraccaricata
Prova a cambiare il nome della funzione.
Forse è per questo che la normalizzazione non è corretta.

C'è un test per la corretta normalizzazione nel codice. Prima di scrivere i tick in un simbolo personalizzato, questo test ha successo. Ho controllato il codice.

 
Slava:

Entrambi i casi sono risultati di normalizzazione per il numero di cifre decimali.

Confrontate ancora i numeri reali per l'uguaglianza assoluta?

Quale server è la fonte delle zecche originali?

Server MQ-Beta. Ma il server non ha niente a che fare con questa situazione. Cosa faccio.

  1. Normalizzo l'array di tick e controllo che sia così.
  2. Lo scrivo in un simbolo personalizzato.
  3. Leggere i tick scritti dal simbolo personalizzato.
  4. Controllate la loro normalizzazione - non sono normalizzati.
Cioè, ho mandato a scrivere una zecca, ma sono state scritte da qualcun altro.
 
Probabilmente a causa delle chiusure di emergenza del Terminale, le code sono lasciate nella cartella bases\Custom.
 
fxsaber:

Bug 25.

2280 - aggiustato, grazie.