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

 

Виктор, здравствуйте!

В рамках int start() имеются две команды : action = "Buy"; action = "Sell"; позиция закрывается только по TP или SL.

А в ф-ии void ActionPosition () предусмотрены еще action == "BuyClose" ; action == "SellClose".

Очень хочется узнать, по каким критериям они ( action == "BuyClose" ; action == "SellClose". ) должны работать ...:)
Может быть их тоже стоит задействовать в данной версии?

 
Blaid73:

Виктор, здравствуйте!

В рамках int start() имеются две команды : action = "Buy"; action = "Sell"; позиция закрывается только по TP или SL.

А в ф-ии void ActionPosition () предусмотрены еще action == "BuyClose" ; action == "SellClose".

Очень хочется узнать, по каким критериям они ( action == "BuyClose" ; action == "SellClose". ) должны работать ...:)
Может быть их тоже стоит задействовать в данной версии?


Эти функции были взяты от другого советника, который просто исполняет внешние торговые команды, поэтому в адаптивном советнике они не используются - нет в этом необходимости.
 
Один из наиболее стабильных вариантов адаптивного советника работает на 15-ти минутках.

Отличие от базового в функции NextBar():
вместо
double price = (Open[1]+High[1]+Low[1]+Close[1])/4;
пишем
double price = (iOpen( NULL, timeframe, 1 )+iHigh( NULL, timeframe, 1 )+iLow( NULL, timeframe, 1 )+iClose( NULL, timeframe, 1 ))/4;
и
extern int timeframe = 240; // период


Символ EURUSD (Euro vs US Dollar)
Период 15 Минут (M15) 2009.01.02 10:00 - 2010.04.26 18:00 (2009.01.01 - 2010.04.30)
Модель Все тики (наиболее точный метод на основе всех наименьших доступных таймфреймов)
Параметры StopBase=0.017; marketOrderOn=false; spred=0.0005; slippage=200; absAmount=1; timeframe=240;

Баров в истории 28967 Смоделировано тиков 13364929 Качество моделирования n/a
Ошибки рассогласования графиков 197

Начальный депозит 10000.00
Чистая прибыль 12682.10 Общая прибыль 27752.60 Общий убыток -15070.50
Прибыльность 1.84 Матожидание выигрыша 186.50
Абсолютная просадка 5889.80 Максимальная просадка 6097.80 (59.74%) Относительная просадка 59.74% (6097.80)

Всего сделок 68 Короткие позиции (% выигравших) 29 (86.21%) Длинные позиции (% выигравших) 39 (89.74%)
Прибыльные сделки (% от всех) 60 (88.24%) Убыточные сделки (% от всех) 8 (11.76%)
Самая большая прибыльная сделка 1685.60 убыточная сделка -2154.00
Средняя прибыльная сделка 462.54 убыточная сделка -1883.81
Максимальное количество непрерывных выигрышей (прибыль) 20 (8502.60) непрерывных проигрышей (убыток) 1 (-2154.00)
Максимальная непрерывная прибыль (число выигрышей) 8731.60 (14) непрерывный убыток (число проигрышей) -2154.00 (1)
Средний непрерывный выигрыш 9 непрерывный проигрыш 1
 
Смотрим, работает ли старый код, на новых данных.

1. Оптимизируем
Период оптимизации 2009.10.01 00:00 - 2009.12.31 18:59

2. Выбираем лучший параметр StopBase=0.009, предложенный оптимизатором

Символ EURUSD (Euro vs US Dollar)
Период 1 Минута (M1) 2009.10.01 00:00 - 2009.12.31 18:59 (2009.10.01 - 2010.01.01)
Модель Все тики (наиболее точный метод на основе всех наименьших доступных таймфреймов)
Параметры StopBase=0.009; marketOrderOn=false; spred=0.0005; slippage=200; absAmount=1; timeframe=240;

Баров в истории 93044 Смоделировано тиков 3146263 Качество моделирования 25.00%
Ошибки рассогласования графиков 0

Начальный депозит 10000.00
Чистая прибыль 4548.80 Общая прибыль 5498.80 Общий убыток -950.00
Прибыльность 5.79 Матожидание выигрыша 168.47
Абсолютная просадка 1176.10 Максимальная просадка 1467.10 (14.26%) Относительная просадка 14.26% (1467.10)

