English 中文 Español Deutsch 日本語 Português
Нестандартная автоматическая торговля

Нестандартная автоматическая торговля

MetaTrader 4Торговые системы | 9 июля 2007, 11:42
5 708 25
Leonid Borsky
Leonid Borsky

Введение

Насколько реально можно успешно и комфортно торговать, используя торговую платформу МТ4, и не слишком обременяя себя, при этом, скрупулезным анализом рынка? Возможно ли практически реализовать такую торговую систему?

Пожалуй - да!

Особенно в плане автоматической торговли! Возможности MQL4 позволяют это сделать. Описанная ниже автоматическая торговая система обладает хорошей повторяемостью. И вполне по силам для реализации даже тем, кто только начинает знакомиться с основами написания экспертов.

Сама же система практически полностью срисована из окружающего нас мира. Жизнь, гармонично развиваясь, диктует нам свои законы. Все мы в детстве, на природе наблюдали такую картину: муравьи, облепив со всех сторон, например, соломинку тянут её в муравейник. Причем, каждый муравей по отдельности тянет соломинку в свою сторону. Однако, в конечном итоге соломинка непостижимым образом движется в сторону муравейника! Загадка природы? Попробуем смоделировать ситуацию. На торговой платформе.

Нестандартная автоматическая система

Предположим, мы имеем некую автоматическую торговую систему. Профитную. При этом, система удовлетворяет следующим условиям:

  1. Входы по этой системе будут, практически, случайными.
  2. Система постоянно находится в рынке, т.е. работает не стопами, а переворотами - это важно.
  3. На входе системы имеются несколько статических параметров, с помощью которых мы оптимизируем систему. Чтобы получить на выходе максимальную прибыль с разумной просадкой.

Практически получилось, что такая система дает за год не менее +3000 пунктов профита даже без включения блока Money Management. Далее, мы включаем эту систему в, так называемом, реверсном режиме. Иначе говоря, теперь она будет работать следующим образом:

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

А теперь посмотрим, что же у нас получилось?

При одновременном включении обоих систем - прямой и реверсной, мы будем иметь в сумме двойную прибыль. При этом, системы осмысленно, не вслепую, работают во встречных режимах, т.е. друг против друга! Уменьшая суммарный убыток, - текущую относительную просадку. Почему системы работают осмысленно, а не вслепую?

Да потому, что реверсная система, за счет иных подобранных статических параметров, уже через три-четыре сделки после начала работы будет торговать с некоторым сдвигом по времени и по цене! Относительно прямой системы. Используя, при этом, тот же алгоритм входа в реверсном режиме.

Но общая, суммарная прибыль на счете будет у нас поступательно расти! Думаю,что это очевидно. Так как обе системы, как прямая, так и реверсная, оптимизированы на профитную работу. Более того, текущий убыток одной версии практически постоянно будет компенсироваться текущей прибылью другой версии! Таким образом, мы получаем максимальную прибыль при минимальной просадке.

Некоторый недостаток такой торговли - увеличение залога. Но можно ли это назвать недостатком? Фактически, здесь работают две независимые торговые системы - прямая и реверсная. И, конечно, залог будет двойным. А вот что касается рисков, то они сильно уменьшаются! Именно в этом и предполагаю конечный смысл идеи. Не столько увеличить прибыль, сколько свести к минимуму просадку. Но одно влечет за собой другое. И, повторюсь, суммарная прибыль при такой торговле поступательно растет. А значит, мы смело можем теперь подключить блок Money Management .

На сайте MQL4.community имеется широкий выбор различных экспертов. В том числе и советники, удовлетворяющие условиям, перечисленным в начале статьи. Было бы желание. А рынок заставляет нас ставить новые задачи и искать различные, нестандартные решения этих задач! Обнаружились и возможности для дальнейшего поиска.

Для реализации идеи и последующих экспериментов в качестве основы был взят советник Юрия Решетова Artificial Intelligence (Исскусственный Интеллект). Описанный ранее в этом же разделе (смотрите статью Ю.Решетова "Как найти прибыльную торговую стратегию". С некоторыми изменениями и дополнениями. В частности, предусмотрен вызов иного базового индикатора для работы Перцептрона. А также, предусмотрены некоторые дополнительные условия для открытия и последующего сопровождения позиций.

Вот некоторые результаты эксперимента, полученные при тестировании пары GBPUSD на таймфрейме H1. Исходный депозит - 10000 единиц. 2.5-летняя история, с января 2005г. по май 2007г.

В прямой версии за этот период наблюдалось 250 сделок. В реверсной - 360 сделок. Число сделок различно за счет того, что уровень стоплосса при оптимизации оказался разным по каждой версии. Чистая прибыль примерно равна +10000 в обоих случаях. При работе 0.1-лотом, без подключения блока Money Management. Отношение прибыльных сделок к убыточным, примерно, 3:2 в обоих версиях.

Графики балансов (эквити) прямой и реверсной версий по истории выглядят так, - см. рисунок:

Легко видеть, что в значительном большинстве случаев убыточные сделки прямой версии компенсируются прибыльными сделками версии реверсной. И наоборот, убыточные участки реверсной версии покрываются прибыльными участками версии прямой.

Более того! Там, где на одном графике наблюдается "флет", - на другом графике идет подъём! В итоге получаем максимальную суммарную прибыль при минимальном риске, т.е. при минимальной просадке. Нетрудно свести историю сделок в Excel и построить результирующий график, наглядно демонстрирующий суть идеи.

Следующий шаг - это установка блока Money Management. Мы вправе ожидать, что при такой торговой системе установка этого блока значительно улучшит конечные результаты. По таким критериям, как прибыль, просадка и комфортность торговли. В прямом и реверсном вариантах я предусмотрел вызов библиотеки расчета лотов "b-lots" по версии И.Кима. Легко вставляется в исходный код. И работает очень прилично: https://www.mql5.com/ru/code/8048

При тестировании использовал фракционно-пропорциональный метод расчета лотов ( LotsWayChoice=2 ). Который дает разумную, минимальную просадку с относительно хорошими прибыльными выходами ( Райан Джонс, "Сделай миллионы, играя числами" ). Результаты получились неплохими. По сравнению с иными методами расчета лотов. Которые зачастую показывают заоблачную прибыль, при такой-же, заоблачной просадке.

На той же истории, с января 2005г. по май 2007г. Результаты тестирования при тех же внешних параметрах, что и ранее:

Реверсная версия:

  • Чистая прибыль +79864
  • Максимальная просадка 16969 (24%)
  • Относительная просадка 33% (3511)

Прямая версия:

  • Чистая прибыль +196520
  • Максимальная просадка 25801 (12.3%)
  • Относительная просадка 6972 (18.14%)

Графики балансов - на рисунке:

Эти графики, также, наглядно демонстрируют, как текущие убытки прямой версии компенсируются прибылью реверсной версии. Комфортность такой торговли, я думаю, не вызывает сомнения.

Практическая реализация

Для примера и последующих начальных экспериментов привожу код реверсной версии. Которая работает "против" прямой версии авторского варианта советника "AI" Ю.Решетова. Прямую же версию и её описание можно взять по ссылке: https://www.mql5.com/ru/code/10289

Кроме того, в прилагаемом к моей статье файле, имеется индикатор Перцептрон (автор - NoName с Украины, г. Кременчуг). Позволяющий визуально контролировать текущую работу советников, прямого и реверсного. И заранее знать, в какую сторону перевернется, либо откроется новая позиция! Понятно, что значения весовых коэффициентов X1-X4 индикатора Перцептрон следует установить равными соответствующим значениям советников. Пример для реверсной версии - на графике:

Специально для тех, кто только начинает знакомиться с MQL4, я постарался максимально полно снабдить код реверсной версии комментариями по работе советника. Показания перцептрона при работе этой реверсной версии выводятся на график в левом верхнем углу:

//+------------------------------------------------------------------+
//|                                 ArtificialIntelligenceRevers.mq4 |
//|                               Copyright й 2006, Yury V. Reshetov |
//|                                Modifed by   Leonid553            |
//|                                  http://www.tradersforum.net.ru/ | 
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright й 2006, Yury V. Reshetov ICQ:282715499"
#property link      "http://reshetov.xnet.uz/"
//---- input parameters
extern int    x1 = 88;
extern int    x2 = 172;
extern int    x3 = 39;
extern int    x4 = 172;
// StopLoss level
extern double sl = 50;
extern double lots = 0.1;
extern int    MagicNumber = 808;
static int prevtime = 0;
static int spread = 3;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
     Comment(perceptron());   
// Ждем, когда сформируется новая свеча
// Если появляется новая свеча, то проверяем возможность сделки 
   if(Time[0] == prevtime) return(0);
   prevtime = Time[0];
//----
   if(IsTradeAllowed()) 
     {
       spread = MarketInfo(Symbol(), MODE_SPREAD);
     } 
   else 
     {
       prevtime = Time[1];
       return(0);
     }
   int ticket = -1;
   // check for opened position
   // сопровождение открытой позиции :
   int total = OrdersTotal();   
   for(int i = 0; i < total; i++) 
     {
       OrderSelect(i, SELECT_BY_POS, MODE_TRADES); 
       // check for symbol & magic number
       //проверяем символ и магик-номер
       if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) 
         {
           int prevticket = OrderTicket();
           // long position is opened
           if(OrderType() == OP_BUY) 
              // если открыта длинная позиция и ...
             {
               // check profit 
               // и текущий профит больше величины =(стоплосс плюс спред) и ...
               if(Bid > (OrderStopLoss() + (sl * 2  + spread) * Point)) 
                 {               
                   if(perceptron() > 0) 
                     { 
                    // и  перцептрон больше нуля , то переворачиваемся в Селл
                       // reverse
                       ticket = OrderSend(Symbol(), OP_SELL, lots * 2, Bid, 3, 
                         Ask + sl * Point, 0, "AI", MagicNumber, 
                                          0, Red); 
                       Sleep(30000);
                       if(ticket < 0) 
                         {
                           prevtime = Time[1];
                         } 
                       else 
                         {
                           OrderCloseBy(ticket, prevticket, Blue);   
                         }
                     } 
                   else 
//если перцептрон меньше нуля, то подтягиваем стоплосс на расстояние =sl
//от текущей цены                 
  { 
                       // trailing stop
                       if(!OrderModify(OrderTicket(), OrderOpenPrice(), 
                          Bid - sl * Point, 0, 0, Blue)) 
                         {
                           Sleep(30000);
                           prevtime = Time[1];
                         }
                     }
                 }  
               // short position is opened
             } 
           else 
             {
               // если открыта короткая позиция и ...
               // check profit 
              if(Ask < (OrderStopLoss() - (sl * 2 + spread) * Point)) 
                 {
                  // текущий профит больше величины =(стоплосс плюс спред) и ...
                   if(perceptron() < 0) 
                     { 
             // и  перцептрон меньше нуля, то переворачиваемся в Бай
                       // reverse
                       ticket = OrderSend(Symbol(), OP_BUY, lots * 2, Ask, 3, 
                           Bid - sl * Point, 0, "AI", MagicNumber,
                                          0, Blue); 
                       Sleep(30000);
                       if(ticket < 0) 
                         {
                           prevtime = Time[1];
                         } 
                       else 
                         {
                           OrderCloseBy(ticket, prevticket, Blue);   
                         }
                     } 
                   else 
//если перцептрон больше нуля то, подтягиваем стоплосс на расстояние =sl  
//от текущей цены
                   { 
                       // trailing stop
                       if(!OrderModify(OrderTicket(), OrderOpenPrice(), 
                          Ask + sl * Point, 0, 0, Blue)) 
                         {
                           Sleep(30000);
                           prevtime = Time[1];
                         }  
                     }
                 }  
             }
           // exit
           return(0);
         }
     }
//********************************************************************
   // check for long or short position possibility
   // изначальный вход в рынок:
 
   if(perceptron() < 0) 
     { 
       // если перцептрон меньше нуля, то открываем длинную позицию :
       //long
       ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, 3, Bid - sl * Point, 0, 
                      "AI", MagicNumber, 0, Blue); 
       if(ticket < 0) 
         {
           Sleep(30000);
           prevtime = Time[1];
         }
     } 
   else 
      // если перцептрон больше нуля, то открываем короткую позицию:
     { 
       // short
       ticket = OrderSend(Symbol(), OP_SELL, lots, Bid, 3, Ask + sl * Point, 0, 
                      "AI", MagicNumber, 0, Red); 
       if(ticket < 0) 
         {
           Sleep(30000);
           prevtime = Time[1];
         }
     }
//--- exit
   return(0);
  }
//+------------------------------------------------------------------+
//|  The PERCEPRRON - a perceiving and recognizing function          |
//+------------------------------------------------------------------+
double perceptron() 
  {
   double w1 = x1 - 100.0;
   double w2 = x2 - 100.0;
   double w3 = x3 - 100.0;
   double w4 = x4 - 100.0;
   double a1 = iAC(Symbol(), 0, 0);
   double a2 = iAC(Symbol(), 0, 7);
   double a3 = iAC(Symbol(), 0, 14);
   double a4 = iAC(Symbol(), 0, 21);
   return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);
  }
