Советники: Адаптивный советник UmnickTrader - страница 5

 
sts:

Виктор, и последний вопрос - дабы не злоупотреблять Вашей отзывчивостью :)

НЕсимметрия ( -spred*3 и +spred*7 ) с какой целью вводится Вами - не только же для компенсанции спреда, но и что бы увеличить кол-во прибыльных сделок за счет увеличения вероятности срабатывания ТэйкПрофита?


В общем, да - количество сделок тоже увеличивается.

Одновременно, код остаётся достаточно простым.

Другими словами, по "кривой дороге" (спрэд и прочие издержки исполнения перекашивают) логично ехать на "кривом автомобиле" :)

 

Виктор, добрый день! Вас и всех уважаемых присутствующих с Новым Годом!!!

Спасибо за образец красивого и умно написанного кода. +10

Вопросы пока не готов задавать, но буду :)

 

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

         if( resultTransaction > 0 ) 
         {
     // последняя сделка прибыльная
            arrayProfit[currentIndex] = maxProfit-spred*3;
            arrayLoss[currentIndex] = StopBase+spred*7;
         }
         else 
         {
     // последняя сделка убыточная
            arrayProfit[currentIndex] = StopBase-spred*3;
            arrayLoss[currentIndex] = drawDown+spred*7;
     // изменяем направление сделок
            currentBuySell = -currentBuySell;
         }
         if( currentIndex+1 < 8 )
            currentIndex = currentIndex+1;
         else
            currentIndex = 0;

В этом месте заполняются массивы. Это то, что Вы называете адаптацией к рынку. После достижения currentIndex предельного значения переменная равна 0. Получается, что следующие значения будут записаны в начало массивов и тем самым нарушается последовательность записи значений. Необходимо сделать так:

         if( currentIndex+1 < 8 )
            currentIndex = currentIndex+1;
         else
//            currentIndex = 0;
            for( i=0; i<7; i++ ) 
            {
               arrayProfit[i]=arrayProfit[i+1];
               arrayLoss[i]=arrayLoss[i+1];
            }

Вторая ошибка.

   if( GetCountOpenOrders() == 0 ) 
   {
     ....
// открываем позицию
     ....     
     if( GetCountOpenOrders() > 0 ) 
     {
       ....
     }
   }

Следует второй оператор вынести за скобки.

Советник открывает только 1 позицию и не может работать одновременно на разных инструментах. Параметр spred оптимизируется + ТФ. Итого получаем 3 параметра для оптимизации: StopBase, spred и ТФ.

 
kharko:

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

         if( resultTransaction > 0 ) 
         {
     // последняя сделка прибыльная
            arrayProfit[currentIndex] = maxProfit-spred*3;
            arrayLoss[currentIndex] = StopBase+spred*7;
         }
         else 
         {
     // последняя сделка убыточная
            arrayProfit[currentIndex] = StopBase-spred*3;
            arrayLoss[currentIndex] = drawDown+spred*7;
     // изменяем направление сделок
            currentBuySell = -currentBuySell;
         }
         if( currentIndex+1 < 8 )
            currentIndex = currentIndex+1;
         else
            currentIndex = 0;

В этом месте заполняются массивы. Это то, что Вы называете адаптацией к рынку. После достижения currentIndex предельного значения переменная равна 0. Получается, что следующие значения будут записаны в начало массивов и тем самым нарушается последовательность записи значений. Необходимо сделать так:



         if( currentIndex+1 < 8 )
            currentIndex = currentIndex+1;
         else
//            currentIndex = 0;
            for( i=0; i<7; i++ ) 
            {
               arrayProfit[i]=arrayProfit[i+1];
               arrayLoss[i]=arrayLoss[i+1];
            }

Вторая ошибка.



   if( GetCountOpenOrders() == 0 ) 
   {
     ....
// открываем позицию
     ....     
     if( GetCountOpenOrders() > 0 ) 
     {
       ....
     }
   }

Следует второй оператор вынести за скобки.

Советник открывает только 1 позицию и не может работать одновременно на разных инструментах. Параметр spred оптимизируется + ТФ. Итого получаем 3 параметра для оптимизации: StopBase, spred и ТФ.



1 и 2 - это не ошибки. Так и должно быть.

Оптимизируемый параметр один StopBase, остальные константы.

 

Объясните подробнее. 1 ошибка приводит к случайному процессу в выборе ритма. 2 ошибка. Ее влияние не видно при непрерывной работе советника, но реально советник работает с перерывами в работе, а значит параметр isOpenPosition=true будет равным значению по умолчанию, false.

Если при изменении параметра spred данные меняются, то он тоже оптимизируется.

 
kharko:

Объясните подробнее. 1 ошибка приводит к случайному процессу в выборе ритма. 2 ошибка. Ее влияние не видно при непрерывной работе советника, но реально советник работает с перерывами в работе, а значит параметр isOpenPosition=true будет равным значению по умолчанию, false.

Если при изменении параметра spred данные меняются, то он тоже оптимизируется.


1. От перемены мест слагаемых сумма не меняется - нужна только сумма. Последовательность не важна.

2. Для непрерывной работы адаптивного советника необходимо добавить код сохранения/восстановления всех переменных - я выше об этом говорил.

3. Конечно можно оптимизировать все внешние параметры, однако это не нужно. Размер спрэда и так известен заранее - константа. Таймфрейм тоже проще выбрать какой-то один раз и навсегда. Нет никакого смысла терять время на оптимизацию лишних параметров.

 

