Новая версия платформы MetaTrader 4 build 1090 - страница 8

 
FuryS:

Благодарю, помогло! Может подскажете, брокера который торгует через МТ4 на ММВБ?!

Так не бывает

 

терминал альпари к примеру


в визуальном тестировании накладываем шаблон где скажем 5-7 индикаторов,

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


не удаляются !


===========

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


этого сделать не могу .. - в старых билдах можно было...


_____


p.s.

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

 
Здравствуйте. Вопрос по тестеру. Много и основательно тестировал еще на 1010 билде. Котировки закачивал через Tickstiry. Проблем ни каких. Теперь решил перетестировать один из своих советников (изменил условия входа, величину сигнальной свечи). Котировки опять закачал через старую версию Tickstiry. Тестировал с 13 по 18 год, Д1. Начало без проблем. После 17.06.16 г. перестали модифицироваться ордера (до этого было все нормально). Ладно, может глюк, может с котировками что не так, все же старая версия Tickstiry. Решил перетестировать на том периоде где не было проблем, т.е. до 17.06.16 г. И опять под конец тестирования перестали модифицироваться ордера. Ладно может виновата старая версия Tickstiry. Решил перетестировать (на другом терминале), скачав котировки через Сервис терминала (в данном случае качество было не принципиально). Все тоже - с 13 по 18 гг, Д1. И опять под конец тестирования, теперь уже где-то в середине 17 года (точно не запомнил), перестали модифицироваться ордера. В чем проблема?  Советник, в принципе, тот же, что и тестировавшийся на 1010 билде (условия модификации не изменены, только величина сигнальной свечи), работает на реале больше года, а сейчас не могу нормально протестировать.
 
Youri Lazurenko:
Здравствуйте. Вопрос по тестеру. Много и основательно тестировал еще на 1010 билде. Котировки закачивал через Tickstiry. Проблем ни каких. Теперь решил перетестировать один из своих советников (изменил условия входа, величину сигнальной свечи). Котировки опять закачал через старую версию Tickstiry. Тестировал с 13 по 18 год, Д1. Начало без проблем. После 17.06.16 г. перестали модифицироваться ордера (до этого было все нормально). Ладно, может глюк, может с котировками что не так, все же старая версия Tickstiry. Решил перетестировать на том периоде где не было проблем, т.е. до 17.06.16 г. И опять под конец тестирования перестали модифицироваться ордера. Ладно может виновата старая версия Tickstiry. Решил перетестировать (на другом терминале), скачав котировки через Сервис терминала (в данном случае качество было не принципиально). Все тоже - с 13 по 18 гг, Д1. И опять под конец тестирования, теперь уже где-то в середине 17 года (точно не запомнил), перестали модифицироваться ордера. В чем проблема?  Советник, в принципе, тот же, что и тестировавшийся на 1010 билде (условия модификации не изменены, только величина сигнальной свечи), работает на реале больше года, а сейчас не могу нормально протестировать.

Скорее всего проблема в коде советника, а не в тестере. Видимо, в новой версии МТ исправили какую-то ошибку, за счет которой советник ранее работал нормально (терминал не замечал этой ошибки в коде), а теперь ошибка в коде проявилась.

 
Ihor Herasko:

Скорее всего проблема в коде советника, а не в тестере. Видимо, в новой версии МТ исправили какую-то ошибку, за счет которой советник ранее работал нормально (терминал не замечал этой ошибки в коде), а теперь ошибка в коде проявилась.

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

 
Youri Lazurenko:

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

Подскажут только в результате анализа кода. По-другому - никак.

 
Ihor Herasko:

Подскажут только в результате анализа кода. По-другому - никак.

Хорошо. Советник с усреднением. Открытие ордеров рыночное с 0-выми параметрами ТП и, естественно, СЛ. Сама функция модификации, можно сказать, стандартная.

