MQL4 - automated forex trading   /  

Code Base

Code Base  Советники  МTC "Сombo" Авторизуйтесь или зарегистрируйтесь, чтобы добавить новый код

Этот индикатор для
MetaTrader 4

Мобильный трейдинг!
Купите лицензию и торгуйте мобильно

Имя:
МTC "Сombo" [ en ]
Автор: Reshetov (27.02.2008 09:54)
Рейтинг: 9
Скачано: 8604
Скачать:
 Combo_Right.mq4 (4.6 Kb) View
Постановка задачи для данной МТС звучит так:

Пусть у нас есть некая базовая торговая система - БТС. Необходимо
спроектировать и обучить нейросеть таким образом, чтобы она могла
делать то, на что неспособна БТС. В результате чего должна получиться
торговая система из двух комбинированных и взаимнодополняющих друг
друга БТС и НС.

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

Если у нас есть трендовая ТС, то необходимо обучить нейросеть только
контртрендовой стратегии. Потому что, система предназначенная для
трендов не в состоянии адекватно торговать в трендах боковых, распознавать
откаты или развороты. Можно, конечно взять две МТС, одну потрендовую, вторую контртрендовую и поставить торговать на один чарт. Но с другой стороны, также можно и обучить нейронную сеть дополнять какую либо торговую систему.

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

  1. Вход в рынок длинной позицией
  2. Вход в рынок короткой позицией
  3. Неопределенное состояние

Собственно третье состояние - это передача управления БТС, в то время, как в первых двух торговые сигналы выдаются нейросетью.

Обучение нейросети разделено на три этапа, на каждом из которых
обучается один перцептрон. И на любом этапе обязательно присутствует
оптимизированная БТС, чтобы перцептроны знали, на что она способна.

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

Но самый первый этап, предваряющий обучение НС, состоит в оптимизации БТС.

Чтобы не запутаться, номер этапа заносится во входной параметр МТС c
идентификатором - pass. А идентификаторы входных параметров,
соответствующих номеру этапа заканчиваются на число равное этому самому
номеру.

Итак, предварительная подготовка к оптимизации и обучению НС. В в
тестере в свойствах эксперта, вкладка "Тестирование" установим
начальный депозит $1000000 (так, чтобы не создать искуственного
маржинколла во время оптимизации), оптимизируемый параметр "Balance" и
включим генетический алгоритм.

Переходим во вкладку "Входные параметры" свойств советника.
Устанавливаем размер лота открываемых позиций, присвоив идентификатору
lots значение 1.

Оптимизацию будем проводить по модели: "По ценам открытия (Быстрый метод на сформировавшихся барах, только для советников с явным контролем открытия баров).", поскольку такой контроль в алгоритме МТС присутствует.

Первый этап оптимизации. Оптимизация БТС:

Входному параметру pass устанавливаем значение 1.
Оптимизируем только входные параметры соответствующие первому этапу,
все идентификаторы которых заканчиваются единичкой, а следовательно
устанавливаем только на них галочки, оптимизации, и удаляем галочки со
всех остальных параметров.

tp1 - тейкпрофит БТС. Оптимизируется значениями от 10 до 100 с шагом 1
sl1 - стоплосс БТС. Оптимизируется значениями от 10 до 100 с шагом 1
p1 - период осциллятора CCI, который применяется в БТС. Оптимизируется значениями от 3 до 100 с шагом 1

После оптимизации БТС получаем результаты:


Второй этап. Обучение перцептрона отвечающего за короткие позиции:

Входному параметру pass придаем значение 2, т.е. соответствующее номеру этапа.
Убираем галочки оптимизации, выставленные на предыдущем этапе. Сохраняем, на всякий случай входные параметры, полученные на предыдущем этапе в файл.

Устанавливаем галочки оптимизации для параметров второго этапа, т.е. идентификаторы которых заканчиваются двойкой:

x12, x22, x32, x42 - весовые коэффициенты перцептрона, распознающего короткие позиции. Оптимизируются значениями от 0 до 200 с шагом 1.
tp2 - тейкпрофит позиций, открываемых перцептроном. Оптимизируется значениями от 10 до 100 с шагом 1
sl2 - стоплосс позиций, открываемых перцептроном. Оптимизируется значениями от 10 до 100 с шагом 1
p2 - период значений разницы цен, который анализируется перцептроном. Оптимизируется значениями от 3 до 100 с шагом 1.

Запустим обучение через оптимизацию ГА. По завершении получаем результаты:

Третий этап. Обучение перцептрона отвечающего за длинные позиции:

Входному параметру pass придаем значение 3, т.е. соответствующее номеру этапа.
Убираем галочки оптимизации, выставленные на предыдущем этапе.
Сохраняем, на всякий случай входные параметры, полученные на предыдущем
этапе в файл.

Устанавливаем галочки оптимизации для параметров второго этапа, т.е. идентификаторы которых заканчиваются тройкой:

x13, x23, x33, x43 - весовые коэффициенты перцептрона, распознающего длинные позиции. Оптимизируются значениями от 0 до 200 с шагом 1.
tp3 - тейкпрофит позиций, открываемых перцептроном. Оптимизируется значениями от 10 до 100 с шагом 1
sl3 - стоплосс позиций, открываемых перцептроном. Оптимизируется значениями от 10 до 100 с шагом 1
p3 - период значений разницы цен, который анализируется перцептроном. Оптимизируется значениями от 3 до 100 с шагом 1.

Запустим обучение через оптимизацию ГА. По завершении получаем результаты:



Завершающий четвертый этап. Обучение первого слоя, т.е. перцептрона, который находится в верхнем слое:

Входному параметру pass придаем значение 4, т.е. соответствующее номеру этапа.
Убираем галочки оптимизации, выставленные на предыдущем этапе.
Сохраняем, на всякий случай входные параметры, полученные на предыдущем
этапе в файл.

Устанавливаем галочки оптимизации для параметров второго этапа, т.е. идентификаторы которых заканчиваются четверкой:

x14, x24, x34, x44 - весовые коэффициенты перцептрона первого слоя. Оптимизируются значениями от 0 до 200 с шагом 1.
p4 - период значений разницы цен, который анализируется перцептроном. Оптимизируется значениями от 3 до 100 с шагом 1.

Запустим обучение через оптимизацию ГА. По завершении получаем результаты:


Все, нейронная сеть обучена.

У МТС есть еще один неоптимизируемый входной параметр mn - магический номер, т.е. идентификатор позиций, чтобы торговая система не путала свои ордера с ордерами открытыми вручную или другими МТС. Значение магического номера должно быть уникальным и не совпадать с магическими номерами позиций которые не были открыты данным советником.

P.S.

  • Размер начального депозита определяется как абсолютная просадка умноженная на два, т.е. с запасом прочности.
  • Советник в исходниках не оптимизирован
  • Если возникнет необходимость заменить встроенную БТС , алгоритмом другой торговой системы, то необходимо изменить содержимое функции basicTradingSystem()
  • Чтобы не вводить вручную начальные, конечные значения и размеры шагов оптимизации, можно взять готовый файл combo.set и поместив его в папку \tester MT4, загрузить в свойствах советника в тестере.

  • Переоптимизация советника выполняется в выходные, т.е. в субботу или (либо) в воскресенье, но только в том случае, если результаты предыдущей недели были убыточными. Наличие убытков говорит, что рынок изменился и необходима переоптимизация. Наличие прибыли, говорит о том, что МТС не нуждается в переоптимизации и достаточно хорошо распознает рыночные паттерны
К сожалению? в начальную, выложенную здесь версию исходников закралась досадная ошибка: одна из закрывающихся фигурных скобок стояла не на месте, из-за чего 4 этап обучался и интерпретировался не корректно. Просьба ко всем, кто скачал файл Combo.mq4 обновиться до версии Combo_Right.


43 комментария: 1 2 3 4 5   Авторизуйтесь или зарегистрируйтесь, чтобы добавить новый комментарий

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

19.03.2008 10:15 ArTrader
Добавил в базовую фильтр из iAO и ограничил время открытия позиций днём, добавил ММ. Результат на тестах стал немного лучше. Поставил советника на демо по 4 парам. 1 день работы результат убыточный. Посмотрю что будет дальше.
Пробовал трейлинг прикручивать результат ухудшался по этому решил "нафига козе баян". С такими небольшими тейками нет смысла трейлинговать.
17.03.2008 22:12 Ugar
спасибо за твой не простой труд по зарабатыванию но лохов становиться все меньше и меньше.
17.03.2008 16:55 ilnar_s

Неужели вы наивные думаете что господин Решетов выложит на шару что то реальное?? Во первых у него ничего нет такого. Во вторых он выкладывает всё сливное г.......

12.03.2008 10:46 Winner
Всем, кто скачал исходники МТС "Combo" просьба обновиться до версии Combo_Right. В прежней версии была обнаружена ошибка.

Подробности 'Всем, кто скачал исходники МТС "Combo" просьба обновиться до версии Combo_Right. В прежней версии была обнаружена ошибка.'


04.03.2008 15:23 Reshetov

Потестил на реале и на демо. К сожелению сливает потихоньку. :(

Насколько я сумел почуствовать у нейро сетей нет будущего. Они черезчур сильно зависимы от того будет ли рынок вести себя также как на том моменте на котором обучались. Это неподходит для торговли на форексе. Больше никаких нейро сетей!

03.03.2008 18:17 AntS
По форвард тестам и предварительному трейдингу на демо советник имеет большие перспективы. Работает очень стабильно. Огромная благодарность разработчику!
03.03.2008 13:57 Driskal
//+------------------------------------------------------------------+
//| TrailingStairs.mq4 |
//| I_D |
//| http://www.mymmk.com/ |
//+------------------------------------------------------------------+
#property copyright "I_D"
#property link "http://www.mymmk.com/ Софт для управления капиталом"

extern int iTicket; // уникальный номер (тикет) открытой позиции
extern int iTrl_dist_1 = 30; // исходное расстояние трейлинга (пунктов) (не меньше MarketInfo(Symbol(),MODE_STOPLEVEL), больше trl_dist_2 и trl_dist_3);
extern int iLevel_1 = 50; // уровень профита (пунктов), при достижении которого дистанция трейлинга будет сокращена с trl_dist_1 до trl_dist_2 (меньше level_2; больше trl_dist_1);
extern int iTrl_dist_2 = 20; // расстояние трейлинга (пунктов) после достижения курсом уровня профита в level_1 пунктов (не меньше MarketInfo(Symbol(),MODE_STOPLEVEL));
extern int iLevel_2 = 70; // уровень профита (пунктов), при достижении которого дистанция трейлинга будет сокращена с trl_dist_2 до trl_dist_3 пунктов (больше trl_dist_1 и больше level_1);
extern int iTrl_dist_3 = 10; // расстояние трейлинга (пунктов) после достижения курсом уровня профита в level_2 пунктов (не меньше MarketInfo(Symbol(),MODE_STOPLEVEL)).

//+------------------------------------------------------------------+
//| ТРЕЙЛИНГ СТАНДАРТНЫЙ-ЗАТЯГИВАЮЩИЙСЯ ("УДАВКА") |
//| Эксперту передаётся тикет позиции, исходный трейлинг (пунктов) и |
//| 2 "уровня" (значения профита, пунктов), при которых трейлинг |
//| сокращаем, и соответствующие значения трейлинга (пунктов) |
//| Пример: исходный трейлинг 30 п., при +50 - 20 п., +80 и больше - |
//| на расстоянии в 10 пунктов. |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
return(0);
}

//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
return(0);
}

//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
TrailingUdavka(iTicket,iTrl_dist_1,iLevel_1,iTrl_dist_2,iLevel_2,iTrl_dist_3);
return(0);
}
//+------------------------------------------------------------------+

void TrailingUdavka(int ticket,int trl_dist_1,int level_1,int trl_dist_2,int level_2,int trl_dist_3)
{

double newstop = 0; // новый стоплосс
double trldist; // расстояние трейлинга (в зависимости от "пройденного" может = trl_dist_1, trl_dist_2 или trl_dist_3)

// проверяем переданные значения
if ((trl_dist_1<MarketInfo(Symbol(),MODE_STOPLEVEL)) || (trl_dist_2<MarketInfo(Symbol(),MODE_STOPLEVEL)) || (trl_dist_3<MarketInfo(Symbol(),MODE_STOPLEVEL)) ||
(level_1<=trl_dist_1) || (level_2<=trl_dist_1) || (level_2<=level_1) || (ticket==0) || (!OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)))
{
Print("Трейлинг функцией TrailingUdavka() невозможен из-за некорректности значений переданных ей аргументов.");
return(0);
}

// если длинная позиция (OP_BUY)
if (OrderType()==OP_BUY)
{
// если профит <=trl_dist_1, то trldist=trl_dist_1, если профит>trl_dist_1 && профит<=level_1*Point ...
if ((Bid-OrderOpenPrice())<=level_1*Point) trldist = trl_dist_1;
if (((Bid-OrderOpenPrice())>level_1*Point) && ((Bid-OrderOpenPrice())<=level_2*Point)) trldist = trl_dist_2;
if ((Bid-OrderOpenPrice())>level_2*Point) trldist = trl_dist_3;

// если стоплосс = 0 или меньше курса открытия, то если тек.цена (Bid) больше/равна дистанции курс_открытия+расст.трейлинга
if ((OrderStopLoss()==0) || (OrderStopLoss()<OrderOpenPrice()))
{
if (Bid>(OrderOpenPrice() + trldist*Point))
newstop = Bid - trldist*Point;
}

// иначе: если текущая цена (Bid) больше/равна дистанции текущий_стоплосс+расстояние трейлинга,
else
{
if (Bid>(OrderStopLoss() + trldist*Point))
newstop = Bid - trldist*Point;
}

// модифицируем стоплосс
if ((newstop>OrderStopLoss()) && (newstop<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
{
if (!OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()))
Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
}
}

// если короткая позиция (OP_SELL)
if (OrderType()==OP_SELL)
{
// если профит <=trl_dist_1, то trldist=trl_dist_1, если профит>trl_dist_1 && профит<=level_1*Point ...
if ((OrderOpenPrice()-(Ask + MarketInfo(Symbol(),MODE_SPREAD)*Point))<=level_1*Point) trldist = trl_dist_1;
if (((OrderOpenPrice()-(Ask + MarketInfo(Symbol(),MODE_SPREAD)*Point))>level_1*Point) && ((OrderOpenPrice()-(Ask + MarketInfo(Symbol(),MODE_SPREAD)*Point))<=level_2*Point)) trldist = trl_dist_2;
if ((OrderOpenPrice()-(Ask + MarketInfo(Symbol(),MODE_SPREAD)*Point))>level_2*Point) trldist = trl_dist_3;

// если стоплосс = 0 или меньше курса открытия, то если тек.цена (Ask) больше/равна дистанции курс_открытия+расст.трейлинга
if ((OrderStopLoss()==0) || (OrderStopLoss()>OrderOpenPrice()))
{
if (Ask<(OrderOpenPrice() - (trldist + MarketInfo(Symbol(),MODE_SPREAD))*Point))
newstop = Ask + trldist*Point;
}

// иначе: если текущая цена (Bid) больше/равна дистанции текущий_стоплосс+расстояние трейлинга,
else
{
if (Ask<(OrderStopLoss() - (trldist + MarketInfo(Symbol(),MODE_SPREAD))*Point))
newstop = Ask + trldist*Point;
}

// модифицируем стоплосс
if (newstop>0)
{
if (((OrderStopLoss()==0) || (OrderStopLoss()>OrderOpenPrice())) && (newstop>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
{
if (!OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()))
Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
}
else
{
if ((newstop<OrderStopLoss()) && (newstop>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
{
if (!OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration()))
Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
}
}
}
}
}
//+------------------------------------------------------------------+
01.03.2008 13:03 knoppix
Здравствуйте господа, извините за тупость но не как неполучается прикрутить библиотеку трейлинг удавка может кто поможет весь мозг уже изломал :(
Спасибо!
29.02.2008 22:47 knoppix
Поскольку здесь никаких дельных замечаний или предложений по работе самого советника не было высказано. А были только наезды на личности и прочий флуд, то я отписываюсь от уведомлений о новых комментариях.

У кого будут конкретные вопросы, то их можно задать на моем сайте http://bigforex.biz/load/2-1-0-171#comments, поскольку там мой администратор и он флуда не допустит. Проходить регистрацию на сайте для комментариев к советнику не обязательно.
29.02.2008 21:26 Reshetov