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

 
EVGENII SHELIPOV #:

¡¡¡Buen día Makar !!!

Siguiendo tu consejo, he encontrado un lugar en la función void OnTick() donde puedo adjuntar la función TrailingGroupOrder() para enviar una orden que modifique un rastro de órdenes de grupo, y oh dios mío el rastro de órdenes de grupo ha empezado a funcionar. Sin embargo, mi alegría no duró mucho. Mirando más de cerca, he visto que sólo el pedido con un billete mínimo está trillado.

Es muy probable que el problema esté en la modificación de sólo el primer (mínimo) pedido y no todos a la vez.

Makar aconseja cómo hacer que todos los pedidos de la parrilla se modifiquen a la vez????

Muéstrame dónde pones TrailingGroupOrder() en la función void OnTick() ?
 
MakarFX #:
Muéstrame dónde pones TrailingGroupOrder() en la función void OnTick() ?


void OnTick()
{
     double JAW = iAlligator(Symbol(),TimeframesIndicators,13,8,5,8,5,3,MODE_SMMA,PRICE_MEDIAN,MODE_GATORJAW,0);
     double TEETH = iAlligator(Symbol(),TimeframesIndicators,13,8,5,8,5,3,MODE_SMMA,PRICE_MEDIAN,MODE_GATORTEETH,0);
     double LIPS = iAlligator(Symbol(),TimeframesIndicators,13,8,5,8,5,3,MODE_SMMA,PRICE_MEDIAN,MODE_GATORLIPS,0);
     double DI_PLUSCurrent=iADX(Symbol(),TimeframesIndicators,14, PRICE_CLOSE,MODE_PLUSDI,0);
     double DI_MINUSCurrent=iADX(Symbol(),TimeframesIndicators,14, PRICE_CLOSE,MODE_MINUSDI,0);
     double MacdCurrent=iMACD(Symbol(),TimeframesIndicators,12,26,9, PRICE_CLOSE,MODE_MAIN,0);
     double MacdPrevious=iMACD(Symbol(),TimeframesIndicators,12,26,9, PRICE_CLOSE,MODE_MAIN,2 ); 
     double ATR = iATR(Symbol(), TimeframesVolatility, BarCount, 0);
     {
      if (CountTrade() == 0)
      {
        if((UseHour==1&&Hour()>=StartTime&&Hour()<=StopTime)||UseHour==0)
        if(LIPS>TEETH&& TEETH>JAW&&DI_PLUSCurrent>18&&DI_PLUSCurrent>DI_MINUSCurrent&&MacdCurrent>MacdPrevious)                              
         {
           FirstLots = Lots();
           tp = NormalizeDouble(Ask + TakeProfitFirstOrder*Point, Digits);
           ticket = OrderSend(Symbol(), OP_BUY, FirstLots, Ask, slip, 0, tp, "1-ый ордер", Magic, 0, Blue); 
         }
        if((UseHour==1&&Hour()>=StartTime&&Hour()<=StopTime)||UseHour==0)
        if(LIPS<TEETH&& TEETH<JAW&&DI_MINUSCurrent>18&&DI_MINUSCurrent>DI_PLUSCurrent&&MacdCurrent<MacdPrevious)                            
         {
           FirstLots = Lots();
           tp = NormalizeDouble(Bid - TakeProfitFirstOrder*Point, Digits);
           ticket = OrderSend(Symbol(), OP_SELL, FirstLots, Bid, slip, 0, tp, "1-ый ордер", Magic, 0, Red); 
         }
       }
      if (CountTrade() == 1) Trailing();
     }
      if (CountTrade() < MaxOrders)                                                           
       {
           int order_type = FindLastOrderType();
           if (order_type == OP_BUY)
           { 
              price = FindLastOrderPrice(OP_BUY);  
              if(Ask<= price - Step()*Point)
              {
                  lastlot = NormalizeDouble(GetMinLotOrder()*MathPow( MultiplierParameter, OrdersTotal()), 2);
                  ticket = OrderSend(Symbol(), OP_BUY, lastlot, Ask, slip, 0, 0, "Групповой ордер", Magic, 0, Blue);
                  if (ticket < 1)
                      Print ("Ошибка ордера на покупку");
                            ModifyOrders(OP_BUY);
              }
           }
             if (order_type == OP_SELL)
           { 
              price = FindLastOrderPrice(OP_SELL);  
              if(Bid>= price + Step()*Point)
              {
                  lastlot = NormalizeDouble(GetMinLotOrder()*MathPow( MultiplierParameter, OrdersTotal()), 2);
                  ticket = OrderSend(Symbol(), OP_SELL, lastlot, Bid, slip, 0, 0, "Групповой ордер", Magic, 0, Red);
                  if (ticket < 1)
                      Print ("Ошибка ордера на продажу!");
                            ModifyOrders(OP_SELL);
              }
           }
         }
         if(CountTrade()>1)
          {
           TrailingGroupOrder();
          } 
         double op = CalculiteProfit(); 
         if (op > FindLastLots() && Drawdown > DrawdownClosingMinMaxOrders)
           {
           ClosseMinMaxOrders();
           } 
      Comment("Всего открыто ордеров : " + DoubleToStr(OrdersHistoryTotal(), 0)+ "\n" +
              "Максимальное количество : " + DoubleToStr(MaxOrders, 0)+ "\n" +
              "Количество открытых ордеров: " + DoubleToStr(OrdersTotal(), 0)+ "\n" +
              "Осталось ордеров: " + DoubleToStr((MaxOrders - OrdersTotal()), 0)+ "\n" +
              "Баланс средств счета: " + DoubleToStr(AccountBalance(), 0)+ "\n" +
              "Свободные средства: " + DoubleToStr(AccountFreeMargin(), 0)+ "\n" +
              "Относительная текущая просадка: " + DoubleToStr(((AccountBalance() - AccountFreeMargin())/AccountBalance())*100, 2)+ "\n" +
              "Относительная максимальная просадка: " + DoubleToStr(GetMaxDrawdown(), 2)+ "\n" +
              "Текущая прибыль/убыток: " + DoubleToStr(AccountProfit(), 2)+ "\n" +
              "Абсолютная максимальная прибыль: " + DoubleToStr(GetMaxProfit(), 2)+ "\n" +
              "Абсолютный максимальный убыток (просадка): " + DoubleToStr(GetMaxLoss(), 2)+ "\n" +
              "Плечо: " + DoubleToStr(AccountLeverage(), 0)+ "\n" + 
              "Своп: " + DoubleToStr(OrderSwap(), 2)+ "\n" + 
              "Коммссия: " + DoubleToStr(OrderCommission(), 2)+ "\n" + 
              "Шаг: "  + DoubleToStr(Step(), 0)+ "\n" + 
              "Минимальный тикет ордера: " + DoubleToStr(GetTicketMinOrder(), 0)+ "\n" + 
              "Максимальный тикет ордера: " + DoubleToStr(GetTicketMaxOrder(), 0)+ "\n" + 
              "Профит минимальный  ордера: " + DoubleToStr(GetProfitMinOrder(), 2)+ "\n" +  
              "Профит максимального  ордера: " + DoubleToStr(GetProfitMaxOrder(), 2)+ "\n" +
              "Профит суммарный: " + DoubleToStr(CalculiteProfit(),2));       
}
 
EVGENII SHELIPOV #:

Eliminar los elementos resaltados en rojo

void OnTick()
{
     double JAW = iAlligator(Symbol(),TimeframesIndicators,13,8,5,8,5,3,MODE_SMMA,PRICE_MEDIAN,MODE_GATORJAW,0);
     double TEETH = iAlligator(Symbol(),TimeframesIndicators,13,8,5,8,5,3,MODE_SMMA,PRICE_MEDIAN,MODE_GATORTEETH,0);
     double LIPS = iAlligator(Symbol(),TimeframesIndicators,13,8,5,8,5,3,MODE_SMMA,PRICE_MEDIAN,MODE_GATORLIPS,0);
     double DI_PLUSCurrent=iADX(Symbol(),TimeframesIndicators,14, PRICE_CLOSE,MODE_PLUSDI,0);
     double DI_MINUSCurrent=iADX(Symbol(),TimeframesIndicators,14, PRICE_CLOSE,MODE_MINUSDI,0);
     double MacdCurrent=iMACD(Symbol(),TimeframesIndicators,12,26,9, PRICE_CLOSE,MODE_MAIN,0);
     double MacdPrevious=iMACD(Symbol(),TimeframesIndicators,12,26,9, PRICE_CLOSE,MODE_MAIN,2 ); 
     double ATR = iATR(Symbol(), TimeframesVolatility, BarCount, 0);
     {
      if (CountTrade() == 0)
      {
        if((UseHour==1&&Hour()>=StartTime&&Hour()<=StopTime)||UseHour==0)
        if(LIPS>TEETH&& TEETH>JAW&&DI_PLUSCurrent>18&&DI_PLUSCurrent>DI_MINUSCurrent&&MacdCurrent>MacdPrevious)                              
         {
           FirstLots = Lots();
           tp = NormalizeDouble(Ask + TakeProfitFirstOrder*Point, Digits);
           ticket = OrderSend(Symbol(), OP_BUY, FirstLots, Ask, slip, 0, tp, "1-ый ордер", Magic, 0, Blue); 
         }
        if((UseHour==1&&Hour()>=StartTime&&Hour()<=StopTime)||UseHour==0)
        if(LIPS<TEETH&& TEETH<JAW&&DI_MINUSCurrent>18&&DI_MINUSCurrent>DI_PLUSCurrent&&MacdCurrent<MacdPrevious)                            
         {
           FirstLots = Lots();
           tp = NormalizeDouble(Bid - TakeProfitFirstOrder*Point, Digits);
           ticket = OrderSend(Symbol(), OP_SELL, FirstLots, Bid, slip, 0, tp, "1-ый ордер", Magic, 0, Red); 
         }
       }
      if (CountTrade() == 1) Trailing();
     }
      if (CountTrade() < MaxOrders)                                                           
       {
           int order_type = FindLastOrderType();
           if (order_type == OP_BUY)
           { 
              price = FindLastOrderPrice(OP_BUY);  
              if(Ask<= price - Step()*Point)
              {
                  lastlot = NormalizeDouble(GetMinLotOrder()*MathPow( MultiplierParameter, OrdersTotal()), 2);
                  ticket = OrderSend(Symbol(), OP_BUY, lastlot, Ask, slip, 0, 0, "Групповой ордер", Magic, 0, Blue);
                  if (ticket < 1)
                      Print ("Ошибка ордера на покупку");
                            ModifyOrders(OP_BUY);
              }
           }
             if (order_type == OP_SELL)
           { 
              price = FindLastOrderPrice(OP_SELL);  
              if(Bid>= price + Step()*Point)
              {
                  lastlot = NormalizeDouble(GetMinLotOrder()*MathPow( MultiplierParameter, OrdersTotal()), 2);
                  ticket = OrderSend(Symbol(), OP_SELL, lastlot, Bid, slip, 0, 0, "Групповой ордер", Magic, 0, Red);
                  if (ticket < 1)
                      Print ("Ошибка ордера на продажу!");
                            ModifyOrders(OP_SELL);
              }
           }
         }
         if(CountTrade()>1)
          {
           TrailingGroupOrder();
          } 
         double op = CalculiteProfit(); 
         if (op > FindLastLots() && Drawdown > DrawdownClosingMinMaxOrders)
           {
           ClosseMinMaxOrders();
           } 
      Comment("Всего открыто ордеров : " + DoubleToStr(OrdersHistoryTotal(), 0)+ "\n" +
              "Максимальное количество : " + DoubleToStr(MaxOrders, 0)+ "\n" +
              "Количество открытых ордеров: " + DoubleToStr(OrdersTotal(), 0)+ "\n" +
              "Осталось ордеров: " + DoubleToStr((MaxOrders - OrdersTotal()), 0)+ "\n" +
              "Баланс средств счета: " + DoubleToStr(AccountBalance(), 0)+ "\n" +
              "Свободные средства: " + DoubleToStr(AccountFreeMargin(), 0)+ "\n" +
              "Относительная текущая просадка: " + DoubleToStr(((AccountBalance() - AccountFreeMargin())/AccountBalance())*100, 2)+ "\n" +
              "Относительная максимальная просадка: " + DoubleToStr(GetMaxDrawdown(), 2)+ "\n" +
              "Текущая прибыль/убыток: " + DoubleToStr(AccountProfit(), 2)+ "\n" +
              "Абсолютная максимальная прибыль: " + DoubleToStr(GetMaxProfit(), 2)+ "\n" +
              "Абсолютный максимальный убыток (просадка): " + DoubleToStr(GetMaxLoss(), 2)+ "\n" +
              "Плечо: " + DoubleToStr(AccountLeverage(), 0)+ "\n" + 
              "Своп: " + DoubleToStr(OrderSwap(), 2)+ "\n" + 
              "Коммссия: " + DoubleToStr(OrderCommission(), 2)+ "\n" + 
              "Шаг: "  + DoubleToStr(Step(), 0)+ "\n" + 
              "Минимальный тикет ордера: " + DoubleToStr(GetTicketMinOrder(), 0)+ "\n" + 
              "Максимальный тикет ордера: " + DoubleToStr(GetTicketMaxOrder(), 0)+ "\n" + 
              "Профит минимальный  ордера: " + DoubleToStr(GetProfitMinOrder(), 2)+ "\n" +  
              "Профит максимального  ордера: " + DoubleToStr(GetProfitMaxOrder(), 2)+ "\n" +
              "Профит суммарный: " + DoubleToStr(CalculiteProfit(),2));       
}

