Fonctions utiles de KimIV - page 4

 

Autres exemples d'utilisation de la fonction SetOrder().

Pour plus de clarté, nous devrions sélectionner un symbole avec un niveau minimum autorisé de stop loss/stake profit en pips. J'ai choisi AUDCAD, pour lequel ce niveau dans ma société de courtage sélectionnée pour le test est de 10 points.

1. Mise en place d'un ordre BuyLimit avec le lot 0.1, 5 pips en dessous du prix actuel. J'ai délibérément choisi un niveau de fixation de l'ordre inférieur au niveau minimum autorisé pour obtenir l'erreur 130 (Mauvais stops) et montrer comment la fonction SetOrder va s'en sortir.

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

Contenu du protocole (lu de bas en haut) :
2008.03.17 09:06:24 test_SetOrder AUDCAD,M5 : supprimé
2008.03.17 09:06:24 stdlib AUDCAD,M5 : supprimé
2008.03.17 09:06:24 stdlib AUDCAD,M5 : uninit reason 0
2008.03.17 09:06:24 test_SetOrder AUDCAD,M5 : raison de désinit 0
2008.03.17 09:06:24 test_SetOrder AUDCAD,M5 : open #21616412 buy limit 0.10 AUDCAD at 0.9180 ok
2008.03.17 09:06:15 test_SetOrder AUDCAD,M5 : SetOrder() : Niveaux de prix corrigés
2008.03.17 09:06:15 test_SetOrder AUDCAD,M5 : Ask=0.919 Bid=0.918 sy=AUDCAD ll=0.1 op=Buy Limit pp=0.9185 sl=0 tp=0 mn=0
2008.03.17 09:06:15 test_SetOrder AUDCAD,M5 : Error(130) set order : invalid stops, try 1
2008.03.17 09:06:15 stdlib AUDCAD,M5 : chargé correctement
2008.03.17 09:06:14 test_SetOrder AUDCAD,M5 : chargé correctement

Le protocole montre que cette fonction a essayé de placer un ordre 0.9185 (pp=0.9185) mais le serveur de trading n'a pas accepté cet ordre et a renvoyé l'erreur 130. Ensuite, la fonction corrige le niveau de fixation de l'ordre en fonction du niveau minimum autorisé et effectue la tentative de transaction suivante qui se termine avec succès. L'ordre est fixé à 0.9180.

2. Fixer un ordre BuyStop avec le lot 0.3 à 6 pips au-dessus du prix actuel avec un stop de 9 pips.

SetOrder(NULL, OP_BUYSTOP, 0.3, Ask+6*Point, Ask+(6-9)*Point);

Contenu du protocole (à lire de bas en haut) :
2008.03.17 09:27:36 test_SetOrder AUDCAD,M5 : supprimé
2008.03.17 09:27:36 stdlib AUDCAD,M5 : supprimé
2008.03.17 09:27:36 stdlib AUDCAD,M5 : uninit reason 0
2008.03.17 09:27:36 test_SetOrder AUDCAD,M5 : uninit reason 0
2008.03.17 09:27:36 test_SetOrder AUDCAD,M5 : open #21617419 buy stop 0.30 AUDCAD at 0.9209 sl : 0.9195 ok
2008.03.17 09:27:26 test_SetOrder AUDCAD,M5 : SetOrder() : Niveaux de prix corrigés
2008.03.17 09:27:26 test_SetOrder AUDCAD,M5 : Ask=0.9198 Bid=0.9188 sy=AUDCAD ll=0.3 op=Buy Stop pp=0.9204 sl=0.9195 tp=0 mn=0
2008.03.17 09:27:26 test_SetOrder AUDCAD,M5 : Error(130) set order : invalid stops, try 1
2008.03.17 09:27:26 stdlib AUDCAD,M5 : chargé correctement
2008.03.17 09:27:25 test_SetOrder AUDCAD,M5 : chargé correctement

Cet exemple montre que le niveau de réglage de l'ordre est passé de 0,9204 à 0,9209. Dans le même temps, le niveau du stop est resté inchangé à sl=0.9195. C'est-à-dire que le stop en pips est passé de 9 à 14.

 

3. Fixation d'un ordre SellLimit avec 0,5 lot à 8 points au-dessus du prix actuel avec un stop de 9 points et un ordre d'achat de 7 points.

SetOrder(NULL, OP_SELLLIMIT, 0.5, Bid+8*Point, Bid+(8-9)*Point, Bid-(8+7)*Point);

Contenu du protocole :
2008.03.17 10:38:50 test_SetOrder AUDCAD,M5 : supprimé
2008.03.17 10:38:50 stdlib AUDCAD,M5 : supprimé
2008.03.17 10:38:50 stdlib AUDCAD,M5 : uninit reason 0
2008.03.17 10:38:50 test_SetOrder AUDCAD,M5 : uninit reason 0
2008.03.17 10:38:49 test_SetOrder AUDCAD,M5 : open #21620553 sell limit 0.50 AUDCAD at 0.9190 sl : 0.9201 tp : 0.9179 ok
2008.03.17 10:38:40 test_SetOrder AUDCAD,M5 : SetOrder() : Niveaux de prix corrigés
2008.03.17 10:38:40 test_SetOrder AUDCAD,M5 : Ask=0.919 Bid=0.918 sy=AUDCAD ll=0.5 op=Sell Limit pp=0.9188 sl=0.9197 tp=0.9179 mn=0
2008.03.17 10:38:40 test_SetOrder AUDCAD,M5 : Error(130) set order : invalid stops, try 1
2008.03.17 10:38:40 stdlib AUDCAD,M5 : chargé correctement
2008.03.17 10:38:39 test_SetOrder AUDCAD,M5 : chargé correctement

Cet exemple tente à nouveau de fixer un ordre limite trop proche du marché. Le niveau de fixation des ordres a été ajusté à la hausse de 2 pips de 0.9188 à 0.9190. Le niveau stop a également été ajusté, mais de 4 points, passant de 0,9197 à 0,9201. Seul le niveau Take est resté inchangé, ce qui l'a fait passer de 9 à 11 pips.

Je pense qu'il y a assez d'exemples. Ils sont déjà assez difficiles à comprendre. Quelles conclusions peut-on en tirer ?
1. La fonction fera de son mieux pour accomplir sa tâche, c'est-à-dire qu'elle essaiera d'établir un ordre. Il ajustera les niveaux en fonction de l'évolution du marché et essaiera de faire son travail encore et encore.
2. L'ajustement du niveau de réglage de l'ordre stop entraîne une augmentation du niveau du stop en points par rapport au prix de réglage. Cela est dû au fait que le niveau de l'ordre stop reste en place et que le niveau de fixation de l'ordre est éloigné du niveau stop. Le niveau de l'ordre BuyStop est déplacé vers le haut et l'ordre SellStop est déplacé vers le bas. Ces manipulations avec le niveau de réglage de l'ordre augmentent la taille du stop en points de la valeur de l'ajustement du niveau de réglage de l'ordre.
3. L'ajustement du niveau de fixation de l'ordre limite entraîne l'augmentation du niveau de la ligne de prise en points par rapport au prix de fixation. Ceci est mis en œuvre de la manière suivante. Les tees restent en place tandis que les stops et les niveaux de configuration sont déplacés vers le haut pour BuyLimit et vers le bas pour SellLimit. La taille des points de prise en charge augmente en fonction de la valeur de la correction du niveau de réglage de la commande.

Attention ! J'ai modifié le code de la fonction SetOrder en échangeant quelques lignes. L'ancien message ne pouvant être édité, je colle ici la fonction corrigée. Vous trouverez également ci-joint un script pour tester en ligne la fonction SetOrder.


Dossiers :
 

Pour accélérer la publication de la fonction ModifyOrder, j'ai décidé de passer aux fonctions de position pendant un certain temps, puis de revenir aux fonctions d'ordre et de terminer avec elles.

Note !
Je définis lespositions comme des opérations de trading OP_BUY et OP_SELL. Les postes sont ouverts et fermés.
J'appelle les opérations OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT et OP_SELLSTOPdes ordres. Les commandes sont passées et supprimées. Si un ordre est déclenché, il devient une position.

La fonction ExistPositions().

Cette fonction est destinée à vérifier s'il existe des positions ouvertes d'achat ou de vente. Similaire à la fonction ExistOrders. Par défaut, il vérifie toutes les positions : actuelles et autres. Vous pouvez affiner la sélection à l'aide d'une combinaison de filtres - paramètres de fonction :

  • sy - Impose une restriction sur le nom de l'instrument. Le paramètre par défaut est "" - aucune restriction, c'est-à-dire n'importe quel instrument. Si vous passez NULL, la sélection de la position sera limitée à l'instrument actuel.
  • op - impose une restriction sur le type de position (Achat/Vente). Par défaut, il n'y a pas de contrainte, c'est-à-dire que tout type de position est vérifié. Les valeurs valides pour ce paramètre sont -1, OP_BUY et OP_SELL.
  • mn - Applique une restriction sur le numéro d'identification ("magique") de la position. Par défaut, il n'y a pas de contrainte, c'est-à-dire que la position avec n'importe quel numéro magique est vérifiée.
  • ot - Applique une restriction sur l'heure d'ouverture du poste. Il vérifie si la position sera ouverte plus tard que la valeur de ce paramètre. Aucune contrainte par défaut, c'est-à-dire que toute position avec n'importe quelle heure d'ouverture est vérifiée.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 06.03.2008                                                     |