bool OrderModifyX(int tic, 
                  double pr = -1, 
                  double sl = 0, 
                  double tp = 0,
                  datetime expir = 0, 
                  color col = 0)
{
   if(IsStopped())                                                 
   {
      Print("Ошибка: советник остановлен, IsStopped() == true");
      return(false);
   }
   
   int cnt = 0;                                                     
    
   while(!IsTradeAllowed() && cnt < tryCount)                       
   {
      Sleep(500);                                                    
      cnt++;
   } 
   if(!IsTradeAllowed())                                            
   {
      Print("Ошибка: операция недопустима - IsTradeAllowed() == true");
      return(false);
   } 
   
   if(OrderSelect(tic, SELECT_BY_TICKET, MODE_TRADES))           
   {
      string sym = OrderSymbol();
      int dig    = int(MarketInfo(sym, MODE_DIGITS));              

      if(dig > 0)
      {
         pr = NormalizeDouble(pr, dig);               
         sl = NormalizeDouble(sl, dig);
         tp = NormalizeDouble(tp, dig);
      }
   }
   
   int err = GetLastError();                                        
   err = 0;

   bool exit_loop = false;                                         
   bool result    = false;
   
   while(!exit_loop)                                               
   {
      result = OrderModify(tic, pr, sl, tp, expir, col); 
      err = GetLastError();
      
      if (result == true)
         return(true);
      
      switch(err)
      {
         case ERR_NO_ERROR:
         case ERR_NO_RESULT:
            exit_loop = true;
            break;
            
         case ERR_SERVER_BUSY:                          
         case ERR_NO_CONNECTION:                        
         case ERR_INVALID_PRICE:                        
         case ERR_OFF_QUOTES:
         case ERR_TRADE_CONTEXT_BUSY:
         case ERR_TRADE_TIMEOUT:
            cnt++;                                     
            break;                                      
            
         case ERR_PRICE_CHANGED:                        
         case ERR_REQUOTE:   
            RefreshRates();                             
            continue;                                   
         
         default:
            exit_loop = true;
            break;
      }
      if(cnt > tryCount)                                      
      exit_loop = true;
      if(!exit_loop)
      {
         Print("Ошибка! Попыток: "+ IntegerToString(cnt) + "/" + IntegerToString(tryCount));
         Sleep(500);                                                     
         RefreshRates();
      }
      if(exit_loop)
      {
         if(err !=ERR_NO_ERROR && err != ERR_NO_RESULT)
         Print("Ошибка: " + IntegerToString(err));
         Sleep(500);                                                     
         RefreshRates();      
      }
   }
   
   if(err == ERR_NO_RESULT)
   {
      return(true);
   }
   Print("Ошибка открытия ордера после" + IntegerToString(cnt) + "попыток.");
   return(false);   
}

А вот формула усреднения моя (меня не не устраивает традиционная через функцию Profit(). Пришлось повозиться и "налипить" много, чтобы уйти от error 1.

void AverageProfit()
{   
   double SumPriceByu          = 0;
   double SumPriceSell         = 0;
   double AverPriceByu         = 0;
   double AverPriceSell        = 0;
   double SwapBuy              = 0;
   double SwapSell             = 0;
   double pointSwapBuy         = 0;
   double pointSwapSell        = 0;
   int    Total                = OrdersTotal();
   int    NewOrderBuy          = 0;
   int    NewOrderSell         = 0;   
   double TickValue            = MarketInfo(Symbol(),MODE_TICKVALUE);
   static int FirstOrderBuy    = 0;
   static int FirstOrderSell   = 0;
   static double FirstSwapBuy  = 0;
   static double FirstSwapSell = 0;
   double tp;
   int    i, j;
        
   for(i = Total - 1; i >= 0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
         {
            if(OrderType() == OP_BUY)
            {
               SumPriceByu += OrderOpenPrice();
            }
         }
      }
      
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
         {
            if(OrderType() == OP_SELL)
            {
               SumPriceSell += OrderOpenPrice();
            }
         }
      }
   }
   
   for(j = Total - 1; j >= 0; j--)
   {
      if(OrderSelect(j, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
         {
            if(OrderType() == OP_BUY)
            {
               if(MarketInfo(Symbol(), MODE_SWAPLONG) < 0)
               {
                  SwapBuy += MathAbs(OrderSwap());
               }   else SwapBuy = 0;
            }
         }
      }
      
      if(OrderSelect(j, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
         {
            if(OrderType() == OP_SELL)
            {
               if(MarketInfo(Symbol(), MODE_SWAPSHORT) < 0)
               {
                  SwapSell += MathAbs(OrderSwap());
               }   else SwapSell = 0;
            }
         }
      }
   }
   
   if(SumPriceByu > 0)
   {
      AverPriceByu = NormalizeDouble(SumPriceByu/CountBuy(), Digits);
      pointSwapBuy = NormalizeDouble((SwapBuy/(Lots*Koeff*TickValue))*Point, Digits); 
   }
   if(SumPriceSell  > 0)
   {
      AverPriceSell = NormalizeDouble(SumPriceSell/CountSell(), Digits);
      pointSwapSell = NormalizeDouble((SwapSell/(Lots*Koeff*TickValue))*Point, Digits); 
   }
   
   for (i = Total - 1; i >= 0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
         { 
            if(OrderType() == OP_BUY)
            NewOrderBuy++;
         }
      }
      
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
         { 
            if(OrderType() == OP_SELL)
            NewOrderSell++;
         }
      }
   }
   
   if(NewOrderBuy < FirstOrderBuy)
   {
      FirstOrderBuy = 0;  
   }
   if(NewOrderSell < FirstOrderSell)
   {
      FirstOrderSell = 0;
   }
   
   if(SwapBuy < FirstSwapBuy)
   {
      FirstSwapBuy = 0;  
   }
   if(SwapSell < FirstSwapSell)
   {
      FirstSwapSell = 0;
   }
   
   if(CountBuy() >= 1)
   {
      if(NewOrderBuy > FirstOrderBuy)
      {
         for (i = Total - 1;i >= 0; i--)
         {
            if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
            {
               if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
               {
                  if(OrderType() == OP_BUY) 
                  {
                     tp = NormalizeDouble(AverPriceByu + pointSwapBuy + Profit*Point, Digits);
                     OrderModifyX(OrderTicket(), OrderOpenPrice(), 0, tp, 0, 0);
                  }
               }
            }
         }
         FirstOrderBuy = NewOrderBuy;
      }
   }
   
   if(CountSell() >= 1)
   { 
      if(NewOrderSell > FirstOrderSell)
      {
         for (i = Total - 1;i >= 0; i--)
         {  
            if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
            {
               if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
               {     
                  if(OrderType() == OP_SELL)
                  {
                     tp = NormalizeDouble(AverPriceSell - pointSwapSell - Profit*Point, Digits);
                     OrderModifyX(OrderTicket(), OrderOpenPrice(), 0, tp, 0, 0);
                  }
               } 
            }
         }
         FirstOrderSell = NewOrderSell;
      }
   }
   
   if(CountBuy() >= 1)
   {
      if(FirstOrderBuy && SwapBuy > FirstSwapBuy)
      {
         for (i = Total - 1;i >= 0; i--)
         {
            if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
            {
               if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
               {
                  if(OrderType() == OP_BUY) 
                  {
                     tp = NormalizeDouble(AverPriceByu + pointSwapBuy + Profit*Point, Digits);
                     OrderModifyX(OrderTicket(), OrderOpenPrice(), 0, tp, 0, 0);
                  }
               }
            }
         }
         FirstSwapBuy = SwapBuy;
      }
   }
   
   if(CountSell() >= 1)
   { 
      if(FirstOrderSell && SwapSell > FirstSwapSell)
      {
         for (i = Total - 1;i >= 0; i--)
         {  
            if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
            {
               if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
               {     
                  if(OrderType() == OP_SELL)
                  {
                     tp = NormalizeDouble(AverPriceSell - pointSwapSell - Profit*Point, Digits);
                     OrderModifyX(OrderTicket(), OrderOpenPrice(), 0, tp, 0, 0);
                  }
               } 
            }
         }
         FirstSwapSell = SwapSell;
      }
   }
}
 