//+------------------------------------------------------------------+}

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

Продолжая развивать идею, можно предложить провести на графиках баланса линии поддержки и сопротивления. Либо наложить на графики баланса индикатор МА или любой иной, подходящий. В этом случае, по сигналам индикаторов возможно будет в некоторых пределах автоматически манипулировать запрещением сделок по каждой версии. Думаю, что программно это реализуемо.

Но это в перспективе.


Заключение

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

Что-ж, возможно такое и произойдет в редких, исключительных случаях. Но не более того - "нет в мире идеала". Однако, при практически случайных входах обе версии работают, всё-таки, по сигналам одного индикатора. И, повторюсь, во встречных режимах, друг против друга!

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

Прикрепленные файлы |
AI_REVERS.mq4 (7.02 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (25)
Tania
Tania | 27 июн. 2009 в 01:23
cozdaite luchshe poezd,a ne kacheli
MoonDrifter
MoonDrifter | 11 янв. 2010 в 13:18
Pyh:Что касается содержательной части, то очевидно, что из двух убыточных систем не сделать одной прибыльной, как их не складывай. Не имеет значения, в фазе или противофазе они будут работать. Эквити можно сгладить, это очевидно, но она скорее всего пойдёт вниз, хоть и будет гладкой.
Если, предположим, у меня есть 2 прибыльные системы, как их не складывай, они и будут прибыльными .

Полностью согласен с написанным.

Леонид, правильно ли я понял, что в Вашей МТС 5 настроечных параметров, которые определяют логику входов-выходов - x1...x4 и sl? Подозреваю, Вам пришлось немало поэкспериментировать с их комбинацией дабы добиться относительно плавного роста доходности каждой из подсистем. Тривиально - доходность двух доходных и, в идеале, слабо коррелированных систем будет, в общем случае, еще более плавной.

Простите за полу-офф: какой смысл выкладывать результаты настроенной на истории системы? Вы проводили вневыборочные (форвардные) тесты? Торговали в реальном времени по этой системе? Иначе я, к сожалению, не могу углядеть смысла в написанном - равно как и в 99.9% прочих выложенных советниках с результатами прогонов на истории. Такие результаты, как правило, вовсе не коррелируют с результатами торговли в реальном времени, это уже столько раз обсуждалось. Попытайтесь, пожалуйста, разубедить меня - очень хочется легких денег!

Leonid Borsky
Leonid Borsky | 13 февр. 2010 в 17:52
andrey.sitaev писал(а):

Полностью согласен с написанным.

Леонид, правильно ли я понял, что в Вашей МТС 5 настроечных параметров, которые определяют логику входов-выходов - x1...x4 и sl? Подозреваю, Вам пришлось немало поэкспериментировать с их комбинацией дабы добиться относительно плавного роста доходности каждой из подсистем. Тривиально - доходность двух доходных и, в идеале, слабо коррелированных систем будет, в общем случае, еще более плавной.

Простите за полу-офф: какой смысл выкладывать результаты настроенной на истории системы? Вы проводили вневыборочные (форвардные) тесты? ..... Попытайтесь, пожалуйста, разубедить меня - очень хочется легких денег!

Прошу прощ. за задержку с ответом.

Экмпериментировать долго не пришлось. 30-ти минутная оптимизация дала такие параметры. Форвард не проводил.

Еще раз повторюсь, что главная идея  - вовсе не этом конкретном советнике.

А в обьединении двух различных (а лучше - почти противоположных) торговых тактик в один советник. Чтобы текущие убытки одной тактики компенсировалсиь текущим профитом другой тактики.

А конкретное исполнение идеи может быть любым....

Kiryl Aliakseyeu
Kiryl Aliakseyeu | 1 авг. 2013 в 12:26


Я тоже думаю над этим экспертом,

пришёл к мнению что ему не хватает такого варианта, может кто сможет написать? должна получиться отличная штука так как советник выдают

большое кол-во положительных сделак.

Условие_1 - Увеличить размер лота на заданный размер после каждой положительной сделки (например изначальный лот 0.01 первая

положительная сделка закрыта и лот возрастает до 0.02 ещё одна и 0.03 так до 0.08 при достижении 0.08 начинается обратный отсчёт лота снова до 0.01 )

Условие_2 - если закрыта убыточная позиция тогда лот удваивается или увеличивается на заданное число (Например счёт в (Условие_1)

дошёл до 0.04 лота и на 0.04 произошла отрицательная сделка, тогда лот сразу же вырастает до 0.07 и идёт на следующие сделки. Если следующая

сделка оказалась удачной то лот начинает спадать по 0.01 до уровня 0.01)

Вот приблизительно так.

Прошу помочь сведущих в этом деле!!!

Aleksey Mavrin
Aleksey Mavrin | 20 нояб. 2019 в 09:17
Сергей Ковалев:

Я не согласен категорически.

Почему бы всё это не сделать по-человечески? Ясно, что прибыль будет получена только в случае, если цена движется в ту сторону, куда открыты ордера остаточной стоимости. Например, если есть Бай 5 лотов и Селл 3 лота, то выигрыш будет пропорционален ордеру Бай 2 лота при условии, что цена пойдёт вверх. Встречные ордера - это бессмыслица, сбивающая с толку. Их нужно просто встречно закрывать. Всегда.

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

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

Читаю старые темы, как много креатива было в те времена)

Полностью согласен с Сергей Ковалев, и добавлю на мой взгляд важное, что автор не учёл:

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

б) если теперь менять пар-ры рандома, то  - первое- прибыль будет только на истории, второе - это уже не реверс, а две совершенно разные тс, просто обе основанные на его величестве рандоме)

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

Отправка торгового сигнала через RSS канал Отправка торгового сигнала через RSS канал
В данной статье описывается отправка торговых сигналов через RSS канал, как один из популярных способов мгновенного общения с членами Вашего сообщества.
Terminal Service Client. Как подружить Pocket PC с большим братом. Terminal Service Client. Как подружить Pocket PC с большим братом.
Подключение к удаленному компьютеру с терминалом МТ4 через КПК.
Основы создания хеджирующего эксперта Основы создания хеджирующего эксперта
В данной статье предлагается пример создания хеджирующего эксперта. Автором была выбрана пара для хеджирования - EURJPY и GBPJPY - в соответствии с собственными предпочтениями. По мнению автора, эта пара всегда движется равномерно и представляет меньше трудностей для установки хеджированного ордера.
MT4TerminalSync - система синхронизации терминалов MetaTrader 4 MT4TerminalSync - система синхронизации терминалов MetaTrader 4
Данная статья относится к тематике: "Расширение возможностей MQL 4 - программ путем использования функций операционных систем, а также других средств разработки программ". Статья посвящена описанию примера программной системы, реализующей задачу синхронизации нескольких копий терминала на основе одного источника-шаблона.