//|  Описание : Возвращает флаг существования позиций                          |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ot - время открытия             ( 0   - любое время открытия)           |
//+----------------------------------------------------------------------------+
bool ExistPositions(string sy="", int op=-1, int mn=-1, datetime ot=0) {
  int i, k=OrdersTotal();
 
  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (ot<=OrderOpenTime()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}
 

Exemples d'utilisation de la fonction ExistPositions().

1. Vérifier l'existence de toute position

ExistPositions();

2. Vérifier l'existence d'une position sur le symbole graphique actuel

ExistPositions(NULL);

3. Vérifier l'existence d'un achat sur tout instrument

ExistPositions("", OP_BUY);

4. Vérifier s'il y a une vente avec le numéro magique 123456 sur EURUSD

ExistPositions("EURUSD", OP_SELL, 123456);

5. Vérifier l'existence de toute position dont l'heure d'ouverture ne remonte pas à plus de 15 minutes.

ExistPositions("", -1, -1, TimeCurrent()-15*60);

Le trailer contient un script pour tester la fonction ExistPositions. Les quatre premiers exemples sont commentés.

Dossiers :
 
Désolé, mais ni OrderSet_1 ni OrderSet_2 ne fonctionnent ! Il génère des erreurs - il ne compile pas ! Que dois-je faire ?
 
SoloEgoist:
Désolé, mais ni OrderSet_1 ni OrderSet_2 ne fonctionnent ! Il génère des erreurs - il ne compile pas ! Que dois-je faire ?
Les fichiers OrderSet_1 ou OrderSet_2 sont des codes sources pour la fonction OrderSet dans différentes versions. Juste le code source, c'est tout. Ils ne compilent pas ou ne s'exécutent pas correctement (sans erreur). Afin d'obtenir au moins quelques résultats, vous devez également créer un environnement de travail qui utilise la fonction OrderSet. J'ai créé un exemple d'un tel environnement de travail dans test_SetOrder.
 
Merci. Je vois - je vais essayer, mais je ne connais pas bien la langue.
 

Des fonctions et des façons de travailler avec la date et l'heure seraient utiles...

Par exemple :
- soustraire 2 heures à l'heure actuelle
- X jours avant l'expiration...

Aussi... Je ne sais pas si c'est pertinent... :(

Fonctions pour les statistiques. Par exemple :
- combien de chandeliers horaires à 21:00 tous les lundis ?
- dont : 215 haussier, 245 baissier
- de chandeliers haussiers : min. 12 pips max 54 pips
- etc...

ou
- le bas de chaque première bougie 15H du jour est supérieur/inférieur à la seconde X fois.

Ce ne sont pas les fonctions elles-mêmes qui sont importantes, mais la façon dont elles sont créées, et il est plus facile d'implémenter ses propres fonctions,
tout en apprenant à programmer...
Je me plains une fois de plus :))) Parfois, beaucoup de choses ne sont pas très claires, et les livres sur le C peuvent aider.
Vous pouvez bien sûr les lire, mais avez-vous vraiment besoin de vous remplir la tête d'informations inutiles, en vous concentrant uniquement sur µl4 ?
Quel genre d'obscurité ? Par exemple, ceci : |||.

 
kombat:

Des fonctions et des moyens de traiter la date et l'heure seraient utiles...

Par exemple :
- soustraire 2 heures à l'heure actuelle
- Il reste X jours avant l'expiration...

...


vous n'avez pas besoin d'écrire une telle fonction - il existe une solution très simple !


int gHour = 2 ;
datetime gTwoHour ;


gTwoHourTime = TimeCorrent() - ((86400)/24) * gHour ) ; // 2 heures
gTwoHourTime = TimeCorrent() - 7200 ; // idem mais sans les calculs de charge

c.-à-d. que nous obtenons 86400 ticks en un jour

donc 2 heures = 7200 ticks, c'est-à-dire 86400/24 * 2 = 7200
1 heure = 3600 ; etc.
 
kombat:

Des fonctions et des moyens de travailler avec la date et l'heure seraient utiles.

Fonctions pour les statistiques. Par exemple :
- combien de chandeliers de 21:00 chaque lundi
- dont : 215 haussier, 245 baissier
- de chandeliers haussiers : min. 12 pips max 54 pips
- etc...

ou
- le bas de chaque première bougie 15H du jour est supérieur/inférieur à la seconde X fois.

Ce ne sont pas les fonctions elles-mêmes qui sont importantes, mais la façon dont elles sont créées, et il est plus facile d'implémenter ses propres fonctions,
tout en apprenant à programmer...

Dûment noté... :-)

kombat a écrit (a) :
Je vais encore me plaindre :)) parfois beaucoup de choses ne sont pas très claires, et ils disent que les livres C aideront.
Ils soulignent que de nombreux livres sur le C vous aideront. Bien sûr, vous pouvez les lire, mais avez-vous vraiment besoin de vous remplir la tête d'informations inutiles, en vous concentrant uniquement sur le µl4 ?
Quel genre d'obscurité ? Par exemple, ceci : |||.

C'est un OU logique. Permettez-moi de l'expliquer par un exemple. L'expression "Si x>2 ou x<-3, alors x=5" dans MQL4 aura la forme suivante

if (х>2 || х<-3) х=5;