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

trailingwithpartialclose.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, написанный на языке MQL4. Советник реализует семь различных типов трейлинг-стопов для управления открытыми позициями по покупке и продаже, а также функцию частичного закрытия позиции при достижении заданного уровня тейк-профита. Код включает вспомогательные функции для модификации ордеров, проверки допустимого стоп-лосса и расчёта объёма закрываемых лотов с учётом типа счёта.

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

НастройкаОписание
Expert_Name Имя советника — Текстовый идентификатор советника, используемый в названии графика и лог-файла.
st6 Разделитель настроек прибыли — Текстовый разделитель, обозначающий группу параметров управления прибылью.
Maximum pips willing to lose per position. (StopLoss) Стоп-лосс — Максимальное количество пипсов убытка, допустимое по позиции.
usePartialClose Частичное закрытие — Включает или отключает режим частичного закрытия позиции при достижении уровня тейк-профита.
PartialPercent Процент закрытия — Процент текущего объёма позиции, который закрывается при срабатывании частичного тейк-профита.
TP_Level1 Уровень тейк-профита 1 — Уровень прибыли в пипсах от цены открытия, при достижении которого выполняется частичное закрытие.
Slippage Проскальзывание — Допустимое проскальзывание в пунктах при исполнении ордеров.
tsp0 Заголовок типов трейлинг-стопов — Текстовый разделитель, обозначающий группу выбора типа трейлинг-стопа.
tsp1 Описание типа 1 — Описание первого типа трейлинг-стопа — немедленное перемещение стоп-лосса.
tsp2 Описание типа 2 — Описание второго типа трейлинг-стопа — ожидание движения цены перед началом трейлинга.
tsp3 Описание типа 3 — Описание третьего типа трейлинг-стопа — использование трёх уровней перед переходом в режим трейлинга.
tsp4 Описание типа 4 — Описание четвёртого типа трейлинг-стопа — выход в безубыток с фиксацией прибыли.
tsp5 Описание типа 5 — Описание пятого типа трейлинг-стопа — пошаговое перемещение стоп-лосса.
tsp6 Описание типа 6 — Описание шестого типа трейлинг-стопа — использование скользящей средней для определения уровня стоп-лосса.
tsp7 Описание типа 7 — Описание седьмого типа трейлинг-стопа — использование параболического индикатора SAR.
TrailingStopType Тип трейлинг-стопа — Выбранный тип трейлинг-стопа от 1 до 7, определяющий алгоритм управления стоп-лоссом.
ts2 Настройки типа 2 — Текстовый разделитель, обозначающий группу параметров второго типа трейлинг-стопа.
Change to whatever number of pips you wish to trail your position with. (TrailingStop) Размер трейлинга типа 2 — Расстояние в пипсах, на которое перемещается стоп-лосс при трейлинге второго типа.
ts3 Настройки типа 3 — Текстовый разделитель, обозначающий группу параметров третьего типа трейлинг-стопа.
Type 3 first level pip gain (FirstMove) Первый уровень типа 3 — Уровень прибыли в пипсах от цены открытия, при достижении которого стоп-лосс перемещается на первый уровень.
Move Stop to Breakeven (FirstStopLoss) Стоп-лосс первого уровня типа 3 — Расстояние стоп-лосса от цены открытия при первом уровне третьего типа трейлинг-стопа.
Type 3 second level pip gain (SecondMove) Второй уровень типа 3 — Уровень прибыли в пипсах от цены открытия, при достижении которого стоп-лосс перемещается на второй уровень.
Move stop to lock is profit (SecondStopLoss) Стоп-лосс второго уровня типа 3 — Расстояние стоп-лосса от цены открытия при втором уровне третьего типа трейлинг-стопа.
type 3 third level pip gain (ThirdMove) Третий уровень типа 3 — Уровень прибыли в пипсах от цены открытия, при достижении которого стоп-лосс переходит в режим постоянного трейлинга.
Move stop and trail from there (TrailingStop3) Трейлинг третьего уровня типа 3 — Расстояние в пипсах для постоянного трейлинга стоп-лосса после достижения третьего уровня.
ts4 Настройки типа 4 — Текстовый разделитель, обозначающий группу параметров четвёртого типа трейлинг-стопа.
BreakEven Безубыток типа 4 — Уровень прибыли в пипсах от цены открытия, при достижении которого стоп-лосс перемещается в точку безубытка.
Profit Lock in pips (LockInPips) Фиксация прибыли типа 4 — Количество пипсов прибыли, фиксируемых при перемещении стоп-лосса в точку безубыток.
ts5 Настройки типа 5 — Текстовый разделитель, обозначающий группу параметров пятого типа трейлинг-стопа.
eTrailingStop Трейлинг шаг типа 5 — Основное расстояние трейлинга в пипсах для пятого типа трейлинг-стопа.
eTrailingStep Шаг трейлинга типа 5 — Шаг перемещения стоп-лосса в пипсах для пятого типа трейлинг-стопа.
ts6 Настройки типа 6 — Текстовый разделитель, обозначающий группу параметров шестого типа трейлинг-стопа.
TrailMA_TimeFrame Таймфрейм MA типа 6 — Таймфрейм для расчёта скользящей средней, используемой в шестом типе трейлинг-стопа.
TrailMA_Period Период MA типа 6 — Период скользящей средней, используемой в шестом типе трейлинг-стопа.
TrailMA_Shift Сдвиг MA типа 6 — Горизонтальный сдвиг скользящей средней в барах для шестого типа трейлинг-стопа.
t3 Настройки скользящей средней — Текстовый разделитель, обозначающий группу параметров скользящей средней.
tm Типы скользящих средних — Текстовый разделитель, обозначающий группу выбора типа скользящей средней.
tm0 SMA — Вариант простой скользящей средней.
tm1 EMA — Вариант экспоненциальной скользящей средней.
tm2 SMMA — Вариант сглаженной скользящей средней.
tm3 LWMA — Вариант линейно-взвешенной скользящей средней.
TrailMA_Type Тип MA типа 6 — Выбранный тип скользящей средней для шестого типа трейлинг-стопа.
tp Типы применяемой цены — Текстовый разделитель, обозначающий группу выбора цены для расчёта скользящей средней.
tp0 Цена закрытия — Вариант цены закрытия свечи для расчёта скользящей средней.
tp1 Цена открытия — Вариант цены открытия свечи для расчёта скользящей средней.
tp2 Высокая цена — Вариант максимальной цены свечи для расчёта скользящей средней.
tp3 Низкая цена — Вариант минимальной цены свечи для расчёта скользящей средней.
tp4 Медианная цена — Вариант медианной цены (high+low)/2 для расчёта скользящей средней.
tp5 Типичная цена — Вариант типичной цены (high+low+close)/3 для расчёта скользящей средней.
tp6 Взвешенная цена — Вариант взвешенной цены (high+low+close+close)/4 для расчёта скользящей средней.
TrailMA_AppliedPrice Применяемая цена MA типа 6 — Выбранный тип цены, используемый для расчёта скользящей средней в шестом типе трейлинг-стопа.
InitialStop Начальный стоп типа 6 — Начальное расстояние стоп-лосса в пипсах от цены открытия для шестого типа трейлинг-стопа.
ts7 Настройки типа 7 — Текстовый разделитель, обозначающий группу параметров седьмого типа трейлинг-стопа.
StepParabolic Шаг параболика типа 7 — Начальный шаг ускорения параболического индикатора SAR, используемого в седьмом типе трейлинг-стопа.
MaxParabolic Максимальный параболик типа 7 — Максимальное значение ускорения параболического индикатора SAR, используемого в седьмом типе трейлинг-стопа.
Interval Интервал типа 7 — Расстояние в пипсах, на которое стоп-лосс отступает от уровня параболического SAR в седьмом типе трейлинг-стопа.
Получить полный код

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

#include <stdlib.mqh>
#include <stderror.mqh> 

extern bool    AccountIsMini = true;
extern string  Expert_Name    = "TrailingPartialClose";

extern string  st6 = "--Profit Controls--";
extern double  StopLoss = 100;          // Maximum pips willing to lose per position.
extern int     usePartialClose = 1;
extern double  PartialPercent = 50;
extern int     TP_Level1 = 20;
extern int     Slippage=3;
bool           First_TP_Level = false;

extern string  tsp0 = "--Trailing Stop Types--";
extern string  tsp1 = " 1 = Trail immediately";
extern string  tsp2 = " 2 = Wait to trail";
extern string  tsp3 = " 3 = Uses 3 levels before trail";
extern string  tsp4 = " 4 = Breakeven + Lockin";
extern string  tsp5 = " 5 = Step trail";
extern string  tsp6 = " 6 = MA trail";
extern string  tsp7 = " 7 = pSAR trail";
extern int     TrailingStopType = 4;

extern string  ts2 = "Settings for Type 2";
extern double  TrailingStop = 15;      // Change to whatever number of pips you wish to trail your position with.

extern string  ts3 = "Settings for Type 3";
extern double  FirstMove = 20;        // Type 3  first level pip gain
extern double  FirstStopLoss = 50;    // Move Stop to Breakeven
extern double  SecondMove = 30;       // Type 3 second level pip gain
extern double  SecondStopLoss = 30;   // Move stop to lock is profit
extern double  ThirdMove = 40;        // type 3 third level pip gain
extern double  TrailingStop3 = 20;    // Move stop and trail from there

extern string  ts4 = "Settings for Type 4";
extern double  BreakEven = 30;
extern int     LockInPips = 1;        // Profit Lock in pips

extern string  ts5 = "Settings for Type 5";
extern int     eTrailingStop   = 10;
extern int     eTrailingStep   = 2;

extern string  ts6 = "Settings for Type 6";
extern int     TrailMA_TimeFrame    =  15;
extern int     TrailMA_Period       = 10;
extern int     TrailMA_Shift        =  0;    
extern string  t3="--Moving Average settings--";
extern string  tm = "--Moving Average Types--";
extern string  tm0 = " 0 = SMA";
extern string  tm1 = " 1 = EMA";
extern string  tm2 = " 2 = SMMA";
extern string  tm3 = " 3 = LWMA";
extern int     TrailMA_Type = 1;
extern string  tp = "--Applied Price Types--";
extern string  tp0 = " 0 = close";
extern string  tp1 = " 1 = open";
extern string  tp2 = " 2 = high";
extern string  tp3 = " 3 = low";
extern string  tp4 = " 4 = median(high+low)/2";
extern string  tp5 = " 5 = typical(high+low+close)/3";
extern string  tp6 = " 6 = weighted(high+low+close+close)/4";
extern int     TrailMA_AppliedPrice = 0;
extern int     InitialStop     =  0;

extern string  ts7 = "Settings for Type 7";
extern double  StepParabolic = 0.02;
extern double  MaxParabolic  = 0.2;
extern int     Interval      = 5;

string setup;
double myPoint;
int totalTries 		= 5; 
int retryDelay 		= 1000;
int OrderErr;

int SignalCandle = 1;
int TradesInThisSymbol = 0;

int init()
  {
      // код доступен только после оплаты
   }

int deinit()
  {
   return(0);
  }

double GetTP_Lots(double ol, double percent)
{
  double mLots;

  mLots = 0;

  if (AccountIsMini)
  {
     if (ol > 0.1)
     {
        mLots = MathFloor(ol*percent/10)/10;
        if (mLots < 0.1) mLots = 0.1;
     }
  }
  else
  {
    if (ol > 1)
    {
        mLots = MathFloor(ol*percent/100);
        if (mLots < 1) mLots = 1;
    }
  }
  return(mLots);

}

int CloseOrder(int ticket,double numLots,int cmd)
{
	bool exit_loop = false, result;
   int cnt, err, digits;
   double myPrice;

   if (cmd == OP_BUY) myPrice = MarketInfo(Symbol( ), MODE_BID);
   if (cmd == OP_SELL) myPrice = MarketInfo(Symbol( ), MODE_ASK);
   digits = MarketInfo(Symbol( ), MODE_DIGITS) ;
   if (digits > 0)  myPrice = NormalizeDouble( myPrice, digits);

    cnt = 0;
    while (!exit_loop)
    {
		if (IsTradeAllowed()) 
		{
       result = OrderClose(ticket,numLots,myPrice,Slippage*myPoint,Violet);
		 err = GetLastError();
      }
        else cnt++;
		if (result == true) 
			exit_loop = true;

         err=GetLastError();
		switch (err) 
		{
			case ERR_NO_ERROR:
				exit_loop = true;
				break;
			case ERR_SERVER_BUSY:
			case ERR_NO_CONNECTION:
			case ERR_INVALID_PRICE:
			case ERR_OFF_QUOTES:
			case ERR_BROKER_BUSY:
			case ERR_TRADE_CONTEXT_BUSY: 
			case ERR_TRADE_TIMEOUT:		// for modify this is a retryable error, I hope. 
				cnt++; 	// a retryable error
				break;
			case ERR_PRICE_CHANGED:
			case ERR_REQUOTE:
				RefreshRates();
				continue; 	// we can apparently retry immediately according to MT docs.
			default:

				exit_loop = true;
				break; 
		}  // end switch 

		if (cnt > totalTries) 
			exit_loop = true; 

		if (!exit_loop) 
		{
         Sleep(retryDelay);
			RefreshRates(); 
		}
	}  

	if ((result == true) || (err == ERR_NO_ERROR)) 
	{
		OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES); 
		return(true); // SUCCESS! 
	}

   Print(" Error closing order : (", err , ") " + ErrorDescription(err));
   return(false);

}

bool CheckPartialClose(int cmd, int mTicket, double mLots)
{
   double TP_Lots;

   TP_Lots = GetTP_Lots(mLots, PartialPercent);
   if (TP_Lots > 0)
   { 
       CloseOrder(mTicket,TP_Lots,cmd);
       return(false);
   }
   return(true);
}

