Нужна помощь в отладке советника

 

Суть данной ТС - отлавливать пересечения линий индикаторов, в данном случае SMA1 & SMA4. Пересечение медленной МА вверх с прохождением заданного количества пунктов - ордер на покупку, обратное пересечение - закрытие длинной позиции и ордер на продажу.

Вручную всё прекрасно получается, если правильно подобрать параметры индикаторов то количество ошибок мало. Но вот в написании советника я забуксовал, даже не знаю что и где я упустил, но ордера на Бай клобасит в тестере со страшной силой. В приложенном видео это видно (Скачать DFFfailed.avi с rapidshare.ru) - после пересечения медленнй МА вверх советник начинает открывать-закрывать позиции без видимой на то причины. Я уже и ограничение на одну открытую позицию прописывал, бесполезно, он ведь всё равно сначала закрывает Бай потом переоткрывает его заново, получается множество ордеров с убытком в пределах -2 .. 0 пипс :(

Понятно что дело в логике работы советника, но я неделю смотрю уже на этот код, глаза замылилися, так сказать. Может кто-то подскажет как ещё можно эти пересечения отловить, чтобы отдера на покупку не сыпались потоком а открывался только один в момент закрытия ордера Селл или сразу после этого? А ведь команды на открытие ордера Селл иногда почему-то правильно срабатывают.

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

Файлы:
 
double lpf0 = iMA(Symbol(),0,slo,0,MODE_SMA,PRICE_CLOSE,0);

double lpf1 = iMA(Symbol(),0,slo,0,MODE_SMA,PRICE_CLOSE,1);

попробуйте

double lpf0 = iMA(Symbol(),0,slo,0,MODE_SMA,PRICE_CLOSE,1);

double lpf1 = iMA(Symbol(),0,slo,0,MODE_SMA,PRICE_CLOSE,2);

Да я тоже хочу торговать на нолевом баре....

 
YOUNGA:
double lpf0 = iMA(Symbol(),0,slo,0,MODE_SMA,PRICE_CLOSE,0);

double lpf1 = iMA(Symbol(),0,slo,0,MODE_SMA,PRICE_CLOSE,1);

попробуйте

double lpf0 = iMA(Symbol(),0,slo,0,MODE_SMA,PRICE_CLOSE,1);

double lpf1 = iMA(Symbol(),0,slo,0,MODE_SMA,PRICE_CLOSE,2);

Да я тоже хочу торговать на нолевом баре....

Да, все хотят торговать на нулевом баре )))

Я вот не понимаю в чём тут проблема, значение Close[0] ведь меняется с каждым новым тиком, почему его нельзя использовать тогда? запаздывание на 1 бар при данной ТС слишком серьезно, сигнал уже может потерять смысл в некоторых случаях, а тогда - убыток.

И да, я пытался бары 1 и 2 подставить, та же самая проблема в диком расколбасе ордеров Бай :( Так что это - не решение. Более того, уже ВСЕ ордера Селл стали убыточны.

 
evillive:

Да, все хотят торговать на нулевом баре )))

Я вот не понимаю в чём тут проблема, значение Close[0] ведь меняется с каждым новым тиком, почему его нельзя использовать тогда? запаздывание на 1 бар при данной ТС слишком серьезно, сигнал уже может потерять смысл в некоторых случаях, а тогда - убыток.

И да, я пытался бары 1 и 2 подставить, та же самая проблема в диком расколбасе ордеров Бай :( Так что это - не решение. Более того, уже ВСЕ ордера Селл стали убыточны.


Мой первый "грааль"
 


О! Точно такой же практически ))) Спасибо, читаю. Жалко в поиске на эту статью не наткнулся. Правда там бОльшая часть статьи про ММ, а хотелось бы про ошибки в алгоритме открытия ордеров больше узнать в этих самых "Граалях". Мне не нужен грааль, мне надо чтобы ордер открывался только один раз после начала новой свечи после пересечения линий индикатора, не штампуя сам себя сотни раз.

А использовать буду не МА, а цифровые фильтры НЧ и ВЧ, они гораздо меньше ложных пересечений дают. Я же точно такую ТС в ручном режиме гоняю, там ведь всё работает нормально, разве никак нельзя это перевести в код?

И почему только Бай повторяется, Селл открывается только ОДИН раз, как и положено???

 
evillive:


О! Точно такой же практически ))) Спасибо, читаю. Жалко в поиске на эту статью не наткнулся. Правда там бОльшая часть статьи про ММ, а хотелось бы про ошибки в алгоритме открытия ордеров больше узнать в этих самых "Граалях". Мне не нужен грааль, мне надо чтобы ордер открывался только один раз после начала новой свечи после пересечения линий индикатора, не штампуя сам себя сотни раз.

А использовать буду не МА, а цифровые фильтры НЧ и ВЧ, они гораздо меньше ложных пересечений дают. Я же точно такую ТС в ручном режиме гоняю, там ведь всё работает нормально, разве никак нельзя это перевести в код?

И почему только Бай повторяется, Селл открывается только ОДИН раз, как и положено???

