Адаптивный советник
| |
ivandurak | Дата: Понедельник, 16.11.2009, 19:03 | Сообщение # 16 |
Рядовой
Группа: Проверенные
Сообщений: 17
Статус: Offline
| на сколько удалось понять ваш код функции Analiz(), идет пересчет набора машек ( пусть будет для выработки самой идеи ). Затем считается профит в вашем случае по 1000 сделок для каждой стратегии , возвращается номер стратегии которая принесла макс профит . Имхо не очень , если сделки прокалибровать под постоянный лот , нужно сделать анализ на линейность эквити , к тому же 1000 сделок для ответа многовато .Нечто подобное сам изобретаю , у мну получилось что для анализа достатточно до 100 сделок этот параметр оптимизируется , при условии , что на каждый сигнал открывается по несколку позиций , реальное число сделок для анализа в районе 10-30 .
|
|
| |
vinin | Дата: Понедельник, 16.11.2009, 19:05 | Сообщение # 17 |
Admin
Группа: Администраторы
Сообщений: 299
Статус: Offline
| Quote (ivandurak) на сколько удалось понять ваш код функции Analiz(), идет пересчет набора машек ( пусть будет для выработки самой идеи ). Затем считается профит в вашем случае по 1000 сделок для каждой стратегии , возвращается номер стратегии которая принесла макс профит . Имхо не очень , если сделки прокалибровать под постоянный лот , нужно сделать анализ на линейность эквити , к тому же 1000 сделок для ответа многовато .Нечто подобное сам изобретаю , у мну получилось что для анализа достатточно до 100 сделок этот параметр оптимизируется , при условии , что на каждый сигнал открывается по несколку позиций , реальное число сделок для анализа в районе 10-30 . У меня оптимальное количество сделок получалось 25-30. Но сам анализ ни к черту не годится. Взял для примера самый простой вариант.
|
|
| |
Globe | Дата: Понедельник, 16.11.2009, 19:44 | Сообщение # 18 |
Рядовой
Группа: Проверенные
Сообщений: 13
Статус: Offline
| Quote (vinin) Модуль виртуальной торговли можно полностью заменить. а вот подскажите, ув. Vinin, эти самые модули виртуальной торговли, более рационально заменяющие собой периодическую автооптимизацию (я их назначение сейчас именно так себе представляю) - они могут быть прикручены совершенно к любой ТС или только к самой простой - как на машках, например. Под сложной ТС я подразумеваю полный мультик: несколько фреймов, несколько валют, несколько стратегий, подающих сигналы, динамические стопы, сложным MM. Не превратится ли написание модуля виртуальной торговли для такой ТС в задачу, сопоставимую по трудоемкости с самой ТС? Или можно тут можно вполне обойтись и малой кровью. Не подступался к такому модулю еще - хотелось бы прежде услышать Мнение, стоит ли стремглавь пускаться во все тяжкие?
|
|
| |
vinin | Дата: Понедельник, 16.11.2009, 19:47 | Сообщение # 19 |
Admin
Группа: Администраторы
Сообщений: 299
Статус: Offline
| Quote (Globe) ти самые модули виртуальной торговли, более рационально заменяющие собой периодическую автооптимизацию (я их назначение сейчас именно так себе представляю) - они могут быть прикручены совершенно к любой ТС или только к самой простой - как на машках, например. Под сложной ТС я подразумеваю полный мультик: несколько фреймов, несколько валют, несколько стратегий, подающих сигналы, динамические стопы, сложным MM. Не превратится ли написание модуля виртуальной торговли для такой ТС в задачу, сопоставимую по трудоемкости с самой ТС? Или можно тут можно вполне обойтись и малой кровью. Не подступался к такому модулю еще - хотелось бы прежде услышать Мнение, стоит ли стремглавь пускаться во все тяжкие? Что бы ответить надо знать Вашу ТС. Если есть сигналы на вход и выход то можно сделать аналогичную систему. И особых проблем она не должна вызывать. Логика то уже у Вас есть.
|
|
| |
Globe | Дата: Понедельник, 16.11.2009, 19:56 | Сообщение # 20 |
Рядовой
Группа: Проверенные
Сообщений: 13
Статус: Offline
| Quote (ivandurak) нужно сделать анализ на линейность эквити Алексей, а вот подскажите - каким образом это делаете: 1) в модули виртуальной торговли; 2) в Тестере (в отчете ведь нет показателя, который бы отображал равномерность распределения прибыли по сделкам - вариант посмотреть глазками на кривую не подходит)
|
|
| |
vinin | Дата: Понедельник, 16.11.2009, 20:02 | Сообщение # 21 |
Admin
Группа: Администраторы
Сообщений: 299
Статус: Offline
| Я попытаюсь ответить, хотя и мне задано. Я использую свой критерий оптимизации иногда. Добавляется несколько функций, которые мне делают нужные расчеты. Если результат устраивает, то идет запись в файл. Потом остается файл отчета проанализировать и принять решение. Да, получается менее удобно, но пользоваться можно.
|
|
| |
ivandurak | Дата: Понедельник, 16.11.2009, 20:31 | Сообщение # 22 |
Рядовой
Группа: Проверенные
Сообщений: 17
Статус: Offline
| Вот мой критерий оценки ТС . Работа далеко не окончена . Это пристрелочный вариант , но вполне работоспособна . double AnalisEquty(int magic_analis,int position_analis) { // Должна расчитать качество ТС по последним Totalanalis сделкам по алгоритму 1. формируется массив // по последним Totalanalis сделкам вида сд1,сд1+сд2,сд1+сд2+сд3, и тд 2. По полученному массиву // строится линейная регрессия 2. расчитывается хитрая десперсия (вместо среднего значения берется // линия регрессии) 3. Угол наклона линейной регрессии делим на кол-во сделок (Totalanalis) и на хитрую // дисперсию чем больше получаемое значение, тем лучше качество ТС . double Profit; int x ,i,j ; double Summ_x,Summ_y,Summ_xy,Summ_x_2,b,CumProfit,a,Sredn_y ,AC; double Pi=3.14159265358979 ,Deviation,StdDeviation; for (i=OrdersHistoryTotal()-1 ; i >= 0; i--) // формирование массива последних position_analis сделок { OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) ; if ((OrderType()==OP_BUY || OrderType()==OP_SELL) && OrderMagicNumber()==magic_analis) { if( OrderType() ==OP_BUY ) { Profit=(OrderClosePrice()-OrderOpenPrice())*OrderLots()*AccountLeverage( ) ;}// считаем профиты для лонг if( OrderType() ==OP_SELL ) { Profit=(OrderOpenPrice()-OrderClosePrice())*OrderLots()*AccountLeverage( ) ;}// и шорт позиций Analis[position_analis-j]=Profit ; // в самом большом индексе последняя сделка .Чем меньше индекс тем старше результат сделки. if (j == position_analis) // масив Analis[] на глобальном уровне { break ;} j++ ; } } for (i=1; i < position_analis ;i++) { CumProfit=Analis[i] ; Analis[i]=CumProfit+Analis[i-1]; } // Print("Cумма последних ",position_analis," равна ",Analis[position_analis-1]) ; for ( x=0 ;x < Totalanalis ; x++) // расчет линейной регрессии на массив сделок { Summ_x=Summ_x+x; Summ_y=Summ_y+Analis[x]; Summ_xy=Summ_xy+x*Analis[x]; Summ_x_2=Summ_x_2+MathPow(x,2); } b=((Totalanalis-1)*Summ_xy-Summ_x*Summ_y)/((position_analis-1)*Summ_x_2-MathPow(Summ_x,2)); a=(Summ_y-b*Summ_x)/(position_analis-1); for ( x=0 ;x < position_analis ; x++) // расчет хитрой дисперсии { if ( b >0 ) { AC= MathAbs(Analis[x]-(b*x+a))*MathSin(Pi/2-MathArctan(b)) ; //расстояние от линии лин регрессии до результата сделки } // при положительном угле if ( b<0 ) { AC=MathAbs(Analis[x]-(b*x+a))*MathSin(MathArctan(b)-Pi/2) ; //расстояние от линии лин регрессии до результата сделки } // // при отрицательном угле Deviation=Deviation+ MathPow(AC,2) ; } StdDeviation=MathSqrt(Deviation/position_analis); return((b/position_analis)/StdDeviation*10000) ; // вычисляем коээфициент пригодности // return(b) ; } Добавлено (16.11.2009, 20:31) ---------------------------------------------
Quote (Globe) Не подступался к такому модулю еще - хотелось бы прежде услышать Мнение, стоит ли стремглавь пускаться во все тяжкие? Тут есть примеры виртуальной торговли , можете прикинуть работу http://codebase.mql4.com/ru/ У мну вертуал с ограничением по одному таймфрейму и одному инструменту , с поддержкой торговых функций как в MQL код около 1000 строк .
|
|
| |
vinin | Дата: Понедельник, 16.11.2009, 21:11 | Сообщение # 23 |
Admin
Группа: Администраторы
Сообщений: 299
Статус: Offline
| Расписал функцию фиртуальной торговли //------------------------------------------------------------------ // Функция виртуальной торговли //------------------------------------------------------------------ void VirtualTrade(int pos){ int Id, tmpBar; // формирование массива значений машки на текущем баре (1) и предыдущем for (int i=0;i<N;i++) { if (Bars-pos<MA_Period[i]) continue; MA_Value[i,1]=MA_Value[i,0]; MA_Value[i,0]=iMA(NULL,0,MA_Period[i],0,MA_Mode,MA_Price,pos+1); } // Поиск пересечений for (i=0;i<N-1;i++) { // Проверка на пересечение if ((MA_Value[i,0]-MA_Value[i,1])*(MA_Value[i+1,0]-MA_Value[i+1,1])<0) { // Если одна разница машек положительна, а другая отрицательно то было пересечение машек if (CandleId[i]>=0) { // Проверка были ранее сделки по этой паре Id=i*CountOrder+CandleId[i]; // Расчет индекса массива Candle[Id,3]=Open[pos]; // Цена закрытия виртуальной позиции Candle[Id,7]=Time[pos]; // Время закрытия виртуальной позиции tmpBar=iBarShift(NULL,0,Candle[Id,6]); // Поиск бара открытия виртуальной позиции Candle[Id,1]=High[iHighest(NULL,0,MODE_HIGH,tmpBar-pos,pos)]; // Максимальная цена Candle[Id,2]=Low[ iLowest( NULL,0,MODE_LOW, tmpBar-pos,pos)]; // Минимальная цена } CandleId[i]++; // Увеличиваем Индекс пары if (CandleId[i]==CountOrder) { // Если индекс равен расчетному количеству позиций, CandleId[i]=0; // то начнем сначала bCandle[i]=true; // Отметим, что по данной паре сделан полный расчет (круг прошли) } Id=i*CountOrder+CandleId[i]; // Расчет временного индекса Candle[Id,0]=Open[pos]; // Цена открытия виртуальной позиции Candle[Id,6]=Time[pos]; // Время открытия виртуальной позиции Candle[Id,4]=iif((MA_Value[i,0]-MA_Value[i,1])>0,1,-1); // Тип виртуальной позиции (1 - Бай, -1 - Селл) } } }
|
|
| |
vinin | Дата: Понедельник, 16.11.2009, 21:18 | Сообщение # 24 |
Admin
Группа: Администраторы
Сообщений: 299
Статус: Offline
| Модуль анализа //====================================================================================================== // Функция анализа виртуальной торговли //====================================================================================================== int Analiz(){ // Проверка готовности (по каждой паре машек должен был быть получен сигнал готовности. // Если данных недостаточно, то прервать обработку и вернуть -1 bool bStart=true; for (int i=0;i<N-1;i++) bStart=bStart && bCandle[i]; if (!bStart) return(-1); // Все нормально, проводим анализ int Id; double MaxProfit; for (i=0;i<N-1;i++) { for (int j=0;j<CountOrder;j++) { Id=i*CountOrder+j; // Временный индекс if (Candle[Id,4]>0) { // Сделка БАЙ Profit[i,0]+=(Candle[Id,3]-Candle[Id,0]); // Считаем профит/убыток Profit[i,1]+=(Candle[Id,1]-Candle[Id,0]); // возможная прибыль Profit[i,2]+=(Candle[Id,2]-Candle[Id,0]); // Просадка } else if (Candle[Id,4]<0) { // Сделка СЕЛЛ Profit[i,0]+=(Candle[Id,0]-Candle[Id,3]); // Профит/убыток Profit[i,1]+=(Candle[Id,0]-Candle[Id,2]); // возможная прибыль Profit[i,2]+=(Candle[Id,0]-Candle[Id,1]); // Просадка } } } for (i=0;i<CountOrder;i++) for (j=0;j<3;j++) Profit[i,j]=Profit[i,j]/CountOrder; // считаем среднее // Ищем максимально прибыльную среднюю сделку MaxProfit=Profit[0,0]; Id=0; for (i=1;i<CountOrder;i++) if (MaxProfit<Profit[i][0]) { MaxProfit=Profit[i][0]; Id=i; } // Возвращаем номер найденной пары return(Id); }
|
|
| |
vinin | Дата: Понедельник, 16.11.2009, 21:32 | Сообщение # 25 |
Admin
Группа: Администраторы
Сообщений: 299
Статус: Offline
| Если что в приведенном коде не ясно, то объясню
|
|
| |
rider | Дата: Вторник, 17.11.2009, 00:53 | Сообщение # 26 |
Сержант
Группа: Группа 1
Сообщений: 34
Статус: Offline
| Возможно смысла комментировать и нет, но адаптивности в его, не советнике, подходе больше, чем в виртуализации торговли. Если все правильно понял, про виртуальность, то мы берем две машки (для примера), оптимизируем их параметры на каком-то участке истории до получения "достоверного" результата, а затем используем эти параметры при торговле. Только используются при этом не штатные средства терминала, а специально написанные, не самые простые, функции. И чем это отличается от автооптимизации или той же ручной оптимизации? Где адаптация к текущему состоянию рынка, а не к истории? Сегодня набросок примитивного эксперта сделал. Принцип почти сумасшедший (как и название :)))): - первая поза открывается в направлении Close 2-х последних баров - через заданные интервалы времени анализируется суммарный OrderProfit, если растет - добавляем позицию, начинает падать - закрываем все и открываемся в противоположном направлении Оптимизируемый параметр один - интервал анализа. О прибыльности в таком виде речь не идет. Я к тому, что принцип адаптивности, это, прежде всего, реакция ТС (или обратная связь - недавно уже писал об этом) на текущий рынок, а не на прошлые его состояния. Мне, кажется, что копать нужно в этом направлении. Все что нам нужно, это в каждый момент времени выбрать один из трех вариантов действий: купить-продать-отсидеться на заборе..... история ответа не подскажет. Имхо, разумеется. PS Код на всякий случай выложу. Только не пинайте - все на скорую руку
"А правильно я вчера переделал, то что сделал позавчера?"
|
|
| |
vinin | Дата: Вторник, 17.11.2009, 06:01 | Сообщение # 27 |
Admin
Группа: Администраторы
Сообщений: 299
Статус: Offline
| Для меня адаптация заключается, что для работы ищутся машки, которые в текущий момент дают максимальную прибыльность. На самом делел это сродни оптимизации, но которая делается автоматом в советнике. Я конечно могу и ошибаться. Но опять же механизм принятия решения (какие машки использовать) может быть отличным. А твой советник - родственник Т101. используется аналогичный механизм принятия решений. Можно на его основе сделать следующий вариант.
|
|
| |
rider | Дата: Вторник, 17.11.2009, 07:34 | Сообщение # 28 |
Сержант
Группа: Группа 1
Сообщений: 34
Статус: Offline
| Ловлю на слове Витя, тогда рацуха к виртуализации. Виртуальная торговля используется только при первом запуске для набора необходимой статистики. В дальнейшем для подстройки используются результаты реальной торговли. Правильно? Тогда ничто не мешает при запуске эксперта использовать штатную оптимизацию, только в автоматическом режиме, и использовать ее результаты..... PS Кстати, у меня твой эксперт почему-то не открыл ни одной позы. История глубокая, Альпари.
"А правильно я вчера переделал, то что сделал позавчера?"
|
|
| |
vinin | Дата: Вторник, 17.11.2009, 07:50 | Сообщение # 29 |
Admin
Группа: Администраторы
Сообщений: 299
Статус: Offline
| Но только сперва вариант Алексея Федорова (ivandurak) адаптировать надо еще.
|
|
| |
rider | Дата: Вторник, 17.11.2009, 08:14 | Сообщение # 30 |
Сержант
Группа: Группа 1
Сообщений: 34
Статус: Offline
| Как топикстартер, ты не хочешь эту ветку здесь отрекламировать: http://forum.mql4.com/ru/27523/page11 ?
"А правильно я вчера переделал, то что сделал позавчера?"
|
|
| |
|