Виктор, вы присутствуете, практически, на всех серьезных интернет-ресурсах, посвященных форексу. Ваши советники продаются на всех торговых площадках. Аналогов такой рекламной кампании я не припомню. Это нормально. Виден профессиональный подход в деле реализации продукта. Здесь вы выложили бесплатную версию советника. Показали алгоритм идеи.

В советнике реализована канальная стратегия, где ширина канала равна параметру StopBase. Известны 2 вида канальной стратегии: на прорыв границы канала и на отскок от границы. Вам удалось объединить эти стратегии. Все решения о входе в рынок принимаются при пересечении границы канала. Платой за такое объединение есть срабатывание стоплосса и, соответственно, смена направления торговли. Если имеем серию прибыльных сделок, больше 8, то стоплосс = StopBase+spred*7, т.е. допустим рынок пошел против сделки и достиг уровня StopBase, открываем позицию в сторону прибыльных сделок, ведь стоплосс еще не сработал. В рынке 2 позиции.
Возможные варианты:
1. Рынок пошел сторону сделок. Закрываемся с профитом.
2. Сработал стоплосс 1-й сделки - смена направления торговли. Рынок пошел в сторону открытой позиции закрываем 2-ю сделку с профитом. При достижении следующего уровня StopBase - открываем позицию в обратном направлении.
3. Сработал стоплосс 1-й сделки - смена направления торговли. Рынок пошел против открытой позиции. Достиг следующего уровня StopBase - открываем позицию в обратном направлении. Имеем 2 противоположные позиции - лок. Одна из позиций закроется с профитом.
Таким образом, ограничение по количеству открытых позиций можно снять. В результате, смена направления торговли будет с меньшими потерями.

Еще один совет.

bool NextBar()
{
 static double pricePrev;
 bool rt = false;
//---
// double price = (Open[1]+High[1]+Low[1]+Close[1])/4;
 double price = Bid;
 if( MathAbs(price-pricePrev) >= StopBase ) 
 {
   pricePrev = price;
   rt = true;
 }
//---
 return(rt);
}

Т.о. не меняя алгоритм избавляемся от зависимости выбора нужного ТФ.

Удачи.

 
kharko:

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

В полнофункциональных версиях: Адаптивный советник UmnickTrader V2M3P2 и Адаптивный советник UmnickTrader V2M3P3, ограничение на количество открытых позиций снимается другим, более простым способом.

P2 - одновременно 2 открытых позиции.

P3 - одновременно 3 открытых позиции.
Необходимости в большем количестве одновременных позиций я не вижу, но при желании легко делается любое количество.


Пример торговли с тремя позициями "Адаптивный советник UmnickTrader V2M3P3":

Closed Transactions:
Ticket Open Time Type Size Item Price S / L T / P Close Time Price Commission Taxes Swap Profit
62467984 2009.12.20 13:32 balance Deposit 10 000.00
62468599 2009.12.21 00:00 buy 1.00 eurusd 1.43136 1.42053 1.43576 2009.12.21 04:49 1.43576 0.00 0.00 0.00 440.00
62557826 2009.12.21 21:12 buy 1.00 eurusd 1.42803 1.42053 1.43243 2009.12.22 08:40 1.43243 0.00 0.00 -1.10 440.00
62627168 2009.12.22 16:46 buy 1.00 eurusd 1.42448 1.41882 1.42778 2009.12.23 13:53 1.42778 0.00 0.00 -1.20 330.00
62608170 2009.12.22 13:29 buy 1.00 eurusd 1.42803 1.42053 1.43243 2009.12.23 16:21 1.43243 0.00 0.00 -1.20 440.00
62468702 2009.12.21 00:00 buy 1.00 eurusd 1.43136 1.42053 1.44264 2009.12.29 09:44 1.44264 0.00 0.00 -7.20 1 128.00
63033983 2010.01.04 02:01 buy 1.00 eurusd 1.42804 1.42053 1.43244 2010.01.04 09:12 1.43244 0.00 0.00 0.00 440.00
63427863 2010.01.08 13:21 buy 1.00 eurusd 1.42806 1.42053 1.43246 2010.01.08 14:30 1.43246 0.00 0.00 0.00 440.00
0.00 0.00 -10.70 3 658.00
Closed P/L: 3 647.30
Open Trades:
Ticket Open Time Type Size Item Price S / L T / P Price Commission Taxes Swap Profit
No transactions
0.00 0.00 0.00 0.00
Floating P/L: 0.00
Working Orders:
Ticket Open Time Type Size Item Price S / L T / P Market Price
No transactions

Summary:
Deposit/Withdrawal: 10 000.00 Credit Facility: 0.00
Closed Trade P/L: 3 647.30 Floating P/L: 0.00 Margin: 0.00
Balance: 13 647.30 Equity: 13 647.30 Free Margin: 13 647.30

 

Виктор, а объясните, пожалуйста, чем отличаются платные версии советника от выложенной здесь бесплатной?

 
ykochubeev:

Виктор, а объясните, пожалуйста, чем отличаются платные версии советника от выложенной здесь бесплатной?



Базовый алгоритм во всех версиях одинаковый.
Основные отличия:
1. сохраняется/восставливается конфигурация в файл
2. в старших версиях большее количество одновременно открытых позиций
3. в старших версиях техподдержка и консультации в течении 3 месяцев


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


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