Блог им. TTrade

Укрепляем дисциплину при помощи роботов.

    • 23 мая 2013, 18:20
    • |
    • TT
  • Еще
Моя работа над персональным граалем вышла на финишную прямую, но  вдруг случился конкрус. Как истинный смартлабовец, я тут же все бросил и вознамерился поучаствовать в соревновании. Решил развить тему, которую озвучивал вот тут: http://smart-lab.ru/blog/115469.php, в этой коротенькой заметке я делал умозрительный вывод о несостоятельности горизонтальных уровней. Но такой маленькой статьей на iPad не заработаешь, поэтому идея заключалась в том, чтобы при помощи робота показать, что горизонтальные уровни не работают. Было даже придумано громкое название «Алгоритмическое доказательство несостоятельности горизонтальных уровней с последующим сеансом одновременной игры на 160 досках». Очень быстро был написан простенький робот, но человек предполагает, а Бог располагает. Робот вдруг начал показывать хорошие результаты, которые никак не укладывались в концепцию несостоятельности уровней. Тогда я решил хотя бы написать статью о состоятельности горизонтальных уровней и даже начал готовить материал, но тут я обнаружил, что все не так однозначно, как хотелось бы. Истина оказалась, как и всегда это бывает на рынке и в трейдинге, в полной неопределенности.


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



Робот, отрабатывающий пробой поддержки.

Параметры робота:

BarsRange — ширина диапазона экстремума в барах. Это минимальное расстояние между касаниями уровня. Если делать слишком маленьким, то за уровень будет приниматься простой боковик из нескольких баров.

PriceRange — размер зоны уровня. Чем она уже, тем жестче отбор, тем горизонтальней уровень. Другими словами погрешность, которая допускается при проведении горизонтального уровня.

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

Диаграмма робота:
Укрепляем дисциплину при помощи роботов.



Алгоритм:

1. Проверяется наличие открытых позиций.

2. Если таких нет, то определяется является ли текущая цена локальным минимумом в диапазоне последних баров BarsRange.

3. Если да, то в районе текущей цены определяется зона предполагаемого уровня PriceRange.

4. Начинается перебор в поисках таких баров, лоу которых находится в зоне уровня PriceRange.

5. Если находится такой бар, то засчитывается подтверждение уровня, но только в том случае, если в пределах BarsRange от этого подтверждения не происходило пробоя зоны уровня.

6. Перебор заканчивается либо после достижения конца истории, либо после достижения предыдущего пробоя уровня, либо после нахождения достаточного количества подтверждений уровня Confirm.

7. При этом, в случае, если уровень подтвержден, то открывается позиция на продажу по текущей цене, со стопом 2 ATR и профитом 6 ATR.

Вот как выглядит код робота на MQL4:

Укрепляем дисциплину при помощи роботов.

Вот ссылка на скачивание:

Укрепляем дисциплину при помощи роботов.

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

Пример работы.

Инструмент: EURUSD
Тайм фрейм: 15 минут
Период: 01.01.2010-01.01.2013
Объем: 0.1 лота
Исходные параметры: PriceRange 20 пунктов (0.002), BarsRange 20, Confirm 3
Параметры подобраны путем легкой оптимизации по 2011 году.

Эквити:

Укрепляем дисциплину при помощи роботов.

Отчет:


Укрепляем дисциплину при помощи роботов.


Примеры сделок:


Укрепляем дисциплину при помощи роботов.


Укрепляем дисциплину при помощи роботов.

Укрепляем дисциплину при помощи роботов.

Эквити и отчет с параметрами PriceRange 20 пунктов (0.002), BarsRange 30, Confirm 2:


Укрепляем дисциплину при помощи роботов.

Укрепляем дисциплину при помощи роботов.

Выводы.

1. Глядя на результаты, я бы не сказал однозначно, что горизонтальные уровни не работают. Но и пускать робота «как есть» на рынок я бы не стал. Во-первых, значения исходных параметров получены в результате, пусть и весьма поверхностной, но оптимизации. Во-вторых, 2012 год полностью боковой. В-третьих, характеристики робота, типа профит фактора и дродауна, довольно средненькие.

2. Написать робота может абсолютно каждый, для этого нужно лишь немного логики и школьных навыков программирования. Посмотрите на код, это же элементарно! Причем даже такие примитивные алгоритмы дают массу информации о рынке и огромное поле для исследования. При этом усилия, необходимые для их создания, совершенно смешные. На разработку этих роботов ушло на порядок меньше времени, чем на написание этого поста, при этом мой опыт механизации трейдинга всего несколько месяцев.

Неожиданный вывод о дисциплине.

Каждый из нас прочитал гору литературы о том, насколько важна дисциплина в трейдинге. Абослютно все знают, что должна быть системность, последовательность, терпеливость. Что вы должны уметь бороться с обственными страхом и жадностью. При этом абсолютно все сталкиваются с проблемой недисциплинированности, тильтов, импульсивности и т.д. Сама природа трейдинга противоестественна физиологии человека. В трейдинге человек должен всегда поступать не так, как он это делает в жизни, и не так, как он поступал на протяжении тысячелетий эволюции. Совершенно очевидно, что «неправильное» поведение абсолютно естественно, и никакая сила воли не сможет этого изменить, точно также как вы никогда не сможете бросить курить на силе воли, хотя в принципе бросить курить довольно просто.

Есть ли легкий способ стать дисциплинированным трейдером? Есть! Для этого нужно всего лишь быть абсолютно, на 110% уверенным в собственной системе. Любая недисциплинированность связана исключительно с неуверенностью в собственных действиях. Человек идет в трейдинг без грааля, надеясь на вероятностный характер тех или иных систем, на их якобы положителное математическое ожидание, которое на самом деле никому не известно. И всякий в глубине души прекрасно понимает, что по большому счету он занимается игрой. Откуда тут взяться дисциплине?

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

Можем ли мы исключить элемент удачи из процесса становления тредера? Приобрести уверенность в собственной системе без трудного пути проб и ошибок? Да! Нужно строить свою систему из элементов, которые легко поддаются автоматизации, каждый из которых можно проверить на истории, подобрать к нему оптимальные параметры. А как это сделать технически я описал выше. При этом я не говорю о том, что непременно нужно писать роботов, которые будут торговать за вас. Вовсе нет. Это довольно сложно и неоднозначно. Я говорю о том, что если элементы вашей системы будут протестированы на истории, то это вам придаст уверенность столь необходимую для дисциплинированности. Например, если в вашей системе присутствует индикатор, то использовать исторически подтвержденный его параметр гораздо проще и правильнее, чем тыкать пальцем в небо чисел Фиббоначи или полагаться на субъективный опыт какого-то гуру из учебника. Это касается практически любых форм технического анализа.

Проверяйте свои идеи и наработки на истории посредством роботов. Это совершенно не сложно и очень полезно для укрепления дисциплины.

А теперь стихи!


   

С удовольствием отвечу на любые ваши вопросы и выслушаю любые мнения по теме.
★41
26 комментариев
>количество прибыльных сделок — 32%
С такой системой в Кукла поверить можно, не то что в уровни.
Ну соотношение стопа к профиту 1:3 выправляет ситуацию.
avatar
слишком сложно… много параметров полюбому будет переоптимизация… вот если свести все к 1-2ум параметрам…
avatar
ves2010, Все три параметра влияют на одно и то же- на точность паттерна. Т.е. описывают насколько строго мы будем отбирать ситуации для открытия позиции. Поэтому их можно смело считать одним параметром, потому что они связаны между собой линейно. Я специально привел две эквити с разными параметрами, они практически не отличаются.
avatar
TT, ты забываешь еще 2 параметра — стоп и ТП… итого у тебя 5 параметров… ты бы еще тайминг забабахал… кроме того у тебя четко написано что проигрышных сделок 62%… т.е. патерн не рабтает (если б работал, то хотябы 50% профитных выдал бы)… имхо выкинь патерн оставь стоп и ТП будет тот же результат…
avatar
ves2010, Тогда уж добавьте параметр объема позиции, таймфрейма, количество баров для перебора, интервал ATR, и т.д. Высосать из пальца можно десяток параметров. По факту, есть лишь один параметр, определяющий насколько разборчивы мы будем при выявлении паттерна.

Кроме того, у меня четко написано, что профит больше стопа в три раза. Если мы уравняем стоп и профит, чтобы определить именно работоспособность паттерна, то обнаружим 57% прибыльных сделок (причем несмотря на спред), что очевидно говорит в пользу горизонтальных уровней.
avatar
ves2010,
avatar
Действительно, слишком много параметров. Попробуйте уменьшить. Хотя идея, безусловно, интересная!
Максим Милованов, Не знаю, по большому счету мне видится тут только один параметр- это число касаний Confirm. Плюс, естественно, широчайшее поле для работы по управлению позицией. BarsRange и PriceRange по сути просто задаются для каждого конкретного инструмента и таймфрейма чисто визуально и, мне кажется, должны быть стабильны.

Плюс учитывайте, что это совсем не торговый робот, а скорее инструмент для исследования горизонтальных уровней.
avatar
Объясните пожалуйста перменные BuyLevel & SellLevel
Frank_Cowperwood, Это верхняя и нижняя границы зоны уровня. Называются так, потому что изначально (в сложной версии робота) отрабатывался, и пробой, и отбой уровня, т.е. пробитие верхней границы зоны уровня- покупка, нижней- продажа. Считаются от текущей цены, откладывается 1/2 PriceRange соответственно вверх и вниз.

Используются для нахождения подтверждения уровня, т.е. лоу очередного бара должно быть больше SellLevel и меньше BuyLevel, это означает, что цена была в зоне уровня, но не смогла его преодолеть. Плюс SellLevel используется для нахождения предыдущего пробития уровня, т.е. когда лоу очередного бара ниже SellLevel, значит стоп перебора, дальше искать подтверждения пробития смысла нет.
avatar
TT, Спасибо. попробую обмозговать :)
Frank_Cowperwood, Пожалуйста. Спрашивайте, если что.

Последнюю фразу: "… дальше искать подтверждения пробития смысла нет." читать как "… дальше искать подтверждения уровня смысла нет, он пробит".
avatar
Молодец +500
avatar
Спасибо!
Плюс в профиль
День добрый. Видимо все ходят кругами, у меня есть пару идей по поводу работы с уровнями, но хотелось бы их протестировать, перед тем как начинать торговать, и решил посмотреть если кто копал в этом направлении, в вашей статье я нашел много из того к чему я пришел по итогам наблюдения за ценой, хотелось бы посмотреть код ваших советников. Заранее спасибо.
avatar
Vadim Kondakov,
avatar
Огромное спасибо, выходные пройдут весело )
avatar
А файл по ссылке-то удалён, можно как-то перезалить?
avatar
Sergey_UpY,  Можно.
avatar
TT, Спасибо большое
avatar
TT, нет ссылки на файл. Можно ли куда-нибудь снова перезалить?
avatar
kuniga, 
//+------------------------------------------------------------------+
//|                                                        Level.mq4 |
//|                                                               TT |
//|                              smart-lab.ru/profile/TTrade/ |
//+------------------------------------------------------------------+
#property copyright «TT»
#property link      «smart-lab.ru/profile/TTrade/»

//--- input parameters
extern double    PriceRange=0.001; //Размер зоны уровня
extern int       BarsRange=10; //Диапазон экстремума в барах
extern int       Confirm=2; //Количество подтверждений уровня

extern string    Instr=«EURUSD»; //Инструмет
extern double    Size=0.1; //Объем позиции

bool Support; //Флаг поддержки
bool Resistant; //Флаг сопротивления
double BuyLevel; //Верх зоны уровня
double SellLevel; //Низ зоны уровня
int i; //Номер бара
int Extrem; //Номер касания зоны

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   if (OrdersTotal()==0) //Работаем, если нет открытой позиции
   {
      if (iHighest(NULL,0,MODE_HIGH,BarsRange,0)==0) Resistant=1; //На новом локальном хае работаем с сопротивлением;
      if (iLowest(NULL,0,MODE_LOW,BarsRange,0)==0) Support=1; //На новом локальном лое работаем с поддержкой;
   
      if (Support==1 && Extrem<Confirm) //Возможна поддержка, но она еще не подтверждена
         {
         BuyLevel=Close[0]+PriceRange/2;
         SellLevel=Close[0]-PriceRange/2; //Определяем границы зоны предполагаемого уровня
         Extrem=0;
         
         //for (i=BarsRange;i<iBars(NULL,0);i++) //Перебираем бары в поисках минимумов в зоне уровня.
         for (i=BarsRange;i<200;i++) //Перебираем бары в поисках минимумов в зоне уровня.
            {
            if (iLow(NULL,0,i)<BuyLevel && iLow(NULL,0,i)>SellLevel) //Лоу текущего бара в зоне уровня
               {
               if (iLow(NULL,0,iLowest(NULL,0,MODE_LOW,BarsRange,i))>SellLevel) Extrem++; //Подтверждение уровня засчитывается, если не было пробоя зоны
               i=i+BarsRange;
               }
            if (Extrem==Confirm) break; //Конец перебора, найдено достаточное количество подтверждений уровня
            if (iLow(NULL,0,iLowest(NULL,0,MODE_LOW,i,0))<SellLevel) break; //Конец перебора, достигнут пробой текущего уровня
            }
         }   
      if (Support==1 && Extrem==Confirm) //Есть подтвержденная поддержка
         {
         if (Close[0]>BuyLevel) //Покупаем при пробое поддержки вверх
            {
            OrderSend(Instr,OP_BUY,Size,Ask,10,SellLevel,BuyLevel+PriceRange*3); //Стоп под уровнем, профит тройной стоп
            Extrem=0;
            Support=0;
            }
         if (Close[0]<SellLevel) //Продаем при пробое поддержки вниз
            {
            OrderSend(Instr,OP_SELL,Size,Bid,10,BuyLevel,SellLevel-PriceRange*3); //Стоп над уровнем, профит тройной стоп
            Extrem=0;
            Support=0;         
            }
         }
   }   
//----
   return(0);
  }
//+------------------------------------------------------------------+
avatar
kuniga, 
//+------------------------------------------------------------------+
//|                                                       Level1.mq4 |
//|                                                               TT |
//|                              smart-lab.ru/profile/TTrade/ |
//+------------------------------------------------------------------+
#property copyright «TT»
#property link      «smart-lab.ru/profile/TTrade/»

//--- input parameters
extern double    PriceRange=0.001; //Размер зоны уровня
extern int       BarsRange=10; //Диапазон экстремума в барах (минимальное расстояние между подтверждениями)
extern int       Confirm=2; //Количество подтверждений уровня

extern string    Instr=«EURUSD»; //Инструмет
extern double    Size=0.1; //Объем позиции

double BuyLevel; //Верхняя граница зоны уровня
double SellLevel; //Нижняя граница зоны уровня
int i; //Номер очередного бара
int Extrem; //Счетчик касания зоны

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   if (OrdersTotal()==0) //Работаем, если нет открытой позиции
   {
      if (iLowest(NULL,0,MODE_LOW,BarsRange,0)==0) //Цена на локальном минимуме, возможна поддержка, но она еще не подтверждена
      {
      BuyLevel=Bid+PriceRange/2;
      SellLevel=Bid-PriceRange/2; //Определяем границы зоны предполагаемого уровня
      Extrem=0;
      
      //for (i=BarsRange;i<iBars(NULL,0);i++) //Перебираем бары (без ограничений, местами подвисает) в поисках минимумов в зоне уровня.
      for (i=BarsRange;i<500;i++) //Перебираем бары (не более 500 штук)в поисках минимумов в зоне уровня.
         {
         if (iLow(NULL,0,i)<BuyLevel && iLow(NULL,0,i)>SellLevel) //Лоу очередного бара в зоне уровня
            {
            if (iLow(NULL,0,iLowest(NULL,0,MODE_LOW,BarsRange,i))>SellLevel) Extrem++; //Подтверждение уровня засчитывается, если не было пробоя зоны
            i=i+BarsRange;
            }
         if (Extrem==Confirm) //Найдено достаточное количество подтверждений уровня
            {
            OrderSend(Instr,OP_SELL,Size,Bid,10,Bid+2*iATR(NULL,0,BarsRange,0),Bid-6*iATR(NULL,0,BarsRange,0)); //Стоп 2 ATR, профит тройной стоп
            break; //Конец перебора, позиция открыта
            }
         if (iLow(NULL,0,iLowest(NULL,0,MODE_LOW,i,0))<SellLevel) break; //Конец перебора, достигнут пробой текущего уровня
         }
      }   
   }   
//----
   return(0);
  }
//+------------------------------------------------------------------+
avatar
TT, спасибо.
avatar

теги блога TT

....все тэги



UPDONW
Новый дизайн