bool ClosePartialLots(int type, int ticket, double op, double ol, double os, double tp, color mColor = CLR_NONE)
{
   double myAsk, myBid;

   switch (type)
   {
   case OP_BUY:
		     myBid = MarketInfo(Symbol(),MODE_BID);

           if (!First_TP_Level)   // Reach 1st TP level
           {
              if(myBid >= op + TP_Level1*myPoint)
              {
                First_TP_Level = true;
                if (CheckPartialClose(OP_BUY, ticket, ol)) return(true);
                return(false);
              }
           }             
           return(false);
           break;
   case OP_SELL:
		     myAsk = MarketInfo(Symbol(),MODE_ASK);

           if (!First_TP_Level)  // Reach 1st TP level 
           {
              if(myAsk <= op-TP_Level1*myPoint)
              {
                First_TP_Level = true;
                if (CheckPartialClose(OP_SELL, ticket, ol)) return(true);
                return(false);
              }
           }
    }
    return(false);
}

int start()
  {
      // код доступен только после оплаты
   }

int CheckOpenPositions()
{
   int cnt, total;
   int NumTrades;

   NumTrades = 0;
   total=OrdersTotal();
   for(cnt=OrdersTotal()-1;cnt>=0;cnt--)
     {
      OrderSelect (cnt, SELECT_BY_POS, MODE_TRADES);
      if ( OrderSymbol() != Symbol()) continue;

      if(OrderType() == OP_BUY )  NumTrades++;
      if(OrderType() == OP_SELL )  NumTrades++;

     }
     return (NumTrades);
  }

int HandleOpenPositions()
{
   int cnt;

   for(cnt=OrdersTotal()-1;cnt>=0;cnt--)
   {
      OrderSelect (cnt, SELECT_BY_POS, MODE_TRADES);
      if ( OrderSymbol() != Symbol()) continue;

      if(OrderType() == OP_BUY)
      {
          if (usePartialClose == 1)
          {
            if (ClosePartialLots(OP_BUY, OrderTicket(),OrderOpenPrice(),OrderLots(), OrderStopLoss(),OrderTakeProfit(), Aqua)) continue;
          }

               HandleTrailingStop(OP_BUY,OrderTicket(),OrderOpenPrice(),OrderStopLoss(),OrderTakeProfit());
      }

      if(OrderType() == OP_SELL)
      {
          if (usePartialClose == 1)
          {
            if (ClosePartialLots(OP_SELL, OrderTicket(),OrderOpenPrice(),OrderLots(), OrderStopLoss(),OrderTakeProfit(), Aqua)) continue;
          }
               HandleTrailingStop(OP_SELL,OrderTicket(),OrderOpenPrice(),OrderStopLoss(),OrderTakeProfit());
      }
   }
}

int HandleTrailingStop(int type, int ticket, double op, double os, double tp)
{
   switch (TrailingStopType)
   {
     case 1 : Immediate_TrailingStop (type, ticket, op, os, tp);
              break;
     case 2 : Delayed_TrailingStop (type, ticket, op, os, tp);
              break;
     case 3 : ThreeLevel_TrailingStop (type, ticket, op, os, tp);
              break;
     case 4 : BreakEven_TrailingStop (type, ticket, op, os, tp);
              break;
	  case 5 : eTrailingStop (type, ticket, op, os, tp);
              break;
	  case 6 : MA_TrailingStop (type, ticket, op, os, tp);
              break;
	  case 7 : pSAR_TrailingStop (type, ticket, op, os, tp);
              break;
	}
   return(0);
}

int ModifyOrder(int ord_ticket,double op, double price,double tp, color mColor)
{
    int CloseCnt, err;

    CloseCnt=0;
    while (CloseCnt < 3)
    {
       if (OrderModify(ord_ticket,op,price,tp,0,mColor))
       {
         CloseCnt = 3;
       }
       else
       {
          err=GetLastError();
          Print(CloseCnt," Error modifying order : (", err , ") " + ErrorDescription(err));
         if (err>0) CloseCnt++;
       }
    }
}

double ValidStopLoss(int type, double price, double SL)
{

   double mySL;
   double minstop;

   minstop = MarketInfo(Symbol(),MODE_STOPLEVEL);
   if (Digits == 3 || Digits == 5) minstop = minstop / 10;

   mySL = SL;
   if (type == OP_BUY)
   {
		 if((price - mySL) < minstop*myPoint) mySL = price - minstop*myPoint;
   }
   if (type == OP_SELL)
   {
       if((mySL-price) < minstop*myPoint)  mySL = price + minstop*myPoint;  
   }

   return(NormalizeDouble(mySL,MarketInfo(Symbol(), MODE_DIGITS)));   
}

void BreakEven_TrailingStop(int type, int ticket, double op, double os, double tp)
{

   int digits;
   double pBid,

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

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

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

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

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

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

Стоимость полного кода
1 382₽ ≈ $16.89