Bibliotheken: Symbol - Seite 9

 
Stanislav Korotky:

Und eine interessante Frage stellte sich - das gleiche Problem ist nicht mit dem Stapel beobachtet - das heißt, so dass in den Stapel Preise unterscheiden sich von der Tabelle?

Ein Benutzer beschwert sich bei mir über die Unsynchronisation des BookEvent-basierten Inducers und des Charts.

Der Stack soll dem Market Watch entsprechen. Dementsprechend kann er sich vom Chart unterscheiden.

 
fxsaber:

Folglich werden Sie im Tester nicht in der Lage sein, das, was Sie im Terminal sehen, auf dem Originalsymbol nachzubilden.

Und genau das sehen Sie im Terminal.

Die Geschäfte werden "in der Luft" abgeschlossen. Die Indikatoren gehen in den Wald. Nur die Abgrenzung der Tick-Historie.

 

Ich verstehe nicht, was falsch ist, wahrscheinlich macht das neue Build 2515 etwas falsch.

Hier ist das Skript:

#property copyright "IgorM"
#property link      "https://www.mql5.com/de/users/igorm"
#property version   "1.00"
#property script_show_inputs

input int      History        = 1 e5;
input double   Weierstrass_A  = 0.33;
input double   Weierstrass_B  = 1.5;
input int      Weierstrass_N  = 10;
input double   Weierstrass_Koeff = 0.45;

#include <fxsaber\Symbol.mqh> // https://www.mql5.com/de/code/18855
//+------------------------------------------------------------------+
//| Skript-Programmstartfunktion|
//+------------------------------------------------------------------+
void OnStart()
{
   const SYMBOL SymbDB("W" + _Symbol);
   datetime dt_end = TimeCurrent();
   if(!SymbDB.IsExist()) // Wenn das Symbol nicht erstellt wird, beenden
   {
      Alert("Error create Weierstrass func, symbol = ", "W" + _Symbol);
      return;
   }
   SymbDB.Off();
   SymbDB.CloneProperties(); // Kopieren der Eigenschaften
   if(CustomRatesDelete(SymbDB.Name, 0, dt_end) == -1)
   {
      Alert("Error CustomRatesDelete , GetLastError = ", GetLastError());
      return;
   }
// Koeffizienten für die Normalisierung finden
   int fw_MAX = INT_MIN, fw_MIN = INT_MAX;
   for(int i = 4 * History; i >= 0; i--)
   {
      int wtmp = FuncWeierstrass(Weierstrass_A, Weierstrass_B, Weierstrass_N, i);
      if(wtmp > fw_MAX) fw_MAX = wtmp;
      if(wtmp < fw_MIN) fw_MIN = wtmp;
   }
   const int fw_knorm = fw_MAX - fw_MIN;

// Erstellen eines Diagramms durch Aufzeichnung von Ticks
   MqlTick ticks[];
   ArrayResize(ticks, History * 4);
   for(int i = 4 * History - 1; i >= 0; i--)
   {
      int wtmp = FuncWeierstrass(Weierstrass_A, Weierstrass_B, Weierstrass_N, i);
      ticks[i].last = ticks[i].bid = ticks[i].ask = NormalizeDouble(1.0 + Weierstrass_Koeff * (2.0 * (wtmp - fw_MIN) / fw_knorm - 1), _Digits);
      ticks[i].bid -= _Point;
      ticks[i].time_msc = ticks[i].time = dt_end--;
      ticks[i].time_msc *= 1000;
      ticks[i].volume = 1;
      ticks[i].volume_real = 1.0;
      ticks[i].flags = TICK_FLAG_ASK | TICK_FLAG_BID;
   }
   CustomTicksAdd(SymbDB.Name, ticks);
   if(SymbDB.On()) // Enthalten in der Marktbeobachtung
      ChartOpen(SymbDB.Name, PERIOD_M1); // Öffnete eine neue Symboltabelle
}
//+------------------------------------------------------------------+
int FuncWeierstrass(const double Wa, const double Wb, const int WN, const int cnt)
{
   int result = 0;
   for(int i = 0; i <= WN; i++)
   {
      result += (int)(MathPow(Wb, i) * MathCos(MathPow(Wa, i) * M_PI * cnt));
   }
   return(result);
}
//+------------------------------------------------------------------+


alles funktioniert, aber es funktioniert nur einmal.

beim Neustart erscheint ein schwarzer Bildschirm "Waiting for update", der durch Löschen des benutzerdefinierten Symbols von Hand behoben wird


Was funktioniert nicht richtig? die Bibliothek oder ein neuer Build des Terminals?

 
Igor Makanu:

Was funktioniert nicht richtig? die Bibliothek oder eine neue Version des Terminals?

Ich weiß es nicht. Ich benutze TicksAdd nicht.

 
fxsaber:

