Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 62

 
Vasiliy Pushkaryov:
Haben Sie ein Bild davon, wie es aussehen würde? Nicht ganz klar, ich habeOBJ_CHART noch nicht verwendet

Es gibt kein Bild. Aber man kann sie auch von Hand bauen. Wählen Sie Einfügen -> Objekte -> Grafische Objekte -> Diagramm und nachdem Sie OBJ_CHART wie folgt eingefügt haben, wählen Sie in den Objekteigenschaften "Objekt als Hintergrund zeichnen" und deaktivieren die Skalierung.

 
fxsaber:

Es gibt kein Bild. Aber man kann sie auch von Hand bauen. Wählen Sie Einfügen -> Objekte -> Grafikobjekte -> Grafik und nachdem Sie OBJ_CHART so eingefügt haben, wählen Sie in den Objekteigenschaften "Objekt als Hintergrund zeichnen" und deaktivieren die Skalierung.


Danke, sieht cool aus

 

Im Debug-Modus können Sie den von einer Funktion oder einem Ausdruck zurückgegebenen Wert nicht kennen.

Zum Beispiel

void OnStart()
{
  double Angle = 1;
  double d = MathSin(Angle / 2) * MathSin(Angle * 2);
}

Zum Beispiel, was die zugewiesenen Funktionen zurückgegeben haben.


Ich verwende (nicht nur im Debug-Modus) diese Methode

template <typename T>
T MyPrint( const T Value, const string Str )
{
  static const bool IsDebug = MQLInfoInteger(MQL_DEBUG);

//  if (IsDebug)
  {
//    DebugBreak(); // если хочется посмотреть средствами дебага

    Print(Str + " = " + (string)Value);
  }
  
  return(Value);
}

#define _P(A) MyPrint(A, __FUNCSIG__ ", Line = " + (string)__LINE__ + ": " + #A)

void OnStart()
{
  double Angle = 1;
  double d = _P(MathSin(Angle / 2)) * _P(MathSin(Angle * 2));
}


Ergebnis

void OnStart(), Line = 21: MathSin(Angle/2) = 0.479425538604203
void OnStart(), Line = 21: MathSin(Angle*2) = 0.9092974268256817
 

Struktur des Prüfungsergebnisses der Handelsanfrage (MqlTradeCheckResult)

Beschreibung des Feldes

Feld

Beschreibung

Bilanz

Saldowert, der sich nach der Ausführung der Handelsoperation ergibt

Eigenkapital

Wert des Eigenkapitals, der sich nach der Ausführung des Geschäfts ergeben wird

Marge

Erforderliche Marge für die gewünschte Handelsoperation

margin_free

Der Betrag des Eigenkapitals, der nach der Ausführung des gewünschten Geschäfts verbleibt

margin_level

Die Höhe des Einschusses, der nach der Ausführung der gewünschten Handelsoperation festgelegt wird

Diese Felder entsprechen der Zeile auf der Registerkarte Handel


Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура результата проверки торгового запроса
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура результата проверки торгового запроса
  • www.mql5.com
Прежде чем отправить торговому серверу запрос на торговую операцию, рекомендуется провести его проверку. Проверка осуществляется функцией OrderCheck(), которой передается сам проверяемый запрос и переменная типа структуры MqlTradeCheckResult. В эту переменную и будет записан результат проверки.
 
fxsaber:

Diese Felder entsprechen der Zeile auf der Registerkarte Handel


Die gleichen Werte zeigen den aktuellen Zustand an, aber gibt die Struktur nicht die berechneten Werte zurück, die nach der Ausführung des Geschäfts vorhanden sein werden?

 
Artyom Trishkin:

Die gleichen Werte zeigen den aktuellen Zustand an, aber gibt die Struktur nicht die berechneten Werte zurück, die nach der Ausführung des Geschäfts vorhanden sein werden?

Zeigt die berechneten Werte an, die in dieser Zeile stehen würden, wenn der Handelsauftrag ausgeführt würde.

 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Generische Klassenbibliothek - Fehler, Beschreibung, Fragen, Besonderheiten der Nutzung und Vorschläge

Renat Fatkhullin, 2017.12.08 23:34