Lo resaltado en amarillo lo lleva a la parte superior

void OnTick()
{
      if (CountTrade() == 1) Trailing();
      if (CountTrade() > 1 ) TrailingGroupOrder();

     double JAW = iAlligator(Symbol(),TimeframesIndicators,13,8,5,8,5,3,MODE_SMMA,PRICE_MEDIAN,MODE_GATORJAW,0);
 
MakarFX #:

Eliminar los elementos resaltados en rojo

Resaltado en amarillo súbelo

Makar es la variante que me enviaste ayer - sería muy sencillo en esa variante los pedidos también se cierran incorrectamente

 
EVGENII SHELIPOV #:

Makar esta es la variante que me enviaste ayer - hubiera sido muy sencillo en esa variante los pedidos no se cierran correctamente

Mis correcciones no afectan al cierre.

Una cosa más: ¿a qué equivale "tr" en la función TrailingGroupOrder()?

if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid - TrailingStopGroupOrder*Point, Digits), tp, 0))
 
EVGENII SHELIPOV #:

Makar esta es la variante que me enviaste ayer - hubiera sido muy sencillo en esa variante los pedidos también se cierran incorrectamente

¿Cómo que no cierran correctamente?
 
MakarFX #:
¿Qué quiere decir con "no cerrar correctamente"?