Ich weiß es nicht. Ich verwende TicksAdd nicht.

Ich glaube, ich habe es herausgefunden und habe es in meinem Code ersetzt

CustomTicksAdd(SymbDB.Name, ticks);

durch ersetzt.

CustomTicksReplace(SymbDB.Name,0,TimeCurrent()*1000,ticks);

Es scheint jetzt zu funktionieren, wenn das Skript neu gestartet wird. Das einzige Problem ist, dass im Marktübersichtsfenster keine Ask/Bid-Symbolwerte angezeigt werden, aber das ist nicht kritisch.



UPD:

Die Hilfe sollte sorgfältig gelesen werden, alles funktioniert, aber CustomTicksAdd funktioniert korrekt, wenn das Symbol zur Marktübersicht hinzugefügt wird, d.h. es sollte wie folgt verwendet werden

if(SymbDB.On()) // Enthalten in der Marktbeobachtung
   {
      CustomTicksAdd(SymbDB.Name, ticks);
      ChartOpen(SymbDB.Name, PERIOD_M1); // Öffnete eine neue Symboltabelle
   }
 

Ich bin auf einen unangenehmen Fehler in MT gestoßen - aus irgendeinem Grund wird SYMBOL_TRADE_TICK_SIZE nicht gesetzt. Die Fehlersuche zeigt, dass der richtige Wert in die Eigenschaft geschrieben wird (z. B. 0,00001 für EURUSD), aber nach dem Erstellen eines Symbols enthält es 0.

Hat jemand dieses Problem gelöst? Handelt es sich um einen MT-Fehler oder um eine Besonderheit in der Symbolbibliothek?

 
Stanislav Korotky:

Ich bin auf einen unangenehmen Fehler in MT gestoßen - aus irgendeinem Grund wird SYMBOL_TRADE_TICK_SIZE nicht gesetzt. Die Fehlersuche zeigt, dass der richtige Wert in die Eigenschaft geschrieben wird (z. B. 0,00001 für EURUSD), aber nach der Erstellung des Symbols enthält es 0.

Hat jemand dieses Problem gelöst? Handelt es sich um einen MT-Fehler oder um eine Besonderheit in der Symbolbibliothek?

Sehen Sie nur die "0" oder erhalten Sie die "0", nachdem Sie die Eigenschaft abgefragt haben?

 
Stanislav Korotky:

Ich bin auf einen unangenehmen Fehler in MT gestoßen - aus irgendeinem Grund wird SYMBOL_TRADE_TICK_SIZE nicht gesetzt. Die Fehlersuche zeigt, dass der richtige Wert in die Eigenschaft geschrieben wird (z. B. 0,00001 für EURUSD), aber nach der Erstellung des Symbols enthält es 0.

Hat jemand dieses Problem gelöst? Handelt es sich um einen MT-Fehler oder um eine Besonderheit in der Symbolbibliothek?

Wahrscheinlich hängt es von der Reihenfolge ab, in der die Felder gesetzt werden. Bei mir ist es so.

    this.SetProperty(SYMBOL_DIGITS, this.Ticks.GetDigits());

    this.SetProperty(SYMBOL_TRADE_CONTRACT_SIZE, 1 e5); // https://www.mql5.com/ru/forum/330333#comment_14608694
    this.SetProperty(SYMBOL_TRADE_TICK_VALUE, 1);

    this.SetProperty(SYMBOL_TRADE_TICK_SIZE, this.GetProperty(SYMBOL_POINT));
 
fxsaber:

Wahrscheinlich hängt es von der Reihenfolge der Feldzuweisung ab. Bei mir ist es so.

Ich verwende den CloneProperties-Aufruf, und der hat diese Zeilen (in der aktuellen, öffentlich verfügbaren Version):

...
    CLONE(SYMBOL_TRADE_CONTRACT_SIZE) &&
    CLONE(SYMBOL_TRADE_FACE_VALUE) &&
    CLONE(SYMBOL_TRADE_LIQUIDITY_RATE) &&
    CLONE(SYMBOL_TRADE_TICK_SIZE) &&
    CLONE(SYMBOL_TRADE_TICK_VALUE) &&
...

Hier ist die Reihenfolge etwas anders, aber die richtigen Werte werden an den Vertrag und andere Eigenschaften übertragen, das einzige Problem ist die Tickgröße.

 

Nach dem Aufruf von CloneProperties habe ich diesen Unsinn geschrieben:

    Symb.CloneProperties(_Symbol);
    if(SymbolInfoDouble(_SymbolName, SYMBOL_TRADE_TICK_SIZE) == 0)
    {
      CustomSymbolSetDouble(_SymbolName, SYMBOL_TRADE_TICK_SIZE, SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE));
    }

So wird es normalerweise angewendet. Aber das ist eine Art Krücke.