[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 346

 
hozВадим, зачем создавать объект заново, если можно воспользоваться функцией  ObjectSet() ?

  Зачем спрашивать совета, а потом еще его и оспаривать ? Это что , мейнстрим такой ?
 
FAQ:

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

Да какие здесь могут быть прения? Закрывать нужно ордер с максимальным отклонением по цене. А значит нас интересует цена... т.е. нужно найти крайний отложенник (с максимальной или минимальной ценой открытия). Если Вы не согласны, то могли бы аргументировать. Иначе я всё-таки прав! Я же чётко понимаю что говорю.
 

Код удаляет ST и TP.  добавляю условие на выборочное удаление

Что не правильно написан? Продолжает удалять все:(

 #property show_inputs
extern bool   StopLoss     = True;    // Удалить только StopLoss
extern bool   TakeProfit   = True;    // Удалить только TakeProfit
extern bool   ALL          = True;    // Удалить все
void start()
   {
   bool   fm;
   int     i;
   double SL=OrderStopLoss();
   double TP=OrderTakeProfit();

      if (StopLoss)   SL=0;
      if (TakeProfit) TP=0;
      if (ALL)       {SL=0; TP=0;}
     
      for (i=0; i<OrdersTotal(); i++)
         {
           if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
               {
                  if (OrderType()==OP_BUY)
                     {
                        fm=OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,CLR_NONE);
                     }
                  if (OrderType()==OP_SELL)
                     {
                        fm=OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,CLR_NONE);
                     }
               }
         }
   }

Или другого решения нет и придется прописывать код удаления для каждого условия?

#property show_inputs
#include <WinUser32.mqh>
extern bool   StopLoss     = False;    // Удалить только StopLoss
extern bool   TakeProfit   = False;    // Удалить только TakeProfit
extern bool   ALL          = False;    // Удалить все
void start()
   {
   bool   fm;
   int     i;

    if (StopLoss)
         {
            for (i=0; i<OrdersTotal(); i++)
               {
                 if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
                     {
                        if (OrderType()==OP_BUY)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderTakeProfit(),CLR_NONE);
                           }
                        if (OrderType()==OP_SELL)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderTakeProfit(),CLR_NONE);
                           }
                     }
               }
           return(0);
         }
      if (TakeProfit)
         {
            for (i=0; i<OrdersTotal(); i++)
               {
                 if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
                     {
                        if (OrderType()==OP_BUY)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),0,CLR_NONE);
                           }
                        if (OrderType()==OP_SELL)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),0,CLR_NONE);
                           }
                     }
               }
           return(0);
         }
      if (ALL)
         {
            for (i=0; i<OrdersTotal(); i++)
               {
                 if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
                     {
                        if (OrderType()==OP_BUY)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,0,CLR_NONE);
                           }
                        if (OrderType()==OP_SELL)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,0,CLR_NONE);
                           }
                     }
               }
           return(0);
         }
   }             

 
hoz:


Вадим, зачем создавать объект заново, если можно воспользоваться функцией  ObjectSet() ?

В том случае была функция, где полностью создавался и настраивался графический объект. В ней функция создания оптимизирована. Если объект уже есть, то он не создаётся. Сами проверте. Засеките время на создание объектов, потом на изменение свойств. Второй вызов будет существенно более коротким. Т.е. ничего не пересоздаётся.

В результате у нас есть универсальная функция, которая не только создаст объект, но ещё может настроить его заменой свойств объекта без особых временных затрат. 

 
подскажите скрипт в советник чтобы определить тренд рынка?
 

 Я написал функцию, которая будет удалять отложки на продажу с самыми низкими ценами. Количество шортовых отложек для закрытия равно количеству отложек на покупкукоторые сработали т.е. перешли в рыночные ордера.

Получается, что если сработала одна отложка в бай, значит закроем одну отложку в селл, если сработало 2 отложки в бай, то закроем 2 отложки в селл.

Вот код:

//+-------------------------------------------------------------------------------------+
//| Удаление несработанных отложеннык шортов                                            |
//+-------------------------------------------------------------------------------------+
void DeletePendingSells(int& amountOfCurrPending)
{
   int total = OrdersTotal() - 1,
       ordersToDelete = level - amountOfCurrPending,
       s_ticket;
   amountOfCurrPendingBuys = 0;
   amountOfCurrPendingSells = 0;
   Print("DeletePendingSells: level = ", level);
   Print("ordersToDelete = level - amountOfCurrPending ; ", level, " - ", amountOfCurrPending);
   int n = 0;
   double OOP = 2.0;
   Print("функция сноса отложек DeletePendingSells");
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if(OrderType() != OP_SELLSTOP) continue;
      
      while (n < ordersToDelete)
      {
         if (OOP > OrderOpenPrice())
         {
             Print("OOP > OrderOpenPrice() ; ", OOP, " > ", OrderOpenPrice());
             OOP = OrderOpenPrice();
             s_ticket = OrderTicket();
             ordersToDelete--;
         }
      }
   }
}

 amountOfCurrPending - количество отложенных ордеров баевых.

level - количество изначально посылаемых отложенных ордеров в кажду. сторону.

OOP - цена открытия отложки, взял любое недосягаемое значение. 

Условие у нас такое, что если счётчик меньше ordersToDelete то удаляем отложку с самой низкой ценой. Но удаляются все отложки шортовые. Что у меня не так?

 
hoz:

 Я написал функцию, которая будет удалять отложки на продажу с самыми низкими ценами. Количество шортовых отложек для закрытия равно количеству отложек на покупкукоторые сработали т.е. перешли в рыночные ордера.

Получается, что если сработала одна отложка в бай, значит закроем одну отложку в селл, если сработало 2 отложки в бай, то закроем 2 отложки в селл.

Вот код:

 amountOfCurrPending - количество отложенных ордеров баевых.

level - количество изначально посылаемых отложенных ордеров в кажду. сторону.

OOP - цена открытия отложки, взял любое недосягаемое значение. 

Условие у нас такое, что если счётчик меньше ordersToDelete то удаляем отложку с самой низкой ценой. Но удаляются все отложки шортовые. Что у меня не так?

 

Я вот вообще не пойму вашей логики... Почему не сделать: ордер преобразовался в рыночную позицию - удалили самую дальнюю противоположную отложку.
И всё. Или у вас пачка ордеров на одной цене висит?
 
artmedia70:

И всё. Или у вас пачка ордеров на одной цене висит?


 Нет, ордера с шагом..
artmedia70:
Я вот вообще не пойму вашей логики... Почему не сделать: ордер преобразовался в рыночную позицию - удалили самую дальнюю противоположную отложку.

Так я и удаляю самую дальнюю позиции т.е. раз это шортовая позиция, значит позиция с самой низкой ценой открытия. Вот переписал функцию, тут должно быть всё понятно. Принты убрал, и убрал лишнюю переменную.

Ведь переменная amountOfCurrPending как раз и передаёт количество оставшихся отложек в бай. Т.е. если всего изначально количество level, а amountOfCurrPending текущее количество отложек, то  вычитая изначальное количество отложек от текущего, получится разница, а это и есть количество требуемое для удаления шортов. Понимаете?

 

//+-------------------------------------------------------------------------------------+
//| Удаление несработанных отложеннык шортов                                            |
//+-------------------------------------------------------------------------------------+
void DeletePendingSells(int& amountOfCurrPending)
{
   int total = OrdersTotal() - 1,
       ordersToDelete = level - amountOfCurrPending,  // Количество отложек, которые требуется удалить
       s_ticket;
   amountOfCurrPendingBuys = 0;                       // Количество текущих отложек на покупку
   amountOfCurrPendingSells = 0;                      // Количество текущих отложек на продажу
   Print("DeletePendingSells: level = ", level);
   Print("ordersToDelete = level - amountOfCurrPending ; ", level, " - ", amountOfCurrPending);

   double OOP = 2.0;
   Print("функция сноса отложек DeletePendingSells");
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if(OrderType() != OP_SELLSTOP) continue;
      
      while (ordersToDelete > 0)                      // Если есть ордера, которые требуется удалить..
      {
         if (OOP > OrderOpenPrice())
         {
             Print("OOP > OrderOpenPrice() ; ", OOP, " > ", OrderOpenPrice());
             OOP = OrderOpenPrice();                  // Ищется ордер, с минимальной ценой открытия
             s_ticket = OrderTicket();                // Получаем тикет ордера с минимальной ценой открытия

             Print("DeletePendingSells: s_ticket = ", s_ticket);
             Print("DeletePendingSells: OOP = ", OOP);
             OrderDelete(s_ticket,Black); // Тут нужно закрыть найденный ордер, и видимо проверить, что он закрыт. И счётчик уменьшить!
             ordersToDelete--;                        // Уменьшаем количество требуемых ордеров для удаления
         }
      }
   }
   Print("DeletePendingSells: ordersToDelete = ", ordersToDelete);
}
Там, где я красным пометил ошибка? Как грамотнее это решить?
 
hoz:

 Нет, ордера с шагом..

Так я и удаляю самую дальнюю позиции т.е. раз это шортовая позиция, значит позиция с самой низкой ценой открытия. Вот переписал функцию, тут должно быть всё понятно. Принты убрал, и убрал лишнюю переменную.

Ведь переменная amountOfCurrPending как раз и передаёт количество оставшихся отложек в бай. Т.е. если всего изначально количество level, а amountOfCurrPending текущее количество отложек, то  вычитая изначальное количество отложек от текущего, получится разница, а это и есть количество требуемое для удаления шортов. Понимаете?

 

Там, где я красным пометил ошибка? Как грамотнее это решить?
 Ищется ордер, с минимальной ценой открытия

Я б записал в комментарий отложки его порядковый номер в сетке и в соответствующем ему противоположном отложенном прописал тот же номер. Тогда по нахождению рыночной позиции, прочитав номер в её комментарии, без проблем ищется соответствующая противоположная отложка по идентичному номеру в её комментарии. Раз магики используете для другого.

ЗЫ. Код ваш пока некогда читать/разбирать

 
artmedia70:

Я б записал в комментарий отложки его порядковый номер в сетке и в соответствующем ему противоположном отложенном прописал тот же номер. Тогда по нахождению рыночной позиции, прочитав номер в её комментарии, без проблем ищется соответствующая противоположная отложка по идентичному номеру в её комментарии. Раз магики используете для другого.

ЗЫ. Код ваш пока некогда читать/разбирать



 Хм. Да, без проблем ищется соответствующая отложка таким образом, если количество отложек в каждом направлении одинаковое. А если разное, тогда такой вариант не прокатит как я понимаю.
Причина обращения: