Bibliotheken: Symbol - Seite 8

 
Stanislav Korotky:

Sollten Geld- und Briefkurs nicht getauscht werden?

Um zu verhindern, dass der Spread negativ wird, ist dies der Fall.

 
fxsaber:
// Beispiel für die Erstellung eines invertierten Symbols

In diesem Beispiel habe ich einen Chart eines benutzerdefinierten Symbols ohne Historie geöffnet. Und das Zeichnen der Balken beginnt nur mit den aktuellen Ticks.

Wie kann ich mit der Historie arbeiten?

+

expression not boolean  Symbol.mqh      192     17
 
ilvic:

In diesem Beispiel habe ich einen Chart eines benutzerdefinierten Symbols ohne Historie geöffnet. Und das Zeichnen der Balken beginnt nur mit den aktuellen Ticks.

Wie kann ich es mit Historie machen?

+

Die Beispiele in diesem Thread sind eine visuelle Demonstration der Fähigkeiten der Bibliothek für diejenigen, die sich für das Programmieren interessieren.

Fertige Skripte für Benutzer werden in diesem Thread nicht veröffentlicht.

 

Ich versuche, ein benutzerdefiniertes Symbol mit einer Geschichte zu erstellen, die in Echtzeit aktualisiert wird, basierend auf der üblichen MA.

iMA(Symbol(),Period(),25,0,MODE_SMA,PRICE_OPEN);

Tics sind nicht wichtig, Gebäude auf Minuten.

Ich habe diesen Code ausprobiert.

// Beispiel für die Erstellung eines invertierten Symbols

#include <fxsaber\ThirdPartyTicks\CustomSymbol.mqh> // https://www.mql5.com/de/code/20225

CUSTOMSYMBOL CustomSymb(StringSubstr(_Symbol, 3, 3) + StringSubstr(_Symbol, 0, 3) + StringSubstr(_Symbol, 6)); // Erstellt ein Symbol

double ReversePrice( const double Price )
{
  return(Price ? NormalizeDouble(1 / Price, _Digits) : 0);
}

void ReverseTick( MqlTick &Tick )
{
  Tick.bid = iMA(Symbol(),Period(),25,0,MODE_SMA,PRICE_OPEN);
  Tick.ask = iMA(Symbol(),Period(),25,0,MODE_SMA,PRICE_OPEN);
  Tick.last = iMA(Symbol(),Period(),25,0,MODE_SMA,PRICE_OPEN);
}

bool ReverseTicks( MqlTick &Ticks[] )
{
  for (int i = ArraySize(Ticks) - 1; i >= 0; i--)
    ReverseTick(Ticks[i]);
    
  return(true);
}

bool GetTicks( MqlTick &Ticks[] )
{
  return(CopyTicks(_Symbol, Ticks) > 0);
}

void OnInit()
{
  MqlTick Ticks[];
  
  if (CustomSymb.IsCustom() && GetTicks(Ticks) && ReverseTicks(Ticks) &&
      (CustomSymb.AddTicks(Ticks) > 0) && (CustomSymb.DataToSymbol() > 0) && CustomSymb.On())
    ChartOpen(CustomSymb.Name, PERIOD_CURRENT); // Öffnete das Diagramm
}

void OnTick()
{  
  MqlTick Tick[1];
  
  if (CustomSymb.IsCustom() && SymbolInfoTick(_Symbol, Tick[0]) && ReverseTicks(Tick))
    CustomTicksAdd(CustomSymb.Name, Tick);
}

Es funktioniert überhaupt nicht.

Kann mir jemand von den Experten sagen, wie man richtig ein benutzerdefiniertes Symbol aus MA erstellen?

 
erotin:

Wie erstellt man richtig einen benutzerdefinierten Charakter aus MA?

#include <Symbol.mqh> // https://www.mql5.com/de/code/18855

bool FillPrices( MqlTick &Tick )
{
  static const int handle = iMA(Symbol(), Period(), 1, 0, MODE_SMA, PRICE_CLOSE);
  double Array[1];
  
  const bool Res = (CopyBuffer(handle, 0, 0, 1, Array) > 0);

  if (Res)
  {
    Tick.bid = Array[0];
    Tick.ask = Array[0];
    Tick.last = Array[0];
  }
    
  return(Res);
}

void OnTick()
{
  static const SYMBOL Symb("CUSTOM_" + _Symbol, NULL, _Symbol); // Erstellt ein Symbol
  static const bool Init = Symb.IsExist() && Symb.IsCustom() && Symb.On() && ChartOpen(Symb.Name, PERIOD_M1);
    
  MqlTick Tick[1];
  
  if (Init && SymbolInfoTick(_Symbol, Tick[0]) && FillPrices(Tick[0]))
// Symb += Tick;
    CustomTicksAdd(Symb.Name, Tick);
}
 
fxsaber:

Ich danke Ihnen.

Wie kann ich diesem Diagramm ein weiteres Jahr der MA-Lesehistorie hinzufügen?

 
erotin:

Wie kann ich ein weiteres Jahr der MA-Lesehistorie zu dieser Grafik hinzufügen?

Der ganze Rest ist ohne mich gemacht.

 
fxsaber:

ZY Ich habe es gründlich auf EURGBP gemessen. Der Zeitgewinn beträgt ~2 mal. Die Transaktionen sind völlig deckungsgleich. Wirklich kostenlos!

Schnell mal den neuen Modus des Testers nach Pips überprüft. Ergebnisse der einzelnen Läufe.


Alle Symbolwährungen sind auf die Kontowährung eingestellt.

final balance 107448.00 EUR
14853401 ticks, 254375 bars generated. Environment synchronized in 0:00:00.084. Test passed in 0:00:40.141 (including ticks preprocessing 0:00:04.524).


Modus nach Pips

final balance 107448.00 pips
14853401 ticks, 254375 bars generated. Environment synchronized in 0:00:00.093. Test passed in 0:00:38.827 (including ticks preprocessing 0:00:04.508).


Die Dauer stimmt innerhalb der Fehlermarge überein.

 

Wenn wir ein Demokonto auf dem Swissquote-Server eröffnen und dieses Skript ausführen, erhalten wir die folgende Zeile.

2020.03.26 08:53:12.567 5, 5

Das bedeutet, dass die Bid/Ask-Kurse in der Tick-Historie um 5 Pips von denen abweichen, die in der Market Watch angezeigt werden (dort gibt es bessere Preise als in der Historie).

Dementsprechend können Sie im Tester nicht nachbilden, was Sie im Terminal auf dem ursprünglichen Symbol sehen.


Die einzige Lösung besteht darin, ein benutzerdefiniertes Symbol zu verwenden, das auf dem entsprechenden Demarcap der Tick-Historie basiert.

 

Und eine interessante Frage ist aufgetaucht: Wird das gleiche Problem nicht auch beim Stapel beobachtet, d. h., dass die Preise im Stapel von denen im Diagramm abweichen?

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