Questions des débutants MQL5 MT5 MetaTrader 5 - page 1097

 
Vladimir Karputov:

Après l'exécution d'un ordre de transaction, une POSITION apparaît, pas un ORDRE !

Il existe des serveurs où vous pouvez reproduire une telle situation

PositionGetTicket(0) = 73401069 
PositionSelect(_Symbol) = true 
OrderGetTicket(0) = 73401069 
PositionsTotal() = 1
OrdersTotal() = 1, ORDER_STATE_STARTED


C'est-à-dire que nous avons en même temps l'ordre suivant dans le terminal

#73401069 2019.06.08 21:42:42 buy 1.00 BO Volatility 100 Index 0.5150 0.0000 0.0000 0.5150 0.00 0.00 0.00 Hello! 0


et la même position depuis celle-ci

#73401069 2019.06.08 21:42:42 buy 1.00 BO Volatility 100 Index 0.5150 0.0000 0.0000 0.5150 0.00 0.00 0.00 Hello! 0
 
Vladimir Karputov:

Commencez donc par décrire en mots ce que vous faites et ce que vous voulez obtenir. Utilisez "ordre commercial d'achat" et "ordre commercial de vente" au lieu de ORDER. Le résultat est une "position d'achat" ou une "position de vente".

Voici le code écrit en MQL4 - je m'intéresse à la version pour testeurs, c'est-à-dire aux vérifications minimales, etc :

//+------------------------------------------------------------------+
//|                                                        tst__.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

int ticket1=-1;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   ticket1=-1;
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(ticket1<0) ticket1=OrderSend(_Symbol,OP_BUY,0.1,Ask,30,NormalizeDouble(Ask-100*_Point,_Digits),NormalizeDouble(Ask+100*_Point,_Digits));

   if(OrderSelect(ticket1,SELECT_BY_TICKET))
     {
      if(OrderCloseTime()>0)
        {
         int cmd=OrderType()==OP_BUY ? OP_SELL : OP_BUY;
         double tp = cmd==OP_BUY ? NormalizeDouble(Ask+100*_Point,_Digits) : NormalizeDouble(Bid-100*_Point,_Digits);
         double sl = cmd==OP_BUY ? NormalizeDouble(Ask-100*_Point,_Digits) : NormalizeDouble(Bid+100*_Point,_Digits);
         ticket1=OrderSend(_Symbol,cmd,0.1,Ask,30,sl,tp);
        }
     }
  }
//+------------------------------------------------------------------+

L'essence du TS : lorsque vous ouvrez un ordre d'achat, commencez d'abord par vous souvenir du ticket de l'ordre (travaillez sur le ticket), puis vérifiez si l'ordre est fermé - voyez quel type d'ordre et mettez l'ordre opposé et souvenez-vous du ticket et ainsi de suite.

J'ai besoin qu'un exemple similaire soit reproduit dans MQL5 en utilisant SB CTrade

 
Igor Makanu:

OK, simplifions notre discussion aux exemples dans le code, voici le code écrit en MQL4 - je suis intéressé par la version pour testeur, c'est-à-dire un minimum de contrôles, etc :

L'essence du TS : lorsque vous ouvrez un ordre d'achat, commencez d'abord par vous souvenir du ticket de l'ordre (travaillez sur le ticket), puis vérifiez si l'ordre est fermé - voyez quel type d'ordre et mettez l'ordre opposé et souvenez-vous du ticket et ainsi de suite.

J'ai besoin qu'un exemple similaire soit reproduit dans MQL5 en utilisant SB CTrade.

C'est ici que le petit tambour va dire ce qu'il pense de vous)))).
 
Alexey Viktorov:
Maintenant le petit tambour va vous dire ce qu'il pense de vous))))

laissez-le parler, mais nous avons besoin de savoir si le numéro de ticket est ouvert ou fermé, s'il est fermé, nous avons besoin de savoir quel typed'ordre de transaction la position fermée avait.

(en gras - c'est un ordre de toute façon ! - parce que dans le compte d'en-tête du CT)

 
Igor Makanu:

OK, simplifions notre discussion à des exemples en code. J'ai écrit un code en MQL4 - je suis intéressé par la version du testeur, c'est-à-dire le minimum de vérifications, etc :

