Una operación de futuros se abre al último precio, no al de compra o venta. ¿Es esto normal? - página 2

 

Roman y Alexey Viktorov, gracias por su ayuda.

Después de abrir una operación decidí simplemente comprobar si las distancias reales y calculadas de TP y SL son iguales. Si no coinciden, intento restablecerlos en la función OnTrade(). Como resultado, las distancias entre el precio abierto real y el TP y el SL se vuelven correctas. Lo sorprendente es que este deslizamiento es la norma para este símbolo. El código se activa casi en cada apertura de la operación.

//+------------------------------------------------------------------+
//|                          OnTrade()                               |
//+------------------------------------------------------------------+
void OnTrade()
  {
   if(HistoryDealSelect(last_trade_ticket))
     {
      // сделка выделилась успешно
      ulong pos_id = HistoryDealGetInteger(last_trade_ticket, DEAL_POSITION_ID);
      // идентификатор позиции сохранён
      if(HistorySelectByPosition(pos_id) && HistoryDealsTotal() == 1)
        {
         // история позиции сформирована
         // позиция состоит из одной сделки
         if(PositionSelectByTicket(pos_id))
           {
            // позиция выделена
            string symbol = PositionGetString(POSITION_SYMBOL);
            double pos_op = PositionGetDouble(POSITION_PRICE_OPEN);
            double pos_tp = NormalizeDouble(PositionGetDouble(POSITION_TP), _Digits);
            double pos_sl = NormalizeDouble(PositionGetDouble(POSITION_SL), _Digits);
            long pos_type = PositionGetInteger(POSITION_TYPE);
            long pos_mag = PositionGetInteger(POSITION_MAGIC);
            // параметры позиции получены
            int tp = int(GlobalVariableGet(global_tp));
            int sl = int(GlobalVariableGet(global_sl));
            double calc_tp_price = 0;
            double calc_sl_price = 0;
            if(pos_type == POSITION_TYPE_BUY)
              {
               // покупка
               // расчёт корректных тп и сл
               if(tp > 0)
                  calc_tp_price = NormalizeDouble(pos_op + tp * _Point, _Digits);
               if(sl > 0)
                  calc_sl_price = NormalizeDouble(pos_op - sl * _Point, _Digits);
              }
            if(pos_type == POSITION_TYPE_SELL)
              {
               // продажа
               // расчёт корректных тп и сл
               if(tp > 0)
                  calc_tp_price = NormalizeDouble(pos_op - tp * _Point, _Digits);
               if(sl > 0)
                  calc_sl_price = NormalizeDouble(pos_op + sl * _Point, _Digits);
              }
            if(pos_tp != calc_tp_price || pos_sl != calc_sl_price)
              {
               // обнаружен факт проскальзывания
               // исправить тейк и стоп
               MqlTradeRequest request;
               MqlTradeResult result;
               ZeroMemory(request);
               ZeroMemory(result);
               request.action = TRADE_ACTION_SLTP;
               request.position = pos_id;
               request.symbol = symbol;
               request.magic = pos_mag;
               request.tp = calc_tp_price;
               request.sl = calc_sl_price;
               if(!OrderSend(request, result) || result.retcode != TRADE_RETCODE_DONE)
                  Print("Ticket:", pos_id, " Error: ", ResultRetcode(result));
              }
           }
        }
     }
   last_trade_ticket = 0;
  }
//+------------------------------------------------------------------+
 
Buen tema. Gracias y no lo borres. Cuando probé el arbitraje, me surgieron muchas preguntas que se responden aquí
 
Oleg Remizov:

Roman y Alexey Viktorov, gracias por su ayuda.

Después de abrir una operación decidí simplemente comprobar si las distancias reales y calculadas de TP y SL son iguales. Si no coinciden, intento restablecerlos en la función OnTrade(). Como resultado, las distancias entre el precio abierto real y el TP y el SL se vuelven correctas. Lo sorprendente es que este deslizamiento es la norma para este símbolo. El código se activa casi en cada apertura de la operación.

Intente ejecutar una operación con una orden limitada en lugar del precio de mercado, pero especifique el mejor precio de compra cuando compre o el mejor precio de venta cuando venda. La orden debe ser ejecutada inmediatamente al precio indicado, a menos que, por supuesto, el Ask o el Bid cambien durante este tiempo.

 
Vitalii Ananev:

Intenta ejecutar la transacción no según el mercado, sino mediante una orden limitada, pero el precio en la orden indica el mejor precio Ask cuando se compra o el mejor precio Bid cuando se vende. La orden debería ejecutarse inmediatamente al precio indicado, a menos que, por supuesto, la oferta o la demanda cambien durante ese tiempo.

Las órdenes limitadas se ejecutan bien. A veces incluso a mejor precio que la oferta.

 
Oleg Remizov:

.... Incluso a veces a mejor precio que en el formulario de solicitud.

Así que los precios han cambiado.

Aquí tienes un consejo:) Con una orden limitada puede abrir una posición como si abriera una orden de mercado, pero también ajusta el deslizamiento. Los operadores de Forex están acostumbrados a colocar órdenes limitadas por debajo del precio de oferta. Y las órdenes de venta limitadas deben colocarse por encima del precio Ask. Puede colocar una orden limitada para comprar al precio Ask o superior. Se ejecutará al siguiente mejor precio. Por ejemplo, el precio de venta en el mercado es de 5,8,10,20,35. El envío de una orden limitada de compra a 10 iniciará una operación a 5. Si la orden de seguridad contiene un cambio de precio y el mejor precio está en 20, su orden no se ejecutará, sino que aparecerá en los piquetes en 10. De esta manera hemos limitado el tamaño de los posibles desvíos.

 
Vitalii Ananev:

Así que los precios han cambiado.

Déjame contarte un consejo:) Con una orden limitada puede abrir una posición como si abriera una orden de mercado, pero también ajusta el deslizamiento. Los operadores de Forex están acostumbrados a colocar órdenes limitadas por debajo del precio de oferta. Y las órdenes de venta limitadas deben colocarse por encima del precio Ask. Puede colocar una orden limitada para comprar al precio Ask o superior. Se ejecutará al siguiente mejor precio. Por ejemplo, el precio de venta en el mercado es de 5,8,10,20,35. El envío de una orden limitada de compra a 10 iniciará una operación a 5. Si la orden de seguridad contiene un cambio de precio y el mejor precio está en 20, su orden no se ejecutará, sino que aparecerá en los piquetes en 10. De esta manera hemos limitado los posibles desvíos.

No se trata de un "cómo", sino del principio de ejecución del intercambio. ))
Por eso le dije antes a Aleh, para que entendiera cómo funcionan las órdenes de intercambio.
Si entiende cómo funcionan, podrá mejorar la calidad de sus acuerdos.

Y aquí hay un truco para los que trabajan en Quik.
En Quik, puede abrir posiciones dirigidas de forma diferente para el mismo instrumento durante el día.
Eso sí que es bueno))
 
Roman:

No es un truco inteligente, es el principio de la ejecución del intercambio. ))
Por eso le dije a Oleg antes, para entender cómo funcionan las órdenes de intercambio.
Si entiende cómo funcionan, podrá mejorar la calidad de sus acuerdos.

Aquí hay un truco inteligente para los que trabajan en Quik.
En Quik, puedes abrir diferentes posiciones para un instrumento durante el día.
Esto sí que es un buen saber hacer).

Lo escribí como una broma sobre este truco del dinero con un smiley al final.

Pero no sabía de las posiciones multidireccionales en el Quick. ¿La bolsa le permite hacer esto?

 
Vitalii Ananev:

Lo escribí como una broma sobre el truco con una cara sonriente al final.

Pero no conocía las posiciones multidireccionales de QuickBooks. ¿La bolsa le permite hacer esto?

No sé quién lo permite)) El intercambio, o los servidores de intercambio rápido.
Las posiciones ordinarias pueden mantenerse hasta la compensación principal, en la que se cerrarán, en igual volumen.
Es decir, si 2 están largos, 1 está corto, entonces 1 permanecerá largo después de la compensación.
De hecho, durante el día puedes fijar la pérdida, pero no realizarla, y si esperas un rebote, puedes reducir la pérdida.
Y si se produce el retroceso, puedes obtener el beneficio de la operación. En general, en buenas manos, es una buena herramienta.

 
Roman:

No sé quién te deja hacer eso )) El intercambio, o los servidores rápidos.
Las posiciones divergentes pueden mantenerse hasta la compensación principal, en la que se cerrarán, en igual volumen.
Es decir, si 2 están largos, 1 está corto, entonces 1 permanecerá largo después de la compensación.
De hecho, durante el día puedes fijar la pérdida, pero no realizarla, y si esperas un rebote, puedes reducir la pérdida.
Y si se produce el retroceso, puedes obtener el beneficio de la operación. En general, es una buena herramienta en manos hábiles.

Ya veo. No opero intradía, sólo largo y largo.

 
Oleg Remizov:

Especificación del instrumento de negociación:

¿En qué mercado se negocia?