![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
leonid553 |
![]()
Сообщение
#11
|
![]() Группа: Активный участник Сообщений: 2 002 Регистрация: 14.4.2006 Из: г.Самара Пользователь №: 28 Спасибо сказали: 11 раз(а) ![]() |
Понятно теперь стало - почему в реале советник с индикатором WPR постоянно сливает!
Я там не предусмотрел, что его шкала находится только в +зоне. И оптимизация , конечно, получилась случайной! Особенно это заметно при оптимизации параметра SL. Сейчас вот исправил в коде условие на вход - и результаты меняются на глазах! Прибыль увеличивается не быстро, зато становится гораздо надежней! Графики идут плавно, без провалов. Кроме того, вспомнилась твоя идея - задавать "запрещенный" диапазоп выходного значения перцептрона. Чтобы советник - в этом диапазоне отдохнул, подумал немного "как дальше с этим жить...". ![]() Вот график оптимизации , GBPUSD, стохастик, M30, с янв. 2007г. Эскизы прикрепленных изображений |
leonid553 |
![]()
Сообщение
#12
|
![]() Группа: Активный участник Сообщений: 2 002 Регистрация: 14.4.2006 Из: г.Самара Пользователь №: 28 Спасибо сказали: 11 раз(а) ![]() |
А вот результат оптимизации от пред. поста
Качество моделирования 89.96% Начальный депозит 1000.00 Чистая прибыль 1736.52 Общая прибыль 2315.04 Общий убыток -578.52 Относительная просадка 15.19% (203.20) Всего сделок 50 Короткие позиции (% выигравших) 28 (82.14%) Длинные позиции (% выигравших) 22 (86.36%) Прибыльные сделки (% от всех) 42 (84.00%) Убыточные сделки (% от всех) 8 (16.00%) Самая большая прибыльная сделка 325.52 убыточная сделка -72.96 Средняя прибыльная сделка 55.12 убыточная сделка -72.31 Максимальное количество непрерывных выигрышей (прибыль) 11 (675.08) непрерывных проигрышей (убыток) 2 (-144.36) Максимальная непрерывная прибыль (число выигрышей) 675.08 (11) непрерывный убыток (число проигрышей) -144.36 (2) Эскизы прикрепленных изображений |
leonid553 |
![]()
Сообщение
#13
|
![]() Группа: Активный участник Сообщений: 2 002 Регистрация: 14.4.2006 Из: г.Самара Пользователь №: 28 Спасибо сказали: 11 раз(а) ![]() |
Не всё, однако, так хорошо!
Результат был получен при оптимизации от 1 янв. до 16 марта. При прогоне до сег. дня - 26 марта - обнаружилось подряд 5 лосей! Стал разбираться - прогнал с 2004 года, результат(фунт, м30): 668 сделок =+375-313, общий профит=+45 пипсов ! Причем короткие 412 сделок, длинные - 276. Обнаружилось вот что: Поскольку в советнике использован вызов стохастика, я взял точку отсчета - среднюю линию стохастика = 50. Но - вот тут и присутствует ошибка! Значения перцептрона у нас в коде заданы либо <50, либо >50, - но при положительной, однополярной шкале стохастика на выходе перцептрона почти всё время будут получаться значения - больше 50-ти (независимо от положения) - это очевидно! И в результате невпопад открываются короткие сделки! Да и значения перцептрона при этом надо задавать либр выше, либо ниже уровней перепроданности/перекупл-ти. Выход - изменить шкалу стохастика на двухполярную. Или брать другой индикатор! |
NoName |
![]()
Сообщение
#14
|
![]() Группа: Активный участник Сообщений: 514 Регистрация: 1.5.2006 Из: Украина, Кременчуг Пользователь №: 146 Спасибо сказали: 0 раз(а) ![]() |
Цитата Поскольку в советнике использован вызов стохастика, я взял точку отсчета - среднюю линию стохастика = 50. Но - вот тут и присутствует ошибка! А нельзя ли сдесь привести код функции Perceptron () ? Не совсем представляю как ты взял эту точку отсчёта от уровня 50. |
leonid553 |
![]()
Сообщение
#15
|
![]() Группа: Активный участник Сообщений: 2 002 Регистрация: 14.4.2006 Из: г.Самара Пользователь №: 28 Спасибо сказали: 11 раз(а) ![]() |
вот так сделал для текущей buy-позиции:
int ticket = -1; // check for opened position - контроль откытых позиций int total = OrdersTotal(); for(int i = 0; i < total; i++) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); // check for symbol & magic number if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { int prevticket = OrderTicket(); // long position is opened - длинная позиция открылась //далее проверяется условие - ЕСЛИ НА МОМЕНТ ОТКРЫТИЯ НОВОГО БАРА ПОЛУЧЕННЫЙ ПРОФИТ //БОЛЬШЕ РАЗМЕРА СТОПЛОССА И ЗНАЧЕНИЕ ПЕРЦЕПТРОНА <50 - ПЕРЕВОРАЧИВАЕМСЯ if(OrderType() == OP_BUY) { // check profit if(Bid > (OrderStopLoss() + (sl * 2 + spread) * Point)) { if(perceptron() < 50) { // reverse ticket = OrderSend(Symbol(), OP_SELL, lots * 2, Bid, 3, Ask + sl * Point, 0, "AI", MagicNumber, 0, Red); Sleep(30000); if(ticket < 0) { prevtime = Time[1]; } else { OrderCloseBy(ticket, prevticket, Blue); } |
leonid553 |
![]()
Сообщение
#16
|
![]() Группа: Активный участник Сообщений: 2 002 Регистрация: 14.4.2006 Из: г.Самара Пользователь №: 28 Спасибо сказали: 11 раз(а) ![]() |
Похоже, я тут вообще не в кон задал
if(perceptron() < 50) - надо подумать здесь! |
NoName |
![]()
Сообщение
#17
|
![]() Группа: Активный участник Сообщений: 514 Регистрация: 1.5.2006 Из: Украина, Кременчуг Пользователь №: 146 Спасибо сказали: 0 раз(а) ![]() |
Цитата Похоже, я тут вообще не в кон задал if(perceptron() < 50) - надо подумать здесь! Конечно не в кон ![]() Ну вобщем не важно уже, ты понял сам в чём дело. Предлагаю проблему решить таким путём: Код double perceptron() { double w1 = x1 - 100; double w2 = x2 - 100; double w3 = x3 - 100; double w4 = x4 - 100; double a1 = iStochastic(NULL,0, Kperiod, Dperiod, slowing, MODE_SMA, 0, MODE_MAIN, 0) - 50; double a2 = iStochastic(NULL,0, Kperiod, Dperiod, slowing, MODE_SMA, 0, MODE_MAIN, 7) - 50; double a3 = iStochastic(NULL,0, Kperiod, Dperiod, slowing, MODE_SMA, 0, MODE_MAIN, 14) - 50; double a4 = iStochastic(NULL,0, Kperiod, Dperiod, slowing, MODE_SMA, 0, MODE_MAIN, 21) - 50; return(w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4); } От значения стохастика отнимаем наш уровень 50 и получаем двухполярный стохастик с областью определения от -50 до +50. Среднюю линию, в таком случае, можно считать равной нулю. |
NoName |
![]()
Сообщение
#18
|
![]() Группа: Активный участник Сообщений: 514 Регистрация: 1.5.2006 Из: Украина, Кременчуг Пользователь №: 146 Спасибо сказали: 0 раз(а) ![]() |
Вот, модернизировал для наглядности
![]() Вверху стандартный, внизу полярный. Индикатор прилагаю: ![]() |
leonid553 |
![]()
Сообщение
#19
|
![]() Группа: Активный участник Сообщений: 2 002 Регистрация: 14.4.2006 Из: г.Самара Пользователь №: 28 Спасибо сказали: 11 раз(а) ![]() |
Благодарю, Андрей.
Вставил этот кусочек кода. чтобы избежать подгонки при оптимизации решил оптимизировать по всей доступной истории. С мая 2004г. закачаны минутки с Альпари по всем тф. А с янв. 2007г - текущие котировки Лайта. Результат получился - от +6000 до +8500 (м30 и н1) Даже "побаловался" с контрольными точками. Не думаю, что на этот раз имеет место подгонка! Три года - это не месяц-два, и подгонка здесь мало вероятна! Причем прибыль идет оч. последовательно вверх, но в неком диапазоне - почти идеальном канале - обозначил на графике баланса зел. линиями. (без ММ) Оч . жаль, однако, что пока внутри этого канала ситуация ещё не определена. Это напоминает мне муравьев - которые тащат соломинку в муравейник. Всякий из нас часто такое наблюдал в детстве. Каждый муравей тянет соломинку в с свою сторону , но в сумме соломинка непостижимом образом всё-таки движется в сторону муравейника! Если взять и разбить этот общий полученный профитный результат по месяцам - то картина не очень впечатляет. Однако в сумме мы имеем достаточно надежный общий профит! Осталось теперь перейти к деталям. И внутри нашего канала свести к минимуму просадку, либо (менее желательно) увеличивать профит. Вот еще проблема, впрочем, небольшая осталась. Эскизы прикрепленных изображений |
leonid553 |
![]()
Сообщение
#20
|
![]() Группа: Активный участник Сообщений: 2 002 Регистрация: 14.4.2006 Из: г.Самара Пользователь №: 28 Спасибо сказали: 11 раз(а) ![]() |
А Проблема вот в чем:
--------------------------------------------------------------------------------- // long position is opened -длинная позиция открылась //далее проверяется условие - ЕСЛИ НА МОМЕНТ ОТКРЫТИЯ НОВОГО БАРА ПОЛУЧЕННЫЙ ПРОФИТ //БОЛЬШЕ РАЗМЕРА СТОПЛОССА И ЗНАЧЕНИЕ ПЕРЦЕПТРОНА <25 - ПЕРЕВОРАЧИВАЕМСЯ if(OrderType() == OP_BUY) { // check profit if(Bid > (OrderStopLoss() + (sl * 2 + spread) * Point)) { if(perceptron() < 25) { // reverse ----------------------------------------------------------------------------------- для короткой позиции , соответственно, наоборот: if(perceptron() > -25) { // reverse Изначально это значение перцептрона было=0, но я для стохастика таким образам обозначил переворот позиции на условных границах зон перекупл/перепрод. И оказалоссь, что на конечном результате эти мои изменения вообще не сказываются! Но ведь должны! Вот только сейчас в коде - в самом конце обнаружилось ещё: } // check for long or short position possibility - возможность контроля длинной/короткой позиции if(perceptron() > 50) { //long ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, 3, Bid - sl * Point, 0, "ST", MagicNumber, 0, Blue); if(ticket < 0) { Sleep(30000); prevtime = Time[1]; } } else { // short ticket = OrderSend(Symbol(), OP_SELL, lots, Bid, 3, Ask + sl * Point, 0, "ST", MagicNumber, 0, Red); if(ticket < 0) { Sleep(30000); prevtime = Time[1]; } } //--- exit return(0); -------------------------------------------------------------------------------- Здесь я забыл поменять. И ещё - мне непонятен механизм входа при самой первой сделке, т.е. при включении советника. А это, между тем, тоже существенно! |
![]() ![]() |
![]() |
Текстовая версия | Сейчас: 13.3.2025, 8:11 |