Obtención del "precio medio ponderado" de una posición abierta con varias transacciones - página 2

 
josemiguel1812:

Me surge la duda siguiente:

Mi algoritmo de colocación de TP pide precio BID (posición BUY) con la estructura MqlTick

y luego suma los puntos de beneficio buscados. Y esto está bien si la posición tiene una sola transacción.

Pero si tiene dos o más transacciones, ese algoritmo me estaría estableciendo TP con respecto al precio de la última transacción. Entiendo que para establecer un TP correcto a partir de la segunda transacción debo obtener el precio con...

que da precio medio ponderado BID y a ese valor sumar los puntos TP (BUY). Si estoy en SELL, al valor obtenido con POSITION_PRICE_OPEN deberé sumarle el spread para obtener ASK, y a continuación sumar restar puntos TP.

¿Es correcto mi razonamiento? 

Realmente no puedo contestar porque depende de los resultados que desea. Lo mejor sería tomar un ejemplo numérico.
 
angevoyageur:
Realmente no puedo contestar porque depende de los resultados que desea. Lo mejor sería tomar un ejemplo numérico.

En el ejemplo del post de 2013.12.12 18:37 quedamos de acuerdo en que POSITION_OPEN_PRICE devuelve 1.37400.

La transacción 1ª se efectua en 1.37800 y la 2ª en 1.37200.

Si estamos en "compra-BUY" y aplicamos el algoritmo de cálculo de TP habitual (por ejemplo 200 puntos), el precio TP sería...

  • tras 1ª transac TP= 1.37800200+0.00200= 1.38000   <Typos corregido por un moderador>
  • tras 2ª transac TP= 1.37200+0.00200= 1.37400

Al alcanzar el precio 1.37400 se cierra la posición, pero obtendríamos beneficio cero porque el precio de la posición (el que devuelve POSITION_OPEN_PRICE) es 1.37400, cuando en realidad esperamos 200 puntos de beneficio.

Por eso creo que lo correcto es el algoritmo que ayer le describía, donde el precio TP se obtiene siempre a partir de...

PositionGetDouble(POSITION_PRICE_OPEN);

sea cual sea el número de transacciones (trades) de la posición. No creo haberlo visto implementado en ningún artículo, no por dificultad sino por la inercia de mql4.

Con StopLoss y TraillingStop ocurre igual a mi parecer.

 

Alex, acabo de ver un error de ejecución que me produce PositionGetDouble(POSITION_PRICE_OPEN).

En optimización y en depuración (en real no se) esta función devuelve el precio medio de las transacciones anteriores a la recién abierta, pero no incluye la actual. Es decir, si teníamos ejecutadas dos transacciones (a 1.34000 y 1.36000) su precio medio es 1.35000, tras abrir una tercera a 1.36000 PositionGetDouble(POSITION_PRICE_OPEN) devuelve 1.35000 cuando el nuevo precio medio es 1.35500 (que si se refleja en el terminal). Sólo al abrir una cuarta transacción  PositionGetDouble(POSITION_PRICE_OPENnos da 1.35500.

Esto es importante, por ejemplo, al calcular TP, que es donde he descubierto el error, porque inmediatamente después de abrir transaccción modificaba la orden para definirle TP, pero el precio de referencia que daba  PositionGetDouble(POSITION_PRICE_OPEN) es erróneo al no incorporar el nuevo precio de apertura

 
josemiguel1812 :

Alex, acabo de ver un error de ejecución que me produce  PositionGetDouble ( POSITION_PRICE_OPEN ).

En optimización y en depuración (en real no se) esta función devuelve el precio medio de las transacciones anteriores a la recién abierta, pero no incluye la actual. Es decir, si teníamos ejecutadas dos transacciones (a 1.34000 y 1.36000) su precio medio es 1.35000, tras abrir una tercera a 1.36000  PositionGetDouble ( POSITION_PRICE_OPEN ) devuelve 1.35000 cuando el nuevo precio medio es 1.35500 (que si se refleja en el terminal). Sólo al abrir una cuarta transacción   PositionGetDouble ( POSITION_PRICE_OPEN nos da 1.35500.

Esto es importante, por ejemplo, al calcular TP, que es donde he descubierto el error, porque inmediatamente después de abrir transaccción modificaba la orden para definirle TP, pero el precio de referencia que daba   PositionGetDouble ( POSITION_PRICE_OPEN ) es erróneo al no incorporar el nuevo precio de apertura


¿Quién es Alex?

Si está seguro de que es un error, puedes reportarlo ServiceDesk por favor. Si usted necesita un segundo consejo, por favor enviar un código de ejemplo para reproducir el error y el procedimiento para capturar el error.
Razón de la queja: