Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1679

 
Maxim Kuznetsov #:

это шутка такая ?

у вас чёрным по белому for(;;)

Ну да, только из него предусмотрен выход: когда magic не будет равнятся маджику ордера.
 
Nerd Trader #:
Ну да, только из него предусмотрен выход: когда magic не будет равнятся маджику ордера.

Попробуй так

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 #:

Доброго времени суток.

Подскажите пожалуйста есть функция OrderSwap() которая возвращает значение свопа текущего выбранного ордера

А если сетка ордеров???

У кого ни будь  не завалялась функция для расчета суммы всех свопов сетки ордеров по магическому ордеру и финансовому инструменту. 

Спасибо за помощь!!!

Тебе зачем?
 
MakarFX #:
Тебе зачем?

При закрытии большой сетки ордеров с длинным периодом жизни сетки свопы ордеров съедают прибыль и очень сильно искажают результат.

Хочу этой функцией компенсировать потерю на свопах. 

 
EVGENII SHELIPOV #:

При закрытии большой сетки ордеров с длинным периодом жизни сетки свопы ордеров съедают прибыль и очень сильно искажают результат.

Хочу этой функцией компенсировать потерю на свопах. 

Сетка закрывается по профиту или цене безубытка?
 
MakarFX #:

Попробуй так

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);
}
Это справил, у меня было if(order.cmd == OP_SELLSTOP || OP_BUYSTOP) только проблема не решилась.
Но мне нужно чтобы проход был по всем ордерам. Сам же маджик задается в момент создания исключительно стопордерам. Понять что создается стопордер по OrderType() невозможно, потому что его ещё нет, для этого предусмотрено предварительная запись типа ордера в order.cmd. И тут нужно два цикла: один вложен в другой, чтобы одна итерация переменной magic проверялась с маджиками всех ордеров из OrdersTotal(). У меня это все реализовано, только происходит бесконечное зацикливание, я хз почему ...
 
MakarFX #:
Сетка закрывается по профиту или цене безубытка?

Да при определенном уровне просадки происходит сброс профита в ноль и к без убытку происходит некрасивый убыток из-за свопов 

 
Nerd Trader #:
Это справил, у меня было if(order.cmd == OP_SELLSTOP || OP_BUYSTOP)
Но мне нужно чтобы проход был по всем ордерам. Сам же маджик задается в момент создания исключительно стопордерам. Понять что создается стопордер по OrderType() невозможно, потому что его ещё нет, для этого предусмотрено предварительная запись типа ордера в order.cmd. И тут нужно два цикла: один вложен в другой, чтобы одна итерация переменной magic проверялась с маджиками всех ордеров из OrdersTotal()
Покажи где ты используешь 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;
}


Там в комментировании написано что отправляется маджик в массив на запись, пусть это не вводит в заблуждение, пока маджик вовзращается обратно по реторну.
 
EVGENII SHELIPOV #:

Да при определенном уровне просадки происходит сброс профита в ноль и к без убытку происходит некрасивый убыток из-за свопов 

   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);
     }
Причина обращения: