Last active
July 11, 2016 17:03
-
-
Save developer88/9b899f40015d0967427b3cba303d50f5 to your computer and use it in GitHub Desktop.
e-CloseByProfit.mq4 robot that closes your order when you need to / робот, который закрывает сделки тогда, когда вам это надо
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//+----------------------------------------------------------------------------+ | |
//| 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