Fonctions utiles de KimIV

 

Dans ce fil de discussion, je publierai les codes de mes fonctions dans MQL4, je donnerai des exemples de leur utilisation et je répondrai aux questions relatives à leur utilisation. Chaque fonction sera publiée en deux postes. Le premier post contiendra le code de la fonction, le second - des exemples d'utilisation et de courtes explications. Parfois, je joins le code d'un script au deuxième message pour tester réellement la fonction et afficher les résultats.

Je commencerai par les fonctions permettant de gérer les ordres, conformément à la demande de Lukyanov dans le sujet "Comment faire fonctionner deux EA en même temps" à la fin.

La première est la fonction de définition des ordres (version du testeur MT4) :

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия  : 13.06.2007                                                      |
//|  Описание : Установка ордера. Версия функции для тестов на истории.        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    op - операция                                                           |
//|    ll - лот                                                                |
//|    pp - цена                                                               |
//|    sl - уровень стоп                                                       |
//|    tp - уровень тейк                                                       |
//|    mn - Magic Number                                                       |
//|    ex - Срок истечения                                                     |
//+----------------------------------------------------------------------------+
void SetOrder(string sy, int op, double ll, double pp,
              double sl=0, double tp=0, int mn=0, datetime ex=0) {
  color clOpen;
  int   err, ticket;
 
  if (sy=="" || sy=="0") sy=Symbol();
  if (op==OP_BUYLIMIT || op==OP_BUYSTOP) clOpen=clOpenBuy; else clOpen=clOpenSell;
  ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, "", mn, ex, clOpen);
  if (ticket<0) {
    err=GetLastError();
    Print("Error(",err,") set ",GetNameOP(op),": ",ErrorDescription(err));
    Print("Ask=",Ask," Bid=",Bid," sy=",sy," ll=",ll,
          " pp=",pp," sl=",sl," tp=",tp," mn=",mn);
  }
}
//+----------------------------------------------------------------------------+
 
Y aura-t-il des fonctionnalités publiées pour le trading réel ? P.S. : Merci pour le sujet. Je pense qu'il sera très populaire et très demandé.
 
Bonjour, Igor !
Je soutiens l'idée. Bonne décision........ !!!
Votre code est énorme, les questions surgissent souvent, et il n'est pas bon de s'adresser à vous dans les messages d'autres personnes et sur d'autres sujets.
 

Super.

