FUERTES: Para ayudar a los principiantes - página 5

 
Mikhail Filimonov:

Funciones útiles y de uso frecuente:

Se ha rediseñado la función GetPositionPrice():

Esta función muestra un resultado erróneo, o mejor dicho, equivocado. Lo he investigado y he descubierto que el ID de la posición no cambia en el giro en U (es decir, durante una operación de entrada/salida), como se describe en la documentación:

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

Una anulación de posición cambia su ID a la entrada de la orden que dio lugar a la anulación.

Su GetPositionPrice puede amontonar 2 o más posiciones de dirección opuesta si hay una inversión, y calcula un precio medio para ellas. Este precio medio de una posición no tiene ninguna utilidad práctica.

Entonces, ¿cambia el ID de posición en la inversión o no?

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
el número de posición no cambia al girar
 
¿Cómo se puede saber qué volumen cerró una posición anterior y cuál abrió una nueva de una operación de entrada/salida?
 
igorbel:
¿Cómo se puede saber en una operación de entrada/salida qué volumen cerró una posición anterior y cuál abrió una nueva?
Puedes compararlo con el actual abierto. Pero es mejor examinar el historial de la posición por su id, que no cambia cuando se le da la vuelta... Volúmenes de compra/venta para ayudar.
 
Dennis Kirichenko:
Se puede comparar con la posición abierta actual. Pero es mejor examinar la historia de la posición por su id, que no cambia cuando se invierte la posición... Volúmenes de compra/venta para ayudar.

Desde hace poco, la identificación de la posición cambia cuando se da la vuelta. La documentación al respecto ya ha sido actualizada....

IDENTIFICADOR_DE_POSICIÓN

El ID de posición es un número único, que se asigna a cada posición recién abierta y no cambia a lo largo de su vida. Corresponde al ticket de la orden con la que se abrió la posición.

El identificador de la posición se especifica en cada orden (ORDER_POSITION_ID) y en cada operación (DEAL_POSITION_ID) que la haya abierto, modificado o cerrado. Utilice esta propiedad para buscar órdenes y operaciones relacionadas con la posición.

La anulación de una posición cambia su identificador a la entrada de la orden que dio lugar a la anulación.

largo

 
Dennis Kirichenko:
Podrías compararlo con el actual abierto. Pero es mejor examinar la historia de la posición por la identificación, que no cambia durante una inversión... Volúmenes de compra/venta para ayudar.

Esto no es una opción en absoluto. La posición anterior también podría estar abierta debido a una inversión, etc. Podría ser una opción, pero claramente no es la óptima.

 
Andrey Barinov:

Desde hace poco, la identificación de la posición cambia cuando te das la vuelta. La documentación al respecto ya ha sido actualizada....

IDENTIFICADOR_DE_POSICIÓN

El ID de posición es un número único, que se asigna a cada posición recién abierta y no cambia a lo largo de su vida. Corresponde al ticket de la orden con la que se abrió la posición.

El identificador de la posición se especifica en cada orden (ORDER_POSITION_ID) y en cada operación (DEAL_POSITION_ID) que la haya abierto, modificado o cerrado. Utilice esta propiedad para buscar órdenes y operaciones asociadas a la posición.

La anulación de una posición cambia su identificador a la entrada de la orden que dio lugar a la anulación.

largo

Está escrito así, pero en realidad nada cambia.

Si quieres, mi código:

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

Donde deal2_ticket es el ticket de la transacción de entrada/salida, deal1_ticket es el ticket anterior a la transacción de entrada/salida, deal3_ticket es el ticket posterior a la transacción de entrada/salida. En los tres casos obtengo el mismo ID de posición.

 
igorbel:

Lo dice, pero en realidad nada cambia.

Si quieres, mi código:

Donde deal2_ticket es el ticket de la transacción de entrada/salida, deal1_ticket es el ticket anterior a la transacción de entrada/salida, deal3_ticket es el ticket posterior a la transacción de entrada/salida. En los tres casos obtengo el mismo ID de posición.

El mío está cambiando. Pruebe con la versión más reciente, la 1340.
 
igorbel:
¿Y cómo podemos determinar en una operación de entrada/salida qué volumen cerró la posición anterior y cuál abrió la nueva?

Este Asesor Experto se ejecuta en el modo "Depuración en el historial" en una cuenta de red. El ejemplo es un poco tosco, porque se calcula que sólo hay una operación de tipo "IN/OUT" en el historial de operaciones.

//+------------------------------------------------------------------+
//|                                                         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()
  {
//---

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

Al principio, después de todas las operaciones ejecutadas y el cierre completo de una posición, se muestran las descripciones de todas las operaciones(DEAL_POSITION_ID, DEAL_VOLUME, DEAL_ENTRY,DEAL_TYPE), en ese DEAL_POSITION_ID para una operación de tipo IN/OUT se memoriza.

A continuación, recorre de nuevo el historial y suma todas las entradas de las operaciones con DEAL_POSITION_ID.

Esto es aproximadamente lo que obtenemos:

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
Archivos adjuntos:
Test.mq5  5 kb
 
Andrey Barinov:
Está cambiando para mí. Prueba con la última versión 1340.
Eso es lo que he intentado. ¿En qué mercado se cambia?