Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 65

 

Доброго времени суток всем! Сталкивался ли кто-нибудь из вас с такой проблемой: в реале трал работает а в тестере нет. Вообщем, у меня как раз такая - в тестере, когда советник должен поставить стоп лосс - этого не происходит, однако, периодически все-таки выставляет, но закономерностей я не нашел, естественно из-за этого точность тестов значительно страдает. Тот же советник на демо-депозите показывает, что трал работает. При этом терминал ни о каких ошибках не сообщает. Это ошибка в коде или баг терминала? Помогите разобраться? Перещупал уже весь код и не могу понять в чем дело, менять стратегию трала не хотелось бы. Прикладываю полный код советника, а ниже выложен код самого трала (слегка модифицированный трейлинг по тени свечи Юрия Дзюбана)

void TrailingByShadows(int ticket,int tmfrm,int bars_n, int indent) {  
   int i;
   double new_extremum;

   if ((bars_n<1) || (indent<0) || (ticket==0) || ((tmfrm!=1) && (tmfrm!=5) && (tmfrm!=15) && (tmfrm!=30) && (tmfrm!=60) && (tmfrm!=240) && (tmfrm!=1440) && (tmfrm!=10080) && (tmfrm!=43200)) || (!OrderSelect(ticket,SELECT_BY_TICKET))) {
      Print("Трейлинг функцией TrailingByShadows() невозможен из-за некорректности значений переданных ей аргументов.");
      return(0);
   } 
   if (OrderType()==OP_BUY) {
      for(i=1;i<=bars_n;i++) {
         if (i==1) new_extremum = iLow(Symbol(),tmfrm,i); else if (new_extremum>iLow(Symbol(),tmfrm,i)) new_extremum = iLow(Symbol(),tmfrm,i);
      }  
  
      if ((((new_extremum - indent*Point)>OrderStopLoss() + 1.0 * Point) || (OrderStopLoss()==0)) && ((new_extremum - indent*Point)>OrderOpenPrice()) && (new_extremum - indent*Point<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point) && (getLots(new_extremum) > 0))
      if (!OrderModify(ticket,OrderOpenPrice(),new_extremum-indent*Point,OrderTakeProfit(),OrderExpiration()))
         Print("Не удалось модифицировать ордер №",OrderTicket(),". Ошибка: ",GetLastError());
   }
   if (OrderType()==OP_SELL) {
      for(i=1;i<=bars_n;i++) {
         if (i==1) new_extremum = iHigh(Symbol(),tmfrm,i); else if (new_extremum<iHigh(Symbol(),tmfrm,i)) new_extremum = iHigh(Symbol(),tmfrm,i);
      }         
      if ((((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point)<OrderStopLoss() - 1.0 * Point) || (OrderStopLoss()==0)) && ((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point)<OrderOpenPrice()) && (new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point) && (getLots(new_extremum) > 0))
      if (!OrderModify(ticket,OrderOpenPrice(),new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration()))
         Print("Не удалось модифицировать ордер №",OrderTicket(),". Ошибка: ",GetLastError());     
   }      
}

double getLots(double newSL) {
   int opnTime = 0; // время открытия трейда для цикла пересчета позиций
   double lotSum = 0; 
   for (int i = 0; i <= OrdersTotal()-1; i++) {
      OrderSelect(i, SELECT_BY_POS);     
      if ((OrderOpenTime() > opnTime) && (OrderType() == OP_BUY) || (OrderType() == OP_SELL)) { 
         opnTime = OrderOpenTime(); 
         if (OrderType() == OP_BUY)    { lotSum += OrderLots() * (newSL - OrderOpenPrice()) / Point; }
         if (OrderType() == OP_SELL)   { lotSum -= OrderLots() * (newSL - OrderOpenPrice()) / Point; }
      }
   }   
   return(lotSum);
}
Файлы:
avalanche.mq4  12 kb
 
На каком таймфрейме тестируете и с каким качеством?
 

EURUSD, M1, 99%, 90%

Сначала для тестов использовал стандартную тиковую историю, загруженную с помощью MT, обнаружилась данная проблема, а также необъяснимые пробелы в истории котировок и я перешел на Tick Data Suite, котировки грузил с Dukascopy, качество увеличилось с 90 до 99, но проблема осталась.

ЗЫ: Возможно и в реале такая же ситуация, или я недостаточно долго тестил (где-то 3 недели), за этот период несколько раз приходилось закрывать вручную т.к. трал не ставился, но то я думал было из-за того, что машину с терминалом приходилось отключать периодически и это каким-либо образом повлияло на работу советника, совсем недавно перенес это дело на VPS может быть неделю назад и сейчас похоже вырисовывается такая же ситуация

 

а тестирование производится на таймфрейме, который равен значению переменной tmfrm или нет?

если нет, то стоит убедиться, что в наличии история по tmfrm таймфрейму..

а количество передаваемых баков в переменной bars_n соответствует таймфрейму передаваемому в переменной tmfrm ?

 
keekkenen:

а тестирование производится на таймфрейме, который равен значению переменной tmfrm или нет?

если нет, то стоит убедиться, что в наличии история по tmfrm таймфрейму..

а количество передаваемых баков в переменной bars_n соответствует таймфрейму передаваемому в переменной tmfrm ?


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

ЗЫ: Вот так всегда: из-за какой-то мелочи код работает совсем не так, как хотелось бы.

 

Добрый день! Кто знает, что за чертовщина стала вылезать с красным кирпичом в журнале?!

2013.08.05 08:00:41 '9291791': Signal - not found update signal - 7400 in base

В моём коде всё в порядке! И с сигналами тоже! А это, что означает?

 
Mepkypuu:


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

ЗЫ: Вот так всегда: из-за какой-то мелочи код работает совсем не так, как хотелось бы.


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

а спред фиксируете? а то при прогонах берется текущий, а на новостях и вечером он отличается от дневного.

А как можно зафиксировать спред? Ведь в OrderSend указывается или Ask или Bid.
 
Mepkypuu:

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

То, что Вы назвали Трейлингом, по сути таковым не является, он расчитывается другим способом и и его поведение может быть нелогичным.
 
Leo59:

А как можно зафиксировать спред? Ведь в OrderSend указывается или Ask или Bid.
В тестере под ТФ!
Причина обращения: