wsb lock.mq4
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «wsb lock.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Данный советник предназначен для автоматической торговли на платформе MetaTrader 4. Он реализует управление до трёх торговыми стратегиями, каждая из которых работает на собственном таймфрейме и может открывать позиции в обоих направлениях. Советник использует усреднение позиций с нарастающими лотами и поддерживает визуальную панель на графике для мониторинга состояния счетов и стратегий.
Программа включает систему защиты от просадок: при достижении заданного порога убытков стратегия может быть заблокирована путём открытия встречного ордера, а при дальнейшем наборе прибыли — закрыта. Также реализована общая остановка по уровню эквити и автоматическое закрытие позиций при достижении заданного процента убытков. Трейлинг-стоп доступен для каждой из стратегий отдельно.
Советник использует внешний индикатор для формирования торговых сигналов и поддерживает настройку времени торговли, включая фильтры открытия в понедельник и закрытия в пятницу. Управление размером лотов реализовано через систему управления рисксом с возможностью расчёта на основе баланса или эквити счёта.
Настройки программы
| Настройка | Описание |
|---|---|
| Panel show use (chartDisplay) | Отображение панели — Включает или отключает визуальную панель информации на графике |
| Display place corner (chartDisplayPlace) | Расположение панели — Угол экрана, в котором будет размещена панель |
| Font Size (FontSize) | Размер шрифта — Размер шрифта элементов панели |
| Lots (Lots) | Лоты — Базовый размер лота для открытия позиций |
| MM (MM) | Управление рисксом — Включает расчёт размера лота на основе баланса или эквити |
| MM_Type | Тип расчёта лота — Базовое значение для расчёта лота: баланс или эквити |
| Divider (Divider) | Делитель — Делитель для расчёта размера лота при управлении рисксом |
| Lot exponent (LotExponent) | Показатель лота — Множитель увеличения лота при усреднении |
| Max Lots (MaxLots) | Максимальные лоты — Максимально допустимый размер лота для одной позиции |
| Max orders count (MaxOrdersCount) | Максимум ордеров — Общее ограничение на количество ордеров по всем стратегиям |
| Use TF by Max Orders (SelectChange_TF_Finish) | Таймфрейм для смены — Таймфрейм, используемый для определения момента смены условия по количеству ордеров |
| Max Orders for TF (Change_TF_max_order) | Порог ордеров для смены ТФ — Количество ордеров, при достижении которого меняется таймфрейм для новых сигналов |
| Continue trading (Dry = false) (ContinueTrading) | Продолжение торговли — Разрешает дальнейшее открытие позиций в режиме реальной торговли |
| Drawdown for first % (Drawdoun1) | Первая просадка — Процент просадки, при превышении которого блокируется открытие новых позиций |
| Drawdown stop all % (Drawdoun2) | Вторая просадка — Процент просадки, при превышении которого происходит полная остановка торговли |
| Lock use (DrawdounLockStart) | Блокировка при просадке — Включает механизм блокировки стратегии при достижении заданной просадки |
| Lock strategy start in % (DrawdounLock) | Порог блокировки — Процент просадки, при котором активируется блокировка стратегии |
| Lock strategy close profit % (LockProfitProc) | Профит для разблокировки — Процент прибыли, необходимый для закрытия заблокированной стратегии |
| Close by DD strategy in % (DrawdounCloseActive) | Закрытие по просадке — Включает автоматическое закрытие стратегии при достижении заданного процента убытков |
| Close DD in % (DrawdounClose) | Порог закрытия — Процент убытка, при котором стратегия закрывается принудительно |
| Use open average by ticks (UsrednitbSei4as) | Усреднение по тикам — Использовать усреднение позиций по каждому тику вместо баров |
| TF start (SelectOpenOrdersNorm_TF) | Таймфрейм стандартного сигнала — Таймфрейм для формирования первого сигнала и усреднения |
| Count 1 (max_orders_strategy_1) | Макс. ордеров стратегии 1 — Пороговое количество ордеров для первой стратегии |
| TF1 (SelectOpenOrdersDrawdount11_TF) | Таймфрейм 1 стратегии 1 — Таймфрейм для проверки новых баров при количестве ордеров в первом диапазоне |
| Count 2 (max_orders_strategy_2) | Макс. ордеров стратегии 2 — Пороговое количество ордеров для второй стратегии |
| TF2 (SelectOpenOrdersDrawdount12_TF) | Таймфрейм 2 стратегии 1 — Таймфрейм для проверки новых баров при количестве ордеров во втором диапазоне |
| Total Count (max_orders_para) | Общий максимум ордеров — Общее пороговое количество ордеров для всех стратегий |
| TF3 (SelectOpenOrdersDrawdount2_TF) | Таймфрейм 3 стратегии 1 — Таймфрейм для проверки новых баров при превышении общего лимита ордеров |
| Take profit (TakeProfit) | Тейк-профит — Общий уровень фиксации прибыли в пунктах от цены открытия |
| Use close by total profit (ProfitClose) | Закрытие по прибыли — Включает автоматическое закрытие всех стратегий при достижении заданной прибыли |
| Minimal count orders (ProfitCloseMaxOrder) | Мин. кол-во ордеров — Минимальное количество ордеров для срабатывания закрытия по прибыли |
| Profit in valute (ProfitCloseStrategyDollar) | Прибыль для закрытия — Суммарная прибыль в валюте счёта для автоматического закрытия всех стратегий |
| Use equity stop (UseEquityStop) | Эквити-стоп — Включает остановку торговли при достижении заданного уровня эквити |
| Total equity risk (TotalEquityRisk) | Риск эквити — Допустимый процент просадки эквити от баланса для полной остановки |
| Use open monday (OpenMondey) | Открытие в понедельник — Разрешает открытие позиций только в понедельник в заданное время |
| Hour (OpenMondeyHour) | Час открытия понедельника — Час начала торгового окна в понедельник |
| Use close friday (CloseFriday) | Закрытие в пятницу — Автоматическое закрытие всех позиций в пятницу в заданное время |
| Hour (CloseFridayHour) | Час закрытия пятницы — Час начала закрытия позиций в пятницу |
| Continue trading (ContinueTrading_System1) | Продолжение стратегии 1 — Разрешает дальнейшее открытие позиций для первой стратегии |
| Close All Orders (ClouseS1) | Принудительное закрытие 1 — Принудительно закрывает все ордера первой стратегии |
| Select direct (SelectTradeS1) | Направление стратегии 1 — Направление торговли для первой стратегии: все, только длинные или только короткие |
| TF (SelectSystem1_TF) | Таймфрейм стратегии 1 — Таймфрейм для формирования сигналов первой стратегии |
| Max Orders (MaxTrades_Hilo) | Макс. ордеров стратегии 1 — Максимальное количество ордеров для первой стратегии |
| Use trailing stop (UseTrailingStop_Hilo) | Трейл-стоп стратегии 1 — Включает трейлинг-стоп для первой стратегии |
| Trailing start (TrailStart_Hilo) | Старт трейла стратегии 1 — Расстояние в пунктах от цены для активации трейлинг-стопа первой стратегии |
| Trailing stop (TrailStop_Hilo) | Стоп трейла стратегии 1 — Расстояние в пунктах для фиксации трейлинг-стопа первой стратегии |
| Pip step (PipStep_S1) | Шаг в пипах стратегии 1 — Базовый шаг в пипсах для усреднения первой стратегии |
| Pip step multiplier (PipStepX_S1) | Множитель шага стратегии 1 — Множитель увеличения шага для последующих ордеров первой стратегии |
| Magic (MagicNumber_1) | Магическое число 1 — Идентификатор ордеров первой стратегии |
| Continue trading (ContinueTrading_System2) | Продолжение стратегии 2 — Разрешает дальнейшее открытие позиций для второй стратегии |
| Close All (ClouseS2) | Принудительное закрытие 2 — Принудительно закрывает все ордера второй стратегии |
| Select direct (SelectTradeS2) | Направление стратегии 2 — Направление торговли для второй стратегии: все, только длинные или только короткие |
| TF (SelectSystem2_TF) | Таймфрейм стратегии 2 — Таймфрейм для формирования сигналов второй стратегии |
| Max Orders Orders (MaxTrades_15) | Макс. ордеров стратегии 2 — Максимальное количество ордеров для второй стратегии |
| Use Trailing stop (UseTrailingStop_15) | Трейл-стоп стратегии 2 — Включает трейлинг-стоп для второй стратегии |
| Trailing start (TrailStart_15) | Старт трейла стратегии 2 — Расстояние в пунктах от цены для активации трейлинг-стопа второй стратегии |
| Trailing stop (TrailStop_15) | Стоп трейла стратегии 2 — Расстояние в пунктах для фиксации трейлинг-стопа второй стратегии |
| Pip step (PipStep_S2) | Шаг в пипах стратегии 2 — Базовый шаг в пипсах для усреднения второй стратегии |
| Pip step multiplier (PipStepX_S2) | Множитель шага стратегии 2 — Множитель увеличения шага для последующих ордеров второй стратегии |
| Magic (MagicNumber_2) | Магическое число 2 — Идентификатор ордеров второй стратегии |
| Continue trading (ContinueTrading_System3) | Продолжение стратегии 3 — Разрешает дальнейшее открытие позиций для третьей стратегии |
| Close All (ClouseS3) | Принудительное закрытие 3 — Принудительно закрывает все ордера третьей стратегии |
| Select direct (SelectTradeS3) | Направление стратегии 3 — Направление торговли для третьей стратегии: все, только длинные или только короткие |
| TF (SelectSystem3_TF) | Таймфрейм стратегии 3 — Таймфрейм для формирования сигналов третьей стратегии |
| Max Orders Orders (MaxTrades_16) | Макс. ордеров стратегии 3 — Максимальное количество ордеров для третьей стратегии |
| Use Trailing stop (UseTrailingStop_16) | Трейл-стоп стратегии 3 — Включает трейлинг-стоп для третьей стратегии |
| Trailing start (TrailStart_16) | Старт трейла стратегии 3 — Расстояние в пунктах от цены для активации трейлинг-стопа третьей стратегии |
| Trailing stop (TrailStop_16) | Стоп трейла стратегии 3 — Расстояние в пунктах для фиксации трейлинг-стопа третьей стратегии |
| Pip step (PipStep_S3) | Шаг в пипах стратегии 3 — Базовый шаг в пипсах для усреднения третьей стратегии |
| Pip step multiplier (PipStepX_S3) | Множитель шага стратегии 3 — Множитель увеличения шага для последующих ордеров третьей стратегии |
| Magic (MagicNumber_3) | Магическое число 3 — Идентификатор ордеров третьей стратегии |
Поиск по коду файла
#property version "1.02"
#property strict
#include <sovetnikovNET\Orders.mqh>
#include <sovetnikovNET\Time.mqh>
#include <sovetnikovNET\Draw.mqh>
#include <sovetnikovNET\Bcrypt.mqh>
#include <Charts\Chart.mqh>
#include <Controls\Picture.mqh>
#resource "\\Indicators\\FTLM-STLMxAMm.ex4"
#resource "\\Images\\wsb_reverse.bmp"
#resource "\\Images\\wsb_logo.bmp"
#define LOGO_RESOURCE "::Images\\wsb_logo.bmp"
#define PANEL_RESOURCE "::Images\\wsb_reverse.bmp"
#define LOGO_W 1280
#define LOGO_H 719
#define PANEL_W 400
#define PANEL_H 376
class CMyPos: public CDrawPos
{
public:
virtual void MovePosition(int ix,int iy,int iwidth,int iheight,ENUM_BASE_CORNER ecorner)
{
option_x=ix;
option_y=iy;
option_corner=ecorner;
if(option_corner==CORNER_LEFT_LOWER)
{
option_x=ix;
option_y=ChartHeight()-iheight-iy-2;
}
else
if(option_corner==CORNER_RIGHT_LOWER)
{
option_x=ChartWidth()-iwidth-ix-2;
option_y=ChartHeight()-iheight-iy+18;
}
else
if(option_corner==CORNER_RIGHT_UPPER)
{
option_x=ChartWidth()-iwidth-ix-2;
option_y=iy;
}
}
};
enum ENUM_MM_TYPE
{
MM_TYPE_BALANCE=1, //Balance
MM_TYPE_EQUITY=2, //Equity
};
enum ENUM_SELECT_TRADE
{
SELECT_TRADE_ALL=7,//Long & Short
SELECT_TRADE_LONG=8, //Only Long
SELECT_TRADE_SHORT=9 //Only Short
};
#define MAX_SYSTEMS 3
string sExpertName="Strategy";
BLOCK(1,"Main settings");//.
B chartDisplay=true; //Panel show use
input ENUM_BASE_CORNER chartDisplayPlace=CORNER_LEFT_UPPER; //Display place corner
I FontSize=14; //Font Size
D Lots=0.01; //Lots
B MM=true; //MM
input ENUM_MM_TYPE MM_Type=MM_TYPE_BALANCE;
D Divider=10; //Divider
D LotExponent=1.5; //Lot exponent
D MaxLots=5; //Max Lots
I MaxOrdersCount=15; //Max orders count
TF SelectChange_TF_Finish=PERIOD_D1; //Use TF by Max Orders
I Change_TF_max_order=5; //Max Orders for TF
B ContinueTrading=true; //Continue trading (Dry = false)
D Drawdoun1=10; //Drawdown for first %
D Drawdoun2=25; //Drawdown stop all %
B DrawdounLockStart=true; //Lock use
D DrawdounLock=5.0; //Lock strategy start in %
D LockProfitProc=50; //Lock strategy close profit %
B DrawdounCloseActive=true; //Close by DD strategy in %
D DrawdounClose=3.0; //Close DD in %
B UsrednitbSei4as=false;//Use open average by ticks
TF SelectOpenOrdersNorm_TF=PERIOD_M5;//TF start
I max_orders_strategy_1=6;//Count 1
TF SelectOpenOrdersDrawdount11_TF=PERIOD_H1;//TF1
I max_orders_strategy_2=8;//Count 2
TF SelectOpenOrdersDrawdount12_TF=PERIOD_H4;//TF2
I max_orders_para=10;//Total Count
TF SelectOpenOrdersDrawdount2_TF=PERIOD_D1;//TF3
D TakeProfit=25; //Take profit
B ProfitClose=false;//Use close by total profit
I ProfitCloseMaxOrder=5;//Minimal count orders
D ProfitCloseStrategyDollar=25.0;//Profit in valute
B UseEquityStop=false; //Use equity stop
D TotalEquityRisk=20.0; //Total equity risk
SEP(2);//.
BLOCK(2,"Time settings");//.
B OpenMondey=false; //Use open monday
I OpenMondeyHour=0; //Hour
B CloseFriday=false; //Use close friday
I CloseFridayHour=17; //Hour
SEP(3);//.
BLOCK(3,"Strategy1 settings");//.
B ContinueTrading_System1=true; //Continue trading
bool Sei4as_S1=false; //Ignore indicators and TF for open first
B ClouseS1=false; //Close All Orders
input ENUM_SELECT_TRADE SelectTradeS1=SELECT_TRADE_ALL; //Select direct
TF SelectSystem1_TF=PERIOD_M5; //TF
I MaxTrades_Hilo=10; //Max Orders
B UseTrailingStop_Hilo=false; //Use trailing stop
D TrailStart_Hilo=10.00000000; //Trailing start
D TrailStop_Hilo=5.00000000; //Trailing stop
D PipStep_S1=15; //Pip step
D PipStepX_S1=1.2; //Pip step multiplier
I MagicNumber_1=1000; //Magic
SEP(4);//.
BLOCK(4,"Strategy2 settings");//.
B ContinueTrading_System2=true; //Continue trading
bool Sei4as_S2=false; //Ignore indicators and TF for open first
B ClouseS2=false; //Close All
input ENUM_SELECT_TRADE SelectTradeS2=SELECT_TRADE_ALL; //Select direct
TF SelectSystem2_TF=PERIOD_M15; //TF
I MaxTrades_15=10; //Max Orders Orders
B UseTrailingStop_15=false; //Use Trailing stop
D TrailStart_15=10.00000000; //Trailing start
D TrailStop_15=5.00000000;//Trailing stop
D PipStep_S2=20;//Pip step
D PipStepX_S2=1.2;//Pip step multiplier
I MagicNumber_2=2000;//Magic
SEP(5);//.
BLOCK(5,"Strategy3 settings");//.
B ContinueTrading_System3=true; //Continue trading
bool Sei4as_S3=false; //Ignore indicators and TF for open first
B ClouseS3=false; //Close All
input ENUM_SELECT_TRADE SelectTradeS3=SELECT_TRADE_ALL; //Select direct
TF SelectSystem3_TF=PERIOD_M30; //TF
I MaxTrades_16=10; //Max Orders Orders
B UseTrailingStop_16=false; //Use Trailing stop
D TrailStart_16=10.00000000; //Trailing start
D TrailStop_16=5.00000000;//Trailing stop
D PipStep_S3=25;//Pip step
D PipStepX_S3=1.2;//Pip step multiplier
I MagicNumber_3=3000;//Magic
CGlobal g_global;
class CMyOrders: public COrders
{
public:
virtual bool CheckMagic(long iMagic)
{
return (iMagic==m_imagic || iMagic==m_imagic+1);
}
virtual int UpdateProfits(double &dprofits,double &dlots,int &icount,int &iback)
{
__COPYRIGHT__
m_all=0;
dprofits=0;
dlots=0;
icount=0;
iback=0;
ArrayInitialize(orders,0);
int itype=-1;
int itotal=PositionsTotal();
for(int i=itotal-1; i>=0; i--)
{
if(SelectByIndex(i,true))
{
m_all++;
itype=m_position.PositionType();
orders[itype]++;
dprofits+=m_position.Profit()+m_position.Swap()+m_position.Commission();
if(m_position.Magic()==m_imagic)
{
dlots+=m_position.Volume(); //считаем лот только стратегии без ордера reverse
icount++; //считаем основные ордера в сетке
}
if(m_position.Magic()==m_imagic+1) //,будет лок ордер
{
iback++;
}
}
}
return m_all; //вернем кол-во ордеров в структуре
}
virtual ulong getOrderTicket(int itype=ALL,const int imode=MODE_TRADES,const datetime dttm=0,bool bHistoryOpenOrderTime=true)
{
__COPYRIGHT__
datetime dtm=0,dtm_open=0;
ulong iticket=0;
int icount=0;
int flag;
icount=PositionsTotal();
for(int i=icount-1; i>=0; i--)
{
if(!SelectByIndex(i,true))
continue;
if(m_position.Magic()==m_imagic+1)
continue; //пропустим бэк ордера
dtm_open=m_position.Time();
flag=toMyTypes(m_position.PositionType())&itype;
if(m_position.PositionType()==toDefType(flag,(int)itype) && dtm_open>=dttm && (m_position.Ticket()>iticket || iticket==-1))
{
dtm=dtm_open;
iticket=m_position.Ticket();
}
}
return iticket;
}
};
class CMyOptions: public COptions
{
public:
bool ContinueTrading_System[];
bool Sei4as[]; //Ignore indicators and TF for open first
bool Clouse[]; //Close All
ENUM_SELECT_TRADE SelectTrade[]; //Select direct
ENUM_TIMEFRAMES SelectSystem_TF[];
int MaxTrades[];
bool UseTrailingStop[];
double TrailStart[];
double TrailStop[];
double PipStep[];
double PipStepX[];
int MagicNumber[];
virtual void OnInit()
{
// код доступен только после оплаты
}
void Add_ContinueTrading_System(bool bContinueTrading_System)
{
Add(ContinueTrading_System,bContinueTrading_System);
}
void Add_Sei4as(bool bSei4as)
{
Add(Sei4as,bSei4as);
}
void Add_Clouse(bool bClouse)
{
Add(Clouse,bClouse);
}
void Add_SelectTrade(ENUM_SELECT_TRADE eSelectTrade)
{
Add(SelectTrade,eSelectTrade);
}
void Add_SelectSystem_TF(ENUM_TIMEFRAMES eSelectSystem_TF)
{
Add(SelectSystem_TF,eSelectSystem_TF);
}
void Add_MaxTrades(int iMaxTrades)
{
Add(MaxTrades,iMaxTrades);
}
void Add_UseTrailingStop(bool bUseTrailingStop)
{
Add(UseTrailingStop,bUseTrailingStop);
}
void Add_TrailStart(double dTrailStart)
{
Add(TrailStart,dTrailStart);
}
void Add_TrailStop(double dTrailStop)
{
Add(TrailStop,dTrailStop);
}
void Add_PipStep(double dPipStep)
{
Add(PipStep,dPipStep);
}
void Add_PipStepX(double dPipStepX)
{
Add(PipStepX,dPipStepX);
}
void Add_MagicNumber(int iMagicNumber)
{
Add(MagicNumber,iMagicNumber);
}
};
class CMain: public CMainDefault
{
protected:
CMyOrders m_main[MAX_SYSTEMS];
CNewBar m_bar[MAX_SYSTEMS],m_day,m_newday,m_checkbar[4];
CMyOptions m_options;
CTime m_time;
CChart m_chart;
bool bDrawPanel;
CPicture m_logo;
CDraw m_draw;
CMyPos m_pos;
CTimer m_timer;
public:
virtual int OnInit()
{
// код доступен только после оплаты
}
virtual void OnDeinit(const int reason)
{
m_timer.OnDeinit();
m_chart.Detach();
for(int i=0; i<MAX_SYSTEMS; i++)
m_main[i].OnDeinit();
HideTestIndicators(false);
m_pos.OnDeinit();
m_draw.OnDeinit();
}
virtual void OnTick()
{
// код доступен только после оплаты
}
bool bcheck=true;
static color clRoute=clrRed;
if(bcheck)
{
clRoute=clrLime;
}
else
{
if(clRoute==clrLime)
clRoute=clrRed;
}
if(bDrawPanel)
{
if(clRoute==clrRed)
clRoute=clrGold;
else
if(clRoute==clrGold)
clRoute=clrRed;
}
double dProfits[MAX_SYSTEMS],dLot[MAX_SYSTEMS];
int iCount[MAX_SYSTEMS],iBack[MAX_SYSTEMS];
ArrayInitialize(dProfits,0);
ArrayInitialize(dLot,0);
ArrayInitialize(iCount,0);
ArrayInitialize(iBack,0);
for(int i=0; i<MAX_SYSTEMS; i++)
{
m_main[i].OnTick();
m_main[i].UpdateProfits(dProfits[i],dLot[i],iCount[i],iBack[i]); //получим кол-во ордеров в структуре orders
}
int itotal=0;
double dsummProfits=0;
int imaxorders=0;
for(int i=0; i<MAX_SYSTEMS; i++)
{
itotal+=iCount[i];
dsummProfits+=dProfits[i];
if(iCount[i]>imaxorders)
imaxorders=iCount[i];//найдем максимальное кол-во ордеров у всех сеток
}
double dd=0;
if(AccountBalance()>0)
dd=NormalizeDouble((AccountEquity()-AccountBalance())*100/AccountBalance(),3);
TESTER_EVENT_TIMER(m_timer);
if(!bcheck && itotal==0)
return; //обязательно компилировать и накладывать MQL5 защиту!!!
if(!m_main[0].IsWork())
return; //отключена торговля?
if(ProfitClose)
{
if(itotal>=ProfitCloseMaxOrder)
{
if(dsummProfits>=ProfitCloseStrategyDollar)
{
for(int i=0; i<MAX_SYSTEMS; i++)
m_main[i].OrderCloseAll(ALL); //закроем все стратегии по прибыли
return;//вернемся к следующему тику для нового анализа
}
}
}
if(UseEquityStopПоказано первые 50% кода (символов: 23681)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.