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

 
Maxim Kuznetsov #:

¿es una broma?

Lo tienes en blanco y negro para(;;)

Bueno, sí, pero hay una forma de evitarlo: cuando la magia no es igual a la magia del orden.
 
Nerd Trader #:
Pues sí, sólo que hay una salida: cuando la magia no es igual a la magia de orden.

Prueba esto

int GetMagic(Order &order)
{
  int magic = 0;
  if(order.cmd == OP_SELLSTOP || order.cmd == OP_BUYSTOP)
  for(int i = OrdersTotal(); i > 0 ; i --)
   {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
       if(OrderType()==OP_SELLSTOP || OrderType()==OP_BUYSTOP)
         {
          if(magic == OrderMagicNumber()) magic+=1;
          else magic=0;
         }
      }
   }
  return (magic);
}
 
EVGENII SHELIPOV orden actualmente seleccionada.

¿Y si hay una red de pedidos?

¿Alguien tiene una función para calcular la suma de todos los intercambios de una red de órdenes para una orden mágica y un instrumento financiero.

¡¡¡Gracias por la ayuda!!!

¿Para qué lo necesitas?
 
MakarFX #:
¿Para qué lo necesitas?

Cuando se cierra una gran parrilla de órdenes con una larga vida de la parrilla, los intercambios de órdenes se comen los beneficios y distorsionan mucho el resultado.

Quiero compensar la pérdida en los intercambios con esta función.

 
EVGENII SHELIPOV #:

Cuando se cierra una gran parrilla de órdenes con una larga vida de la parrilla, los intercambios de órdenes se comen los beneficios y distorsionan mucho el resultado.

Quiero compensar la pérdida en los intercambios con esta función.

¿La red se cierra con beneficios o con el punto de equilibrio?
 
MakarFX #:

Prueba esto

int GetMagic(Order &order)
{
  int magic = 0;
  if(order.cmd == OP_SELLSTOP || order.cmd == OP_BUYSTOP)
  for(int i = OrdersTotal(); i > 0 ; i --)
   {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
       if(OrderType()==OP_SELLSTOP || OrderType()==OP_BUYSTOP)
         {
          if(magic == OrderMagicNumber()) magic+=1;
          else magic=0;
         }
      }
   }
  return (magic);
}
Eso lo arregló, tenía if (order.cmd == OP_SELLSTOP || OP_BUYSTOP) sólo que el problema no se solucionó.
Pero necesito que pase por todas las órdenes. El mago en sí se fija en el momento de la creación sólo al tapón. No podemos entender que el tapón sea creado por OrderType() porque aún no ha estado allí; tenemos un registro preliminar del tipo de orden en order.cmd para ello. Y aquí necesitamos dos bucles: uno anidado en el otro, para que una iteración de la variable magic se compruebe con todos los pedidos de OrdersTotal(). Lo tengo todo implementado, sólo que hay un bucle sin fin, no sé por qué...
 
MakarFX #:
¿La red se cierra con beneficios o con el punto de equilibrio?

Sí, a un cierto nivel de detracción, hay una pérdida a cero y a ninguna pérdida hay una pérdida fea debido a los swaps

 
Nerd Trader #:
Esto está bien, tenía if (order.cmd == OP_SELLSTOP || OP_BUYSTOP)
Pero necesito que se pasen todas las órdenes. El mago en sí mismo se establece cuando sólo se crea el tapón. No podemos saber que el tapón es creado por OrderType() ya que aún no ha estado allí, necesitamos escribir el tipo de orden en order.cmd de antemano. Y aquí necesitamos dos bucles: uno anidado en el otro, para que una iteración de la variable mágica se compruebe con todos los pedidos de OrdersTotal()
Muéstrame dónde usas GetMagic(...)
 
void OpenOrder(int db = -1){

  if(db == -1){
    Print("'db' должен иметь корректное значение");
    return;
  }

  Order order;

  //Если бид в границах ДБ (его хай/лоу) то инициализируем ордер для селстопа или байстопа
  if(Bid > db_last.low && Bid < db_last.hight){
    if(db == BEAR) order.InitForSell(SELLSTOP);
    if(db == BULL) order.InitForBuy(BUYSTOP);
  }

 ...

  if(order.is_init == true)
  {
    int order_send = OrderSend(Symbol(), order.cmd, 0.01, order.open_price, 10, 
    order.sl_price, order.tp_price, "", GetMagic(order), 0, order.arrow_color);

    if(order_send == -1){
      Print(order.error_text," | ",GetLastError()," db_last.third ",db_last.third,
        " | db_last.size_open_to_low ",db_last.size_open_to_low," | order.sl_price: ",
        order.sl_price," | order.cmd ",order.cmd);
      ResetLastError();
      return;
    }
  }
}

...

int GetMagic(Order &order)
{
  int magic = 0;
  //Если должен быть открыт стопордер и если есть уже открытые или отложенные 
  //ордера, то возможно некоторые с маджиком, это надо проверить и сгенерировать 
  //для нашего ордера уникальный маджик и отправить его на запись в массив
  if(order.cmd == OP_SELLSTOP || OP_BUYSTOP)
    if(OrdersTotal() >= 1)
      for(;;){
        magic++;
        for(int i = OrdersTotal(); i > 0 ; i --)
          if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) != false)
            if(magic != OrderMagicNumber())
              return magic;
            
      }
    //Если нет открытых или отложенных ордеров то увеличиваем значение 
    //маджика, чтобы он равнялся единице и отправляем на запись в массив
    else if (OrdersTotal() == 0)
      return (magic + 1);
  return magic;
}


En el comentario dice que envía el majic al array de escritura, así que no te dejes engañar por esto, siempre que el majic vuelva al retorn.
 
EVGENII SHELIPOV #:

Sí, a un cierto nivel de detracción, hay una pérdida a cero y a ninguna pérdida hay una pérdida fea debido a los swaps

   double GetOrderSwap()
     {
      double order_swap = 0;
      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)
                 {
                  order_swap += OrderSwap();
                 }
              }
           }
        }
      return(order_swap);
     }