Что-то нет ответа на мой предыдущий вопрос.

Кстати раньше в тестере на ура работала такая формула, например

 if(body > s_vol*1.5 && BuyCount () == 0)
 {
    ticket = OrderSendX(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "...", Magic, 0, Blue);
         
    if(ticket > 0) 
    {
       SL = NormalizeDouble(Ask - StopLoss1*point, Digits);
       TP = NormalizeDouble(Ask + TakeProfit1*point, Digits);
            
       OrderModifyX(ticket1, OrderOpenPrice(), SL, TP, OrderExpiration(), 0);   
    }
 } 

Теперь модификация, в тестере, происходит через раз, когда модифицируется, когда нет. Может это и примитивно, и с проблемой можно легко справиться с помощью OrderSelect(..., ...) и т.д. Но все же, раньше работало, а сейчас нет.

 
Youri Lazurenko:

Что-то нет ответа на мой предыдущий вопрос.

Кстати раньше в тестере на ура работала такая формула, например

Теперь модификация, в тестере, происходит через раз, когда модифицируется, когда нет. Может это и примитивно, и с проблемой можно легко справиться с помощью OrderSelect(..., ...) и т.д. Но все же, раньше работало, а сейчас нет.

Если основываться только на этом коде, то в глаза бросается следующее: получен тикет ордера и записан в переменную ticket, а модификация происходит ордера с тикетом ticket1. 

Кроме того, не видно, где же выбран ордер. Ведь OrderOpenPrice() и OrderExpiration() возвращают данные для выбранного ордера.

Таким образом, работать приведенный код корректно не может. И раньше не мог работать правильно. 

 
Ihor Herasko:

Если основываться только на этом коде, то в глаза бросается следующее: получен тикет ордера и записан в переменную ticket, а модификация происходит ордера с тикетом ticket1. 

Кроме того, не видно, где же выбран ордер. Ведь OrderOpenPrice() и OrderExpiration() возвращают данные для выбранного ордера.

Таким образом, работать приведенный код корректно не может. И раньше не мог работать правильно. 

"Таким образом, работать приведенный код корректно не может." По логике я с вами согласен. Потому достав с чулана, проверив в тестере, получив вышеописанный результат и придя к тому же выводу что и вы, переделал модификацию через OrderSelect(..., ...) и все стало работать корректно. 

"И раньше не мог работать правильно." Спорить не буду, но данный вариант взят из примеров написания советников (раньше) и, если не ошибаюсь, в тестере работал. Хотя спорить не буду, так как данный вариант на практике не использовал.

Здесь все ясно и проблемы решаются просто, а что с предыдущим (первым) моим вопросом? Этот вариант работал раньше в тестере, работает по сей день на реале, да и в нынешнем билде где-то первые 90% тестирования без проблем. а потом...

P.S. В варианте с ticket проблемы возникли сразу же. И еще не досмотрел, в вашем комментарии, на счет ticket и ticket1. Это когда задавал вопрос и копировал кусочек кода не много исправил, а в OrderModifyX(ticket1,...) не досмотрел, не исправил. В оригинале везде 

ticket1.
Причина обращения: