Bibliotheken: Symbol - Seite 6

 
class CURRENCY_CHECK
{
public:
  CURRENCY_CHECK( void )
  {
    const string CurrencyProfit = ::SymbolInfoString(_Symbol, SYMBOL_CURRENCY_PROFIT);
    const string AccountCurrency = ::AccountInfoString(ACCOUNT_CURRENCY);
    const bool Res = !::MQLInfoInteger(MQL_TESTER) || (CurrencyProfit == AccountCurrency);
    
    if (!Res && !::MQLInfoInteger(MQL_OPTIMIZATION))
    {
      ::Print(CurrencyProfit + " = SYMBOL_CURRENCY_PROFIT != ACCOUNT_CURRENCY = " + AccountCurrency);
      
      ::TesterStop();
    }
  }
};

CURRENCY_CHECK CurrencyCheck; // Lässt keine Prüfung langsamer Varianten zu

2018.07.01 00:00:00   TER = SYMBOL_CURRENCY_PROFIT != ACCOUNT_CURRENCY = USD
TesterStop() called on 0% of testing interval
 
// Das Skript setzt die Provision für alle Positionen mit einem Gewinn ungleich Null.
#property script_show_inputs

input double inCommission = 0.004; // Provision in Prozent pro Runde (0,004 - 20 Einheiten pro Seite pro Million)
input bool inAdd = false;          // true - zum aktuellen Wert hinzugefügt, false - Wert gesetzt

#include <Symbol.mqh>

string CommissionToString( const double TickValue )
{
  const double Commission = 1 - TickValue;
  
  return("Commission = " + DoubleToString(Commission * 100, 5) + "% per round (" + DoubleToString(Commission * 1000000 / 2, 1) + " per million (one side))");
}

void OnStart()
{
  const SYMBOL Symb;
  
  if (Symb.IsCustom())
  {
    const double TickValue = Symb.GetProperty(SYMBOL_TRADE_TICK_VALUE);
    const double NewTickValue = inAdd ? TickValue * (1 - inCommission / 100) : 1 - inCommission / 100;
    
    if ((MessageBox(Symb.Name + "\nBefore: " + CommissionToString(TickValue) +
                   "\nAfter: " + CommissionToString(NewTickValue) + "\n\n Do you agree?", "Commission Change", MB_YESNO) == IDYES) &&
        Symb.SetProperty(SYMBOL_TRADE_TICK_VALUE, NewTickValue))
      MessageBox(Symb.Name + ": current " + CommissionToString(Symb.GetProperty(SYMBOL_TRADE_TICK_VALUE)));
  }
}


Es funktioniert noch nicht.

 

Wenn es nicht zu viel Mühe macht, hätte ich gerne ein Beispiel für die korrekte Verwendung der Symbolbibliothek, um ein benutzerdefiniertes Symbol zu generieren - zum Beispiel 1/EURUSD = USDEUR.

Ich würde gerne wissen, wie man die verfügbare Tick-Historie korrekt kopiert und wie man jeden Tick auf einem neuen Chart generiert, damit alles im "Market Watch"-Fenster korrekt ist, d.h. damit der USDEUR-Chart sowohl für die Online-Arbeit als auch für das Testen im Tester so nah wie möglich an den regulären Charts ist.

Vielen Dank im Voraus

 
Igor Makanu:

Wenn es nicht zu viel Mühe macht, hätte ich gerne ein Beispiel für die korrekte Verwendung der Symbolbibliothek, um ein benutzerdefiniertes Symbol zu generieren - zum Beispiel 1/EURUSD = USDEUR

Ich würde gerne wissen, wie man die verfügbare Tick-Historie korrekt kopiert und wie man jeden Tick auf einem neuen Chart generiert, damit alles im "Market Watch"-Fenster korrekt ist, d.h. damit der USDEUR-Chart den üblichen Charts sowohl für die Online-Arbeit als auch für das Testen im Tester so nahe wie möglich kommt.

Vielen Dank im Voraus

// 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 = ReversePrice(Tick.bid);
  Tick.ask = ReversePrice(Tick.ask);
  Tick.last = ReversePrice(Tick.last);
}

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);
}
 
fxsaber:

Ich danke Ihnen!

Ich werde mich heute Abend damit befassen, ich habe ein anderes Problem, aber ich brauche ein einfaches Beispiel, um zu verstehen, was Ihre Bibliothek tun kann.

----------------------------------


das Beispiel ausgeführt // Beispiel für die Erstellung eines invertierten Symbols

