Если позиция закрылась с убытком - увеличиваем риск

 

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

Как можно отследить вообще факт закрытия позиции? Здесь есть два варианта:

  1. Постоянное сканирование торговой истории
  2. Сканирование торговой истории при поступлении события OnTrade()
  3. "Ловля" события в OnTradeTransaction()
Вариант 1 - хоть это делать в Ontick() (на каждом тике), хоть в OnTimer() - всё это очень затратно по ресурсам. Вариант 2 - можно сказать такой себе средний вариант.  Вариант 3 - вот это самый оптимальный вариант в таком случае не приходится проводить постоянное сканирование - достаточно разместить код увеличения рисков в функции OnTradeTransaction().

Далее будет:

  1. Подключение библиотек
  2. Метод расчёта размера лота в зависимости от риска на свободную маржу
  3. Обработка OnTradeTransaction() - взведение флага "нужно увеличить риск"
  4. Реагирование на событие "нужно увеличить риск"
  5. ...

 
такая система заведомо убыточная на дистанциях от тысячи сделок
 

Подключение библиотек.

  • Советник должен увеличивать риск - то есть он будет торговать, значит нужен торговый класс класс CTrade
  • Расчёт риска будем производить в процентах от маржи - здесь понадобиться класс CMoneyFixedMargin
Примем такие условности: советник будет отслеживать убыточные позиции по всем символам и всем magic.

Заготовка: "If loss - increase risk.mq5" - версия 1.000:

//+------------------------------------------------------------------+
//|                                      If loss - increase risk.mq5 |
//|                              Copyright © 2017, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property description "If loss - increase risk"
#property version   "1.000"
#include <Trade\Trade.mqh>
#include <Expert\Money\MoneyFixedRisk.mqh>
CTrade         m_trade;                      // trading object
CMoneyFixedRisk m_money;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
  
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
  
  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
//---
  
  }
//+------------------------------------------------------------------+
Файлы:
 
Vladimir Karputov:

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

Как можно отследить вообще факт закрытия позиции? Здесь есть два варианта:

  1. Постоянное сканирование торговой истории
  2. Сканирование торговой истории при поступлении события OnTrade()
  3. "Ловля" события в OnTradeTransaction()
Вариант 1 - хоть это делать в Ontick() (на каждом тике), хоть в OnTimer() - всё это очень затратно по ресурсам. Вариант 2 - можно сказать такой себе средний вариант.  Вариант 3 - вот это самый оптимальный вариант в таком случае не приходится проводить постоянное сканирование - достаточно разместить код увеличения рисков в функции OnTradeTransaction().

Далее будет:

  1. Подключение библиотек
  2. Метод расчёта размера лота в зависимости от риска на свободную маржу
  3. Обработка OnTradeTransaction() - взведение флага "нужно увеличить риск"
  4. Реагирование на событие "нужно увеличить риск"
  5. ...

В СБ нет класса HashTable, как во многих либах, но он есть тут на сайте https://www.mql5.com/ru/articles/1334

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

Рецепты MQL5 - Реализуем ассоциативный массив или словарь для быстрого доступа к данным
Рецепты MQL5 - Реализуем ассоциативный массив или словарь для быстрого доступа к данным
  • 2015.03.23
  • Vasiliy Sokolov
  • www.mql5.com
В данной статье описывается специальный алгоритм, позволяющий эффективно получать доступ к элементам по их уникальному ключу. В качестве ключа может быть использован любой базовый тип данных, например ключом могут быть строки или целочисленные переменные. Такой контейнер данных принято называть словарем или ассоциативным массивом. С его помощью решать многие задачи становиться гораздо проще и эффективней.
 
идея из области мартингейла и его вариаций (растянутый и тд), только не понятно что подразумевается под "увеличиваем риск":

* размер/величину SL

* размер/объем лота

* размер/величину SL И размер/объем лота


так же нужно учитвать не только факт "прибыльная/убыточная сделка", а и размер убытка, т.к. прибыль может быть +1 пункт, убыток -100 пунктов и тд
 
Igor Yeremenko:
..., только не понятно что подразумевается под "увеличиваем риск":

...

Увеличение риска в процентах от маржи - таким образом увеличится размер лота при неизменном уровне StopLoss. 

Igor Yeremenko:
...

так же нужно учитвать не только факт "прибыльная/убыточная сделка", а и размер убытка, т.к. прибыль может быть +1 пункт, убыток -100 пунктов и тд

А таки Да! Нужно тоже покрутить такой момент.