Le deuxième OrderSend contient une erreur. Et la normalisation est inutile. Dans le forum (et pas seulement), le code est plus facile à lire lorsqu'il est plus court.
void OnTick()
  {
   static int ticket1 = -1;
   
   if(ticket1<0) ticket1=OrderSend(_Symbol,OP_BUY,0.1,Ask,30,Ask-100*_Point,Ask+100*_Point);

   if(OrderSelect(ticket1,SELECT_BY_TICKET) && OrderCloseTime())
    {
     int cmd=1-OrderType();
     double open = cmd ? Bid : Ask;
     double tp = open - (cmd ? 1 : -1) * 100 * _Point;
     double sl = open + (cmd ? 1 : -1) * 100 * _Point;
     ticket1=OrderSend(_Symbol,cmd,0.1,open,30,sl,tp);
    }
  }

J'ai besoin qu'un exemple similaire soit reproduit dans MQL5 en utilisant CTrade SB

J'ai besoin qu'un exemple similaire soit reproduit dans MQL5 en utilisant CTrade SB.

 

Ainsi, les bases sont lePOSITION_IDENTIFIER, mais pas le ticket de position. C'est important justement à cause du filet:

IDENTIFICATEUR DE POSITION

L'identifiant du poste est un numéro unique, qui est attribué à chaque poste nouvellement ouvert et ne change pas pendant toute sa durée de vie. Il correspond au ticket de l'ordre avec lequel la position a été ouverte.

L'identifiant de la position est spécifié dans chaque ordre (ORDER_POSITION_ID) et dans chaque transaction (DEAL_POSITION_ID) qui l'a ouvert, modifié ou fermé. Utilisez cette propriété pour rechercher les ordres et les transactions liés à la position.

Lorsqu'une position est inversée en mode compensation (une seule opération d'entrée/sortie), l'identifiant POSITION_IDENTIFIER de la position n'est pas modifié. Cependant, POSITION_TICKET est changé en ticket d'ordre qui a entraîné l'annulation. En mode couverture, il n'y a pas d'inversion de position.

long


Nous devons donc garder la trace de l'identifiant de la position (POSITION_IDENTIFIER).


Maintenant, une tâche plus précise : au premier lancement, nous ouvrons une POSITION D'ACHAT et la mémorisons (ATTENTION : nous devons mémoriser l'ID de la position, pas le ticket). Si la position a été fermée, nous ouvrons une position opposée : par exemple, il y avait autrefois une position ACHETER, puis elle a été fermée, ce qui signifie que nous ouvrons immédiatement une position VENDRE.


Maintenant, il sera beaucoup plus facile de résoudre le problème.

 
Vladimir Karputov:

Maintenant, il sera beaucoup plus facile de résoudre le problème.

Lorsque vous rédigez l'exemple, regardez un peu plus loin.

 
fxsaber:
Le deuxième OrderSend contient une erreur. Je n'ai pas besoin de normalisation. Sur le forum (et pas seulement), il est plus facile de lire le code quand il est plus court.

Oui, je vois, j'ai écrit le code à la volée - je l'ai exécuté dans le testeur - il fonctionne, je l'ai copié sur le forum.


fxsaber:

Tu devras essayer un peu plus fort.

C'est pourquoi j'ai demandé de l'aide sur le forum ! - J'ai décidé d'estimer les capacités de SB CTrade - j'ai pris une tâche élémentaire comme exemple et jusqu'à présent le résultat a été négatif !


Vladimir Karputov:

Maintenant, il sera beaucoup plus facile de résoudre le problème.

Je vous connais en tant que membre actif du forum. Pourriez-vous reproduire mon, ou plutôt le code corrigé defxsaber, en utilisant CTrade Server sous MQL5 ?

 
Igor Makanu:

Oui, je vois, j'ai écrit le code à la volée - je l'ai exécuté dans le testeur - il fonctionne, je l'ai copié sur le forum.

Lorsque je commence à rédiger une EE, je commence toujours par une page blanche (je le recommande). Le plus souvent, on commence par un en-tête avec des fonctions On.

 
Igor Makanu:

C'est pourquoi j'ai demandé de l'aide sur le forum ! - J'ai décidé d'évaluer les capacités de CTrade - j'ai pris une tâche élémentaire comme exemple et jusqu'à présent le résultat a été négatif !

Il existe un exemple encore plus court.

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

Caractéristiques du langage mql5, subtilités et astuces

fxsaber, 2018.02.15 11:48

OrderCloseBy(OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0), OrderSend(_Symbol, OP_SELL, 1, Bid, 0, 0, 0));

Il est difficile d'y faire face dans MT5 si ce n'est dans le testeur.

Raison: