trailingwithpartialclose.mq4
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «trailingwithpartialclose.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Это торговый советник для платформы 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? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.