Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 56

 
Andrey Khatimlianskii:

Haben Sie die Leistung gemessen? Ich bin gespannt, wie viel langsamer es sein wird. Insbesondere bei benutzerdefinierten Indikatoren.

Nicht gemessen, aber es sollte nicht langsamer sein als in MT4.

Messung
#define  AMOUNT 1 e7
void OnStart()
{  
  int handle = iMA(NULL, PERIOD_CURRENT, 1, 0, MODE_SMA, PRICE_CLOSE);
  const ulong StartTime = GetMicrosecondCount();
  
  for (int i = 0; i < AMOUNT; i++)
    handle = iMA(NULL, PERIOD_CURRENT, 1, 0, MODE_SMA, PRICE_CLOSE);

  Print((string)((GetMicrosecondCount() - StartTime) / AMOUNT) + " mcs per iMA");
  Print(handle);    
}


Das Ergebnis ist

0.3383469 mcs per iMA


Ein Drittel einer Mikrosekunde zur Prüfung. Das bedeutet, dass ein einziger Durchlauf pro 10 Millionen Ticks um drei Sekunden langsamer wird.

 
fxsaber:

Messung

Seltsam, dass Sie das Erstellen des Handles und das Abrufen des Wertes in der Schleife nicht mit Ihrer ursprünglichen Version verglichen haben, das ist der interessante Unterschied.

 
Andrey Khatimlianskii:

Seltsam, dass Sie die Erstellung des Handles und das Abrufen des Wertes in der Schleife nicht mit Ihrer ursprünglichen Version verglichen haben, denn das ist der interessante Unterschied.

Denn die Werte stammen aus demselben Griff. iMA gibt immer denselben Handle mit denselben Parametern zurück.

 
fxsaber:
In MQL5 ist es durchaus akzeptabel, es so zu schreiben

D.h. bei jedem Tick einen Griff "erstellen". Neue Indikatoren werden nicht erstellt, die Zeit wird nur für den Vergleich der iMA-Eingabeparameter mit den Indikatoren verwendet, die zu früheren Ticks gestartet wurden. D.h. genau dasselbe, was in MT4 gemacht wird.

Interessantes Design.

Bitte prüfen Sie die Geschwindigkeit beim Erstellen eines Handles in OnInit mit diesem Ansatz.

 
Vitaly Muzichenko:

Bitte überprüfen Sie die Geschwindigkeit bei der Erstellung des OnInit-Handles mit diesem Ansatz.

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Merkmale der Sprache mql5, Feinheiten und Tricks

fxsaber, 2017.10.05 09:09

Ein einziger Durchlauf pro 10 Millionen Ticks verlangsamt sich um drei Sekunden.

Das ist im Vergleich zu Ihrer Option.

 

Wie kann ich die Standardfunktionen OrderCalcProfit() und OrderCalcMargin() so ersetzen, dass sie plattformübergreifend sind? Es scheint hier schon einmal gestanden zu haben, aber ich kann es hier nicht finden - vielleicht war ich müde... Aber ich muss innerhalb einer Stunde nach der Suche aufgewacht sein :)

 
Artyom Trishkin:

Wie kann ich die Standardfunktionen OrderCalcProfit() und OrderCalcMargin() ersetzen, damit sie plattformübergreifend sind? Es scheint schon irgendwo gepostet worden zu sein, aber ich kann es hier nicht finden - vielleicht war ich wach... Aber ich muss während einer Stunde der Suche aufgewacht sein :)

https://www.mql5.com/ru/search#!keyword=myordercalcmargin&module=mql5_module_forum

MQL5.Community
MQL5.Community
  • www.mql5.com
Поиск выполняется с учетом морфологии и без учета регистра. Все буквы, независимо от того, как они введены, будут рассматриваться как строчные. По умолчанию наш поиск показывает страницы...
 
fxsaber:

https://www.mql5.com/ru/search#!keyword=myordercalcmargin&module=mql5_module_forum

:)

SymbolInfoMarginRate() ist nicht vorhanden in 4. Die Frage wurde wie folgt gestellt:

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Eigenheiten der Sprache mql5, Tipps und Tricks

Artyom Trishkin, 2017.10.06 06:36

Was kann die Standardfunktionen OrderCalcProfit() und OrderCalcMargin() ersetzen, so dass die Funktionen plattformübergreifend sind? Es scheint, dass es schon irgendwo stand, aber ich kann es hier nicht finden - vielleicht bin ich zu müde... Aber ich hätte während einer Stunde der Suche aufwachen sollen :)

Und es gibt nichts über OrderCalcProfit()
 

Ein Geschenk, keine Sprachangebote

struct MQLTICK : public MqlTick
{
  bool operator >( const MqlTick &Tick )
  {
    return(this.bid > Tick.bid);
  }

  bool operator <( const MqlTick &Tick )
  {
    return(this.ask < Tick.ask);
  }
};

void OnStart()
{  
  MQLTICK Ticks[];
  
  Print(CopyTicks(_Symbol, Ticks));
  
  Print(Ticks[0] < Ticks[1]);
}
 
fxsaber:

Ein Geschenk, keine Sprachangebote

Ein Geschenk in Form eines schwer fassbaren Laufzeitfehlers

struct MqlTick1 : MqlTick {        };
struct MqlTick2 : MqlTick { int i; };
void Copyticks( MqlTick& []) {}
void OnStart()
{
        MqlTick1 ticks1[];
        MqlTick2 ticks2[];
        int i1 = ::CopyTicks( _Symbol, ticks1 ); //нормально ??????????????
                   Copyticks(          ticks1 ); //error: 'ticks1' - parameter conversion not allowed
        int i2 = ::CopyTicks( _Symbol, ticks2 ); //нормально ??????????????
        Print( "i2=", i2, ":", GetLastError()); //Результат: -1:4006
}

Was ist ::CopyTicks besser als Copyticks?

Und warum ist das Ergebnis immer -1. Solche Fehler (4006) sollten zur Kompilierzeit gemeldet werden