Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1831

 
Mihail Matkovskij #:

Un trailing stop debe activarse si el precio se mueve en la dirección del TP y no hacer nada si el precio retrocede. El nivel de SL sólo debe ir en la dirección del TP y no retroceder.

Lo sé.

Yo escribí.

hay un número infinito de posiciones de parada y toma al instante

2021.12.23 21:07:51.634 2021.12.21 21:12:20 111 AUDUSD,M15: ¡Modificación de la orden de compra con éxito!

2021.12.23 21:07:51.634 2021.12.21 21:12:20 111 AUDUSD,M15: modificar #2 comprar 0.02 AUDUSD a 0.71028 sl: 0.71288 tp: 0.72038 ok

2021.12.23 21:07:51.634 2021.12.21 21 12:12:18 111 AUDUSD,M15: ¡Modificación de la orden de compra con éxito!

2021.12.23 21:07:51.634 2021.12.21 21:12:18 111 AUDUSD,M15: modificar #2 comprar 0.02 AUDUSD a 0.71028 sl: 0.71268 tp: 0.72018 ok

2021.12.23 21:07:51.634 2021.12.21 21 12:12:16 111 AUDUSD,M15: ¡Modificación de la orden de compra con éxito!

2021.12.23 21:07:51.634 2021.12.21 21:12:16 111 AUDUSD,M15: modify #2 buy 0.02 AUDUSD at 0.71028 sl: 0.71248 tp: 0.71998 ok

2021.12.23 21:07:51.634 2021.12.21 21 12:12:15 111 AUDUSD,M15: ¡Modificación de la orden de compra con éxito!

2021.12.23 21:07:51.634 2021.12.21 21:12:15 111 AUDUSD,M15: modificar #2 comprar 0.02 AUDUSD a 0.71028 sl: 0.71228 tp: 0.71978 ok

2021.12.23 21:07:51.634 2021.12.21 21 12:12:13 111 AUDUSD,M15: ¡Modificación de la orden de compra con éxito!

2021.12.23 21:07:51.634 2021.12.21 21:12:13 111 AUDUSD,M15: modificar #2 comprar 0.02 AUDUSD a 0.71028 sl: 0.71208 tp: 0.71958 ok

2021.12.23 21:07:51.634 2021.12.21 21 12:12:11 111 AUDUSD,M15: ¡Modificación de la orden de compra con éxito!

2021.12.23 21:07:51.634 2021.12.21 21:12:11 111 AUDUSD,M15: modificar #2 comprar 0.02 AUDUSD a 0.71028 sl: 0.71188 tp: 0.71938 ok

2021.12.23 21:07:51.634 2021.12.21 12:12:10 111 AUDUSD,M15: ¡Modificación de la orden de compra con éxito!

2021.12.23 21:07:51.634 2021.12.21 21:12:10 111 AUDUSD,M15: modificar #2 comprar 0.02 AUDUSD a 0.71028 sl: 0.71168 tp: 0.71918 ok

2021.12.23 21:07:51.634 2021.12.21 21 12:12:08 111 AUDUSD,M15: ¡Modificación de la orden de compra con éxito!

2021.12.23 21:07:51.634 2021.12.21 21:12:08 111 AUDUSD,M15: modificar #2 comprar 0.02 AUDUSD a 0.71028 sl: 0.71148 tp: 0.71898 ok

2021.12.23 21:07:51.634 2021.12.21 21 12:12:06 111 AUDUSD,M15: ¡Modificación de la orden de compra con éxito!

2021.12.23 21:07:51.634 2021.12.21 21:12:06 111 AUDUSD,M15: modify #2 buy 0.02 AUDUSD at 0.71028 sl: 0.71128 tp: 0.71878 ok

2021.12.23 21:07:51.634 2021.12.21 21 12:12:05 111 AUDUSD,M15: ¡Modificación de la orden de compra con éxito!

2021.12.23 21:07:51.634 2021.12.21 21:12:05 111 AUDUSD,M15: modificar #2 comprar 0.02 AUDUSD a 0.71028 sl: 0.71108 tp: 0.71858 ok

2021.12.23 21:07:51.634 2021.12.21 21 12:12:00 111 AUDUSD,M15: ¡Modificación de la orden de compra con éxito!

2021.12.23 21:07:51.634 2021.12.21 21:12:00 111 AUDUSD,M15: modify #2 buy 0.02 AUDUSD at 0.71028 sl: 0.71088 tp: 0.71838 ok

2021.12.23 21:07:51.634 2021.12.21 12:11:53 111 AUDUSD,M15: ¡Modificación de la orden de compra con éxito!

2021.12.23 21:07:51.634 2021.12.21 12:11:53 111 AUDUSD,M15: modificar #2 comprar 0.02 AUDUSD a 0.71028 sl: 0.71068 tp: 0.71818

2021.12.23 21:07:51.634 2021.12.21 12:11:52 111 AUDUSD,M15: ¡Modificación de la orden de compra con éxito!


 
законопослушный гражданин #:

Lo sé.

Yo escribí.

la parada y la toma se mueven instantáneamente un número infinito de veces

Debe obtener el SL de la orden que se está modificando y compararlo con el SL calculado. Si son iguales, el robot no debe hacer nada hasta que el SL calculado supere el SL de la orden que se está procesando. Cómo comparar dos valores dobles: o bien compara NodmalizeDouble(valor, Dígitos) (de cada valor) o EqualDoubleshttps://www.mql5.com/ru/docs/basis/types/double

Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
  • www.mql5.com
Вещественные типы (double, float) - Типы данных - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
законопослушный гражданин #:

Lo sé.


Lo has configurado correctamente. ¿Ha cambiado algo dentro de la función TrailingOrders()?

 
Mihail Matkovskij #:

Debe obtener el SL de la orden que se está modificando y compararlo con el SL calculado. ...

En general, las normas son las siguientes.

  • El SL calculado es menor que el SL de la orden (menos favorable) - no hacer nada
  • El SL calculado es igual al SL de la orden - no hacer nada
  • El SL calculado supera el SL de la orden (más rentable) - modifíquelo con el valor calculado
Estas reglas de arrastre pueden utilizarse para construir casi cualquier red de arrastre con cualquier algoritmo de cálculo de SL.
 
Tretyakov Rostyslav #:

Lo has configurado correctamente. ¿Ha cambiado algo dentro de la función TrailingOrders()?

Lo cambié y lo puse "tal cual" y el resultado fue el mismo.

 
законопослушный гражданин #:

Lo he cambiado y lo he puesto "tal cual" y el resultado es el mismo.

Es necesario ver los parámetros de entrada, porque el registro muestra que la red de arrastre funciona correctamente
 
Tretyakov Rostyslav #:
Necesitamos ver los parámetros de entrada, porque según el registro la red de arrastre funciona correctamente

2021.12.24 16:10:14.788 2021.12.17 00:00:00 111 - copy: Lot=0.01; StopLoss=200; TakeProfit=560; Slippage=3; Magic=1; K_Martin1=0.01; K_Martin2=1.9; K_Martin3=1.4; OrdersClose=3; OrdersClose2=5; DigitsLot=2; PeriodMA=21; MovingShift=1;


 
законопослушный гражданин #:

2021.12.24 16:10:14.788 2021.12.17 00:00:00 111 - copy: Lot=0.01; StopLoss=200; TakeProfit=560; Slippage=3; Magic=1; K_Martin1=0.01; K_Martin2=1.9; K_Martin3=1.4; OrdersClose=3; OrdersClose2=5; DigitsLot=2; PeriodMA=21; MovingShift=1;


¿quizás he puesto mal la función en el código?

