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

closeparttp.mq4

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

#1.mtf_collider_h4_close_13_v18bar.mq4MQL4 / MetaTrader 4 · 1 общих теговea robofibo source v.11.2.mq4MQL4 / MetaTrader 4 · 1 общих теговsma crossover scalper ea for mt4.mq4MQL4 / MetaTrader 4 · 1 общих теговr15 pivot points expert advisor by @fundedmillionairess.mq4MQL4 / MetaTrader 4 · 1 общих теговnewstrader.mq5MQL5 / MetaTrader 5 · 1 общих теговmm3.0_flip_codepro_v3.1_with_cooldown@lifeindreamsworld.mq5MQL5 / MetaTrader 5 · 1 общих тегов
Вы автор или правообладатель?

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

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

О программе

Советник для MetaTrader 4, предназначенный для частичного закрытия открытых позиций и управления стоп-лоссами. Поддерживает несколько уровней частичного закрытия с настраиваемыми параметрами, а также функцию трейлинг-стопа, использующую индикаторы ATR и Parabolic SAR для динамического управления защитным стопом. Работает с позициями по текущему символу или по всем символам с возможностью исключения и фильтрации по магическим номерам.

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

НастройкаОписание
TakeProfit 1 (TakeProfit1) TakeProfit 1 — Первый уровень прибыли в соотношении к стоп-лоссу для срабатывания частичного закрытия
Part 1 close % (Part1) Part 1 — Процент лота для закрытия при достижении первого уровня прибыли
TakeProfit 2 (TakeProfit2) TakeProfit 2 — Второй уровень прибыли в соотношении к стоп-лоссу для частичного закрытия
Part 2 close % (Part2) Part 2 — Процент лота для закрытия при достижении второго уровня прибыли
TakeProfit 3 (TakeProfit3) TakeProfit 3 — Третий уровень прибыли в соотношении к стоп-лоссу для частичного закрытия
Part 3 close % (Part3) Part 3 — Процент лота для закрытия при достижении третьего уровня прибыли
TakeProfit 4 (TakeProfit4) TakeProfit 4 — Четвёртый уровень прибыли в соотношении к стоп-лоссу для частичного закрытия
Part 4 close % (Part4) Part 4 — Процент лота для закрытия при достижении четвёртого уровня прибыли
TakeProfit 5 (TakeProfit5) TakeProfit 5 — Пятый уровень прибыли в соотношении к стоп-лоссу для частичного закрытия
Part 5 close % (Part5) Part 5 — Процент лота для закрытия при достижении пятого уровня прибыли
All symbols (AllSymbols) All symbols — Обрабатывать позиции на всех символах, а не только на текущем
Exclude symbols (sample: XAUUSD EURGBP) (Exclude) Exclude — Список символов через пробел, которые нужно исключить из обработки
Magic list use (false = all magic) (MagicListUse) Magic list use — Использовать ли список магических номеров для фильтрации ордеров
Magic list (sample: 0 12345 3444 777) (Magic) Magic — Список магических номеров через пробел для фильтрации обрабатываемых ордеров
NoLoss NoLoss — Минимальная защита в пунктах, сдвигающая стоп-лосс при частичном закрытии
Trailing Stop Use (TrailingStop) Trailing Stop Use — Включить или выключить трейлинг-стоп
Start trailing TP (0,1,2,3,4,5) (TrailingLevel_TP) Start trailing TP — Минимальный уровень прибыли (RR), начиная с которого активируется трейлинг-стоп
ATR Period (ATR_Period) ATR Period — Период индикатора ATR, используемый для расчёта трейлинг-стопа
SAR step (SAR_step) SAR step — Шаг изменения параболического SAR
SAR maximum (SAR_maximum) SAR maximum — Максимальное значение параболического SAR
ATR multiplicator (ATR_Koef) ATR multiplicator — Множитель ATR для расчёта уровня трейлинг-стопа
TF (tf) TF — Таймфрейм для расчётов трейлинг-стопа
Получить полный код

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

