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

 
DhP:


Пересчитывайте с каждым тиком количество отложенных ордеров.

Если их стало меньше, значит один отложенник превратился в рыночный ордер.

Все оставшиеся (ставшие ненужными) можно удалить.


На момент удаления оба ордера являются рыночными. Но даже если последний отложенный ордер удалён или сработал, то всё-равно срабатывает его тикет и выдаёт ошибку. А предпоследний так и остаётся висеть.
 
Andreev:

Спасибо за сылку!!! Буду изучать :) С временем, также как и магик номером и по типу ордера (байлимит или селлимит) - хорошая идея. Но Вы, наверное, меня не совсем поняли. У меня проблема не обозначить ордер, а КАК ЕГО УДАЛИТЬ. У меня получается удалить только последний отложенный ордер вне зависимости от того, как я определяю предпоследний.
// ------------------------------------------------Ищете Ваши отложенники---------------------------------

   int orderType;
   for (int orderIndex = (OrdersTotal() - 1); orderIndex >= 0; orderIndex--)
   {
      if (!OrderSelect(orderIndex, SELECT_BY_POS))
      {
         continue;
      }

      if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != MagicNumber))
      {
         continue;
      }

      orderType = OrderType();
      if ((orderType == OP_BUY) || (orderType == OP_SELL))
      {
         continue;
      }
          ticket = OrderTicket( );                         // Номер ордера
          orderLots = OrderLots();                         // Lots   
          
          
          SL =  OrderStopLoss();                           // Значение StopLoss ордера
          TP = OrderTakeProfit();                          // Значение TakeProfit ордера
          
          
             if (ticket>0)                                               // 
                    {
                             while(OrderSelect(ticket,SELECT_BY_TICKET)==false)       // Если ордер выбран
                                 {
                                   Sleep(100);
                                 }
                                  
      
                             OrderDelete(ticket,CLR_NONE); // и удаляете их                       
                     
                            
                    }

       
      return (0);
   }
Как я понял из Вашего первого поста "Использую следующий пример для определения, но закрывает вместо первого только последний отложенный ордер, хотя все условия выполняются для первого отложенного ордера. Помогите найти ошибку!!!!!!!!!!!!!" - Вам необходимо удалить все оставшиеся отложенники, после превраще ния части из них в рыночные ордера - этот код вписываете в Ваши торговые условия и вперед...
 
Roman.:
Как я понял из Вашего первого поста "Использую следующий пример для определения, но закрывает вместо первого только последний отложенный ордер, хотя все условия выполняются для первого отложенного ордера. Помогите найти ошибку!!!!!!!!!!!!!" - Вам необходимо удалить все оставшиеся отложенники, после превраще ния части из них в рыночные ордера - этот код вписываете в Ваши торговые условия и вперед...

Спасибо!!! Не ожидал, что всё так сложно :)))
 
Roman.:
Как я понял из Вашего первого поста "Использую следующий пример для определения, но закрывает вместо первого только последний отложенный ордер, хотя все условия выполняются для первого отложенного ордера. Помогите найти ошибку!!!!!!!!!!!!!" - Вам необходимо удалить все оставшиеся отложенники, после превраще ния части из них в рыночные ордера - этот код вписываете в Ваши торговые условия и вперед...

Думал возможно в пару строк уложиться ... :)
 
Andreev:

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


У меня даже не получается представить, как такое возможно.

Если пересчитав отложенные ордера, Советник не досчитывается одного ордера, то он тотчас отдает команду на удаление оставшихся.

Операция удаления ненужных отложенников обязательно должна предшествовать (стоять до) любой операции на открытие.

 
Roman.:

Как я понял из Вашего первого поста "Использую следующий пример для определения, но закрывает вместо первого только последний отложенный ордер, хотя все условия выполняются для первого отложенного ордера. Помогите найти ошибку!!!!!!!!!!!!!" - Вам необходимо удалить все оставшиеся отложенники, после превраще ния части из них в рыночные ордера - этот код вписываете в Ваши торговые условия и вперед...

// ------------------------------------------------Ищете Ваши отложенники---------------------------------

   int orderType;
   for (int orderIndex = (OrdersTotal() - 1); orderIndex >= 0; orderIndex--)
   {
      if (!OrderSelect(orderIndex, SELECT_BY_POS))
      {
         continue;
      }

      if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != MagicNumber))
      {
         continue;
      }

      orderType = OrderType();
      if ((orderType == OP_BUY) || (orderType == OP_SELL))
      {
         continue;
      }
          ticket = OrderTicket( );                         // Номер ордера
          orderLots = OrderLots();                         // Lots   
          
          
          SL =  OrderStopLoss();                           // Значение StopLoss ордера
          TP = OrderTakeProfit();                          // Значение TakeProfit ордера
          
          
             if (ticket>0)                                               // 
                    {
                             while(OrderSelect(ticket,SELECT_BY_TICKET)==false)       // Если ордер выбран
                                 {
                                   Sleep(100);
                                 }
                                  
      
                             OrderDelete(ticket,CLR_NONE); // и удаляете их                       
                     
                            
                    }

       
      return (0);
   }
Никогда не пробовали коды компактно писать?

Вот ваш же код:

// ------------------------------------------------Ищете Ваши отложенники---------------------------------

   int orderType;
   for (int orderIndex = (OrdersTotal() - 1); orderIndex >= 0; orderIndex--) {
      if (!OrderSelect(orderIndex, SELECT_BY_POS))                            continue;
      if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != MagicNumber)) continue;
      orderType = OrderType();
      if ((orderType == OP_BUY) || (orderType == OP_SELL))                    continue;
      ticket = OrderTicket( );                         // Номер ордера
      orderLots = OrderLots();                         // Lots   
      SL =  OrderStopLoss();                           // Значение StopLoss ордера
      TP = OrderTakeProfit();                          // Значение TakeProfit ордера
      if (ticket>0) {
         while(OrderSelect(ticket,SELECT_BY_TICKET)==false)       // Если ордер выбран
            Sleep(100);
            OrderDelete(ticket,CLR_NONE); // и удаляете их                       
         }
      return (0);
      }
 
Andreev:

Думал возможно в пару строк уложиться ... :)

Ну вот. artmedia70 (24.07.2011 20:01) всё упаковал почти в две строчки. Как Вы и хотели.)))
 

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


OrderSelect(OrdersHistoryTotal()-1, SELECT_BY_POS, MODE_HISTORY);
if ((условие 1)&&(условие 2)&&(OrderCloseTime()!=Time[0]))
 {
 OrderSend...; 
 }

но в тестере, после закрытия ордера условия продолжают выполняться и открывается еще 1 ордер в том же направлении

 
artmedia70:
Никогда не пробовали коды компактно писать?

Вот ваш же код:

Пробовал... :-))) Еще с Паскаля привычка осталась... Читаемость хуже... особливо для не слишком "посвященных"... :-))) Да и отступы нужны в операциях во вложенных циклах и условиях на ширину табуляции, либо 3 пробела - на крайняк...:-)))
 
LazarevDenis:

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


но в тестере, после закрытия ордера условия продолжают выполняться и открывается еще 1 ордер в том же направлении


В помощь - это, также наберите в гугле в поиске - что-то типа: открытие и закрытие одного ордера на одном баре site:mql4.com - и будет Вам Щастье.