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

genibot.mq4

Вы автор или правообладатель?

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

Получить полный код

Поиск по коду файла

#property version   "1.00"
#property strict

#define POINTS_NEW

#include <sovetnikovGUI\Orders.mqh>
#include <sovetnikovGUI\Button.mqh>
#include <sovetnikovGUI\Time.mqh>
#include <sovetnikovGUI\Bcrypt.mqh>
#include <Charts\Chart.mqh>
#include <Controls\Picture.mqh>

#define VALID_KEY "Advisor activated."
#define EMPTY_KEY "Activate the key."
#define INVALID_KEY "Invalid key."
#define EXPERIED "Key expired."

#define LICENSE_NAME "genibot_key"

#define LICENSE_OFF

#resource "\\Indicators\\FTLM-STLMxAMm.ex4"
#resource "\\Images\\genibot\\panel.bmp"
#resource "\\Images\\genibot\\logo.bmp"
#resource "\\Images\\genibot\\logo2.bmp"
#define PANEL_RESOURCE "::Images\\genibot\\panel.bmp"
#define LOGO_RESOURCE "::Images\\genibot\\logo.bmp"
#define LOGO2_RESOURCE "::Images\\genibot\\logo2.bmp"

#define LOGO2_W 909
#define LOGO2_H 550

#define LOGO_W 700
#define LOGO_H 424

#define PANEL_W 400
#define PANEL_H 376

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_RIGHT_UPPER; //Display place corner
I FontSize=12; //Font Size

input ENUM_SELECT_TRADE SelectTrade=SELECT_TRADE_ALL; //Trade Mode
D Lots=0.01; //Lots
B MM=false; //MM
ENUM_MM_TYPE MM_Type=MM_TYPE_BALANCE;
D Divider=10; //Divider
D LotExponent=1.55; //Lot exponent
D MaxLots=100; //Max Lots

TF SelectChange_TF_Finish=PERIOD_D1; //Use TF by Max Orders
I Change_TF_max_order=10; //Max Orders

B ContinueTrading=true; //Continue trading

I BackOrder=0; //Use reverse
D BackOrder_Exponent=0.5; //Reverse Lot exponent

B Stabilization=false; //Stabilization
D Stabilization_DD=5; //Drawdown for stabilization
D Stabilization_Procent=50;  //Profit % for stabilization

TF SelectOpenOrdersNorm_TF=PERIOD_H1;//TF norma
D Drawdoun=5; //Drawdown1
TF SelectOpenOrdersDrawdount11_TF=PERIOD_H4;//TF1
D Drawdoun2=10; //Drawdown2
TF SelectOpenOrdersDrawdount12_TF=PERIOD_D1;//TF2

D TakeProfit=125; //Take profit

B ProfitClose=true;//Use close by profit
I ProfitCloseMaxOrder=10;//Minimal count orders
D ProfitCloseStrategyDollar=5.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=true; //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_M15; //TF

I MaxTrades_Hilo=15; //Max Orders

B UseTrailingStop_Hilo=false; //Use trailing stop
D TrailStart_Hilo=100.00000000; //Trailing start
D TrailStop_Hilo=50.00000000; //Trailing stop
D PipStep_Hilo=250; //Pip step
D PipStepX_Hilo=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_H1; //TF
I MaxTrades_15=15; //Max Orders Orders
B UseTrailingStop_15=false; //Use Trailing stop
D TrailStart_15=100.00000000; //Trailing start
D TrailStop_15=50.00000000;//Trailing stop
D PipStep_15=195;//Pip step
D PipStepX_15=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_H4; //TF
I MaxTrades_16=15; //Max Orders Orders
B UseTrailingStop_16=false; //Use Trailing stop
D TrailStart_16=100.00000000; //Trailing start
D TrailStop_16=50.00000000;//Trailing stop
D PipStep_16=150;//Pip step
D PipStepX_16=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,int &icount,int &iback)
     {

      __COPYRIGHT__
      ArrayResize(m_orders,0);
      m_all=0;
      ArrayInitialize(orders,0);

      int isize=0;
      int itotal=::OrdersTotal();

      dprofits=0;
      dlots=0;
      icount=0;
      iback=0;

      m_total=itotal; //запомним для проверок кол-ва лимита ордеров

      for(int i=0; i<itotal; i++)
        {
         if(!::OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
            continue; //если не выбирает, пропускаем

         if(CheckSymbol(::OrderSymbol()))
           {

            if((!options_bSupportMaxLot && CheckMagic(::OrderMagicNumber(),::OrderComment())) || options_bSupportMaxLot)
              {

               isize=ArraySize(m_orders); //кол-во оредров в структуре

               if(ArrayResize(m_orders,isize+1)!=-1)
                 {
                  if(m_orders[isize].getOrderByTicket(::OrderTicket())) //загрузим информацию по ордеру (грузим все ордера)
                    {
                     dprofits+=m_orders[isize].Profit;

                     if(m_orders[isize].OrderMagicNumber==m_imagic)
                       {
                        dlots+=m_orders[isize].OrderLots; //считаем лот только стратегии без ордера reverse
                        icount++; //считаем основные ордера в сетке
                       }

                     if(m_orders[isize].OrderMagicNumber==m_imagic+1)
                       {
                        iback++;
                       }

                     orders[m_orders[isize].OrderType]++; //увеличим счетчик
                     m_all++;
                    }
                 }
              }

           }
        }

      return m_all; //вернем кол-во ордеров в структуре
     }

   virtual double    get_Average(int itype,int &idirect,double dProfit=0)
     {

      double dprofit[2]= {0,0},
                         m_lots[2]= {0,0},
                                    icount[2]= {0,0};

      idirect=0;

      double dask=SymbolInfoDouble(m_name,SYMBOL_ASK);
      double dbid=SymbolInfoDouble(m_name,SYMBOL_BID);

      int flag;

      for(int i=ArraySize(m_orders)-1; i>=0; i--)
        {

         if(m_orders[i].OrderCloseTime>0)
            continue;

         if(CheckMagic(m_orders[i].OrderMagicNumber,m_orders[i].OrderComment) && CheckSymbol(m_orders[i].OrderSymbol))
           {

            flag=toMyTypes(m_orders[i].OrderType)&itype;

            if(m_orders[i].OrderType==OP_BUY && toDefType(flag,itype)==OP_BUY)
              {
               m_lots[0]+=m_orders[i].OrderLots;
               dprofit[0]+=NormalizeDouble(m_orders[i].Profit,2);
               icount[0]++;
              }
            if(m_orders[i].OrderType==OP_SELL && toDefType(flag,itype)==OP_SELL)
              {
               m_lots[1]+=m_orders[i].OrderLots;
               dprofit[1]+=NormalizeDouble(m_orders[i].Profit,2);
               icount[1]++;
              }
           }
        }

      if(NormalizeDouble(m_lots[0],2)-NormalizeDouble(m_lots[1],2)==0.0)
         return (0);

      if(NormalizeDouble(m_lots[0],2)>NormalizeDouble(m_lots[1],2))
         idirect=1;
      if(NormalizeDouble(m_lots[0],2)<NormalizeDouble(m_lots[1],2))
         idirect=-1;

      double PriceLevel=0;
      double TickValue=NormalizeDouble(SymbolInfoDouble(m_name,SYMBOL_TRADE_TICK_VALUE),3);
      if(TickValue==0.0)
         return 0;

      double _dpoint=SymbolInfoDouble(m_name,SYMBOL_POINT);
      if(_dpoint==0.0)
         return 0;

      double sp=ND1((dask-dbid)/p);

      int idigits=(int)SymbolInfoInteger(m_name,SYMBOL_DIGITS);

      if((m_lots[0]-m_lots[1])>0)
         PriceLevel=nd(dbid-((dprofit[0]+dprofit[1]+dProfit)/(TickValue*(m_lots[0]-m_lots[1]))*_dpoint),m_name);
      if((m_lots[1]-m_lots[0])>0)
         PriceLevel=nd(dbid+((dprofit[0]+dprofit[1]+dProfit)/(TickValue*(m_lots[1]-m_lots[0]))*_dpoint),m_name);

      return NormalizeDouble(PriceLevel,idigits);
     }

   virtual long       getOrderTicket(int itype=ALL,const int imode=MODE_TRADES,const datetime dttm=0,bool bHistoryOpenOrderTime=true)
     {
      __COPYRIGHT__
      datetime dtm=0,dtm_open=0;
      long iticket=-1;
      int icount=0;
      int flag;

      icount=ArraySize(m_orders);

      for(int i=icount-1; i>=0; i--)
        {
         if(m_orders[i].OrderCloseTime>0)
            continue;

         if(m_orders[i].OrderMagicNumber==m_imagic+1)
            continue; //пропустим бэк ордера

         dtm_open=m_orders[i].OrderOpenTime;

         flag=toMyTypes(m_orders[i].OrderType)&itype;

         if(m_orders[i].OrderType==toDefType(flag,(int)itype) && dtm_open>=dttm && (m_orders[i].OrderTicket>iticket || iticket==-1))
           {
            dtm=dtm_open;
            iticket=m_orders[i].OrderTicket;

           }

        }

      return iticket;
     }
  };

class CMyOptions: public COptions
  {
public:
   bool              ContinueTrading_System[];
   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_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 CFullOrders: public COrders
  {
public:
   virtual bool      CheckMagic(long iMagic)
     {
      return (iMagic==MagicNumber_1 || iMagic==MagicNumber_2 || iMagic==MagicNumber_3);
     }

  };

class CMain: public CMainDefault
  {
protected:
   CMyOrders         m_main[MAX_SYSTEMS];
   CNewBar           m_bar[MAX_SYSTEMS],m_day,m_newday,m_checkbar[3];

   CMyOptions        m_options;
   CTime             m_time;
   CChart            m_chart;

   bool              bDrawPanel;

   CDrawPos          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();

     }

   virtual void      OnTick()
     {
      // код доступен только после оплаты
   }

      string sLicense=VALID_KEY;

      bool bcheck=checkAccount(sLicense,LICENSE_NAME);

      if(bDrawPanel)
        {

         m_pos.DrawStatus("status",sLicense,bcheck);

        }

      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(!IsWork())
         return; //отключена торговля?

      m_newday.Refresh();      //новый день
      m_day.Refresh();

      for(int i=0; i<3; i++)
         m_checkbar[i].Refresh();

      if(ProfitClose)
        {
         if(itotal>=ProfitCloseMaxOrder)
           {
            if(dsummProfits>=ProfitCloseStrategyDollar)
              {
               for(int i=0; i<MAX_SYSTEMS; i++)
                  m_main[i].OrderCloseAll(ALL); //закроем все стратегии по прибыли

               return;//вернемся к следующему тику для нового анализа
              }
           }
        }

      if(UseEquityStop && itotal>0)
        {
         if(dd<=-TotalEquityRisk)
           {
            for(int i=0; i<MAX_SYSTEMS; i++)
               m_main[i].OrderCloseAll(ALL); //закроем все стратегии по убытку

            return;//вернемся к следующему тику для нового анализа
           }
        }

      for(int i=0; i<MAX_SYSTEMS; i++)
        {
         m_bar[i].Refresh();

         if(CloseFriday && DayOfWeek()==FRIDAY)
           {
            string stime=StringFormat("%02d:00-24:00",CloseFridayHour);
            if(m_time.time_checking(stime)) //время в пт{
              {
               m_main[i].OrderCloseAll(ALL);

               continue; //пропускаем так как закрываются ордера
              }

           }

         if(Stabilization)
            fnStabilization();

         if(iCount[i]==0 && ContinueTrading &&
            (dd>-Drawdoun || Drawdoun==0))
           {

            if(m_options.ContinueTrading_System[i])
              {

               bool btime=true;

               if(OpenMondey && DayOfWeek()==MONDAY)
                 {
                  string stime=StringFormat("%02d:00-24:00",OpenMondeyHour);
                  btime=m_time.time_checking(stime); //время в пн
                 }

               if(btime)
                 {

                  int iop=signal(i,imaxorders);

                  bool bTrade=false;

                  if(iop==OP_BUY && (m_options.selecttrade[i]==SELECT_TRADE_ALL || m_options.selecttrade[i]==SELECT_TRADE_LONG))
                    {
                     bTrade=true;
                    }

               

Показано первые 50% кода (символов: 26750)

Что вы получите после оплаты

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода: 2 675 ₽