alles ist klar, es ist fantastisch, dass man mit ein paar Zeilen ein echtes benutzerdefiniertes Zeichen programmatisch erstellen kann, sehr cooles Zeug!

SUS: in Build 1158 erschien eine Warnung während der Kompilierung:

Ausdruck nicht boolesch Symbol.mqh 192 17

in Symbol.mqh Datei Methode bool IsCustom( void ) const
 
Igor Makanu:

SZY: In Build 1158 erschien eine Warnung während der Kompilierung:

expression not boolean Symbol.mqh 192 17

in Symbol.mqh Datei Methode bool IsCustom( void ) const

Ich vergesse zu aktualisieren, ich habe schon eine Menge eigenen Code in KB, was soll ich über die Joker meines MQL-Ordners sagen...

Aktualisiert.

 
fxsaber:

Aktualisiert.

aktualisiert:

0 Fehler, 0 Warnung(en), Kompilierzeit: 1220 msec

alles OK, danke!
 

Hallo!

Ist es möglich, Futures nach Liste in ein benutzerdefiniertes Symbol mit verschobenen Zeitinformationen zu kopieren? Zeitinformationen müssen aufgrund der Notwendigkeit, Low-Liquidität Tails von Futures, die die Berechnung von Indikatoren während des Übergangs zu einem neuen Futures beeinflussen können verschoben werden.

Ich möchte nur die Futures nacheinander zu kleben, wie es in der Tat ist - ihre gesamte Geschichte, und in der Expert Advisor nur Punkte auf die Daten der Zeiträume, in denen der Handel nicht durchgeführt wird, zu machen.
 
Aleksey Vyazmikin:

Hallo!

Ist es möglich, Futures nach Liste in ein benutzerdefiniertes Symbol mit verschobenen Zeitinformationen zu kopieren? Zeitinformationen müssen aufgrund der Notwendigkeit, Low-Liquidität Tails von Futures, die die Berechnung von Indikatoren während des Übergangs zu einem neuen Futures beeinflussen können verschoben werden.

Ich möchte nur die Futures nacheinander zu kleben, wie es in der Tat ist - ihre gesamte Geschichte, und in der Expert Advisor nur Punkte auf den Daten der Zeiträume, in denen der Handel nicht durchgeführt wird, zu machen.

Wenn es Quelldaten und einen Klebealgorithmus gibt, dann gibt es natürlich eine solche Möglichkeit. Sie müssen nur die Bildung eines Tick-Archivs für ein neues Symbol schreiben. Die Bildung eines benutzerdefinierten Symbols mit dieser Historie erfolgt auf die gleiche Weise wie in den Beispielen dieses Zweigs.


Das Einzige, was Sie tun müssen, ist, den Preis der Balkenbildung festzulegen und zu entscheiden, zu welchen Preisen die Marktaufträge ausgeführt werden sollen. Ich würde den letzten Preis ausschließen, aber es steht jedem frei, selbst zu entscheiden, was er braucht.

 
fxsaber:

Wenn es Quelldaten und einen Klebealgorithmus gibt, dann ist eine solche Möglichkeit natürlich vorhanden. Sie müssen nur die Bildung eines Tick-Archivs für ein neues Symbol schreiben. Die Bildung eines benutzerdefinierten Symbols mit dieser Geschichte erfolgt auf die gleiche Weise wie in den Beispielen dieses Zweigs.


Das Einzige, was Sie tun müssen, ist, den Preis der Balkenbildung zu bestimmen und festzulegen, zu welchen Preisen die Marktaufträge ausgeführt werden sollen. Ich würde den letzten Preis ausschließen, aber es steht jedem frei, selbst zu entscheiden, was er braucht.

Natürlich befinden sich die Ausgangsdaten im Terminal - Futures der vergangenen Jahre. Was bedeutet es, ein Tick-Archiv zu bilden? Im Allgemeinen würde ich gerne OHLC auf M1 testen, sozusagen ohne zusätzliche Ticks.

Warum mag ich die letzten Preise nicht? Ich verstehe nicht, was es mit dem Preis der Balkenbildung auf sich hat - Minutenbalken sind in Ordnung, zu den ursprünglichen Preisen. Im Allgemeinen brauche ich die gleiche Sache wie auf einem separaten Futures, und die Tatsache, dass es nicht mit dem realen bei allen Einstellungen übereinstimmen, so ist es klar - nach meinen Beobachtungen ist es notwendig, 5 Punkte in das Minus im Durchschnitt setzen, wenn die Prüfung auf alle Ticks.

Können Sie mir mit einem solchen Skript helfen?