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

 

Hmm, situation étrange, comme l'activité dans le sujet que j'ai soulevé, j'avais une question, de mon point de vue spécifique, mais au lieu d'une réponse jusqu'à présent j'ai obtenu "pourquoi en avez-vous besoin ?

Je veux le faire avec SB CTrade, voici un exemple (compilé à partir de 2 de mes exemples) : Nous ouvrons chaquenouvelle barre à 9 TF par un ordre, nous mémorisons le ticket et déterminons la direction d'un ordre fermé par le numéro du ticket.

Dans MQL4, le code pour le testeur ressemblerait à ceci

//+------------------------------------------------------------------+
//|                                                        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
input int TP = 100;
input int SL = 100;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CNewbar
  {
private:
   datetime          mnewtime;
   ENUM_TIMEFRAMES   mperiod;
public:
                     CNewbar()                        { mperiod=PERIOD_CURRENT;  mnewtime=TimeCurrent(); }
                     CNewbar(ENUM_TIMEFRAMES period)  { mperiod=period;          mnewtime=TimeCurrent(); }
   bool              NewBar(){ datetime t=iTime(NULL,mperiod,0); if(mnewtime<t){ mnewtime=t; return(true); } return(false);  }
  };

ENUM_TIMEFRAMES  TF[9]={PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1,PERIOD_W1,PERIOD_MN1};
CNewbar *BAR[9];
int ticket[9];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   for(int i=0;i<9;i++) BAR[i]=new CNewbar(TF[i]);
   ArrayInitialize(ticket,-1);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   for(int i=0;i<9;i++) delete BAR[i];
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   for(int i=0;i<9;i++)
      if(BAR[i].NewBar())
        {
         if(ticket[i]<0) ticket[i]=OrderSend(_Symbol,OP_BUY,0.1,Ask,30,Ask-SL*_Point,Ask+TP*_Point);
         if(OrderSelect(ticket[i],SELECT_BY_TICKET) && OrderCloseTime()>0)
           {
            int cmd=1-OrderType();
            double open=cmd ? Bid : Ask;
            double tp = open - (cmd ? 1 : -1) * TP * _Point;
            double sl = open + (cmd ? 1 : -1) * SL * _Point;
            ticket[i]=OrderSend(_Symbol,cmd,0.1,open,30,sl,tp);
           }
        }
  }

nous avons besoin d'un code pour le testeur, c'est-à-dire le nombre minimum de contrôles et le travail le plus rapide possible dans l'optimiseur.

comment écrire ce code en MQL5 avec SB CTrade ?

 
Igor Makanu:

Hmm, situation étrange, comme l'activité dans le sujet que j'ai soulevé, j'avais une question, de mon point de vue spécifique, mais au lieu d'une réponse jusqu'à présent j'ai obtenu "pourquoi en avez-vous besoin ?

Je veux le faire avec SB CTrade, voici un exemple (compilé à partir de 2 de mes exemples) : Nous ouvrons chaque nouvelle barre à 9 TF par un ordre, nous mémorisons le ticket et déterminons la direction d'un ordre fermé par le numéro du ticket.

Dans MQL4, le code pour le testeur ressemblerait à ceci

comment écrire ce code dans MQL5 en utilisant SB CTrade ?

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

FAQ des débutants MQL5 MT5 MetaTrader 5

Vladimir Karputov, 2019.07.21 12:56

Ainsi, la base est lePOSITION_IDENTIFIER, mais pas le ticket de position. C'est important juste à 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 BUY, puis elle a été fermée, ce qui signifie que nous ouvrons immédiatement une position SELL.


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


 
Vladimir Karputov:

c'est-à-dire que CTrade ne sait pas comment détecter de manière indépendante si un ordre est ouvert ou fermé, quel était le type du dernier ordre fermé ?

quelle bibliothèque dois-je utiliser à cette fin ?

 
Igor Makanu:

c'est-à-dire que CTrade ne sait pas comment détecter indépendamment si un ordre est ouvert ou fermé, quel était le type du dernier ordre fermé ?

Quelle bibliothèque devons-nous utiliser à cette fin ?

Je vous l'ai déjà dit cent fois, alors s'il vous plaît, retirez le mot "ordre" de votre vocabulaire. Tant que vous n'aurez pas fait ça, vous ne pourrez pas passer à autre chose. De toute façon, je ne pourrai probablement pas vous aider. C'est dommage.

 
Vladimir Karputov:

Eh bien, je vous l'ai dit des centaines de fois - enlevez le mot "mandat" de votre vocabulaire. Tant que tu n'auras pas fait ça, tu ne pourras pas avancer. Bref, je ne peux probablement pas vous aider. C'est dommage.