#property version   "1.00"
#property strict

#define POINTS_NEW

#include <sovetnikovNET\Orders.mqh>
#include <sovetnikovNET\Time.mqh>

D TakeProfit1=1; //TakeProfit 1
D Part1=50; //Part 1 close %
D TakeProfit2=2; //TakeProfit 2
D Part2=20; //Part 2 close %
D TakeProfit3=3; //TakeProfit 3
D Part3=10; //Part 3 close %
D TakeProfit4=4; //TakeProfit 4
D Part4=10; //Part 4 close %
D TakeProfit5=5; //TakeProfit 5
D Part5=10; //Part 5 close %

B AllSymbols=true;  //All symbols
S Exclude=""; //Exclude symbols (sample: XAUUSD EURGBP)

B MagicListUse=false; //Magic list use (false = all magic)
S Magic=""; //Magic list (sample: 0 12345 3444 777)

D NoLoss=0;

B TrailingStop=true; //Trailing Stop Use
I TrailingLevel_TP=1; //Start trailing TP (0,1,2,3,4,5)
I ATR_Period=5; //ATR Period
D SAR_step=0.02; //SAR step
D SAR_maximum=0.2; //SAR maximum
D ATR_Koef=2; //ATR multiplicator
TF tf=PERIOD_CURRENT; //TF

CGlobal g_global;

