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:
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?
Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
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.
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.
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.
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.
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.0400: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.0400:07:10DEAL_POSITION_ID0, DEAL_VOLUME0.00, DEAL_ENTRYDEAL_ENTRY_IN, DEAL_TYPEDEAL_TYPE_BALANCE10:58:30.784 Test (EURUSD,H1) 2016.01.0400:07:10DEAL_POSITION_ID2, DEAL_VOLUME0.02, DEAL_ENTRYDEAL_ENTRY_IN, DEAL_TYPEDEAL_TYPE_BUY10:58:32.074 Test (EURUSD,H1) 2016.01.0400:07:10DEAL_POSITION_ID2, DEAL_VOLUME0.01, DEAL_ENTRYDEAL_ENTRY_IN, DEAL_TYPEDEAL_TYPE_BUY10:58:33.826 Test (EURUSD,H1) 2016.01.0400:07:10DEAL_POSITION_ID2, DEAL_VOLUME0.07, DEAL_ENTRYDEAL_ENTRY_INOUT, DEAL_TYPEDEAL_TYPE_SELL10:58:37.237 Test (EURUSD,H1) 2016.01.0400:07:10DEAL_POSITION_ID4, DEAL_VOLUME0.04, DEAL_ENTRYDEAL_ENTRY_OUT, DEAL_TYPEDEAL_TYPE_BUY10:59:07.397 Test (EURUSD,H1) 2016.01.0400:07:19DEAL_POSITION_ID2: volume in 0.03, volume out 0.07
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?
¿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?
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
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.
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:
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.
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.
¿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.
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:
Está cambiando para mí. Prueba con la última versión 1340.