FORTS : Pour aider les débutants - page 5

 
Mikhail Filimonov:

Fonctions utiles et fréquemment utilisées:

Redéfinition de la fonction GetPositionPrice() :

Cette fonction montre le mauvais résultat, ou plutôt le mauvais résultat. Je me suis penché sur la question et j'ai découvert que l'ID de la position ne change pas en cas de demi-tour (c'est-à-dire pendant une transaction d'entrée/sortie), comme décrit dans la documentation :

https://www.mql5.com/ru/docs/constants/tradingconstants/positionproperties

Une inversion de position change son ID pour le ticket d'ordre qui a entraîné l'inversion.

Votre GetPositionPrice peut empiler 2 positions opposées ou plus en cas de retournement, et calcule un prix moyen pour celles-ci. Un tel prix moyen d'une position n'est d'aucune utilité pratique.

Alors, l'ID de la position change-t-il en cas d'inversion ou non ?

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
le numéro de position ne change pas en tournant
 
Comment savoir quel volume a fermé une position précédente et quel volume en a ouvert une nouvelle à partir d'une transaction d'entrée/sortie ?
 
igorbel:
Comment pouvez-vous savoir, à partir d'une transaction d'entrée/sortie, quel volume a fermé une position précédente et lequel a ouvert une nouvelle position ?
Vous pouvez le comparer avec l'ouverture actuelle. Mais il est préférable d'examiner l'historique de la position par son id, qui ne change pas quand on la retourne... Volumes d'achat/vente pour aider.
 
Dennis Kirichenko:
Elle peut être comparée à la position ouverte actuelle. Mais il est préférable d'examiner l'histoire de la position par son id, qui ne change pas lorsque la position est inversée... Les volumes d'achat/vente pour aider.

Depuis peu, l'identification de la position change lorsque vous vous retournez. La documentation à ce sujet a déjà été mise à jour.....

IDENTIFICATEUR DE POSITION

L'ID 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.

L'inversion d'une position modifie son identifiant en le remplaçant par le ticket d'ordre qui a entraîné l'inversion.

long

 
Dennis Kirichenko:
Vous pourriez le comparer avec l'ouverture actuelle. Mais il est préférable d'examiner l'historique de la position par l'id, qui ne change pas lors d'un retournement... Les volumes d'achat/vente pour aider.

Ce n'est pas du tout une option. La position précédente peut également être ouverte en raison d'un retournement, etc. Cela pourrait être une option, mais clairement pas une option optimale.

 
Andrey Barinov:

Depuis peu, l'identification de la position change lorsque vous vous retournez. La documentation à ce sujet a déjà été mise à jour.....

IDENTIFICATEUR DE POSITION

L'ID 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 associés à la position.

L'inversion d'une position modifie son identifiant en le remplaçant par le ticket d'ordre qui a entraîné l'inversion.

long

C'est écrit comme ça, mais en réalité, rien ne change.

Mon code, si vous voulez :

long pos_id1,pos_id2,pos_id3;
   ulong deal1_ticket=xxx;
   ulong deal2_ticket=xxx;
   ulong deal3_ticket=xxx;
   if(!HistoryDealSelect(deal1_ticket))
      Print(__FUNCTION__+": deal 1 not selected. Error=",GetLastError());   
   pos_id1=HistoryDealGetInteger(deal1_ticket,DEAL_POSITION_ID);
   Print(__FUNCTION__+": ticket=",deal1_ticket,", position ID=",pos_id1);
   if(!HistoryDealSelect(deal2_ticket))
      Print(__FUNCTION__+": deal 2 not selected. Error=",GetLastError());
   pos_id2=HistoryDealGetInteger(deal2_ticket,DEAL_POSITION_ID);
   Print(__FUNCTION__+": ticket=",deal2_ticket,", position ID=",pos_id2);
   if(!HistoryDealSelect(deal3_ticket))
      Print(__FUNCTION__+": deal 3 not selected. Error=",GetLastError());
   pos_id3=HistoryDealGetInteger(deal3_ticket,DEAL_POSITION_ID);
   Print(__FUNCTION__+": ticket=",deal3_ticket,", position ID=",pos_id3);

Où deal2_ticket est le ticket de transaction d'entrée/sortie, deal1_ticket est le ticket précédant la transaction d'entrée/sortie, deal3_ticket est le ticket après la transaction d'entrée/sortie. Dans les trois cas, j'obtiens le même ID de position.

 
igorbel:

C'est ce qui est écrit, mais en réalité, rien ne change.

Si vous voulez, mon code :

Où deal2_ticket est le ticket de transaction d'entrée/sortie, deal1_ticket est le ticket précédant la transaction d'entrée/sortie, deal3_ticket est le ticket après la transaction d'entrée/sortie. Dans les trois cas, j'obtiens le même ID de position.

Le mien est en train de changer. Essayez la version la plus récente, la 1340.
 
igorbel:
Et comment déterminer, à partir d'une transaction d'entrée/sortie, quel volume a fermé la position précédente et quel volume a ouvert la nouvelle position ?

Cet Expert Advisor est exécuté en mode "Débogage sur historique" sur un compte de compensation. L'exemple est un peu grossier, car il est calculé qu'il n'y a qu'une seule transaction de type "IN/OUT" dans l'historique des transactions.

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#include <Trade\Trade.mqh>
CTrade my_trade;
long deal_positions_id_in_out=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   static int t=0;
   if(t==20)
     {
      my_trade.Buy(0.02);
     }
   if(t==25)
     {
      my_trade.Buy(0.01);
     }
   if(t==30)
     {
      my_trade.Sell(0.07);
     }
   if(t==40)
     {
      my_trade.PositionClose(Symbol());
     }
   if(t==50)
     {
      //--- request trade history 
      HistorySelect(0,TimeCurrent());
      long     deal_positions_id=0;
      double   deal_volume=0;
      long     deal_entry=0;
      long     deal_type=0;
      ulong    ticket=0;
      for(int i=0;i<HistoryDealsTotal();i++)
        {
         if((ticket=HistoryDealGetTicket(i))>0)
           {
            deal_positions_id=HistoryDealGetInteger(ticket,DEAL_POSITION_ID);
            deal_volume=HistoryDealGetDouble(ticket,DEAL_VOLUME);
            deal_entry=HistoryDealGetInteger(ticket,DEAL_ENTRY);
            deal_type=HistoryDealGetInteger(ticket,DEAL_TYPE);
            if(deal_entry==DEAL_ENTRY_INOUT)
               deal_positions_id_in_out=deal_positions_id;
            Print("DEAL_POSITION_ID ",deal_positions_id,
                  ", DEAL_VOLUME ",DoubleToString(deal_volume,2),
                  ", DEAL_ENTRY ",EnumToString((ENUM_DEAL_ENTRY)deal_entry),
                  ", DEAL_TYPE ",EnumToString((ENUM_DEAL_TYPE)deal_type));
           }
        }
     }
   if(t==55)
     {
      //--- request trade history 
      HistorySelect(0,TimeCurrent());
      long     deal_positions_id=0;
      double   deal_volume=0;
      long     deal_entry=0;
      long     deal_type=0;
      ulong    ticket=0;
      double   volume_in=0;
      double   volume_out=0;
      for(int i=0;i<HistoryDealsTotal();i++)
        {
         if((ticket=HistoryDealGetTicket(i))>0)
           {
            deal_positions_id=HistoryDealGetInteger(ticket,DEAL_POSITION_ID);
            deal_volume=HistoryDealGetDouble(ticket,DEAL_VOLUME);
            deal_entry=HistoryDealGetInteger(ticket,DEAL_ENTRY);
            deal_type=HistoryDealGetInteger(ticket,DEAL_TYPE);
            if(deal_positions_id==deal_positions_id_in_out && deal_entry==DEAL_ENTRY_IN)
               volume_in+=deal_volume;
            else if(deal_positions_id==deal_positions_id_in_out && deal_entry==DEAL_ENTRY_INOUT)
               volume_out=deal_volume;
           }
        }
      Print("DEAL_POSITION_ID ",deal_positions_id_in_out,
            ": volume in ",DoubleToString(volume_in,2),", volume out ",DoubleToString(volume_out,2));
     }
   t++;
  }
//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade()
  {
//---

  }
//+------------------------------------------------------------------+

Tout d'abord, après toutes les transactions exécutées et la fermeture complète d'une position, les descriptions de toutes les transactions sont obtenues(DEAL_POSITION_ID, DEAL_VOLUME, DEAL_ENTRY,DEAL_TYPE), à cela DEAL_POSITION_ID pour une transaction de type IN/OUT est mémorisé.

Ensuite, il parcourt à nouveau l'historique et additionne toutes les entrées pour les transactions avec DEAL_POSITION_ID.

Nous obtenons quelque chose comme ceci :

10:58:23.963    Test (EURUSD,H1)        2016.01.04 00:06:42   CTrade::OrderSend: instant buy 0.04 EURUSD at 1.08732 [done at 1.08732]
10:58:30.692    Test (EURUSD,H1)        2016.01.04 00:07:10   DEAL_POSITION_ID 0, DEAL_VOLUME 0.00, DEAL_ENTRY DEAL_ENTRY_IN, DEAL_TYPE DEAL_TYPE_BALANCE
10:58:30.784    Test (EURUSD,H1)        2016.01.04 00:07:10   DEAL_POSITION_ID 2, DEAL_VOLUME 0.02, DEAL_ENTRY DEAL_ENTRY_IN, DEAL_TYPE DEAL_TYPE_BUY
10:58:32.074    Test (EURUSD,H1)        2016.01.04 00:07:10   DEAL_POSITION_ID 2, DEAL_VOLUME 0.01, DEAL_ENTRY DEAL_ENTRY_IN, DEAL_TYPE DEAL_TYPE_BUY
10:58:33.826    Test (EURUSD,H1)        2016.01.04 00:07:10   DEAL_POSITION_ID 2, DEAL_VOLUME 0.07, DEAL_ENTRY DEAL_ENTRY_INOUT, DEAL_TYPE DEAL_TYPE_SELL
10:58:37.237    Test (EURUSD,H1)        2016.01.04 00:07:10   DEAL_POSITION_ID 4, DEAL_VOLUME 0.04, DEAL_ENTRY DEAL_ENTRY_OUT, DEAL_TYPE DEAL_TYPE_BUY
10:59:07.397    Test (EURUSD,H1)        2016.01.04 00:07:19   DEAL_POSITION_ID 2: volume in 0.03, volume out 0.07
Dossiers :
Test.mq5  5 kb
 
Andrey Barinov:
C'est en train de changer pour moi. Essayez-le sur la dernière version 1340.
C'est ce que j'ai essayé. Sur quel marché évoluez-vous ?
Raison: