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

SN Simple Swing

sn simple swing v10.mq4
Вы автор или правообладатель?

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

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

О программе

Этот файл является торговым советником для MetaTrader 4, написанным на MQL4. Советник использует пользовательские макросы для объявления входных параметров и подключает внешние include-файлы из библиотеки sovetnikovGUI для работы с ордерами и кнопками. В коде присутствуют обработчики событий OnInit, OnDeinit, OnTick, OnTimer и OnChartEvent, что подтверждает его назначение как эксперта.

Основная логика советника включает открытие рыночного ордера при отсутствии позиций, управление ордерами с использованием отложенных ордеров и множителя лота, а также закрытие всех ордеров при достижении заданного уровня профита или при срабатывании риск-менеджера по эквити. Советник отображает на графике информационную панель с текущими показателями прибыли, спреда и других параметров, а также кнопку STOP для ручного закрытия всех сделок.

В настройках доступны параметры для управления проскальзыванием, комментарием к ордерам, расстоянием для отложенных ордеров, условиями закрытия по профиту, риском, множителем лота, уровнем стоп-лосса в процентах, а также параметрами отображения текста и кнопок. Советник поддерживает работу с несколькими символами при включении соответствующей опции.

Настройки программы

НастройкаОписание
slippage Максимально допустимое проскальзывание в пунктах при открытии ордеров. Значение 0 означает, что проскальзывание не используется.
comment Текстовый комментарий, добавляемый к отправляемым торговым ордерам.
distance Расстояние в пунктах от цены открытия последнего ордера для установки отложенного ордера.
CloseByProfit Определяет, будет ли советник закрывать все сделки при достижении заданного уровня прибыли.
Profit Целевой уровень прибыли в валюте депозита, при достижении которого советник закрывает все сделки.
AllSymbols При включении советник учитывает прибыль по всем символам при принятии решения о закрытии сделок, а также отправляет команду на закрытие всем советникам на других графиках.
risk Риск в процентах от баланса, используемый для расчета размера лота.
Lot_Multiplicator Множитель для расчета лота следующего отложенного ордера относительно лота предыдущего ордера.
order_sl Уровень стоп-лосса в процентах, используемый при расчете размера лота.
FONT_SIZE Задает размер шрифта для текста на кнопке STOP в пунктах.
text_size Размер шрифта для текста информационной панели в пунктах.
background_width Ширина фона информационной панели в пикселях.
RiskManager_Stop Уровень эквити в валюте депозита, при достижении которого советник закрывает все сделки и останавливает торговлю.
Получить полный код

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

#property version   "10.00"
#property strict
#include <sovetnikovGUI\Orders.mqh>
#include <sovetnikovGUI\Button.mqh>

#define CLOSE_MESSAGE 2409

I slippage=0;

S comment="";

D distance=30; //Distance (pt)

B CloseByProfit=true; //Close By Profit Use

D Profit=3; //Profit ($)

B AllSymbols=false; //All Symbols Profit      

D  risk=1; //Risk (%)

D  Lot_Multiplicator=2;

D  order_sl=0.5; //SL %

I   FONT_SIZE=10; //Button Text Size (points)
I   text_size=10; //Text Size (points)

C   text_color=clrWhite; //Text Color
C   background_color=clrBlack; //Background Color
I   background_width=200; //Backgroud Width (pixels)

D  RiskManager_Stop=0; //Equity Stop (level equity $)

class CMyOrders: public COrders
  {
public:
   virtual int Update(datetime dtm=0,int iticket=-1)
     {

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

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

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

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

         if(CheckSymbol(::OrderSymbol()) && ::OrderOpenTime()>=dtm)
           {

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

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

               if(ArrayResize(m_orders,isize+1)!=-1)
                 {

                  if(m_orders[isize].getOrderByTicket(::OrderTicket())) //загрузим информацию по ордеру (грузим все ордера)
                    {

                     if(CheckMagic(m_orders[isize].OrderMagicNumber,m_orders[isize].OrderComment) || m_orders[isize].OrderTicket==iticket)
                       {
                        orders[m_orders[isize].OrderType]++; //увеличим счетчик
                        m_all++;
                       }
                    }
                 }
              }

           }
        }

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

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

      if(ArraySize(m_orders)==0 || bUpdate) Update();

      icount=ArraySize(m_orders);

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

         if(m_orders[i].OrderMagicNumber==m_imagic || m_orders[i].OrderTicket==m_imagic)
           {

            dtm_open=m_orders[i].OrderOpenTime;

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

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

      return iticket;
     }

   virtual double getProfit(bool bAll)
     {
      double pr=0;
      int itotal=::OrdersTotal();

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

         if((!bAll && CheckSymbol(::OrderSymbol())) || bAll)
           {
            pr+=::OrderProfit()+::OrderSwap()+::OrderCommission();
           }
        }

      return NormalizeDouble(pr,3);
     }
  };

class CMain: public CMainDefault
  {
protected:
   CMyOrders         m_main,m_tmp;
   SNButton          m_stop;
   CDraw             draw;

public:
   virtual int OnInit()
     {
      // код доступен только после оплаты
   }

   virtual void OnDeinit(const int reason)
     {
      m_main.OnDeinit();
      m_stop.Destroy();
      draw.OnDeinit();
     }

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

      if(!m_main.IsWork()) return; //отключена торговля

      m_stop.SetSize(60);
      int iwidth=(int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);

      m_stop.Create(0,"m_stop",0,iwidth-70,20);
      m_stop.Text("STOP");

      m_main.OnTick();
      m_main.Update(); //получим кол-во ордеров в структуре orders

      double step=getStop();
      double lot=0;
      if(step>0) lot=m_main.getLotBySL(risk,step);

      if(m_main.m_all==0 )
        {
         m_main.m_imagic=0;
         m_main.OrderSend(OP_BUY,lot,-1,0,0,"test",0);
         m_main.m_imagic=-1;
         return;
        }

      if(AccountEquity()<=RiskManager_Stop && RiskManager_Stop>0 && m_main.m_all>0)
        {
         Print("Equity RiskManager_Stop: ",DoubleToString(AccountEquity(),2)," EA is Stop");
         m_main.OrderCloseAll(ALL);
         return;
        }

      double curr_profit=m_main.getProfit();
      double day_profit=m_main.GetProfitDay(0);
      double month_profit=m_main.GetProfitMonth(0);

      double summ_profit1=curr_profit+day_profit;
      double summ_profit2=curr_profit+month_profit;
      double start_balance1=AccountBalance()-summ_profit1;
      double start_balance2=Acco

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

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

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

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

Стоимость полного кода
683,60₽ ≈ $8.35