- как совместить 2 советника в 1 используя чужие наработки?
- Разговор с искусственным интеллектом (ИИ) о форексе.
- Ищу продукт для создания торговой стратегии
Думаю, каждый советник - это инструмент реализации каждой ТС в отдельности. Как их можно объединять в одном советнике - нужно еще найти такой способ. Например, один из моих советников в режиме "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();
}
Обратите внимание, что в коде присутствует только инициализация самой управляющей оболочки, её настройка и, непосредственно, сама стратегия, тут представляется как "сигнал".
Никаких торговых функций, никаких обработок ошибок и т.п. Всё это уже реализовано в самой оболочке(включаемом файле). Присутствует жёсткий контроль на адекватность заполнения управляющих значений, в случае ошибки, в сообщениях довольно точно указываются как должно или не должно быть, и происходит отключение стратегии, остальные, если нету ошибок, могут дальше работать. Можно сказать, что минимизируется влияние человеческого фактора.
Сюда можно добавлять несколько стратегий, они будут исполняться параллельно, заморачиваться о совместной их работе уже не надо(использование депозита, назначение магиков и т.д.).
Данная реализация имеет определённые ограничения, на стратегию(сигнал) допускается только одна активная позиция или два отложенных ордера, мне так надо было. Тут ещё показан не весь функционал.
Есть ли смысл реализовать как библиотеку и выложить на маркете?
Обратите внимание на простоту написания советника при использовании данной оболочки.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования