Caractéristiques du langage mql4, subtilités et techniques - page 6

 
fxsaber:
Contrairement à MQL5, dans MQL4 les tableaux statiques peuvent changer de taille.
Pas toujours.

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

Nouvelle version de la plateforme MetaTrader 5 build 1595 : accès à l'historique des prix

fxsaber, 2017.05.01 16:36

#property strict

template <typename T>
struct ARRAY
{
  T Simple[100];
};

void OnStart()
{
  int ArraySimple[100];
  ARRAY<int> Array;

  Print(ArrayResize(Array.Simple, 10)); // MQL4: -1
  Print(ArrayResize(ArraySimple, 10));  // MQL4: 10
  
  Print(ArraySize(ArraySimple));        // MQL4: 10
  Print(ArraySize(Array.Simple));       // MQL4: 100
}
 

Il y a toujours eu un bug dans MT4 au niveau du Trailing Stop. Si vous observez pendant un fort mouvement de hausse et de baisse des prix,
vous pouvez voir le SL monter et descendre. Ici, un petit mouvement s'est produit, mais il est beaucoup plus important.
2017.05.22 10:53:38.563 '9898616' : trailing stop #1465775202 -> 1.29765
2017.05.22 10:53:38.483'9898616' : trailing stop #1465775202 -> 1.29764
2017.05.22 10:53:33.236'9898616' : trailing stop #1465775202 -> 1.29763
2017.05.22 10:53:33.130'9898616' : trailing stop #1465775202 -> 1.29764
2017.05.22 10:53:32.813 '9898616' : trailing stop #1465775202 -> 1.29762
Je l'ai eu quand SL = 2 (dernier chiffre pour la simplicité), au tick suivant le prix a augmenté et le terminal a donné un ordre pour augmenter SL à 4.
Au tick suivant, le prix a baissé mais le SL est toujours à 2. Le terminal émet un ordre pour porter SL à 3.
Le serveur, tel une girafe au long cou, a traité la première commande et porté SL à 4. Le serveur a traité la deuxième commande et a réduit SL à 3.
Ainsi, le terminal envoie des ordres supplémentaires sans signification et cela augmente la charge sur le serveur.
En outre, il existe un risque de perte inutile pour le trader en raison du mouvement inverse du SL.
Cela s'applique également aux programmes suivis d'une EA ou d'un script . Nous le corrigeons en partie en déplaçant le SL par étapes de 3...5 pips.

Ce qu'il faut faire. Sauvegarde de la valeur de SL, émise dans le dernier OrderModify.
Et ensuite, calculer la prochaine commande en fonction de cette valeur.
Ce serait comme suit : deux commandes de moins au serveur, ce qui fait avancer SL uniquement, réduisant ainsi la charge CPU de l'ordinateur.
2017.05.22 10:53:38.563 '9898616' : trailing stop #1465775202 -> 1.29765
2017.05.22 10:53:33.130 '9898616' : trailing stop #1465775202 -> 1.29764
2017.05.22 10:53:32.813 '9898616' : trailing stop #1465775202 -> 1.29762

 

Lors de la modification des ordres, il est souvent nécessaire de comparer le TP/SL précédent avec la nouvelle valeur à modifier. Si nous essayons de le modifier avec l'ancienne valeur, nous obtiendrons l'erreur n°1.

Prenons l'exemple de la comparaison entre l'ancienne SL (100.03) et la nouvelle SL(100.02) pour USDJPY (Chiffres = 2). C'est écrit dans l'aide :

La deuxième méthode consiste à comparer la différence normalisée de deux nombres réels avec une valeur nulle. Comparer la différence des nombres normalisés à zéro est inutile, puisque toute opération mathématique avec des nombres normalisés donne un résultat non normalisé.

C'est-à-dire que la comparaison doit être faite de cette manière :

if(NormalizeDouble(100.03 - 100.02, Digits) != 0) // можно модифицировать

Mais parfois, le courtier peut donner des prix non normalisés. Et par exemple, nous avons obtenu le prix 100.025, pas 100.02. Après avoir comparé selon le schéma ci-dessus, nous obtiendrons une différence de 0,01, c'est-à-dire que nous pouvons la modifier. Mais ayant passé pour la modification normalisée aux chiffres 100.025, nous passerons en fait 100.03 et par conséquent nous obtiendrons l'erreur #1.

En général, par expérience, je suis arrivé à la conclusion qu'à chiffres égaux pour les modifications, il est préférablede comparer la différence des nombres normalisés avec zéro (ce que l'aide ne recommande pas de faire).

Script à vérifier :

void OnStart()
{
  double a = 0.02;
  double b = 0.015;
  
  Print(" norm1 dif=", ND(a - b));            // результат = 0.01
  Print(" norm2 dif=", ND(a) - ND(b));        // результат = 0.0
}

double ND(double d) {return NormalizeDouble(d, 2);}
Вещественные типы (double, float) - Типы данных - Основы языка - Справочник MQL4
Вещественные типы (double, float) - Типы данных - Основы языка - Справочник MQL4
  • docs.mql4.com
Вещественные типы (double, float) - Типы данных - Основы языка - Справочник MQL4
 
if(MathAbs(a-b)>=Point)
 
Yurij Kozhevnikov:
Oui, vous pouvez le faire. C'est le premier mode de comparaison donné dans l'aide. Je soulignais simplement le piège de la normalisation des nombres réels dans lequel je suis moi-même tombé, en utilisant la deuxième méthode recommandée dans la documentation.
 
Les commentaires non pertinents pour ce sujet ont été déplacés vers "Organiser le cycle de commande".
 

Contrairement à OrderProfit() dans MT4, OrderCommission() enregistre des données qui ne sont pas arrondies en centimes.


SZZ Dans OrderPrint(), la commission est arrondie (comme dans l'interface graphique).

 
fxsaber:

Contrairement à OrderProfit() dans MT4, OrderCommission() enregistre des données qui ne sont pas arrondies en centimes.


SZZ Dans OrderPrint(), la commission est arrondie (comme dans l'interface graphique).

Par conséquent, que dois-je faire pour obtenir la valeur correcte de OrderProfit()+OrderComission()+OrderSwap() ?

 
Artyom Trishkin:

En conséquence, pour obtenir la valeur correcte de OrderProfit()+OrderComission()+OrderSwap(), que faut-il faire ?

Rien ! C'est la valeur la plus correcte. Grâce à cette commission, nous pouvons voir dans l'interface graphique que la commission totale diffère d'un centime de la somme des chiffres affichés par l'interface graphique.

 
fxsaber:

Rien ! C'est la valeur la plus correcte. Grâce à cette commission, vous pouvez observer dans l'interface graphique que la commission totale diffère d'un centime de la somme des chiffres que l'interface graphique affiche.

Alors je ne le comprends pas du tout. Que voulez-vous dire par "OrderCommission() stocke des données non arrondies en centimes"? Où sont-ils arrondis ? Et comment sont-ils arrondis ?