Caractéristiques du langage mql5, subtilités et techniques - page 62

 
Vasiliy Pushkaryov:
Avez-vous une photo de ce à quoi cela ressemblerait ? Ce n'est pas très clair, je n'ai pas encore utiliséOBJ_CHART.

Il n'y a pas de photo. Mais vous pouvez le construire à la main. Sélectionnez Insert -> Objects -> Graphic Objects -> Chart et après avoir inséré OBJ_CHART comme ceci, sélectionnez "Draw object as background" dans les propriétés de l'objet, en désactivant les échelles.

 
fxsaber:

Il n'y a pas de photo. Mais vous pouvez le construire à la main. Sélectionnez Insert -> Objects -> Graphic Objects -> Graphic et après avoir inséré OBJ_CHART comme ceci, sélectionnez "Draw object as background" dans les propriétés de l'objet, en désactivant les échelles.


Merci, ça a l'air cool

 

En mode débogage, vous ne pouvez pas connaître la valeur renvoyée par une fonction ou une expression.

Par exemple

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

Par exemple, ce que les fonctions allouées ont retourné.


J'utilise (pas seulement en mode débogage) cette façon de faire

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


Résultat

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

Structure du résultat du contrôle de la demande de transaction (MqlTradeCheckResult)

Description du champ

Champ

Description

équilibre

Valeur du solde qui sera après l'exécution de l'opération commerciale

actions

Valeur de l'équité, qui sera après l'exécution de la transaction.

marge

Marge requise pour l'opération requise

marge_libre

Le montant de l'équité qui restera après l'exécution de la transaction requise.

niveau de marge

Le niveau de marge qui sera fixé après l'exécution de l'opération requise.

Ces champs correspondent à la ligne de l'onglet "Commerce".


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

Ces champs correspondent à la ligne de l'onglet "Commerce".


Les mêmes valeurs indiquent l'état actuel, mais la structure ne renvoie-t-elle pas les valeurs calculées qui seront présentes après l'exécution de la transaction?

 
Artyom Trishkin:

Les mêmes valeurs indiquent l'état actuel, mais la structure ne renvoie-t-elle pas les valeurs calculées qui seront présentes après l'exécution de la transaction?

Affiche les valeurs calculées qui se trouveraient dans cette ligne si l'ordre de transaction était exécuté.

 

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Bibliothèque des classes génériques - erreurs, description, questions, particularités d'utilisation et suggestions

Renat Fatkhullin, 2017.12.08 23:34

Nous n'avons pas de structure MqlDeal car les formats d'enregistrement des échanges sont flottants et s'étendent périodiquement. Sans cela, il est impossible d'étendre les fonctionnalités de la plate-forme.

Par conséquent, la seule option est d'y accéder par la fonction Get. Et l 'accès à d'autres champs de l'enregistrement précédemment affecté est plusieurs fois plus rapide que le premier accès, car l'enregistrement est mis en cache.

Dans le test ci-dessus, les numéros de transaction sont nouveaux à chaque fois, ce qui perturbe continuellement le cache de la transaction précédemment sélectionnée.

 

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading

MT5 vs MT4. Taux de remplissage du réseau.

Renat Fatkhullin, 2017.12.12 12:19

1) L'idée est fausse, les tableaux locaux ne se remplissent pas plus vite (en gros, sans descendre au niveau micro).

2) Les tableaux doivent être remplis rapidement par les fonctions d'initialisation normales.

3) Pour maximiser la vitesse, il est préférable de conserver le tableau sous forme de vecteur (unidimensionnel), afin d'avoir plus de chances d'optimiser l'accès. Parce que la multidimensionnalité vous limite sévèrement aux cadres obligatoires et oblige le compilateur à effectuer un calcul constant supplémentaire des indices multidimensionnels.

4) Les tableaux à accès rapide doivent rester statiques, ce qui réduit considérablement le nombre de vérifications des valeurs aberrantes.

 

Forum sur le trading, les systèmes de trading automatisés et l'essai de stratégies de trading

Ouverture d'une position de vente en 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();    
  }
}


Résultat

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

Vous permet de comprendre rapidement pourquoi les marchés ne s'ouvrent pas dans le testeur. Peut-être que c'est le mauvais comportement du testeur qui fait que les ordres au marché sont interdits comme ça et pas les ordres en attente.


Je suggère que lorsque SYMBOL_FILLING_MODE est égal à zéro, le testeur remplace cette valeur par(SYMBOL_FILLING_IOC | SYMBOL_FILLING_FOK). C'est-à-dire qu'il a permis une négociation complète lorsque le courtier n'a pas spécifié le champ de symbole approprié.

 
// Опознает кривые 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;
    }
}
Je recommande de faire quelque chose comme ça chaque fois après CopyTicks(COPY_TICKS_INFO), afin que le TS ne vide pas accidentellement le compte.