Eh bien, dites-moi ce que vous entendez par là :

GN      0       16:24:14.030    Core 1  2018.06.06 08:00:00   Sell market. Ticket = 20
JF      0       16:24:14.030    Core 1  2018.06.06 08:00:00   Sell market. Identifier = 0
FQ      0       16:24:14.030    Core 1  2018.06.19 16:00:00   ======closePosition======
HG      0       16:24:14.030    Core 1  2018.06.19 16:00:00   market buy 0.10 AUDUSD, close #20 (0.73633 / 0.73637 / 0.73633)
PH      0       16:24:14.030    Core 1  2018.06.19 16:00:00   deal #21  buy 0.10 AUDUSD at 0.73637 done (based on order #21)
 KJ      0       16:24:14.030    Core 1  2018.06.19 16:00:00   deal performed [#21  buy 0.10 AUDUSD at 0.73637]
IL      0       16:24:14.030    Core 1  2018.06.19 16:00:00   order performed buy 0.10 at 0.73637 [#21  buy 0.10 AUDUSD at 0.73637]
RN      0       16:24:14.030    Core 1  2018.06.19 16:00:00   CTrade::OrderSend: market buy 0.10 position #20  AUDUSD [done at 0.73637]
HN      0       16:24:14.030    Core 1  2018.06.19 16:00:00   Позиция с магиком 2544113114312914, тикетом 20 и лотом 0.1 успешно закрыта.
LO      0       16:24:14.030    Core 1  2018.06.19 16:00:00   Очистка данных произведена.
CH      0       16:24:14.030    Core 1  2018.06.19 16:00:00   ======checkMargin======
OF      0       16:24:14.030    Core 1  2018.06.19 16:00:00   market buy 0.10 AUDUSD (0.73633 / 0.73637 / 0.73633)
DS      0       16:24:14.030    Core 1  2018.06.19 16:00:00   deal #22  buy 0.10 AUDUSD at 0.73637 done (based on order #22)
 RM      0       16:24:14.030    Core 1  2018.06.19 16:00:00   deal performed [#22  buy 0.10 AUDUSD at 0.73637]
DS      0       16:24:14.030    Core 1  2018.06.19 16:00:00   order performed buy 0.10 at 0.73637 [#22  buy 0.10 AUDUSD at 0.73637]
FF      0       16:24:14.030    Core 1  2018.06.19 16:00:00   CTrade::OrderSend: market buy 0.10 AUDUSD [done at 0.73637]
MJ      0       16:24:14.030    Core 1  2018.06.19 16:00:00   magic = 2544113114312914
RR      0       16:24:14.030    Core 1  2018.06.19 16:00:00   balance = 11308.94
JK      0       16:24:14.030    Core 1  2018.06.19 16:00:00   lot = 0.10
HQ      0       16:24:14.030    Core 1  2018.06.19 16:00:00   Buy market. Ticket = 22
CJ      0       16:24:14.030    Core 1  2018.06.19 16:00:00   Buy market. Identifier = 20
HR      0       16:24:14.030    Core 1  2018.07.04 08:00:00   ======closePosition======
FI      0       16:24:14.030    Core 1  2018.07.04 08:00:00   market sell 0.10 AUDUSD, close #22 (0.74021 / 0.74025 / 0.74021)
RF      0       16:24:14.030    Core 1  2018.07.04 08:00:00   deal #23  sell 0.10 AUDUSD at 0.74021 done (based on order #23)
 ID      0       16:24:14.030    Core 1  2018.07.04 08:00:00   deal performed [#23  sell 0.10 AUDUSD at 0.74021]
GM      0       16:24:14.030    Core 1  2018.07.04 08:00:00   order performed sell 0.10 at 0.74021 [#23  sell 0.10 AUDUSD at 0.74021]
NQ      0       16:24:14.030    Core 1  2018.07.04 08:00:00   CTrade::OrderSend: market sell 0.10 position #22  AUDUSD [done at 0.74021]
PO      0       16:24:14.030    Core 1  2018.07.04 08:00:00   Позиция с магиком 2544113114312914, тикетом 22 и лотом 0.1 успешно закрыта.
FO      0       16:24:14.030    Core 1  2018.07.04 08:00:00   Очистка данных произведена.
CH      0       16:24:14.030    Core 1  2018.07.04 08:00:00   ======checkMargin======
OI      0       16:24:14.030    Core 1  2018.07.04 08:00:00   market sell 0.10 AUDUSD (0.74021 / 0.74025 / 0.74021)
JO      0       16:24:14.030    Core 1  2018.07.04 08:00:00   deal #24  sell 0.10 AUDUSD at 0.74021 done (based on order #24)
 LM      0       16:24:14.030    Core 1  2018.07.04 08:00:00   deal performed [#24  sell 0.10 AUDUSD at 0.74021]
ND      0       16:24:14.030    Core 1  2018.07.04 08:00:00   order performed sell 0.10 at 0.74021 [#24  sell 0.10 AUDUSD at 0.74021]
LI      0       16:24:14.030    Core 1  2018.07.04 08:00:00   CTrade::OrderSend: market sell 0.10 AUDUSD [done at 0.74021]
OJ      0       16:24:14.030    Core 1  2018.07.04 08:00:00   magic = 2544113114312914
RR      0       16:24:14.030    Core 1  2018.07.04 08:00:00   balance = 11335.85
DK      0       16:24:14.030    Core 1  2018.07.04 08:00:00   lot = 0.10
PN      0       16:24:14.030    Core 1  2018.07.04 08:00:00   Sell market. Ticket = 24
QE      0       16:24:14.030    Core 1  2018.07.04 08:00:00   Sell market. Identifier = 22
NR      0       16:24:14.030    Core 1  2018.07.19 00:00:00   ======closePosition======
NF      0       16:24:14.030    Core 1  2018.07.19 00:00:00   market buy 0.10 AUDUSD, close #24 (0.73968 / 0.73989 / 0.73968)
JI      0       16:24:14.030    Core 1  2018.07.19 00:00:00   deal #25  buy 0.10 AUDUSD at 0.73989 done (based on order #25)
 QK      0       16:24:14.030    Core 1  2018.07.19 00:00:00   deal performed [#25  buy 0.10 AUDUSD at 0.73989]
MM      0       16:24:14.030    Core 1  2018.07.19 00:00:00   order performed buy 0.10 at 0.73989 [#25  buy 0.10 AUDUSD at 0.73989]
PN      0       16:24:14.030    Core 1  2018.07.19 00:00:00   CTrade::OrderSend: market buy 0.10 position #24  AUDUSD [done at 0.73989]
DO      0       16:24:14.030    Core 1  2018.07.19 00:00:00   Позиция с магиком 2544113114312914, тикетом 24 и лотом 0.1 успешно закрыта.
LP      0       16:24:14.030    Core 1  2018.07.19 00:00:00   Очистка данных произведена.
KK      0       16:24:14.030    Core 1  2018.08.08 16:00:00   ======checkMargin======
RI      0       16:24:14.030    Core 1  2018.08.08 16:00:00   market sell 0.10 AUDUSD (0.73933 / 0.73937 / 0.73933)
GO      0       16:24:14.030    Core 1  2018.08.08 16:00:00   deal #26  sell 0.10 AUDUSD at 0.73933 done (based on order #26)
 OM      0       16:24:14.030    Core 1  2018.08.08 16:00:00   deal performed [#26  sell 0.10 AUDUSD at 0.73933]
JD      0       16:24:14.030    Core 1  2018.08.08 16:00:00   order performed sell 0.10 at 0.73933 [#26  sell 0.10 AUDUSD at 0.73933]
QI      0       16:24:14.030    Core 1  2018.08.08 16:00:00   CTrade::OrderSend: market sell 0.10 AUDUSD [done at 0.73933]
HN      0       16:24:14.030    Core 1  2018.08.08 16:00:00   Sell market. Ticket = 26
CF      0       16:24:14.030    Core 1  2018.08.08 16:00:00   Sell market. Identifier = 0
 
Vladimir Karputov:

Eh bien, je vous l'ai dit des centaines de fois - enlevez le mot "mandat" de votre vocabulaire. Tant que tu n'auras pas fait ça, tu ne pourras pas avancer. Bref, je ne peux probablement pas vous aider. C'est dommage.

OK ? Laissez-moi reformuler la question :

Comment utiliser un ticket mémorisé avec CTrade::ResultOrder()?

pour le découvrir :

1. si la position est fermée ?

2. quel type d'accord le poste fermé avait-il ?

3. nous devons gérer simultanément 9 positions, commandes ou tickets, ou ... OnAnyTerminology sur un compte de couverture


dans cette formulation, ma question est-elle sans ambiguïté ? (exemple reproductible sous MQl4 posté ci-dessus)

ZS : Je ne peux pas oublier l'ordre des mots, malheureusement ce mot est utilisé dans l'aide avec d'autres termes: https://www.mql5.com/ru/docs/standardlibrary/tradeclasses/ctrade/ctraderequestorder.

 
Igor Makanu:

Hm, c'est une situation étrange, il me semble que j'ai soulevé le sujet, ma question était spécifique de mon point de vue, mais au lieu d'une réponse, j'ai eu droit à "pourquoi en avez-vous besoin ?".

La raison en est l'incompétence des intervenants. Il m'a fallu cinq minutes pour l'écrire et une tentative pour le vérifier.


MT4

Forum sur le trading, les systèmes de trading automatisés et le testeur de stratégie

Questions des débutants MQL5 MT5 MetaTrader 5

fxsaber, 2019.07.21 12:54

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


MT5

#include <Trade\Trade.mqh>

#define  Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnTick()
{
  static CTrade Trade; // Не стал возиться с Deviation.
  static ulong ticket1 = 0;
 
  if (!ticket1)
    ticket1 = Trade.PositionOpen(_Symbol, ORDER_TYPE_BUY, 0.1, Ask, Ask - 100 * _Point, Ask + 100 * _Point) ? Trade.ResultOrder() : 0;
  else if (!PositionSelectByTicket(ticket1) && HistorySelectByPosition(ticket1))
  {
    ENUM_ORDER_TYPE cmd = (ENUM_ORDER_TYPE)HistoryOrderGetInteger(HistoryOrderGetTicket(HistoryOrdersTotal() - 1), ORDER_TYPE);
    double open = cmd ? Bid : Ask;
    double tp = open - (cmd ? 1 : -1) * 100 * _Point;
    double sl = open + (cmd ? 1 : -1) * 100 * _Point;
    ticket1 = Trade.PositionOpen(_Symbol, cmd, 0.1, open, sl, tp) ? Trade.ResultOrder() : 0;
  }
}


Il n'est pas nécessaire d'être un expert pour écrire cela, il suffit de connaître les bases de MT5.


ZS Sur les filets, il y a une petite nuance pour déterminer le type de position fermée. Mais cela ne joue pas de rôle ici.

 
fxsaber:

Vous n'avez pas besoin d'être fort pour écrire ceci, vous devez juste connaître les bases de MT5.

Merci !

Oui, je cherchais une solution si je ne pouvais pas l'écrire en cinq lignes avec SB

Mais j'ai bien compris qu'un seul SB CTrade ne pourra pas résoudre mon problème et que je dois aussi utiliser CPositionInfo ? - Si je veux accompagner 9 postes par plusieurs TF en même temps ?

ZS : Je suis assis dans l'aide MQL5 avec smart TV - assez bien décrit les fonctions commerciales, l'utilisation de SatB est sous une question .... je pense qu'il est logique d'utiliser SB pour les stratégies primitives, un peu plus compliquées - la fonctionnalité est insuffisante ou l'utilisation pas évidente, peut-être que j'ai besoin de plus de pratique - je vais essayer de "tordre" le SB


Merci encore !

 
fxsaber:

La raison est l'incompétence si répondue. Il m'a fallu cinq minutes pour écrire et une tentative pour vérifier.


MT4


MT5


Il n'est pas nécessaire d'être un expert pour écrire cela, il suffit de connaître les bases de MT5.


Vous n'avez pas besoin de connaître les bases, il vous suffit de connaître les bases de MT5. Mais ça n'a pas d'importance ici.

C'est là que

ENUM_ORDER_TYPE cmd = (ENUM_ORDER_TYPE)HistoryOrderGetInteger(HistoryOrderGetTicket(HistoryOrdersTotal() - 1), ORDER_TYPE);

il existe un piège potentiel.

Dans la liste historique, les mandats ne sont pas classés dans l'ordre dans lequel ils apparaissent dans cette liste. Je suis tombé dessus en développant la bibliothèque. Je m'y suis fié. Mais il s'est avéré que ce n'était pas si simple. Essayez de définir des ordres limite et stop à tour de rôle dans l'ordre suivant : limite -> stop -> limite -> stop -> limite -> stop et supprimez chacun d'entre eux dans n'importe quel ordre et voyez quel est le dernier ordre enregistré dans la liste historique. Vous serez surpris.

 
Artyom Trishkin:

C'est là que

il y a une erreur potentielle.

Dans la liste de l'historique, les commandes ne sont pas classées dans l'ordre dans lequel elles apparaissent dans la liste. J'ai rencontré ce problème lors du développement de la bibliothèque. Je m'y suis fié. Mais il s'est avéré que ce n'était pas si simple. Essayez de définir des ordres limite et stop à tour de rôle dans l'ordre suivant : limite -> stop -> limite -> stop -> limite -> stop et supprimez chacun d'entre eux dans n'importe quel ordre et voyez quel est le dernier ordre enregistré dans la liste historique. Vous serez surpris.

Il n'y a pas d'erreur ici, car la liste est générée par HistorySelectByPosition.