void OnTick()
  {
// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.
   TrailingOrders();
// Если нет открытых ордеров, то входим в условие
      if(CountOrders()==0)
     {

// Если появился сигнал на покупку, то откроем ордер на покупку
      if(bSignalBuy() == true)
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
      if(bSignalSell() == true)
         vOrderOpenSell();
     } 
       DrawLABEL("nextlot",1,5,0,Color1(),StringConcatenate("CURRENT LOT: ",DoubleToStr(LOT(),2)));
       DrawLABEL("currentlot",1,5,0,Color2(),StringConcatenate("NEXT LOT: ",DoubleToStr(LOT(),2))); 
  }

y poner la propia función por separado

//-------------------------------------------------------------------+

void TrailingOrders()
  {
   for(int i = OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
           {
            if(OrderType() == OP_BUY)
              {
               if(Bid >= OrderOpenPrice()+(TakeProfit*0.75*_Point) && OrderStopLoss()<OrderOpenPrice()-20*_Point)
                 {
                  if(OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss()+20*_Point, OrderTakeProfit()+20*_Point, 0))
                     Print("Модификации ордера на покупку успешна!");
                  else
                     Print("Ошибка модификации ордера на покупку! - ",GetLastError());
                 }
               if(Bid >= OrderOpenPrice()+(TakeProfit*0.9*_Point) && OrderStopLoss()>=OrderOpenPrice()-20*_Point)
                 {
                  if(OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss()+30*_Point, OrderTakeProfit()+10*_Point, 0))
                     Print("Модификации ордера на покупку успешна!");
                  else
                     Print("Ошибка модификации ордера на покупку! - ",GetLastError());
                 }
              }
           }
        }
     }
  }
 
законопослушный гражданин #:

¿he puesto mal la función en el código?

y poner la propia función por separado

//-------------------------------------------------------------------+

void TrailingOrders()
  {
   
   for(int i = OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
           {
            if(OrderType() == OP_BUY)
              {
               if(Bid >= OrderOpenPrice()+(TakeProfit*0.75*_Point) && OrderStopLoss()<=OrderOpenPrice()-StopLoss*_Point)
                 {
                  if(OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice()-(StopLoss+20)*_Point, OrderTakeProfit()+20*_Point, 0))
                     Print("Модификации ордера на покупку успешна!");
                  else
                     Print("Ошибка модификации ордера на покупку! - ",GetLastError());
                 }
               if(Bid >= OrderOpenPrice()+(TakeProfit*0.9*_Point) && OrderStopLoss()>=OrderOpenPrice()-(StopLoss+20)*_Point)
                 {
                  if(OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss()+30*_Point, OrderTakeProfit()+10*_Point, 0))
                     Print("Модификации ордера на покупку успешна!");
                  else
                     Print("Ошибка модификации ордера на покупку! - ",GetLastError());
                 }
              }
           }
        }
     }
  }

El camino es correcto.

Pruébalo así

 
Tretyakov Rostyslav #:

El carro está correctamente parado.

Prueba esto.

despegar al espacio

la parada se detiene primero, y luego vuela instantáneamente al espacio junto con la toma (cerrando la orden en el camino)

esta no es la cuestión tal y como yo la entiendo.

corrígeme si me equivoco: void OnTick()

si no hay órdenes abiertas y hay una señal, entonces vOrderOpenBuy() / vOrderOpenSell()

Luego viene el void vOrderModify(int iOTi) - es decir, se establecen los topes y takei y luego se comprueba si hay errores.

Es decir, hasta que la orden no se cierra en el stop o en la toma, no es posible corregirla en términos de trailing.

Necesita un (máximo dos) múltiplo de parada y toma.

Si quieres cambiar el trailing stop y tomar un beneficio, entonces necesitarás un enfoque diferente.

Todavía estoy pensando en cómo implementarlo.

Archivos adjuntos:
111.mq4  25 kb
Razón de la queja: