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