No se cierran todos los pedidos a la vez desde la red de arrastre, sino sólo el pedido con el ticket mínimo y así uno por uno

 
EVGENII SHELIPOV #:

No se cierran todos los pedidos a la vez desde la red de arrastre, sino sólo el pedido con el ticket mínimo y así uno por uno

Lo comprobaré mañana
 

Hola a todos, estoy escribiendo código para un arrastre de órdenes de grupo . La lógica del código es la siguiente:

Después de abrir la segunda orden y las siguientes, obtenemos un comando para modificar las órdenes ModifyOrders() donde calculamos la media y luego el cálculo del takeprofit y modificamos todas las órdenes pero sólo el takeprofit.

Luego llamamos a la función TrailingGroupOrder() desde la función void OnTick() donde el Stop Loss es modificado en Trailing Stop.

La cuestión es que sólo se modifica una orden con una entrada mínima; esto no es correcto; todas las órdenes de la parrilla deberían modificarse y cerrarse en TP o SL. Por favor, ayúdenme a entender esto. Gracias de antemano.

//+----------------------------------------------------------------------------+
//| Модификация групповых ордеров                                              |
//+----------------------------------------------------------------------------+
void ModifyOrders(int otype)
  {
   for(int i = OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
           {
            if(otype == OP_BUY)
               tp = NormalizeDouble(GetAveragePrice() + TakeProfitGroupOrder*Point, Digits);
            if(otype == OP_SELL)
               tp = NormalizeDouble(GetAveragePrice() - TakeProfitGroupOrder*Point, Digits);
            if((otype == OP_BUY || otype == OP_SELL) && (Drawdown > DrawdownClosingTakeprofitZero))
               tp = NormalizeDouble(GetAveragePrice(), Digits);
           }
        }
     }
   for(int i = OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
           {
            if(OrderModify(OrderTicket(), OrderOpenPrice(), 0, tp, 0))
               Print("Ордера успешно модифицированы!");
            else
               Print("Ошибка модификации ордеров!");
           }
        }
     }
  }
//+----------------------------------------------------------------------------+
//| Трейлинг стоп групповых ордеров                                            |
//+----------------------------------------------------------------------------+
void TrailingGroupOrder()
  {
   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 && Bid - GetAveragePrice() > TrailingStopGroupOrder*Point)
              {
               if(Bid - GetAveragePrice() > TrailingStopGroupOrder*Point || OrderStopLoss() == 0)
                 {
                  if(OrderStopLoss() < Bid - (TrailingStep + TrailingStopGroupOrder)*Point || OrderStopLoss() == 0)
                    {
                     if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid - TrailingStopGroupOrder*Point, Digits), tp, 0))
                        Print("Ошибка модификации групповых ордеров на покупку!");
                    }
                 }
              }
            if(OrderType() == OP_SELL && GetAveragePrice() - Ask > TrailingStopGroupOrder*Point)
              {
               if(GetAveragePrice() - Ask > TrailingStopGroupOrder*Point || OrderStopLoss() == 0)
                 {
                  if(OrderStopLoss() > Ask + (TrailingStep + TrailingStopGroupOrder)*Point || OrderStopLoss() == 0)
                    {
                     if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask + TrailingStopGroupOrder*Point, Digits), tp, 0))
                        Print("Ошибка модификации групповых ордеров на продажу!");
                    }
                 }
              }
           }
        }
     }
  }


 
EVGENII SHELIPOV #:

Hola a todos, estoy escribiendo código para un arrastre de órdenes de grupo . La lógica del código de la red de arrastre es la siguiente :

Por qué esta duplicación

            if(OrderType() == OP_BUY && Bid - GetAveragePrice() > TrailingStopGroupOrder*Point)
              {
               if(Bid - GetAveragePrice() > TrailingStopGroupOrder*Point || OrderStopLoss() == 0)
                 {
                  if(OrderStopLoss() < Bid - (TrailingStep + TrailingStopGroupOrder)*Point || OrderStopLoss() == 0)
                    {

Puedes hacerlo así

            if(OrderType() == OP_BUY && Bid - GetAveragePrice() > TrailingStopGroupOrder*Point)
              {
               if(OrderStopLoss() < Bid - (TrailingStep + TrailingStopGroupOrder)*Point || OrderStopLoss() == 0)
                  {


También muestra qué parámetros

TrailingStep                
TakeProfitGroupOrder        
TrailingStopGroupOrder