Symboles personnalisés. Erreurs, bogues, questions, suggestions. - page 23

 
Slava :

Pour l'instant, il n'est pas possible de former des barres d'outils personnalisées avec des ticks d'un jour autre qu'aujourd'hui (hier, avant-hier, l'année dernière, etc.).

Mais. Nous avons fait une correction.

Lorsque vous utilisez CustomTicksReplace (et non CustomTicksAdd ! n'utilisez pas CustomTicksAdd pour ajouter des ticks en masse), le dernier jour des ticks ajoutés devient "actuel" s'il n'y avait pas de ticks pour le jour précédent.

Attendez la prochaine version. Ensuite, nous continuerons les expériences et les discussions

J'utilise la version 2177. Je pense que c'est le plus récent.

Mais je ne peux pas travailler avec CUSTOMSYMBOL. Pouvez-vous me dire quand je peux espérer une construction qui m'aidera ?

Où puis-je voir les modifications apportées à la construction ?

 

L'indicateur ci-joint fonctionne dans la version actuelle 2177.

C'est votre indicateur. Il est édité, mais l'algorithme est le même. J'ai placé le fichier Symbol.mqh dans MQL5\Include\Includes

Changez la ligne

#include  <Includes\Symbol.mqh>

afin d'utiliser votre Symbol.mqh.

Les barres sont formées. Les tics sont correctement appliqués à l'historique, pas seulement dans MarketWatch


Dossiers :
 
Slava :

L'indicateur ci-joint fonctionne dans la version actuelle 2177.

C'est votre indicateur. Il est édité, mais l'algorithme est le même. J'ai placé le fichier Symbol.mqh dans MQL5\Include\Includes

Changez la ligne

afin d'utiliser votre Symbol.mqh.

Les barres sont formées. Les tics sont correctement appliqués à l'histoire, pas seulement dans MarketWatch


Je vais vérifier. Peut-être des problèmes dans mon code. Mais le code semble bon.

 

Bug 25.

Lorsque l'on écrit des ticks dans un symbole personnalisé, ils sont normalisés différemment !

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


Résultat

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 


Il semble qu'il y ait une sorte de NormalizeDouble dans le terminal qui diffère du standard. Ce bogue peut affecter de manière invisible de nombreux algorithmes.


S'il vous plaît, réparez-le. La nécessité naturelle d'écrire des prix normalisés ne peut être mise en œuvre.

 
fxsaber:

Bug 25.

Lorsque l'on écrit des ticks dans un symbole personnalisé, ils sont mélangés !

Résultat

Le terminal semble avoir son propre NormalizeDouble, différent de celui de la norme. Ce bogue peut affecter de manière invisible de nombreux algorithmes.

S'il vous plaît, réparez-le. La nécessité naturelle d'écrire des prix normalisés ne peut être mise en œuvre.

Vous avez une fonction Normalize surchargée
Essayez de changer le nom de la fonction.
Peut-être que cela fera échouer la normalisation.

 
fxsaber:

Bug 25.

Lorsque l'on écrit des ticks dans un symbole personnalisé, ils sont mélangés !


Résultat


Le terminal semble avoir son propre NormalizeDouble, différent de celui de la norme. Ce bogue peut affecter de manière invisible de nombreux algorithmes.


S'il vous plaît, réparez-le. La nécessité naturelle d'écrire des prix normalisés ne peut être mise en œuvre.

Les deux cas sont les résultats de la normalisation des points décimaux.

Vous comparez toujours des chiffres réels pour une égalité absolue ?

Quel serveur est à l'origine des tics originaux ?

 
Roman:

Vous avez une fonction Normalize surchargée
Essayez de changer le nom de la fonction.
C'est peut-être pour cela que la normalisation n'est pas correcte.

Il y a un test pour la normalisation correcte dans le code. Avant d'écrire des ticks dans un symbole personnalisé, ce test est réussi. J'ai vérifié le code.

 
Slava:

Dans les deux cas, il s'agit de résultats de normalisation par le nombre de décimales.

Comparez-vous toujours les chiffres réels pour une égalité absolue ?

Quel serveur est à l'origine des tics originaux ?

Serveur MQ-Beta. Mais le serveur n'a absolument rien à voir avec cette situation. Ce que je fais.

  1. Je normalise le tableau des ticks et vérifie qu'il en est ainsi.
  2. Je l'écris dans le symbole personnalisé.
  3. Lire les ticks écrits à partir du symbole personnalisé.
  4. Vérifiez leur normalisation - ils ne sont pas normalisés.
C'est-à-dire que j'ai envoyé pour écrire un ticks, mais ils ont été écrits par quelqu'un d'autre.
 
Probablement en raison des fermetures d' urgence du terminal, les queues sont laissées dans le dossier bases\Custom.
 
fxsaber:

Bug 25.

2280 - réparé, Merci.