Wir haben keine MqlDeal-Struktur, da die Handelsdatensatzformate fließend sind und regelmäßig erweitert werden. Ohne dies ist es unmöglich, die Funktionalität der Plattform zu erweitern.

Daher besteht die einzige Möglichkeit darin, über die Funktion Get auf sie zuzugreifen. Und der Zugriff auf andere Felder des zuvor betroffenen Datensatzes ist um ein Vielfaches schneller als der erste Zugriff, da der Datensatz zwischengespeichert wird.

Im obigen Test werden die Handelsnummern jedes Mal neu eingegeben, wodurch der Cache des zuvor ausgewählten Handels immer wieder verworfen wird.

 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

MT5 vs. MT4. Array-Füllrate.

Renat Fatkhullin, 2017.12.12 12:19

1) Die Idee ist falsch, lokale Arrays füllen sich nicht schneller (grob, ohne auf die Mikroebene zu fallen)

2) Arrays müssen über normale Initialisierungsfunktionen schnell gefüllt werden

3) Um die Geschwindigkeit zu maximieren, ist es besser, das Array als Vektor (eindimensional) zu halten, damit Sie mehr Möglichkeiten haben, den Zugriff zu optimieren. Denn die Mehrdimensionalität schränkt die Zahl der obligatorischen Frames stark ein und zwingt den Compiler, zusätzliche konstante Berechnungen von mehrdimensionalen Indizes durchzuführen.

4) Arrays für den schnellen Zugriff sollten statisch gehalten werden, was die Anzahl der Prüfungen auf Ausreißer drastisch reduziert.

 

Forum zum Thema Handel, automatische Handelssysteme und Testen von Handelsstrategien

Eröffnung einer Verkaufsposition in mql5

fxsaber, 2017.12.12 21:56

// true - not for trade by market-orders
bool IsBadFilling( const string Symb )
{
  return(!(SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE) & (SYMBOL_FILLING_IOC | SYMBOL_FILLING_FOK)));
}

void OnTick()
{
  if (IsBadFilling(_Symbol))
  {
    Print("Change symbol " + _Symbol + " or server " + AccountInfoString(ACCOUNT_SERVER) + " for trade by market!");
    
    ExpertRemove();    
  }
}


Ergebnis

2017.12.05 00:00:00   Change symbol EURUSD or server AMPGlobalClearing-Demo-CQG for trade by market!

Ermöglicht es Ihnen, schnell herauszufinden, warum sich die Märkte im Tester nicht öffnen. Vielleicht liegt es am Fehlverhalten des Testers, dass Marktaufträge auf diese Weise verboten werden und schwebende Aufträge nicht.


Ich schlage vor, dass, wenn SYMBOL_FILLING_MODE Null ist, der Prüfer diesen Wert durch(SYMBOL_FILLING_IOC | SYMBOL_FILLING_FOK) ersetzen sollte. D. h., es wurde der vollständige Handel zugelassen, obwohl der Broker das entsprechende Symbolfeld nicht angegeben hat.

 
// Опознает кривые COPY_TICKS_INFO-тики
// Отсутствие цены (высохшая сторона стакана - нулевая цена) не признается валидной ситуацией
bool IsTickInfoBad( const MqlTick &Tick )
{
  return(!Tick.ask || !Tick.bid || Tick.last || Tick.volume || ((Tick.flags & (0x7F ^ (TICK_FLAG_ASK | TICK_FLAG_BID))) != 0));
}

#define  DEFINE_FIELD(A)             \
  if (!Ticks[i].##A)                \
    Ticks[i].##A = Ticks[i - 1].##A

// Корректирует ошибочные COPY_TICKS_INFO-тики
void CorrectTicksInfo( MqlTick &Ticks[] )
{
  const int Size = ArraySize(Ticks);
  
  for (int i = 1; i < Size; i++)
    if (IsTickInfoBad(Ticks[i]))
    {
      DEFINE_FIELD(bid);
      DEFINE_FIELD(ask);      
      
      Ticks[i].last = 0;
      Ticks[i].volume = 0;
      Ticks[i].flags = TICK_FLAG_ASK | TICK_FLAG_BID;
    }
}
Ich empfehle, so etwas jedes Mal nach CopyTicks(COPY_TICKS_INFO) zu tun, damit der TS nicht versehentlich das Konto leert.