Из статьи:

"...Тогда он решил более внимательно посмотреть на таймфрейм с отметками открытия и закрытия ордеров и к своему удивлению обнаружил, что его эксперт без всяких на то видимых оснований открывает ордера не только в момент пересечения МА, но и в других местах!..."

------------

Ссылка на статью выше. В статье ответ на Ваш вопрос - но вам лень. Если лень читать..., а программировать не лень... Чукча не читатель, чукча писатель (с)

 
блин вы и тестируете на daily ну тестируйте на минутках а период поставьте 1440 минуты и посмотрите на close(0)(честно хочу помочь)- "начинающему"плохому танцору тестер мешает(поговорка)
 
zxc:

Из статьи:

"...Тогда он решил более внимательно посмотреть на таймфрейм с отметками открытия и закрытия ордеров и к своему удивлению обнаружил, что его эксперт без всяких на то видимых оснований открывает ордера не только в момент пересечения МА, но и в других местах!..."

------------

Ссылка на статью выше. В статье ответ на Ваш вопрос - но вам лень. Если лень читать..., а программировать не лень... Чукча не читатель, чукча писатель (с)


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

Я внимательно прочёл ту статью, не отрицаю, там те же ошибки что и у меня, но решения их я там не увидел. Ну поставил я обнуление этого самого "рес", вписал и кусок кода с проверкой начала нового бара, никаких улучшений.

YOUNGA:
блин вы и тестируете на daily ну тестируйте на минутках а период поставьте 1440 минуты и посмотрите на close(0)(честно хочу помочь)- "начинающему"плохому танцору тестер мешает(поговорка)
В том-то и беда что тестил на всех таймфреймах, то же самое, я же не зря просил помочь найти ошибку в логике кода, до этого чего только не перепробовал. И ещё не совсем понял, зачем тестить ТС предназначенную для среднесрочной торговли на минутном графике, где спред и другие ограничения некоторых ДЦ съедят почти всю прибыль?
 

В общем я решил что действительно не стоит работать с нулевым баром, хоть это и очень заманчивая в плане скорости реагирования на изменение направления тренда стратегия. Увы, таких лисапедов, хоть с педалями, хоть с пропеллером действительно много и ни один не работает как надо :(

Спасибо тем кто откликнулся, а особенно тем кто прошел мимо, ведь именно благодаря им я набираюсь опыта самостоятельно xD

 
extern int Period_MAfast = 1;
extern int Period_MAslow = 4;
extern int Ma_Method = MODE_SMA;
extern int Ma_Price  = PRICE_OPEN;


double detect() {
   double _Ret = 0.0;
   double _Up = 1.0;
   double _Dn = -1.0;
//-----------------   
   double MA_fast_0 = iMA(Symbol(),0,Period_MAfast,0,Ma_Method,Ma_Price,0);
   double MA_fast_1 = iMA(Symbol(),0,Period_MAfast,0,Ma_Method,Ma_Price,1);
   double MA_slow_0 = iMA(Symbol(),0,Period_MAslow,0,Ma_Method,Ma_Price,0);
   double MA_slow_1 = iMA(Symbol(),0,Period_MAslow,0,Ma_Method,Ma_Price,1);
//-----------------   
   if(MA_fast_0 > MA_slow_0 && MA_fast_1 <= MA_slow_1) _Ret = _Up;
   if(MA_fast_0 < MA_slow_0 && MA_fast_1 >= MA_slow_1) _Ret = _Dn;
//-----------------   
   return(_Ret)
}
 
valenok2003:

И чем этот код от моего отличается?

double detect()
{
   RefreshRates();                             
//Free margin check
   int res = 0;
   double lotcost = MarketInfo(Symbol(),MODE_MARGINREQUIRED);// Стоимость 1 лота
    if(AccountFreeMargin()<LotsOptimized()*lotcost) 
      {
         Print("Not enough funds, free margin = ", AccountFreeMargin());
         return(0);
      }
//
     lpf0 = iMA(Symbol(),0,slo,0,mamode_slo,maprice_slo,0);
     lpf1 = iMA(Symbol(),0,slo,0,mamode_slo,maprice_slo,1);
     hpf0 = iMA(Symbol(),0,fast,0,mamode_fast,maprice_fast,0);
     hpf1 = iMA(Symbol(),0,fast,0,mamode_fast,maprice_fast,1);
//-----------------   
   //if(MA_fast_0 > MA_slow_0 && MA_fast_1 <= MA_slow_1) _Ret = _Up;
   //if(MA_fast_0 < MA_slow_0 && MA_fast_1 >= MA_slow_1) _Ret = _Dn;//
   if(hpf1<lpf1 && hpf0>lpf0) res = 1;
   if(hpf1>lpf1 && hpf0<lpf0) res = -1;
   return(res);
}

Переменой мест сравниваемых параметров разве что и применением к цене открытия бара, что даст то же самое зепездывание на 1 бар, как если и выставить смещение МАшки на 1 бар вперед...

Проблему переоткрывания десятков ордеров Бай и Селл это не решает никак, к сожалению :(