class CMyOrders: public COrders
  {
public:
   bool              CheckMagic(string symbol,bool bMagicListUse,long imagic,long &lMagic[])
     {

      if(symbol!=m_name && !AllSymbols)
         return false;

      if(StringFind(Exclude,symbol,0)>=0)
         return false;

      if(!bMagicListUse)
         return true;

      for(int i=0; i<ArraySize(lMagic); i++)
        {
         if(imagic==lMagic[i])
            return true;
        }

      return false;
     }

   virtual bool      SelectByIndex(int i,bool is_position,bool bMagicListUse,long &lMagic[])
     {
      if(is_position)
        {
         if(!m_position.SelectByIndex(i))
            return false;

         if(CheckMagic(m_position.Symbol(),bMagicListUse,m_position.Magic(),lMagic))
            return true;
        }
      else
        {
         if(!m_order.SelectByIndex(i))
            return false;

         if(m_order.OrderType()>=6)
            return false; //не пропустим ордера с нестандартным типом отложки и рыночные стандартные ордера обрабатываем только

         if(CheckMagic(m_order.Symbol(),bMagicListUse,m_order.Magic(),lMagic))
            return true;
        }

      return false;
     }

   bool              PartClose(double dpartclose_profit1,double dpartclose_procent1,double dpartclose_profit2,double dpartclose_procent2,double dpartclose_profit3,double dpartclose_procent3,double dpartclose_profit4,double dpartclose_procent4,double dpartclose_profit5,double dpartclose_procent5,bool bMagicListUse,long &lMagic[])
     {

      ulong iticket=0;

      for(int i=PositionsTotal()-1; i>=0; i--)
        {
         if(!SelectByIndex(i,true,bMagicListUse,lMagic))
            continue;

         ENUM_POSITION_TYPE etype=(ENUM_POSITION_TYPE)m_position.PositionType();

         if(etype==POSITION_TYPE_BUY || etype==POSITION_TYPE_SELL)
           {

            m_symbol.Name(m_position.Symbol());
            m_symbol.Refresh();

            double dopen=m_position.PriceOpen();
            double dtake=m_position.TakeProfit();
            double dstop=m_position.StopLoss();

            if(dstop==0.0)
               continue; //для позиции не задан стоп, ждем

            iticket=m_position.Ticket();

            double ddelta=0;

            double pr=0,rr=0;

            m_symbol.RefreshRates();
            if(etype==POSITION_TYPE_BUY)
              {
               pr=nd(m_symbol.Bid()-dopen,m_position.Symbol());
               if(dstop>0 && dstop<dopen)
                 {
                  ddelta=nd((dopen-dstop),m_position.Symbol());
                  pglobal.GlobalVariableSet(StringFormat("%lld_stoploss",iticket),ddelta);
                 }
               else
                  ddelta=pglobal.GlobalVariableGet(StringFormat("%lld_stoploss",iticket));

              }
            else
               if(etype==POSITION_TYPE_SELL)
                 {
                  pr=nd(dopen-m_symbol.Ask(),m_position.Symbol());
                  if(dstop>0 && dstop>dopen)
                    {
                     ddelta=nd((dstop-dopen),m_position.Symbol());
                     pglobal.GlobalVariableSet(StringFormat("%lld_stoploss",iticket),ddelta);
                    }
                  else
                     ddelta=pglobal.GlobalVariableGet(StringFormat("%lld_stoploss",iticket));

                 }

            if(ddelta>0)
              {
               rr=ND2(pr/ddelta);
              }

            if(ddelta>0 && ((rr>=dpartclose_profit1 && dpartclose_profit1>0) ||
                            (rr>=dpartclose_profit2 && dpartclose_profit2>0) ||
                            (rr>=dpartclose_profit3 && dpartclose_profit3>0) ||
                            (rr>=dpartclose_profit4 && dpartclose_profit4>0) ||
                            (rr>=dpartclose_profit5 && dpartclose_profit5>0)))
              {

               double dsummlots=0;
               int part=get_part(iticket,dsummlots);

               /*if(etype==POSITION_TYPE_BUY)
                  {
                   Comment("rr=",rr," ddelta",ddelta," pr=",pr, " part=",part);
                  }*/

               if(part==0 && rr>=dpartclose_profit1 && dpartclose_profit1>0)
                 {
                  double dlot=NLot(dsummlots*dpartclose_procent1/100); //часть лота
                  PrintFormat("part close 1: %.2f RR: %.2f Move stop price: %f",dlot,rr,dopen);
                  double dnoloss=0;
                  if(NoLoss>0)
                    {
                     if(etype==POSITION_TYPE_BUY)
                        dnoloss=NoLoss*m_symbol.Point();
                     if(etype==POSITION_TYPE_SELL)
                        dnoloss=-NoLoss*m_symbol.Point();
                    }
                  OrderModify(iticket,dopen,nd(dopen+dnoloss,m_position.Symbol()),-1); //в бу
                  if(OrderClose(iticket,dlot))
                    {

                     if(::OrderSelect(0,SELECT_BY_POS))
                       {
                        ulong inew=::OrderTicket();
                        PrintFormat("New ticket: %lld Last: %lld",inew,iticket);

                        pglobal.GlobalVariableSet(StringFormat("%lld_stoploss",inew),ddelta);
                       }

                     return true;
                    }

                  return false;

                 }

               if(part==1 && rr>=dpartclose_profit2 && dpartclose_profit2>0)
                 {
                  double dlot=NLot(dsummlots*dpartclose_procent2/100); //часть лота
                  PrintFormat("part close 2: %.2f RR: %.2f",dlot,rr);
                  if(OrderClose(iticket,dlot))
                    {

                     if(::OrderSelect(0,SELECT_BY_POS))
                       {
                        ulong inew=::OrderTicket();
                        PrintFormat("New ticket: %lld Last: %lld",inew,iticket);

                        pglobal.GlobalVariableSet(StringFormat("%lld_stoploss",inew),ddelta);
                       }

                     return true;
                    }

                  return false;

                 }

               if(part==2 && rr>=dpartclose_profit3 && dpartclose_profit3>0)
                 {
                  double dlot=NLot(dsummlots*dpartclose_procent3/100); //часть лота
                  PrintFormat("part close 3: %.2f RR: %.2f",dlot,rr);

                  if(OrderClose(iticket,dlot))
                    {

                     if(::OrderSelect(0,SELECT_BY_POS))
                       {
                        ulong inew=::OrderTicket();

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

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

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

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

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

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

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