← К каталогу
Исходный код · ID 3509

WSB EA

wsb ea.mq4

Похожие материалы по тегам

ares_indicator.pineTradingView · 1 общих теговgold_trend_revers.mq5MQL5 / MetaTrader 5 · 1 общих тегов!!!-mt4 x-xardg-rsi.mq5MQL5 / MetaTrader 5 · 1 общих тегов! cycle-identifier.mq5MQL5 / MetaTrader 5 · 1 общих тегов!!! rsi ma simple+arrows 1.2 (mtf).mq5MQL5 / MetaTrader 5 · 1 общих теговprecisionflowea.mq5MQL5 / MetaTrader 5 · 1 общих тегов
Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

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 и перейдите к оплате.

Стоимость полного кода
1 480,90₽ ≈ $18.10