OnTradeTransaction - página 4

 
Andrey Dik:

Nunca he manejado un evento OnTradeTransaction () antes, no había necesidad de hacerlo ya que la lógica de negociación no necesitaba tener en cuenta lo que desencadenó SL o TP. ¿Está sugiriendo que esto es una prueba de mi experiencia comercial?))

Estoy leyendo con mucha atención, pero no veo que nadie dé una respuesta sensata en forma de código de trabajo. ¿O se trata de un puto gran secreto y una gran hechicería: el conocimiento secreto y la capacidad de determinar lo que funciona?

No escribo EAs para ordenar, especialmente para FOREX.

Ahora tienes todos los conocimientos necesarios para escribir un código sensato,

que satisfaga sus necesidades.

 
prostotrader:

No escribo EAs para ordenar, especialmente para FOREX.

Ahora tienes todo el conocimiento que necesitas para escribir un código sensato,

que satisfaga sus necesidades.

¿Y quién le pidió que escribiera por encargo?

¿Hacer una pregunta en este foro significa hoy en día escribir para pedir?

Váyanse todos al infierno. Son vendedores.

 
Andrey Dik:

...

Y si se mira el historial de la cuenta para ver el comentario de la última operación, ¿estaría bien?

Algo así:

//+------------------------------------------------------------------+
//| Возвращает причину закрытия позиции по Take Profit               |
//+------------------------------------------------------------------+
bool CAccountHistory::IsClosedByTakeProfit(const string symbol)
  {
//--- Получим комментарий последней сделки на указанном символе
   string last_comment=LastDealComment(symbol);
//--- Если в комментарии есть строка "tp"
   if(StringFind(last_comment,"tp",0)>-1)
      return(true);
//--- Если нет строки "tp"
   return(false);
  }
//+------------------------------------------------------------------+
//| Возвращает причину закрытия позиции по Stop Loss                 |
//+------------------------------------------------------------------+
bool CAccountHistory::IsClosedByStopLoss(const string symbol)
  {
//--- Получим комментарий последней сделки на указанном символе
   string last_comment=LastDealComment(symbol);
//--- Если в комментарии есть строка "sl"
   if(StringFind(last_comment,"sl",0)>-1)
      return(true);
//--- Если нет строки "sl"
   return(false);
  }
//+------------------------------------------------------------------+
//| Возвращает комментарий последней сделки на указанном символе     |
//+------------------------------------------------------------------+
string CAccountHistory::LastDealComment(const string symbol)
  {
   int    total_deals  =0;  // Всего сделок в списке выбранной истории
   string deal_symbol  =""; // Символ сделки
   string deal_comment =""; // Комментарий сделки
//--- Если история сделок получена
   if(HistorySelect(0,TimeCurrent()))
     {
      //--- Получим количество сделок в полученном списке
      total_deals=HistoryDealsTotal();
      //--- Пройдемся по всем сделкам в полученном списке от последней сделки к первой
      for(int i=total_deals-1; i>=0; i--)
        {
         //--- Получим комментарий сделки
         deal_comment=HistoryDealGetString(HistoryDealGetTicket(i),DEAL_COMMENT);
         //--- Получим символ сделки
         deal_symbol=HistoryDealGetString(HistoryDealGetTicket(i),DEAL_SYMBOL);
         //--- Если символ сделки и текущий символ равны, остановим цикл
         if(deal_symbol==symbol)
            break;
        }
     }
//---
   return(deal_comment);
  }
 
Anatoli Kazharski:

Y si se mira el historial de la cuenta para ver el comentario de la última transacción, ¿estaría bien?

Algo así:

¡Gracias, amigo!

Probablemente sea la forma más fiable, dado que el SL y el TP pueden deslizarse y comparar los precios sería inútil.

 
Anatoli Kazharski:

Y si se mira el historial de la cuenta para ver el comentario de la última transacción, ¿estaría bien?

Algo así:


¿Y si no hay comentarios (lo que es totalmente posible)?

 
Andrey Dik:

Esta es probablemente la forma más fiable, dado que el SL y el TP pueden deslizarse y una comparación de precios sería inútil.

No, este método es malo
   static int GetOrderType(const ulong OrderTicket)
     {
      int OrderType=(int)::HistoryOrderGetInteger(OrderTicket,ORDER_TYPE);

      if((OrderType==ORDER_TYPE_BUY) || (OrderType==ORDER_TYPE_SELL))
        {
         const string OrderComment=HistoryOrderGetString(OrderTicket,ORDER_COMMENT);
         const string OrderPrice=::DoubleToString(::HistoryOrderGetDouble(OrderTicket,ORDER_PRICE_OPEN),
                                                  (int)::SymbolInfoInteger(HistoryOrderGetString(OrderTicket,ORDER_SYMBOL),SYMBOL_DIGITS));

         if(OrderComment=="tp "+OrderPrice)
            OrderType=ORDER_TYPE_TAKEPROFIT;
         else if(OrderComment=="sl "+OrderPrice)
            OrderType=ORDER_TYPE_STOPLOSS;
        }

      return(OrderType);
     }
 
prostotrader:

¿Y si no hay comentarios (lo cual es totalmente posible)?

Es muy posible, por supuesto. Yo uso este para analizar en el historial en el probador, como el más fácil y rápido.

En este caso, tengo que hacer y analizar entradas con órdenes pendientes. No tengo un ejemplo a mano.

 
Un viejo problema

cerrar una posición .


Esto no es una acusación indiscriminada, sino el resultado de horas tratando de averiguar (no ayuda HistorySelectByPosition y otras cosas) cómo funciona todo. Y no tengo inconveniente en disculparme si me equivoco. Para no ser infundado, estoy mostrando un Asesor Experto para un probador (es más fácil de entender) en el servidor RoboForexEU-MetaTrader 5, que abre una posición, y luego pone los niveles SL y TP.

void OnTick()
{
  static bool Flag = true;

  if (Flag)
  {
    // Открываем SELL-позицию
    MqlTradeRequest Request = {0};

    Request.action = TRADE_ACTION_DEAL;

    Request.symbol = Symbol();
    Request.volume = 1;
    Request.price = SymbolInfoDouble(Symbol(), SYMBOL_BID);

    Request.type = ORDER_TYPE_SELL;

    MqlTradeResult Result;

    if (OrderSend(Request, Result))
    {
      // Устанавливаем SL и TP
      Request.position = Result.deal;

      Request.action = TRADE_ACTION_SLTP;

      Request.tp = Result.ask - 10 * _Point;
      Request.sl = Result.ask + 10 * _Point;

      if (OrderSend(Request, Result))
        Print("Сделка в тестере закроется либо по SL, TP, либо по окончании бэктеста")    ;

      Flag = false;
    }
  }
}

En este EA, no se puede definir el SL y el TP de una sola posición cerrada (en OnDeinit). ¿Se supone que debe hacer eso?

¿Quién puede resolver - definir SL y TP de una posición cerrada?
 
Anatoli Kazharski:

Es muy posible, por supuesto. Yo uso este para analizar el historial en el probador, como el más fácil y rápido.

Y así con las órdenes pendientes hay que hacer y analizar las entradas. No tengo un ejemplo a mano.

¿Qué es lo que no le ha gustado de este método?

case TRADE_TRANSACTION_DEAL_ADD:
  if (trans.order != my_order_ticket)
  {
   //Сработал SL или TP
  }
break;
 
prostotrader:

¿Qué tiene de malo este método?

case TRADE_TRANSACTION_DEAL_ADD:
  if (trans.order != my_order_ticket)
  {
   //Сработал SL или TP
  }
break;
Sí, es más o menos así. Sólo que aún no lo he probado así.