Всего сделок 27 Короткие позиции (% выигравших) 26 (100.00%) Длинные позиции (% выигравших) 1 (0.00%)
Прибыльные сделки (% от всех) 26 (96.30%) Убыточные сделки (% от всех) 1 (3.70%)
Самая большая прибыльная сделка 900.00 убыточная сделка -950.00
Средняя прибыльная сделка 211.49 убыточная сделка -950.00
Максимальное количество непрерывных выигрышей (прибыль) 26 (5498.80) непрерывных проигрышей (убыток) 1 (-950.00)
Максимальная непрерывная прибыль (число выигрышей) 5498.80 (26) непрерывный убыток (число проигрышей) -950.00 (1)
Средний непрерывный выигрыш 26 непрерывный проигрыш 1

3. Проверяем
Период тестирования 2009.10.01 00:00 - 2010.04.30 22:59

Символ EURUSD (Euro vs US Dollar)
Период 1 Минута (M1) 2009.10.01 00:00 - 2010.04.30 22:59 (2009.10.01 - 2010.05.01)
Модель Все тики (наиболее точный метод на основе всех наименьших доступных таймфреймов)
Параметры StopBase=0.009; marketOrderOn=false; spred=0.0005; slippage=200; absAmount=1; timeframe=240;

Баров в истории 214001 Смоделировано тиков 6496748 Качество моделирования 25.00%
Ошибки рассогласования графиков 0

Начальный депозит 10000.00
Чистая прибыль 7859.50 Общая прибыль 14335.00 Общий убыток -6475.50
Прибыльность 2.21 Матожидание выигрыша 115.58
Абсолютная просадка 1176.10 Максимальная просадка 5507.60 (31.48%) Относительная просадка 31.48% (5507.60)

Всего сделок 68 Короткие позиции (% выигравших) 60 (96.67%) Длинные позиции (% выигравших) 8 (62.50%)
Прибыльные сделки (% от всех) 63 (92.65%) Убыточные сделки (% от всех) 5 (7.35%)
Самая большая прибыльная сделка 900.00 убыточная сделка -1466.70
Средняя прибыльная сделка 227.54 убыточная сделка -1295.10
Максимальное количество непрерывных выигрышей (прибыль) 36 (8444.80) непрерывных проигрышей (убыток) 3 (-4223.30)
Максимальная непрерывная прибыль (число выигрышей) 8444.80 (36) непрерывный убыток (число проигрышей) -4223.30 (3)
Средний непрерывный выигрыш 21 непрерывный проигрыш 2

4. "Заработали" после периода оптимизации
7859.50-4548.80 = 3310.7

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

Тест немножко усовершенствованной версии "Адаптивный советник UmnickTrader V3" на периоде 4.5 года.
Оптимизируемый параметр всего один - StopBase.

Символ EURUSD (Euro vs US Dollar)
Период 1 Минута (M1) 2006.01.02 00:51 - 2010.05.11 23:59 (2006.01.01 - 2010.05.12)
Модель Все тики (наиболее точный метод на основе всех наименьших доступных таймфреймов)
Параметры StopBase=0.005; marketOrderOn=false; spred=0.0005; slippage=200; absAmount=1; timeframe=240;

Баров в истории 1453206 Смоделировано тиков 23538591 Качество моделирования 25.00%
Ошибки рассогласования графиков 0

Начальный депозит 10000.00
Чистая прибыль 48460.60 Общая прибыль 277029.60 Общий убыток -228569.00
Прибыльность 1.21 Матожидание выигрыша 47.32
Абсолютная просадка 1902.80 Максимальная просадка 7386.80 (21.01%) Относительная просадка 33.06% (3998.40)

Всего сделок 1024 Короткие позиции (% выигравших) 508 (53.94%) Длинные позиции (% выигравших) 516 (54.65%)
Прибыльные сделки (% от всех) 556 (54.30%) Убыточные сделки (% от всех) 468 (45.70%)
Самая большая прибыльная сделка 524.00 убыточная сделка -503.60
Средняя прибыльная сделка 498.25 убыточная сделка -488.40
Максимальное количество непрерывных выигрышей (прибыль) 10 (4905.60) непрерывных проигрышей (убыток) 6 (-2963.20)
Максимальная непрерывная прибыль (число выигрышей) 4905.60 (10) непрерывный убыток (число проигрышей) -2963.20 (6)
Средний непрерывный выигрыш 2 непрерывный проигрыш 2

 

 
 
marker:

А где продавец советника?:))


В поисковике :)

 

Тест "Адаптивный советник UmnickTrader V3M3P2".
Отличается от "Адаптивный советник UmnickTrader V3" только количеством сделок, т.е. базовые алгоритмы идентичны и не изменялись с момента создания.
Изначальные параметры также не изменялись и переоптимизации не производилось - см. чуть ниже тест версии "Адаптивный советник UmnickTrader V3".


Символ EURUSD (Euro vs US Dollar)
Период 1 Минута (M1) 2010.01.04 00:00 - 2011.01.13 01:09 (2010.01.01 - 2011.02.01)
Модель Все тики (наиболее точный метод на основе всех наименьших доступных таймфреймов)
Параметры StopBase=0.005; marketOrderOn=false; spred=0.0005; slippage=200; absAmount=1; timeframe=240; currentIdOrder="1"; absAmount2=1; absLimit2=0.04; currentIdOrder2="2";

Баров в истории 377686 Смоделировано тиков 11885229 Качество моделирования 25.00%
Ошибки рассогласования графиков 0

Начальный депозит 10000.00
Чистая прибыль 41776.00 Общая прибыль 142389.50 Общий убыток -100613.50
Прибыльность 1.42 Матожидание выигрыша 108.23
Абсолютная просадка 2585.00 Максимальная просадка 10746.00 (30.84%) Относительная просадка 33.47% (3737.00)

Всего сделок 386 Короткие позиции (% выигравших) 200 (49.50%) Длинные позиции (% выигравших) 186 (43.55%)
Прибыльные сделки (% от всех) 180 (46.63%) Убыточные сделки (% от всех) 206 (53.37%)
Самая большая прибыльная сделка 3999.50 убыточная сделка -571.00
Средняя прибыльная сделка 791.05 убыточная сделка -488.42
Максимальное количество непрерывных выигрышей (прибыль) 7 (3553.50) непрерывных проигрышей (убыток) 11 (-5419.00)
Максимальная непрерывная прибыль (число выигрышей) 6476.00 (6) непрерывный убыток (число проигрышей) -5419.00 (11)
Средний непрерывный выигрыш 2 непрерывный проигрыш 2

 

Адаптивный советник UmnickTrader V3

Внимание! Данный исходный код предназначен только для использования в тестере МТ4, но не для реальной торговли. Для реальной торговли необходим специальный дополнительный код здесь отсутствующий.

//+------------------------------------------------------------------+
//|                                                 UmnickTrader.mq4 |
//|                              © 2009 Umnick. All rights reserved. |
//|                                            http://www.umnick.com |
//+------------------------------------------------------------------+
#property copyright "© 2009 Umnick. All rights reserved."
#property link      "http://www.umnick.com"
//---- input parameters
extern double       StopBase=0.0050;
extern bool marketOrderOn = false;                // включить режим открытия сделок по рынку
extern double spred = 0.0005;                     // размер спрэда
extern int slippage = 200;                        // проскальзывание в пунктах
extern double absAmount = 0.1;                    // абсолютный размер лота
extern int timeframe = 240;                       // период
extern string currentIdOrder = "1";               // название ордера в комментарии
#define SIZE_BUF 8
// данные для сохранения в файле конфигурации
int currentBuySell = 1;
double pricePrev = 0;
bool isOpenPosition = false;                      // = true, если есть текущая открытая позиция
int orderTicket = 0;                              // идентификатор последнего ордера
int orderTicket1 = 0;                             // идентификатор 1-го ордера
double openPrice = 0;                             // цена последней открытой позиции
double arrayProfit[SIZE_BUF];
double arrayLoss[SIZE_BUF];
int currentIndex = 0;
double drawDown = 0;
double maxProfit = 0;
bool isSaveTester = false;                      // = true, если файл конфигурации записан тестером
double limit = 0;
double stop = 0;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
{
 int i;
 
 for( i=0; i<SIZE_BUF; i++ ) {
  arrayProfit[i] = StopBase;
  arrayLoss[i] = StopBase;
 }
 return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{
 return(0);
}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
 string action = "";
 double sumProfit = 0., sumLoss = 0.;
 int i;
 
 if( IsTradeAllowed() == false )
  return;
 if( limit == 0. )
  limit = StopBase;
 if( stop == 0. )
  stop = StopBase;
 CalcDrawDown( currentIdOrder );
 
 if( NextBar() == true ) {
  // разрешение на анализ при открытии следующей позиции
  if( GetCountOpenOrders( currentIdOrder ) == 0 ) {
   // открытых позиций нет - проверяем результат последней сделки
   
   int resultTransaction = GetResultTransaction();
   if( isOpenPosition == true ) {
    // позиция была открыта - закрылась
    isOpenPosition = false;
    if( resultTransaction > 0 ) {
     // последняя сделка прибыльная
     arrayProfit[currentIndex] = maxProfit;
     arrayLoss[currentIndex] = StopBase;
    }
    else
    if( resultTransaction < 0 ) {
     // последняя сделка убыточная
     arrayProfit[currentIndex] = StopBase;
     arrayLoss[currentIndex] = drawDown;
     // изменяем направление сделок
     currentBuySell = -currentBuySell;
    }
    if( currentIndex+1 < SIZE_BUF )
     currentIndex = currentIndex+1;
    else
     currentIndex = 0;
   }
   // вычисляем лимиты и стопы
   sumProfit = 0.;
   sumLoss = 0.;
   for( i=0; i<SIZE_BUF; i++ ) {
    sumProfit = sumProfit+arrayProfit[i];
    sumLoss = sumLoss+arrayLoss[i];
   }
   if( sumProfit > StopBase/2 )
    limit = sumProfit/SIZE_BUF;
   if( sumLoss > StopBase/2 )
    stop = sumLoss/SIZE_BUF;
   // открываем новую позицию
   if( currentBuySell == 1 )
    action = "Buy";
   else
    action = "Sell";
   limit = MathMax(spred*2,limit);
   ActionPosition( action, currentIdOrder, absAmount, limit, stop );
   if( GetCountOpenOrders( currentIdOrder ) > 0 ) {
    // позиция открылась
    orderTicket1 = orderTicket;
    isOpenPosition = true;
    maxProfit = 0;
    drawDown = 0;
   }
  }
 }
 else {
  if( IsOptimization() == false && IsTesting() == false && isSaveTester == true && isOpenPosition == true ) {
   if( GetCountOpenOrders( currentIdOrder ) == 0 ) {
    // если в тестере была открыта позиция, то переоткрываем её на графике
    // открываем новую позицию с корректированными лимит и стоп
    RefreshRates();
    if( currentBuySell == 1 ) {
     action = "Buy";
     limit = MathMax(spred*2,limit-(Ask-openPrice));
     stop = stop+(Ask-openPrice);
    }
    else {
     action = "Sell";
     limit = MathMax(spred*2,limit+(Bid-openPrice));
     stop = stop-(Bid-openPrice);
    }
    ActionPosition( action, currentIdOrder, absAmount, limit, stop );
    if( GetCountOpenOrders( currentIdOrder ) > 0 ) {
     // позиция открылась
     orderTicket1 = orderTicket;
     isOpenPosition = true;
     maxProfit = 0;
     drawDown = 0;
    }
   }
  }
 }
 return(0);
}
//+------------------------------------------------------------------+
bool NextBar()
{
 bool rt = false;
 double price = (iOpen( NULL, timeframe, 1 )+iHigh( NULL, timeframe, 1 )+iLow( NULL, timeframe, 1 )+iClose( NULL, timeframe, 1 ))/4;
 if( MathAbs(price-pricePrev) >= StopBase ) {
  pricePrev = price;
  rt = true;
  if( IsOptimization() == false && IsTesting() == false )
   Print("NextBar ", price);
 }
 return(rt);
}
int GetCountOpenOrders( string idSignal )
{
 int j, count;
 
 count = 0;
 for( j=0; j<OrdersTotal(); j++) {
  if( OrderSelect( j, SELECT_BY_POS, MODE_TRADES ) ) {
   if( Symbol() == OrderSymbol() && idSignal == OrderComment()  ) {
    count = count+1;
   }
  }
 }
 return(count);
}
double GetResultTransaction()
// > 0 - позиция закрылась в прибыль
// < 0 - позиция закрылась в убыток
{
 int res = 0;
 if( OrderSelect( orderTicket1, SELECT_BY_TICKET, MODE_HISTORY ) ) {
  res = OrderProfit();
  Print("ResTran ", orderTicket1, " ", res);
 }
 return(res);
}
void CalcDrawDown( string idSignal )
{
 int j, order, typeOrder;
 
 for( j=0; j<OrdersTotal(); j++) {
  if( OrderSelect( j, SELECT_BY_POS, MODE_TRADES ) ) {
   if( Symbol() == OrderSymbol() && idSignal == OrderComment()  ) {
    typeOrder = OrderType();
    openPrice = OrderOpenPrice();
    if( typeOrder == OP_BUY ) {
     RefreshRates();
     if( maxProfit < High[0]-openPrice )
      maxProfit = High[0]-openPrice;
     if( drawDown < openPrice-Low[0] )
      drawDown = openPrice-Low[0];
    }
    if( typeOrder == OP_SELL ) {
     RefreshRates();
     if( maxProfit < openPrice-Low[0] )
      maxProfit = openPrice-Low[0];
     if( drawDown < High[0]-openPrice )
      drawDown = High[0]-openPrice;
    }       
   }
  }
 }
}
void ActionPosition( string action, string idSignal, double amount, double limit, double stop )
{
 int i, j, typeOrder;
 double price = 0., nAsk = 0., nBid = 0.;
 
 if( action == "Buy" ) {
  // покупаем
  for( i=0; i<7; i++ ) {
   if( IsTradeAllowed() ) {
    RefreshRates();
    nAsk = Ask;
    if( IsOptimization() || IsTesting() )
     nAsk = NormalizeDouble(nAsk, MarketInfo(Symbol(), MODE_DIGITS));
    if( marketOrderOn == false )
     orderTicket = OrderSend( Symbol(), OP_BUY, amount, nAsk, slippage, NormalizeDouble(nAsk-stop, MarketInfo(Symbol(), MODE_DIGITS)), NormalizeDouble(nAsk+limit, MarketInfo(Symbol(), MODE_DIGITS)), idSignal, 0, 0, CLR_NONE );
    else {
     // открываемся по цене рынка
     orderTicket = OrderSend( Symbol(), OP_BUY, amount, nAsk, slippage, 0, 0, idSignal, 0, 0, CLR_NONE );
     if( orderTicket > 0 ) {
      OrderSelect( orderTicket, SELECT_BY_TICKET );
      OrderModify( orderTicket, OrderOpenPrice(), NormalizeDouble(nAsk-stop, MarketInfo(Symbol(), MODE_DIGITS)), NormalizeDouble(nAsk+limit, MarketInfo(Symbol(), MODE_DIGITS)), 0, CLR_NONE );
     }
    }
    if( orderTicket <= 0 )
     Print("Ошибка: ",GetLastError());  
    else {
     Print( "Купили "+Symbol()+" id="+idSignal+" stop="+stop+" limit="+limit+" amount="+amount );
     PlaySound("ok.wav");
     return( 0 );
    }
   }       
   Sleep( 10000 );
  }   
  Print( "Ошибка открытия позиции "+Symbol()+" id="+idSignal+" stop="+stop+" limit="+limit );
  PlaySound( "disconnect.wav" );
 }
 else
 if( action == "Sell" ) {
  // продаём
  for( i=0; i<7; i++ ) {
   if( IsTradeAllowed() ) {
    RefreshRates();
    nBid = Bid;
    if( IsOptimization() || IsTesting() )
     nBid = NormalizeDouble(nBid, MarketInfo(Symbol(), MODE_DIGITS));
    if( marketOrderOn == false )
     orderTicket = OrderSend( Symbol(), OP_SELL, amount, nBid, slippage, NormalizeDouble(nBid+stop, MarketInfo(Symbol(), MODE_DIGITS)), NormalizeDouble(nBid-limit, MarketInfo(Symbol(), MODE_DIGITS)), idSignal, 0, 0, CLR_NONE );
    else {
     // открываемся по цене рынка
     orderTicket = OrderSend( Symbol(), OP_SELL, amount, nBid, slippage, 0, 0, idSignal, 0, 0, CLR_NONE );
     if( orderTicket > 0 ) {
      OrderSelect( orderTicket, SELECT_BY_TICKET );
      OrderModify( orderTicket, OrderOpenPrice(), NormalizeDouble(nBid+stop, MarketInfo(Symbol(), MODE_DIGITS)), NormalizeDouble(nBid-limit, MarketInfo(Symbol(), MODE_DIGITS)), 0, CLR_NONE );
     }
    }
    if( orderTicket <= 0 )
     Print("Ошибка: ",GetLastError());  
    else {
     Print( "Продали "+Symbol()+" id="+idSignal+" stop="+stop+" limit="+limit+" amount="+amount );
     PlaySound("ok.wav");
     return( 0 );
    }
   }       
   Sleep( 10000 );
  }   
  Print( "Ошибка открытия позиции "+Symbol()+" id="+idSignal+" stop="+stop+" limit="+limit );
  PlaySound( "disconnect.wav" );
 }
}

Оптимизации в 2010 году не было, параметры используются старые - см. ниже тесты "Адаптивный советник UmnickTrader V3".

Символ EURUSD (Euro vs US Dollar)
Период 1 Минута (M1) 2010.01.04 00:00 - 2011.01.31 08:31 (2010.01.01 - 2011.02.01)
Модель Все тики (наиболее точный метод на основе всех наименьших доступных таймфреймов)
Параметры StopBase=0.005; marketOrderOn=false; spred=0.0005; slippage=200; absAmount=1; timeframe=240; currentIdOrder="1";

Баров в истории 382884 Смоделировано тиков 12330887 Качество моделирования 25.00%
Ошибки рассогласования графиков 0

Начальный депозит 10000.00
Чистая прибыль 17674.70 Общая прибыль 82520.10 Общий убыток -64845.40
Прибыльность 1.27 Матожидание выигрыша 59.51
Абсолютная просадка 1214.00 Максимальная просадка 4815.00 (22.07%) Относительная просадка 23.14% (4124.80)

Всего сделок 297 Короткие позиции (% выигравших) 156 (57.69%) Длинные позиции (% выигравших) 141 (53.19%)
Прибыльные сделки (% от всех) 165 (55.56%) Убыточные сделки (% от всех) 132 (44.44%)
Самая большая прибыльная сделка 512.40 убыточная сделка -507.10
Средняя прибыльная сделка 500.12 убыточная сделка -491.25
Максимальное количество непрерывных выигрышей (прибыль) 9 (4512.10) непрерывных проигрышей (убыток) 8 (-3941.20)
Максимальная непрерывная прибыль (число выигрышей) 4512.10 (9) непрерывный убыток (число проигрышей) -3941.20 (8)
Средний непрерывный выигрыш 2 непрерывный проигрыш 2


 

Адаптивный...
У авторов мозг адаптивный, а не советник. Простой подгон параметров на определенный промежуток времени. У меня база данных по сделкам, в определенные периоды (3-4 месяца) допускаемая просадка может составлять 1-2%, в гору лезет будь здоров! А потом бац и пипец (то есть одновременно и бац и пипец).
Здесь проблема в том, что когда советник тестит период с обученной выборкой, ОН НЕ ИДЕТ ПО ТЕМ ЖЕ СЛЕДАМ. То есть там где советник запретил сделку, остается пустое пространство в котором откроется другая сделка, и вот вам сдрасьте новая ситуация.
Так что ничего высоконаучного здесь нет, а в получении патентов усматриваю либо мухлеж (может они и есть, но явно не для автоматической торговли в метатрейдере), либо завышенную самооценку голодных аспирантов

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