Benutzerdefinierte Symbole. Fehler, Bugs, Fragen, Vorschläge. - Seite 23

 
Slava :

Derzeit ist es nicht möglich, benutzerdefinierte Symbolleisten mit Ticks von einem anderen Tag als heute (gestern, vorgestern, letztes Jahr usw.) zu erstellen.

Aber. Wir haben eine Korrektur vorgenommen.

Wenn Sie CustomTicksReplace verwenden (nicht CustomTicksAdd! verwenden Sie CustomTicksAdd nicht, um massenhaft Ticks hinzuzufügen), wird der letzte Tag der hinzugefügten Ticks "aktuell", wenn es vorher keine Ticks für heute gab.

Warten Sie auf den nächsten Build. Dann werden wir die Experimente und Diskussionen fortsetzen

Ich verwende Build 2177. Ich glaube, es ist die jüngste.

Aber ich kann nicht mit CUSTOMSYMBOL arbeiten. Können Sie mir sagen, wann ich mit einer neuen Version rechnen kann, die mir helfen wird?

Wo kann ich die Änderungen im Build sehen?

 

Der beigefügte Indikator funktioniert im aktuellen Build 2177

Dies ist Ihr Indikator. Sie wird bearbeitet, aber der Algorithmus ist derselbe. Ich habe die Datei Symbol.mqh in MQL5\Include\Includes

Ändern Sie die Zeile

#include  <Includes\Symbol.mqh>

um Ihr Symbol.mqh zu verwenden.

Stäbe werden geformt. Ticks werden korrekt auf den Verlauf angewendet, nicht nur in MarketWatch


Dateien:
 
Slava :

Der beigefügte Indikator funktioniert im aktuellen Build 2177

Dies ist Ihr Indikator. Sie wird bearbeitet, aber der Algorithmus ist derselbe. Ich habe die Datei Symbol.mqh in MQL5\Include\Includes

Ändern Sie die Zeile

um Ihr Symbol.mqh zu verwenden.

Stäbe werden geformt. Ticks werden korrekt auf die Geschichte angewendet, nicht nur in MarketWatch


Ich werde das überprüfen. Vielleicht gibt es Probleme in meinem Code. Aber der Code sieht gut aus.

 

Fehler 25.

Beim Schreiben von Häkchen in ein benutzerdefiniertes Symbol werden diese anders normalisiert!

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


Ergebnis

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 


Es scheint eine Art von NormalizeDouble innerhalb des Terminals zu geben, die sich vom Standard unterscheidet. Dieser Fehler kann viele Algorithmen unsichtbar beeinflussen.


Bitte reparieren Sie das. Die natürliche Notwendigkeit, normalisierte Preise zu schreiben, kann nicht umgesetzt werden.

 
fxsaber:

Fehler 25.

Wenn Sie ein benutzerdefiniertes Symbol mit Häkchen versehen, werden diese gemischt!

Ergebnis

Das Terminal scheint sein eigenes NormalizeDouble zu haben, das sich vom Standard unterscheidet. Dieser Fehler kann viele Algorithmen unsichtbar beeinflussen.

Bitte reparieren Sie das. Die natürliche Notwendigkeit, normalisierte Preise zu schreiben, kann nicht umgesetzt werden.

Sie haben eine überladene Normalize-Funktion
Versuchen Sie, den Funktionsnamen zu ändern.
Vielleicht scheitert dann die Normalisierung.

 
fxsaber:

Fehler 25.

Wenn Sie ein benutzerdefiniertes Symbol mit Häkchen versehen, werden diese gemischt!


Ergebnis


Das Terminal scheint sein eigenes NormalizeDouble zu haben, das sich vom Standard unterscheidet. Dieser Fehler kann viele Algorithmen unbemerkt beeinflussen.


Bitte reparieren Sie das. Die natürliche Notwendigkeit, normalisierte Preise zu schreiben, kann nicht umgesetzt werden.

In beiden Fällen handelt es sich um das Ergebnis der Dezimalpunktnormalisierung.

Vergleichen Sie immer noch reale Zahlen auf absolute Gleichheit?

Welcher Server ist die Quelle der ursprünglichen Ticks?

 
Roman:

Sie haben eine überladene Normalize-Funktion
Versuchen Sie, den Funktionsnamen zu ändern.
Vielleicht ist das der Grund, warum die Normalisierung nicht korrekt ist.

Es gibt einen Test für die korrekte Normalisierung im Code. Bevor Sie Ticks in ein benutzerdefiniertes Symbol schreiben, ist dieser Test erfolgreich. Ich habe den Code überprüft.

 
Slava:

In beiden Fällen handelt es sich um Normalisierungsergebnisse nach der Anzahl der Dezimalstellen.

Vergleichen Sie immer noch reale Zahlen auf absolute Gleichheit?

Welcher Server ist die Quelle der ursprünglichen Ticks?

MQ-Beta-Server. Aber der Server hat mit dieser Situation überhaupt nichts zu tun. Was ich mache.

  1. Ich normalisiere das Array der Ticks und überprüfe, ob es so ist.
  2. Ich schreibe es in ein benutzerdefiniertes Symbol.
  3. Lesen von geschriebenen Ticks aus dem benutzerdefinierten Symbol.
  4. Überprüfen Sie sie auf Normalisierung - sie sind nicht normalisiert.
Das heißt, ich habe eine Zecke schreiben lassen, aber sie wurde von jemand anderem geschrieben.
 
Wahrscheinlich wegen der Notschließungen des Terminals gibt es immer noch Schwänze im Ordner bases\Custom.
 
fxsaber:

Fehler 25.

2280 - behoben, Danke.

Grund der Beschwerde: