Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@developer88
Last active July 11, 2016 17:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save developer88/9b899f40015d0967427b3cba303d50f5 to your computer and use it in GitHub Desktop.
Save developer88/9b899f40015d0967427b3cba303d50f5 to your computer and use it in GitHub Desktop.
e-CloseByProfit.mq4 robot that closes your order when you need to / робот, который закрывает сделки тогда, когда вам это надо
//+----------------------------------------------------------------------------+
//| e-CloseByProfit.mq4 |
//| Ким Игорь В. aka KimIV |
//| http://www.kimiv.ru |
//| |
//| С доработками от: |
//| Андрей Ерёмин |
//| http://aeremin.ru |
//| |
//| |
//| 22.10.2006 Советник закрывает все позиции при достижении заданного |
//| уровня профита в пунктах. |
//| 20.06.2008 Исправлена ошибка расчёта профита в пунктах. |
//| 18.08.2008 Добавлен параметр StopLoss. |
//| 02.07.2016 Добавлен параметр BuySellPriority. |
//| 03.07.2016 Добавлена возможность учитывать комиссию и параметр |
//| UseCommission. |
//+----------------------------------------------------------------------------+
#property copyright "Ким Игорь В. aka KimIV"
#property link "http://www.kimiv.ru"
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
enum BuySellPrioList
{
Sell=0, // Sell
Buy=1, // Buy
Both=2, // Buy&Sell
};
//------- Внешние параметры советника ------------------------------------------
extern string _P_Expert="---------- Параметры советника";
extern bool CurSymbolOnly = True; // Только текущий символ
extern int StopLoss = 4000; // Stop
extern int TakeProfit = 50; // Тейк
extern bool ShowComment = True; // Показывать комментарий
extern int NumberAccount = 0; // Номер торгового счёта
extern bool UseSound = False; // Использовать звуковой сигнал
extern string NameFileSound = "expert.wav"; // Наименование звукового файла
extern int Slippage = 3; // Проскальзывание цены
extern int NumberOfTry = 5; // Количество попыток
input BuySellPrioList BuySellPriority = Both; // Приоритет продаж или покупок
extern bool UseCommission = true; // Учитывать комиссию
//------- Глобальные переменные советника --------------------------------------
color clCloseBuy = Blue; // Цвет значка закрытия покупки
color clCloseSell = Red; // Цвет значка закрытия продажи
int CurProfit;
//------- Поключение внешних модулей -------------------------------------------
#include <stdlib.mqh>
//+----------------------------------------------------------------------------+
//| expert initialization function |
//+----------------------------------------------------------------------------+
void init() { if(!IsTesting()) Comment(""); }
//+----------------------------------------------------------------------------+
//| expert deinitialization function |
//+----------------------------------------------------------------------------+
void deinit() { if(!IsTesting()) Comment(""); }
//+----------------------------------------------------------------------------+
//| expert start function |
//+----------------------------------------------------------------------------+
void start()
{
if(!IsTesting())
{
if(NumberAccount>0 && NumberAccount!=AccountNumber())
{
Message("ЗАПРЕЩЕНА торговля на счёте "+AccountNumber());
return;
}
else Comment("");
}
CloseByProfit();
if(ShowComment)
{
Comment(IIFs(CurSymbolOnly,"CurSymbolOnly ","")
,"Текущий профит=",CurProfit," п."
," Убыток закрытия=",StopLoss," п."
," Прибыль закрытия=",TakeProfit," п."
," Торговля=",PriorityName()
);
}
}
//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 19.02.2008 |
//| Описание: Закрытие одной предварительно выбранной позиции. |
//| Третья функция |
//+----------------------------------------------------------------------------+
void ClosePosBySelect()
{
bool fc;
color clClose;
double ll,pa,pb,pp;
int err,it;
if(IsOrderTypeAllowed())
{
for(it=1; it<=NumberOfTry; it++)
{
if(!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
while(!IsTradeAllowed()) Sleep(5000);
RefreshRates();
pa=MarketInfo(OrderSymbol(), MODE_ASK);
pb=MarketInfo(OrderSymbol(), MODE_BID);
if(OrderType()==OP_BUY)
{
pp=pb; clClose=clCloseBuy;
} else {
pp=pa; clClose=clCloseSell;
}
ll=OrderLots();
fc=OrderClose(OrderTicket(), ll, pp, Slippage, clClose);
if(fc)
{
if(UseSound) PlaySound(NameFileSound); break;
} else {
err=GetLastError();
if(err==146) while(IsTradeContextBusy()) Sleep(1000*11);
Print("Error(",err,") Close ",GetNameOP(OrderType())," ",
ErrorDescription(err),", try ",it);
Print(OrderTicket()," Ask=",pa," Bid=",pb," pp=",pp);
Print("sy=",OrderSymbol()," ll=",ll," sl=",OrderStopLoss(),
" tp=",OrderTakeProfit()," mn=",OrderMagicNumber());
Sleep(1000*5);
}
}
}
else Print("Некорректная торговая операция. Close ",GetNameOP(OrderType()));
}
//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 19.02.2008 |
//| Описание : Закрытие позиций по рыночной цене сначала прибыльных. Вторая |
//| функция |
//+----------------------------------------------------------------------------+
void ClosePosFirstProfit()
{
int i,k=OrdersTotal();
// Сначала закрываем прибыльные позиции
for(i=k-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(!CurSymbolOnly || OrderSymbol()==Symbol())
{
if(IsOrderTypeAllowed())
{
if(OrderProfit()+OrderSwap()>0) ClosePosBySelect();
}
}
}
}
// Потом все остальные
k=OrdersTotal();
for(i=k-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(!CurSymbolOnly || OrderSymbol()==Symbol())
{
if(IsOrderTypeAllowed())
{
ClosePosBySelect();
}
}
}
}
}
//+----------------------------------------------------------------------------+
//| Закрытие всех позиций по профиту.
//| Основная функция |
//+----------------------------------------------------------------------------+
void CloseByProfit()
{
double pa,pb,pp;
int i,k=OrdersTotal(),pr=0;
for(i=0; i<k; i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(!CurSymbolOnly || OrderSymbol()==Symbol())
{
pa=MarketInfo(OrderSymbol(), MODE_ASK); // Последняя поступившая цена продажи
pb=MarketInfo(OrderSymbol(), MODE_BID); // Последняя поступившая цена предложения
pp=MarketInfo(OrderSymbol(), MODE_POINT); // Размер пункта в валюте котировки
if(pp==0) if(StringFind(OrderSymbol(),"JPY")<0) pp=0.0001; else pp=0.01; // Так как у йиены другие катировки
// Ограничиваем выбор типа сделок (либо только продать, либо только купить)
if(OrderType()==OP_BUY && IsOrderTypeAllowed())
{
pr+=NormalizeDouble((pb - OrderOpenPrice())/pp,0) + ComissionForOrderinPips();
}
if(OrderType()==OP_SELL && IsOrderTypeAllowed())
{
pr+=NormalizeDouble((OrderOpenPrice() - pa)/pp,0) + ComissionForOrderinPips();
}
}
}
}
CurProfit=pr;
if(CurProfit<= -(StopLoss) || CurProfit>=TakeProfit) ClosePosFirstProfit();
}
//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 01.09.2005 |
//| Описание : Возвращает наименование торговой операции |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| op - идентификатор торговой операции |
//+----------------------------------------------------------------------------+
string GetNameOP(int op)
{
switch(op)
{
case OP_BUY : return("Buy");
case OP_SELL : return("Sell");
case OP_BUYLIMIT : return("BuyLimit");
case OP_SELLLIMIT: return("SellLimit");
case OP_BUYSTOP : return("BuyStop");
case OP_SELLSTOP : return("SellStop");
default : return("Unknown Operation");
}
}
//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 01.02.2008 |
//| Описание : Возвращает одно из двух значений взависимости от условия. |
//+----------------------------------------------------------------------------+
string IIFs(bool condition,string ifTrue,string ifFalse)
{
if(condition) return(ifTrue); else return(ifFalse);
}
//+----------------------------------------------------------------------------+
//| Вывод сообщения в коммент и в журнал |
//+----------------------------------------------------------------------------+
void Message(string m)
{
Comment(m);
if(StringLen(m)>0) Print(m);
}
//+----------------------------------------------------------------------------+
//| Автор : Андрей Ерёмин, http:/aeremin.ru |
//+----------------------------------------------------------------------------+
//| Версия : 02.07.2016 |
//| Описание: Проверяем можно ли работать с текущим ордером |
//+----------------------------------------------------------------------------+
bool IsOrderTypeAllowed()
{
// Разрешаем только чистый Бай и чистый Селл
if(OrderType()== OP_BUY || OrderType()== OP_SELL)
{
// Разрешаем, если разрешены оба направления
if(BuySellPriority == 2)
{
return(true);
}
// Разрешаем, если разрешена только продажа
if(OrderType()== OP_SELL && BuySellPriority == 0)
{
return(true);
}
// Разрешаем, если разрешена только покупка
if(OrderType()== OP_BUY && BuySellPriority == 1)
{
return(true);
}
// Иначе не разрешаем
return(false);
}
else
{
return(false);
}
}
//+----------------------------------------------------------------------------+
//| Автор : Андрей Ерёмин, http:/aeremin.ru |
//+----------------------------------------------------------------------------+
//| Версия : 03.07.2016 |
//| Описание: Возвращает комиссию за текущий ордер |
//+----------------------------------------------------------------------------+
double ComissionForOrderinPips()
{
if(UseCommission)
{
return( MathCeil(OrderCommission() / (OrderLots()*MarketInfo(Symbol(),MODE_TICKVALUE))));
}
else
{
return(0);
}
}
//+----------------------------------------------------------------------------+
//| Вывод сообщения в коммент и в журнал |
//+----------------------------------------------------------------------------+
string PriorityName()
{
if(BuySellPriority == 0)
{
return("Sell");
}
if(BuySellPriority == 1)
{
return("Buy");
}
return("Buy&Sell");
}
//+----------------------------------------------------------------------------+
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment