WSB EA
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «wsb ea.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
WSB EA — торговый советник для MetaTrader 4, реализующий одновременную работу трёх независимых торговых систем. Каждая система работает на собственном таймфрейме, управляет своими ордерами и может использовать трейлинг-стоп. Советник анализирует индикатор RSI и ценовые данные для формирования торговых сигналов.
Основной модуль управляет рисками и денежными параметрами: поддерживает мартингейл-увеличение лотов, ограничение максимального количества ордеров, стоп по эквити и закрытие по достижении целевой прибыли. Также предусмотрены временные ограничения — возможность открытия позиций по понедельникам и принудительное закрытие по пятницам.
Советник включает систему защиты лицензии и работает через классы управления ордерами из библиотек sovetnikovNET. Все торговые операции выполняются через стандартные API MetaTrader 4. Три стратегии различаются таймфреймами, шагами пипсов и магическими номерами ордеров.
Настройки программы
| Настройка | Описание |
|---|---|
| SelectTrade | Режим торговли: разрешены все направления, только длинные, только короткие или торговля отключена. |
| MaxOrdersCount | Общее максимальное количество ордеров по всем стратегиям одновременно. |
| MM | Включает или отключает автоматическое управление размером лота на основе баланса или эквити. |
| Divider | Делитель для расчёта размера лота при автоматическом управлении капиталом (баланс делится на это значение). |
| Lots | Базовый размер лота для ручного режима управления объёмом. |
| LotExponent | Множитель увеличения лота при добавлении каждого нового ордера в сетку. |
| MaxLots | Максимально допустимый размер лота. |
| ContinueTrading | Разрешает продолжение открытия новых ордеров при условии, что отрицательная доходность не превышает установленный лимит просадки. |
| SelectChange_TF_Finish | Таймфрейм, используемый для определения нового бара при достижении максимального количества ордеров. |
| Change_TF_max_order | Порог максимального количества ордеров для переключения на другой таймфрейм торговли. |
| BackOrder | Включает обратные (реверсные) ордера при достижении определённой глубины сетки. Значение задаёт минимальное количество ордеров для активации реверса. |
| BackOrder_Exponent | Множитель лота для обратных ордеров. |
| Drawdoun1 | Максимальный процент просадки, при превышении которого торговля приостанавливается. |
| UsrednitbSei4as | Использовать усреднение цены открытия по тикам вместо пересчёта по новым барам. |
| TakeProfit | Общий уровень тейк-профита в пунктах от средней цены позиции. |
| ProfitClose | Включает автоматическое закрытие всех стратегий при достижении целевой прибыли в долларах. |
| ProfitCloseMaxOrder | Минимальное количество открытых ордеров, при котором активируется закрытие по прибыли. |
| ProfitCloseStrategyDollar | Целевая прибыль в долларах для автоматического закрытия всех стратегий. |
| UseEquityStop | Включает стоп-эквити: при превышении заданного процента убытка от эквити все ордера закрываются. |
| TotalEquityRisk | Процент потери эквити, при превышении которого срабатывает стоп по эквити и закрываются все ордера. |
| OpenMondey | Включает возможность открытия новых ордеров по понедельникам в заданном часовом окне. |
| OpenMondeyHour | Час начала окна для открытия ордеров по понедельникам. |
| CloseFriday | Включает автоматическое закрытие всех ордеров в пятницу в заданном часовом окне. |
| CloseFridayHour | Час начала окна закрытия ордеров в пятницу. |
| ContinueTrading_System1 | Разрешает продолжение торговли для первой стратегии. |
| SelectSystem1_TF | Таймфрейм для первой торговой стратегии. |
| MaxTrades_Hilo | Максимальное количество ордеров для первой стратегии. |
| UseTrailingStop_Hilo | Включает трейлинг-стоп для первой стратегии. |
| TrailStart_Hilo | Расстояние в пунктах от средней цены для активации трейлинг-стопа в первой стратегии. |
| TrailStop_Hilo | Расстояние в пунктах от текущей цены для установки стоп-лосса при трейлинг-стопе в первой стратегии. |
| PipStep_S1 | Базовый шаг пипсов для добавления ордеров в первой стратегии. |
| PipStepX_S1 | Множитель шага пипсов для расчёта дистанции добавления ордера в первой стратегии. |
| MagicNumber_1 | Магический номер ордеров первой стратегии для идентификации её сделок. |
| ContinueTrading_System2 | Разрешает продолжение торговли для второй стратегии. |
| SelectSystem2_TF | Таймфрейм для второй торговой стратегии. |
| MaxTrades_15 | Максимальное количество ордеров для второй стратегии. |
| UseTrailingStop_15 | Включает трейлинг-стоп для второй стратегии. |
| TrailStart_15 | Расстояние в пунктах от средней цены для активации трейлинг-стопа во второй стратегии. |
| TrailStop_15 | Расстояние в пунктах от текущей цены для установки стоп-лосса при трейлинг-стопе во второй стратегии. |
| PipStep_S2 | Базовый шаг пипсов для добавления ордеров во второй стратегии. |
| PipStepX_S2 | Множитель шага пипсов для расчёта дистанции добавления ордера во второй стратегии. |
| MagicNumber_2 | Магический номер ордеров второй стратегии для идентификации её сделок. |
| ContinueTrading_System3 | Разрешает продолжение торговли для третьей стратегии. |
| SelectSystem3_TF | Таймфрейм для третьей торговой стратегии. |
| MaxTrades_16 | Максимальное количество ордеров для третьей стратегии. |
| UseTrailingStop_16 | Включает трейлинг-стоп для третьей стратегии. |
| TrailStart_16 | Расстояние в пунктах от средней цены для активации трейлинг-стопа в третьей стратегии. |
| TrailStop_16 | Расстояние в пунктах от текущей цены для установки стоп-лосса при трейлинг-стопе в третьей стратегии. |
| PipStep_S3 | Базовый шаг пипсов для добавления ордеров в третьей стратегии. |
| PipStepX_S3 | Множитель шага пипсов для расчёта дистанции добавления ордера в третьей стратегии. |
| MagicNumber_3 | Магический номер ордеров третьей стратегии для идентификации её сделок. |
Поиск по коду файла
#property strict
#property version "1.21"
const int ADMIN_ID=1;
const int PRODUCT_ID=12;//WSB EA MT4
const string VERSION="1.21";
/*
1.21
- оптимизация
1.20
- оптимизация кода
1.12
- исправление закрытия реверса и подсчета количества ордеров.
1.11
- исправлена работа функции Use TF by Max Orders
- переименован параметр Trend в Reverse отвечающий за открытие реверсного ордера. По умолчанию функция отключена.
- исправления недочетов в алгоритме по данным пользователей
- в тестере тр не отображается для ускорения тестирования (виртуальный), при торговле тр будет ставиться обязательно.
- исправлен номер Magic для 3-й стратегии, он совпадал с 2й.
*/
#include <sovetnikovNET\Orders.mqh>
#include <sovetnikovNET\Draw.mqh>
#include <sovetnikovNET\Button.mqh>
#include <sovetnikovNET\Protect.mqh>
#include <Charts\Chart.mqh>
bool bcheck=false;
enum ENUM_MM_TYPE
{
MM_TYPE_BALANCE=1, //Balance
MM_TYPE_EQUITY=2, //Equity
};
#define MAX_SYSTEMS 3
string sExpertName="Strategy";
BLOCK(1,"Main settings");//.
#ifdef LICENSE_OFF
HIDE_LICENSE_PARAMS;
#else
SHOW_LICENSE_PARAMS;
#endif
input ENUM_TRADEMODE SelectTrade=TRADEMODE_ALL;//Trade Mode
I MaxOrdersCount=30; //Max orders count
B MM=true; //MM
ENUM_MM_TYPE MM_Type=MM_TYPE_BALANCE;
D Divider=10; //Divider
D Lots=0.01; //Lots
D LotExponent=1.55; //Lot exponent
D MaxLots=100; //Max Lot
B ContinueTrading=true; //Continue trading
TF SelectChange_TF_Finish=PERIOD_D1; //Use TF by Max Orders
I Change_TF_max_order=10; //Max Orders
I BackOrder=0; //Reverse Start
D BackOrder_Exponent=0.5; //Reverse Exponent
D Drawdoun1=10; //Drowdown
B UsrednitbSei4as=false;//Use open average by ticks
D TakeProfit=13; //Take profit
B ProfitClose=false;//Use close by 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
TF SelectSystem1_TF=PERIOD_M5; //TF
I MaxTrades_Hilo=8; //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.1; //Pip step multiplier
I MagicNumber_1=1000; //Magic
SEP(4);//.
BLOCK(4,"Strategy2 settings");//.
B ContinueTrading_System2=true; //Continue trading
TF SelectSystem2_TF=PERIOD_M15; //TF
I MaxTrades_15=8; //Max 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.1;//Pip step multiplier
I MagicNumber_2=2000;//Magic
SEP(5);//.
BLOCK(5,"Strategy3 settings");//.
B ContinueTrading_System3=true; //Continue trading
TF SelectSystem3_TF=PERIOD_M30; //TF
I MaxTrades_16=8; //Max 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=20;//Pip step
D PipStepX_S3=1.1;//Pip step multiplier
I MagicNumber_3=3000;//Magic
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)
{
__COPYRIGHT__
m_all=0;
dprofits=0;
dlots=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
}
Position();
}
}
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[];
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_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;
CMyOptions m_options;
CTime m_time;
CChart m_chart;
double dTakeProfit;
CDrawPos m_pos;
public:
int hrsi;
virtual bool OnInitIndicators()
{
#ifdef __MQL5__
hrsi=iRSI(_Symbol, PERIOD_H1, 14, PRICE_CLOSE);
#endif
return true;
}
virtual bool OnDeinitIndicators()
{
#ifdef __MQL5__
IndicatorRelease(hrsi);
#endif
return true;
}
virtual int OnInit()
{
// код доступен только после оплаты
}
virtual void OnDeinit(const int reason)
{
m_pos.OnDeinit();
m_chart.Detach();
for(int i=0; i<MAX_SYSTEMS; i++)
m_main[i].OnDeinit();
OnDeinitIndicators();
HideTestIndicators(false);
}
virtual void OnTick()
{
// код доступен только после оплаты
}
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]); //получим кол-во ордеров в структуре orders
if(i>0 && !IsHedging() && m_options.ContinueTrading_System[i])
m_options.ContinueTrading_System[i]=false;
}
int itotal=0;
double dsummProfits=0;
int imaxorders=0;
for(int i=0; i<MAX_SYSTEMS; i++)
{
iCount[i]=m_main[i].m_all;
itotal+=iCount[i];
dsummProfits+=dProfits[i];
if(iCount[i]>imaxorders)
imaxorders=iCount[i];//найдем максимальное кол-во ордеров у всех сеток
}
double dd=0;
if(AccountBalance()>0)
dd=NormalizeDouble(dsummProfits*100/AccountBalance(),3);
#ifndef LICENSE_OFF
bcheck=protect.GetStatus(); //получаем статус только если есть тики, иначе смысл
#endif
if(!m_main[0].IsWork())
return; //отключена торговля?
m_newday.Refresh(); //нПоказано первые 50% кода (символов: 14809)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.