Suggestion aux développeurs : commencez à constituer une bibliothèque de fonctions. À mon avis, il serait souhaitable de présenter à la communauté des exigences de conception à cet égard (par exemple, description obligatoire des variables, restrictions d'utilisation, nombre de caractères par ligne, etc.) Un article de MQ sur le sujet serait une bonne idée.

Au fil du temps, des fonctions non seulement simples mais aussi complexes apparaîtront dans la bibliothèque.

 
Lukyanov:
Y aura-t-il des fonctionnalités publiées pour le trading réel ?

Oui, ils vont... La prochaine étape sera la fonction SetOrder() pour le trading en ligne...


Exemples d'utilisation de la fonction SetOrder() :

1. Mise en place d'un ordre BuyLimit avec 0.1 lot, 50 pips en dessous du prix actuel :

SetOrder(NULL, OP_BUYLIMIT, 0.1, Ask-50*Point);

2. Mise en place d'un ordre BuyStop avec le lot 0.3 36 pips au-dessus du prix actuel avec un stop de 32 pips :

SetOrder(NULL, OP_BUYSTOP, 0.3, Ask+36*Point, Ask+(36-32)*Point);

3. Placement d'un ordre SellLimit par le lot 0.2 à 42 pips au-dessus du prix actuel avec un takeaway de 50 pips :

SetOrder(NULL, OP_SELLLIMIT, 0.2, Bid+42*Point, 0, Bid+(42-50)*Point);

4. Placer un ordre SellStop par lot 0.5 de 100 pips en dessous du prix actuel avec un stop de 30 pips et un takeaway de 70 pips :

SetOrder(NULL, OP_SELLSTOP, 0.5, Bid-100*Point, Bid-(100-30)*Point, Bid-(100+70)*Point);

5. Un ordre BuyLimit avec le lot 0.1 placé 50 pips en dessous du prix actuel avec le numéro magique 123456 et une expiration dans deux heures :

SetOrder(NULL, OP_BUYLIMIT, 0.1, Ask-50*Point, 0, 0, 123456, TimeCurrent()+2*60*60);
La bande-annonce est un scénario réel avec les exemples ci-dessus. Les quatre premiers exemples sont commentés.
Dossiers :
 
VBAG:
Bonjour, Igor !
Je soutiens l'idée. Bonne décision........ !!!
Votre code est énorme, les questions surgissent souvent, et il n'est pas bon de s'adresser à vous dans les messages d'autres personnes et sur d'autres sujets.
Eh bien, ici nous pouvons parler. Formulez vos questions, je me ferai un plaisir d'y répondre :-)
 
Montrez votre version des délais entre les transactions commerciales
Merci.
 
Merci pour ce sujet utile, bien que je sois sur les tartes brûlées, mais quand même, peut-être que quelqu'un a été confronté au problème du stockage et de l'échantillonnage de grands ensembles de données en µl. µl et des bases de données ? Quelqu'un a-t-il pensé dans cette direction ?
 
zhuki писал (а):
Montrez votre version des délais entre les transactions

Je ne fais aucun délai entre les transactions. C'est-à-dire que si je dois passer deux ou plusieurs ordres, j'effectue ces opérations de trading sans pause entre elles. Mais entre les tentatives de transaction, qui doivent être répétées s'il y a une erreur lors du contact avec le serveur, je fais une pause selon les recommandations des développeurs de MT4. À titre d'exemple, vous pouvez voir comment ces pauses sont mises en œuvre dans ma fonction SetOrder() pour le trading en ligne. Des pauses différentes sont effectuées pour les différentes erreurs renvoyées par le serveur de négociation.

Cette fonction SetOrder() est utilisée pour définir les ordres en attente. Il est recommandé de l'utiliser pour le trading en ligne sur des comptes de démonstration et des comptes réels.

Dossiers :
 
Très original, mais expliquez pourquoi les délais de 7,7, 17, 11 secondes. De même, s'il y a plus d'un conseiller expert, l'analyse est alors nécessaire.
 
zhuki:
...expliquer pourquoi il y a un délai de 7,7, 17, 11 secondes . Est-ce une blague ou est-ce justifié ?

Quel genre de blagues peut-on faire avec de l'argent réel ?

Les erreurs 129 (prix acheteur ou vendeur incorrect), 130 (arrêts incorrects), 134 (pas assez d'argent), 136 (pas de prix) seront mises en pause pendant 7,7 secondes. Les développeurs de MT4 recommandent des pauses de plus de 5 secondes dans ces cas. Je l'ai réglé à 7,7 secondes. C'est comme si on avait mis 6,1 secondes. Je n'aime pas les valeurs rondes en raison de leur attrait, c'est pourquoi je définis des valeurs non circulaires.

La pause de 17 secondes était censée correspondre à l'erreur 145 (Modification interdite). Mais comme la fonction SetOrder ne gère pas la modification, j'ai supprimé la gestion de cette erreur. Merci d'avoir attiré mon attention sur cet aspect de ma fonction !

La pause de 11 secondes est située à l'intérieur de la boucle qui vérifie l'état du sous-système commercial. Vous pouvez le régler sur 15 ou 30 secondes. Peu importe ce que vous aimez.

zhuki:
Je me demande également ce qu'il faut faire s'il y a plus d'un conseiller expert et qu'on ne peut pas se passer de l'analyse.

Pour plusieurs Expert Advisors dans un compte de trading, l'erreur 146 (trading subsystem is busy) est traitée. La fonction SetOrder attend que le sous-système de négociation soit libre.


Attention ! J'ai modifié le message précédent. Modifications apportées à la fonction SetOrder.