es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Metatrader 5: ¿Cómo obtener el nivel de toma de ganancias de una posición cerrada?

En el lenguaje MQL5, para obtener el TP actual de una posición abierta (modo de cobertura), utilizo:

if (PositionSelectByTicket(positionId)) {
   return PositionGetDouble(POSITION_TP);
}

Una vez que la posición se cierra, busco la operación ENTRY_IN correspondiente y consulto la orden correspondiente para obtener el TP:

if (HistorySelectByPosition(positionId)) {
   for (int i = HistoryDealsTotal()-1; i >= 0; i--) {
      ulong dealId = HistoryDealGetTicket(i);
      if (HistoryDealGetInteger(dealId, DEAL_POSITION_ID) != positionId) continue;
      if ((ENUM_DEAL_ENTRY)HistoryDealGetInteger(dealId, DEAL_ENTRY) != DEAL_ENTRY_IN) continue;
      ulong orderId = HistoryDealGetInteger(dealId, DEAL_ORDER);
      if (HistoryOrderSelect(orderId)) {
         return HistoryOrderGetDouble(orderId, ORDER_TP);
      }
   }
}

Sin embargo, esto solo funciona si el TP se estableció directamente al abrir la posición. Si el TP se estableció más tarde, esto no funciona. Examiné todas las operaciones y órdenes correspondientes a la posiciónId, pero no pude encontrar el TP en ninguna parte.

¿Cuál es un método robusto para obtener el TP de una posición cerrada?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Un método robusto para obtener el TP de una posición cerrada es utilizar la función HistoryOrdersGetResult(). Esta función devuelve una matriz de órdenes cerradas con información detallada, incluyendo el valor del TP. Esto se puede filtrar por POSITION_ID para obtener todas las órdenes relacionadas con una posición específica. Luego, el valor del TP se puede obtener desde la orden correspondiente. Aquí hay un ejemplo de fragmento de código:

    MqlTradeRequest request;
    MqlTradeResult result;
    request.action = TRADE_ACTION_HISTORY_ORDERS_GET;
    request.historyOrdersTotal = WHOLE_ARRAY;
    request.historyOrderSelect = True;
    request.position_by = POSITION_BY_POS;
    request.position_id = positionId;
    if (OrderSend(request, result)) {
       for (int i=0; i < result.historyTotal; i++) {
          double tp = HistoryOrderGetDouble(result.order[i].order, ORDER_TP);
          // hacer algo con el valor del tp
       }
    }
    

    Ten en cuenta que este método puede no funcionar para órdenes muy antiguas o eliminadas, ya que es posible que no estén incluidas en la base de datos de historial.

Comments are closed.