Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 475

 
alph:
Подскажите пожалуйста, такой показатель тестера в жизни реален? И хороший это или плохой результат за год с депо 3000$?

Тестер стратегий всегда врет, хоть качество моделирования 99.9%!

 Единственный вариант проверить советника поставить его на впс сервер в реальном времени на демо счет...в Microsoft Azure на месяц дают почти халявный сервак нужен 1$ посмотри на ютубе!...Есть и другие впс сервисы но там 10 дней максимум бесплатного использования.

 

Парни! А можно задать программно в советнике запрет на торговлю вручную?

 

 Подскажите пожалуйста, почему данный блок удаляет все отложенные стоп-ордера по любым символам установленные в терминале, игнорируя magic и _Symbol?

//--------------------------------------------------------------------------------------------------------------
//       Блок удаления отложенников по типу ордера
//--------------------------------------------------------------------------------------------------------------
int dell_ord_by_type(int type_ord, int _magic)
{   
   bool ticketmdf;
   int j;
  
   int orders=OrdersTotal();
   for(int i=0;i<orders;i++)//--- пробежим по списку ордеров
   {     
         if( OrderGetString(ORDER_SYMBOL) ==Symbol() && OrderGetInteger(ORDER_MAGIC)==_magic && OrderGetInteger(ORDER_TYPE) ==type_ord)   
         {  
            if(OrderGetInteger(ORDER_TYPE)==ORDER_TYPE_BUY_STOP || OrderGetInteger(ORDER_TYPE)==ORDER_TYPE_SELL_STOP)
            {       
               for(j=Appempts; j>0; j--) 
               { 
               //----------------------------------------------------------------------
               MqlTradeResult result={0}; 
            MqlTradeRequest request={0};
            request.order=OrderGetTicket(i);
            request.symbol = _Symbol;
            request.magic = _magic;
            request.action=TRADE_ACTION_REMOVE;
            ticketmdf=OrderSend(request,result);
            
                  if(ticketmdf==true)
                  {
                     Print("Успешно удалён ордер");
                     Sleep(2000);
                     break;                    
                  }
                  if(ticketmdf==false)                     
                  {
                     Print("Ошибка при удалении ордера # ",+GetLastError());
                     Sleep(7000);
                  }
               }                            
            }                       
         }                        
   }
   return(true);  
}
 
Aleksandr Prishenko:

 Подскажите пожалуйста, почему данный блок удаляет все отложенные стоп-ордера по любым символам установленные в терминале, игнорируя magic и _Symbol?

1. Ордер нужно вначале выбрать;

2. Цикл нужно строить с последнего ордера, т.е. for( i = orders-1; i >= 0; i-- ) 

 
Aleksandr Prishenko:

 Подскажите пожалуйста, почему данный блок удаляет все отложенные стоп-ордера по любым символам установленные в терминале, игнорируя magic и _Symbol?

Нужно выбирать ордера:

...
   int orders=OrdersTotal();
   for(int i=0;i<orders;i++)//--- пробежим по списку ордеров
     {
      if(OrderSelect(ххх,ххх,хххх)==true)
        {
         if(OrderGetString(ORDER_SYMBOL)==Symbol() && OrderGetInteger(ORDER_MAGIC)==_magic && OrderGetInteger(ORDER_TYPE)==type_ord)
           {
...
 
Vladimir Tkach:

Парни! А можно задать программно в советнике запрет на торговлю вручную?

Конечно нет.
 
Karputov Vladimir:

Нужно выбирать ордера:

Утверждение верное. Реализация - не корректная. Тикет для OrderSelect() где возьмете?
 

так правильно будет?

 Alexey Kozitsyn и Karputov Vladimir спасибо за советы!

int dell_ord_by_type(int type_ord, int _magic)
{   
   bool ticketmdf;
   int j;
 int orders=OrdersTotal();
   for(int i=0;i<orders;i++)//--- пробежим по списку ордеров
   { 
   ResetLastError();    
  ulong ticket=OrderGetTicket(i);
      if(ticket!=0)// если ордер успешно скопирован в кэш, работаем с ним  

      {      
         if( OrderGetString(ORDER_SYMBOL) ==_Symbol && OrderGetInteger(ORDER_MAGIC)==_magic && OrderGetInteger(ORDER_TYPE) ==type_ord)   
         {  
            if(OrderGetInteger(ORDER_TYPE)==ORDER_TYPE_BUY_STOP || OrderGetInteger(ORDER_TYPE)==ORDER_TYPE_SELL_STOP)
            {       
               for(j=Appempts; j>0; j--)
               { 
 

Вам же написали выше: при удалении ордеров цикл должен быть обратным. После удаления ордера индексы оставшихся ордеров смещаются же.

int dell_ord_by_type(int type_ord, int _magic)
{
   ulong nOrderTicket = 0;
   
   for(int i = OrdersTotal() - 1; i >= 0; i--)   //--- пробежим по списку ордеров
   {
      nOrderTicket = OrderGetTicket(i);
        
      if(nOrderTicket > 0 && OrderGetString(ORDER_SYMBOL) == Symbol() && OrderGetInteger(ORDER_MAGIC) == _magic && OrderGetInteger(ORDER_TYPE) == type_ord)   
      {  
         if(OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_BUY_STOP || OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_SELL_STOP)
         {       
            // удаляем
         }
      }
   }
        
   return(0);  
}
 
Кстати, зачем вы объявляете функцию как int, если она в вашем варианте возвращает true, причём всегда? )
Причина обращения: