Управление несколькими стратегиями в советнике

 
Какие наработки есть для создания роботов с несколькими стратегиями? Например, есть некоторая программная оболочка в которую довольно легко добавляются новые стратегии. Программная оболочка берёт на себя следующие функции:
1. Независимое управление стратегиями на разных инструментах и стратегиях.
2. Управление рисками.
3. Управление сделками/ордерами.
4. Обработка ошибок.
5. Планировщик(работа в определённое время).
6. Ограничения убытков/выход из сделки(трейлинг стоп, выход через указанное количество баров, условие как и при входе в рынок...).
7. Поддержка разных принципов управления ордерами/позициями, которые, конечно, зависят от стратегии. Например, сетка и стратегия на базе "граальной" машке имеют разные принципы.
8..........
.....
Можете выложить код стандартной стратегии, чтобы можно было увидеть простоту и функционал при добавлении стратегии.

Идеи тоже приветствуются.
 
Можно ещё добавить функционал по оптимизации параметров. Например, при отключаются все стратегии, кроме оптимизируемой, и подстройка параметров, которые определяют время работы стратегии...
 
Aliaksandr Hryshyn:
Какие наработки есть для создания роботов с несколькими стратегиями? Например, есть некоторая программная оболочка в которую довольно легко добавляются новые стратегии. Программная оболочка берёт на себя следующие функции:
1. Независимое управление стратегиями на разных инструментах и стратегиях.
2. Управление рисками.
3. Управление сделками/ордерами.
4. Обработка ошибок.
5. Планировщик(работа в определённое время).
6. Ограничения убытков/выход из сделки(трейлинг стоп, выход через указанное количество баров, условие как и при входе в рынок...).
7. Поддержка разных принципов управления ордерами/позициями, которые, конечно, зависят от стратегии. Например, сетка и стратегия на базе "граальной" машке имеют разные принципы.
8..........
.....
Можете выложить код стандартной стратегии, чтобы можно было увидеть простоту и функционал при добавлении стратегии.

Идеи тоже приветствуются.

Думаю, каждый советник - это инструмент реализации каждой ТС в отдельности. Как их можно объединять в одном советнике - нужно еще найти такой способ. Например, один из моих советников в режиме "false" реализует трендовую ТС, а в режиме "true" - флетовую ТС, без изменения других параметров настройки советника. Как их объединить? 
 

Вот моя версия, пример реализации стратегии  "Поглощение", аналогично можно создавать и другие, которые будут исполняться паралельно:

К‌од на MQL4.

#property strict                                            
#include <Greshnik\\breakdown.mqh>                          
extern string  dd_hd1="-------Сигнал 'Поглощение'-------";//---------
extern int     bg_TP=200;//TP
extern int     bg_interval= 11;//Отступ от минимальной/максимальной точки
extern int     bg_bar1size=160;//Минимальный размер первого бара
extern int     bg_hour_start=10;//Первый час торгов
extern int     bg_hour_stop=2;//Последний час торгов
extern int     bg_time_pending=3;//Время(периоды) удержания отложенного ордера
Breakdown *brd;

class MySignal1: public Breakdown_baseSignal
  {
public:
   virtual int initSignal()
     {

//Тут в примере происходит только настройка самой оболочки
      this.r_name="Поглощение";
      this.r_every_bar_only=true;
      this.r_timeactive_set(es_All_hours,false);
      //this.r_timeactive_set(es_All_days_week,false);
      this.r_timeactive_set(bg_hour_start,0,bg_hour_stop,59,true);

      //this.r_hist_trade_analyse=7;//Кол-во анализируемых сделок(-2=выключить анализ,-1=использоваьб стандартное значение)
      //this.r_hist_consecutive_losses=-2;//Максимальное доля непрерывных проигрышей(-2=не исп.,-1=стандартное значение)
      //this.r_hist_profitability=-2;//Минимальная прибыльность(-2=не исп.,-1=стандартное значение)
      //this.r_hist_share_lost_trades=-2;//Допустимая доля уб.сделок для сигнала(-2=не исп.,-1=стандартное значение)
      //this.r_hist_stability=-2;//Минимальная стабильность(-2=не исп.,-1=стандартное значение)

      //this.r_ignore_repeat_active_signal=true;
      //this.r_trailing_stop=true;
      //this.r_trailing_max_sl=1.2;
      //this.r_trailing_mul=1.8;
      //this.r_trailing_step_p=0.4;
      //this.r_lot_multipler=1.5;
      //this.r_hist_max_virtual=3;
      //this.r_hist_trade_analyse=8;
      return 0;
     }
   virtual int readSignal()
     {
      this.r_result=eb_false;

//Непосредственно сама стратегия
      double open1        = iOpen(Symbol(), Period(), 1);
      double open2        = iOpen(Symbol(), Period(), 2);
      double close1       = iClose(Symbol(), Period(), 1);
      double close2       = iClose(Symbol(), Period(), 2);
      double low1         = iLow(Symbol(), Period(), 1);
      double low2         = iLow(Symbol(), Period(), 2);
      double high1        = iHigh(Symbol(), Period(), 1);
      double high2        = iHigh(Symbol(), Period(), 2);

      //--- Определение цен установки ордеров и цен установки стоп-приказов
      double buyPrice=high1+bg_interval*Point;
      int buySL=(int)(buyPrice/Point-(low1/Point-bg_interval));
      double sellPrice=low1-bg_interval*Point;
      int sellSL=(int)((high1/Point+bg_interval)-sellPrice/Point);
      int _bar1size=(int)((high1-low1)/Point);
      if(_bar1size>bg_bar1size &&
         low1<low2 &&
         high1>high2 &&
         close1<open2 &&
         open1>close1 &&
         open2<close2)
        {
         if(sellPrice<Bid)
           {

//Даём торговую команду
            this.r_result=eb_true;
            this.r_trade_operation0=OP_SELLSTOP;
            this.r_price0=sellPrice;
            this.r_stop_loss0=sellSL;
            this.r_take_profit0=bg_TP;
            this.r_time_pending_order=bg_time_pending;
           }
        }
      else
         if(_bar1size>bg_bar1size &&
            low1<low2 &&
            high1>high2 &&
            close1>open2 &&
            open1<close1 &&
            open2>close2)
           {
            if(buyPrice>Ask)
              {

//Даём торговую команду
               this.r_result=eb_true;
               this.r_trade_operation0=OP_BUYSTOP;
               this.r_price0=buyPrice;
               this.r_stop_loss0=buySL;
               this.r_take_profit0=bg_TP;
               this.r_time_pending_order=bg_time_pending;
              }
           }
      return 0;
     }
   virtual int deinitSignal()
     {
      return 0;
     }
  };

int OnInit()
  {
   brd=new Breakdown();

//Первая стратегия, которая описана выше, можно и другие создавать
   MySignal1 *mm=new MySignal1();

//Добавление стратегии для исполнения. Стратегий может быть несколько, например, brd.r_Signal_add(strategy1);   brd.r_Signal_add(strategy2);   brd.r_Signal_add(strategy3);
   brd.r_Signal_add(mm);

//Погнали
   brd.r_Init_signals();
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {
   brd.r_OnDeinit();
   delete brd;
  }

void OnTick()
  {
   brd.r_OnTick();
  }

‌Обратите внимание, что в коде присутствует только инициализация самой управляющей оболочки, её настройка и, непосредственно, сама стратегия, тут представляется как "сигнал".

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

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

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

Е‌сть ли смысл реализовать как библиотеку и выложить на маркете?

О‌братите внимание на простоту написания советника при использовании данной оболочки.