Equity Sentry
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «zeador.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Equity Sentry — торговый советник для MetaTrader 4, предназначенный для контроля состояния торгового счёта и автоматического реагирования на достижение заданных уровней прибыли или убытка. Советник отслеживает плавающий и накопленный результат по открытым и закрытым сделкам, учитывая комиссии и свопы, и при срабатывании условий выполняет настроенные действия: закрывает позиции, отключает всех экспертов или завершает работу терминала MetaTrader.
Входные параметры позволяют задать пороги срабатывания по проценту эквити, денежному выражению и пунктам как для текущего, так и для накопленного результата. Дополнительно предусмотрены настройки управления стоп-лоссами: трейлинг-стоп и перевод в безубыток. Советник может работать в непрерывном режиме, отображать информационную панель на графике и учитывать комиссии и свопы при расчёте прибыли.
Для выполнения действий по отключению экспертов или закрытию терминала советник использует вызовы Windows API, что требует разрешения на импорт DLL. Советник не содержит собственной торговой стратегии открытия сделок — он предназначен для управления уже существующими позициями и защиты капитала.
Настройки программы
| Настройка | Описание |
|---|---|
| _A | Действие при срабатывании — Текстовый параметр, используемый как заголовок группы настроек действий при срабатывании. |
| DisableAllExpertAdvisors | Отключать всех экспертов — Если включено, при срабатывании условия советник отключает всех экспертов в терминале. |
| CloseMetatraderCompletely | Закрывать MetaTrader полностью — Если включено, при срабатывании условия советник закрывает окно MetaTrader. |
| _B | Настройки плавающего P/L — Текстовый параметр, используемый как заголовок группы настроек плавающего P/L. |
| EquityLossPercent | Убыток по эквити (%) — Порог убытка по текущему эквити в процентах, при котором советник выполняет заданные действия. |
| EquityLossMoney | Убыток по эквити (деньги) — Порог убытка по текущему эквити в денежном выражении, при котором советник выполняет заданные действия. |
| EquityLossPips | Убыток по эквити (пипсы) — Порог убытка по текущему эквити в пунктах, при котором советник выполняет заданные действия. |
| EquityProfitPercent | Прибыль по эквити (%) — Порог прибыли по текущему эквити в процентах, при котором советник выполняет заданные действия. |
| EquityProfitMoney | Прибыль по эквити (деньги) — Порог прибыли по текущему эквити в денежном выражении, при котором советник выполняет заданные действия. |
| EquityProfitPips | Прибыль по эквити (пипсы) — Порог прибыли по текущему эквити в пунктах, при котором советник выполняет заданные действия. |
| _C | Настройки накопленного P/L — Текстовый параметр, используемый как заголовок группы настроек накопленного P/L. |
| CumulativeLossMoney | Накопленный убыток (деньги) — Порог накопленного убытка в денежном выражении, при котором советник выполняет заданные действия. |
| CumulativeLossPips | Накопленный убыток (пипсы) — Порог накопленного убытка в пунктах, при котором советник выполняет заданные действия. |
| CumulativeProfitMoney | Накопленная прибыль (деньги) — Порог накопленной прибыли в денежном выражении, при котором советник выполняет заданные действия. |
| CumulativeProfitPips | Накопленная прибыль (пипсы) — Порог накопленной прибыли в пунктах, при котором советник выполняет заданные действия. |
| _D | Настройки управления стоп-лоссами — Текстовый параметр, используемый как заголовок группы настроек управления стоп-лоссами. |
| TrailStopStartPips | Начало трейлинг-стопа (пипсы) — Определяет прибыль в пунктах, при достижении которой советник начинает трейлинг стоп-лосса. |
| TrailStopMovePips | Сдвиг трейлинг-стопа (пипсы) — Задаёт величину сдвига стоп-лосса в пунктах при трейлинге. |
| BreakEvenStartPips | Начало безубытка (пипсы) — Определяет прибыль в пунктах, при достижении которой советник начинает переводить позицию в безубыток. |
| BreakEvenMovePips | Сдвиг безубытка (пипсы) — Задаёт величину сдвига стоп-лосса в пунктах при переводе позиции в безубыток. |
| _E | Прочие настройки — Текстовый параметр, используемый как заголовок группы прочих настроек. |
| UninterruptibleMode | Непрерывный режим — Если включено, советник продолжает работу после срабатывания условия, не завершая цикл. |
| IncludeCommissionsAndSwap | Учитывать комиссии и свопы — Если включено, при расчёте прибыли и убытка учитываются комиссии и свопы. |
| Slippage | Проскальзывание — Максимальное допустимое проскальзывание в пунктах при закрытии сделок. |
| MagicNumber | Магическое число — Идентификатор магического числа для фильтрации сделок; -1 означает учёт всех сделок. |
| DashboardDisplay | Отображение панели — Управляет отображением информационной панели на графике. |
| DashboardColor | Цвет панели — Цвет информационной панели, отображаемой на графике. |
Поиск по коду файла
/*
Decompiler Iury Alves!!!
*/
#include <WinUser32.mqh>
#import "user32.dll"
int GetAncestor(int a0, int a1);
int PostMessageA(int a0, int a1, int a2, string a3);
#import
extern string _A = "Action on trigger";
extern bool DisableAllExpertAdvisors = TRUE;
extern bool CloseMetatraderCompletely = FALSE;
extern string _B = "Floating P/L settings";
extern double EquityLossPercent = 10.0;
extern double EquityLossMoney = 0.0;
extern double EquityLossPips = 0.0;
extern double EquityProfitPercent = 0.0;
extern double EquityProfitMoney = 0.0;
extern double EquityProfitPips = 0.0;
extern string _C = "Cumulative P/L settings";
extern double CumulativeLossMoney = 0.0;
extern double CumulativeLossPips = 0.0;
extern double CumulativeProfitMoney = 0.0;
extern double CumulativeProfitPips = 0.0;
extern string _D = "Stop Loss management settings";
extern double TrailStopStartPips = 0.0;
extern double TrailStopMovePips = 0.0;
extern double BreakEvenStartPips = 0.0;
extern double BreakEvenMovePips = 0.0;
extern string _E = "Other settings";
extern bool UninterruptibleMode = FALSE;
extern bool IncludeCommissionsAndSwap = TRUE;
extern int Slippage = 5;
extern int MagicNumber = -1;
extern int DashboardDisplay = 2;
extern color DashboardColor = C'0x46,0x91,0xEC';
double G_point_260;
int Gi_unused_268;
int Gi_272 = 5;
bool Gi_276 = TRUE;
double Gd_280 = 0.0;
double Gd_288 = 0.0;
double Gd_296 = 0.0;
double Gd_304 = 0.0;
double Gd_312 = 0.0;
int Gi_320;
string Gs_324;
int Gia_332[11];
double G_lotstep_336;
double G_minlot_344;
double G_maxlot_352;
double Gd_360;
double G_tickvalue_368;
double G_lotsize_376;
int Gi_384;
double Gda_388[][11];
double Gda_392[][11];
void init() {
// код доступен только после оплаты
}
void deinit() {
if (UninitializeReason() != REASON_CHARTCHANGE) {
Comment("");
f0_12();
return;
}
}
void f0_4() {
double order_stoploss_0;
double Ld_8;
double Ld_16;
int Li_24;
double point_28;
double point_36;
ArrayInitialize(Gia_332, 0);
Gd_288 = 0;
Gd_296 = 0;
int index_44 = 0;
if (ArraySize(Gda_388) > 0) ArrayCopy(Gda_392, Gda_388);
else ArrayResize(Gda_392, 0);
ArrayResize(Gda_388, 0);
if (ArraySize(Gda_388) > 0) ArrayInitialize(Gda_388, 0);
for (int pos_48 = 0; pos_48 < OrdersTotal(); pos_48++) {
if (OrderSelect(pos_48, SELECT_BY_POS) == TRUE && MagicNumber == -1 || OrderMagicNumber() == MagicNumber) {
index_44++;
ArrayResize(Gda_388, 11 * index_44);
Gda_388[index_44][1] = OrderOpenPrice();
Gda_388[index_44][2] = OrderStopLoss();
Gda_388[index_44][3] = OrderTakeProfit();
Gda_388[index_44][4] = OrderTicket();
Gda_388[index_44][5] = OrderLots();
Gda_388[index_44][6] = OrderType();
Gda_388[index_44][7] = OrderMagicNumber();
if (StringSubstr(OrderComment(), 0, 6) == "from #") Gda_388[index_44][8] = 1;
else Gda_388[index_44][8] = 0;
Gda_388[index_44][9] = OrderClosePrice();
Gda_388[index_44][10] = OrderProfit();
Gia_332[OrderType()]++;
if (OrderType() == OP_BUY || OrderType() == OP_SELL) Gia_332[6]++;
if (OrderType() == OP_BUYLIMIT || OrderType() == OP_SELLLIMIT) {
Gia_332[7]++;
Gia_332[9]++;
}
if (OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP) {
Gia_332[8]++;
Gia_332[9]++;
}
Gia_332[10]++;
Li_24 = MarketInfo(OrderSymbol(), MODE_DIGITS);
point_28 = MarketInfo(OrderSymbol(), MODE_POINT);
if (point_28 == 0.00001) point_36 = 0.0001;
else {
if (point_28 == 0.001) point_36 = 0.01;
else point_36 = point_28;
}
Gd_288 += OrderProfit();
if (IncludeCommissionsAndSwap) Gd_288 += OrderSwap() + OrderCommission();
if (OrderType() == OP_BUY) Gd_296 += (OrderClosePrice() - OrderOpenPrice()) / point_36;
else
if (OrderType() == OP_SELL) Gd_296 += (OrderOpenPrice() - OrderClosePrice()) / point_36;
if (TrailStopStartPips > 0.0) {
Ld_8 = OrderOpenPrice();
order_stoploss_0 = OrderStopLoss();
if (OrderType() == OP_BUY) {
if (OrderStopLoss() > 0.0 && NormalizeDouble(OrderStopLoss(), Li_24) > NormalizeDouble(OrderOpenPrice(), Li_24)) Ld_8 = OrderStopLoss();
Ld_16 = (OrderClosePrice() - Ld_8) / point_36;
if (Ld_16 > 0.0 && Ld_16 >= TrailStopStartPips) order_stoploss_0 = NormalizeDouble(OrderClosePrice() - (TrailStopStartPips - TrailStopMovePips) * point_36, Li_24);
} else {
if (OrderType() == OP_SELL) {
if (OrderStopLoss() > 0.0 && NormalizeDouble(OrderStopLoss(), Li_24) < NormalizeDouble(OrderOpenPrice(), Li_24)) Ld_8 = OrderStopLoss();
Ld_16 = (Ld_8 - OrderClosePrice()) / point_36;
if (Ld_16 > 0.0 && Ld_16 >= TrailStopStartPips) order_stoploss_0 = NormalizeDouble(OrderClosePrice() + (TrailStopStartPips - TrailStopMovePips) * point_36, Li_24);
}
}
if (NormalizeDouble(order_stoploss_0, Li_24) != NormalizeDouble(OrderStopLoss(), Li_24)) OrderModify(OrderTicket(), OrderOpenPrice(), order_stoploss_0, OrderTakeProfit(), 0, CLR_NONE);
}
if (BreakEvenStartPips > 0.0) {
order_stoploss_0 = OrderStopLoss();
if (OrderType() == OP_BUY) {
if (OrderStopLoss() == 0.0 || NormalizeDouble(OrderStopLoss(), Li_24) < NormalizeDouble(OrderOpenPrice(), Li_24)) {
Ld_16 = (OrderClosePrice() - OrderOpenPrice()) / point_36;
if (Ld_16 > 0.0 && Ld_16 >= BreakEvenStartPips) order_stoploss_0 = OrderOpenPrice() + BreakEvenMovePips * point_36;
}
} else {
if (OrderType() == OP_SELL) {
if (OrderStopLoss() == 0.0 || NormalizeDouble(OrderStopLoss(), Li_24) > NormalizeDouble(OrderOpenPrice(), Li_24)) {
Ld_16 = (OrderOpenPrice() - OrderClosePrice()) / point_36;
if (Ld_16 > 0.0 && Ld_16 >= BreakEvenStartPips) order_stoploss_0 = OrderOpenPrice() - BreakEvenMovePips * point_36;
}
}
}
if (NormalizeDouble(order_stoploss_0, Li_24) != NormalizeDouble(OrderStopLoss(), Li_24)) OrderModify(OrderTicket(), OrderOpenPrice(), order_stoploss_0, OrderTakeProfit(), 0, CLR_NONE);
}
}
}
Gda_388[0][0] = index_44;
Gd_280 = 100.0 * (Gd_288 / AccountBalance());
}
void f0_9() {
bool Li_0;
for (int Li_4 = 1; Li_4 <= Gda_392[0][0]; Li_4++) {
Li_0 = FALSE;
for (int Li_8 = 1; Li_8 <= Gda_388[0][0]; Li_8++) {
if (Gda_392[Li_4][4] == Gda_388[Li_8][4]) {
Li_0 = TRUE;
break;
}
}
if (Li_0 == FALSE) f0_15(Li_4);
}
for (Li_8 = 1; Li_8 <= Gda_388[0][0]; Li_8++) {
if (Gda_388[Li_8][8] <= 0.0) {
Li_0 = FALSE;
for (Li_4 = 1; Li_4 <= Gda_392[0][0]; Li_4++) {
if (Gda_388[Li_8][4] == Gda_392[Li_4][4]) {
Li_0 = TRUE;
break;
}
}
if (Li_0 == FALSE) {
}
}
}
}
void f0_15(int Ai_0) {
int error_4;
double Ld_8;
string Ls_16;
double point_24;
double point_32;
if (Gda_392[Ai_0][6] <= 1.0) {
Ld_8 = 0;
Ls_16 = "";
if (OrderSelect(Gda_392[Ai_0][4], SELECT_BY_TICKET)) {
point_24 = MarketInfo(OrderSymbol(), MODE_POINT);
if (point_24 == 0.00001) point_32 = 0.0001;
else {
if (point_24 == 0.001) point_32 = 0.01;
else point_32 = point_24;
}
if (OrderType() == OP_BUY) Ld_8 = (OrderClosePrice() - OrderOpenPrice()) / point_32;
else
if (OrderType() == OP_SELL) Ld_8 = (OrderOpenPrice() - OrderClosePrice()) / point_32;
Gd_304 += OrderProfit();
if (IncludeCommissionsAndSwap) Gd_304 += OrderSwap() + OrderCommission();
Gd_312 += Ld_8;
GlobalVariableSet(Gs_324 + "_cumulative_money", Gd_304);
GlobalVariableSet(Gs_324 + "_cumulative_pips", Gd_312);
Ls_16 = "; Cumulative P/L: " + DoubleToStr(Gd_304, 2) + " " + AccountCurrency() + " (" + DoubleToStr(Gd_312, 1) + " pips)";
Print("Trade #" + OrderTicket() + " closed. Profit/Loss: " + DoubleToStr(OrderProfit(), 2) + " " + AccountCurrency() + " (" + DoubleToStr(Ld_8, 1) + " pips)" + Ls_16);
} else {
error_4 = GetLastError();
Print("OrderSelect error: " + f0_13(error_4) + " (" + error_4 + ")");
}
}
}
void f0_10() {
Gd_304 = 0;
Gd_312 = 0;
GlobalVariableSet(Gs_324 + "_cumulative_money", Gd_304);
GlobalVariableSet(Gs_324 + "_cumulative_pips", Gd_312);
}
int f0_14(double Ad_0) {
if (Ad_0 <= 0.0) return (0);
double Ld_ret_8 = 0;
while (Ad_0 < 1.0) {
Ld_ret_8++;
Ad_0 = 10.0 * Ad_0;
}
return (Ld_ret_8);
}
void f0_12() {
for (int Li_0 = ObjectsTotal() - 1; Li_0 >= 0; Li_0--)
if (StringSubstr(ObjectName(Li_0), 0, StringLen("Equity Sentry")) == "Equity Sentry") ObjectDelete(ObjectName(Li_0));
}
int f0_11(int A_cmd_0 = -1) {
int error_4;
int count_8;
int digits_12;
double price_24;
double point_36;
double point_44;
if (f0_3() < 0) return (-1);
int count_16 = 0;
bool Li_20 = FALSE;
for (int pos_32 = OrdersTotal() - 1; pos_32 >= 0; pos_32--) {
if (OrderSelect(pos_32, SELECT_BY_POS, MODE_TRADES) != FALSE) {
if (MagicNumber > -1)
if (OrderMagicNumber() != MagicNumber) continue;
if (A_cmd_0 > -1)
if (OrderType() != A_cmd_0) continue;
if (OrderType() <= OP_SELL) {
count_8 = 0;
digits_12 = MarketInfo(OrderSymbol(), MODE_DIGITS);
RefreshRates();
if (OrderType() == OP_BUY) price_24 = MarketInfo(OrderSymbol(), MODE_BID);
else {
if (OrderType() == OP_SELL) price_24 = MarketInfo(OrderSymbol(), MODE_ASK);
else price_24 = OrderClosePrice();
}
for (Li_20 = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(price_24, digits_12), Slippage, Yellow); !Li_20 && count_8 <= Gi_272; Li_20 = OrderClose(OrderTicket(),
OrderLots(), NormalizeDouble(price_24, digits_12), Slippage, Yellow)) {
error_4 = GetLastError();
Print("OrderClose error (" + error_4 + "): " + f0_13(error_4) + "; OrderTicket: " + OrderTicket() + ";");
if (error_4 != 0/* NO_ERROR */ && error_4 != 4/* SERVER_BUSY */ && error_4 != 6/* NO_CONNECTION */ && error_4 != 128/* TRADE_TIMEOUT */ && error_4 != 129/* INVALID_PRICE */ &&
error_4 != 130/* INVALID_STOPS */ && error_4 != 135/* PRICE_CHANGED */ && error_4 != 136/* OFF_QUOTES */ && error_4 != 137/* BROKER_BUSY */ && error_4 != 138/* REQUOTE */ &&
error_4 != 145/* TRADE_MODIFY_DENIED */ && error_4 != 146/* TRADE_CONTEXT_BUSY */) break;
if (count_8 >= Gi_272) break;
Sleep(1000);
if (error_4 == 128/* TRADE_TIMEOUT */ || error_4 == 129/* INVALID_PRICE */ || error_4 == 130/* INVALID_STOPS */ || error_4 == 136/* OFF_QUOTES */ || error_4 == 145/* TRADE_MODIFY_DENIED */ ||
error_4 == 146/* TRADE_CONTEXT_BUSY */) {
Print("EA must wait a few seconds before attempting to repeat the last trading action to obey MQL rules");
Sleep(5000);
}
count_8++;
Print("OrderClose retry #" + count_8);
RefreshRates();
if (OrderType() == OP_BUY) price_24 = MarketInfo(OrderSymbol(), MODE_BID);
else {
if (OrderType() == OP_SELL) price_24 = MarketInfo(OrderSymbol(), MODE_ASK);
else price_24 = OrderClosePrice();
}
}
} else {
count_8 = 0;
for (Li_20 = OrderDelete(OrderTicket()); !Li_20 && count_8 <= Gi_272; Li_20 = OrderDelete(OrderTicket())) {
error_4 = GetLastError();
Print("OrderDelete error (" + error_4 + "): " + f0_13(error_4) + "; OrderTicket: " + OrderTicket() + ";");
if (error_4 != 0/* NO_ERROR */ && error_4 != 4/* SERVER_BUSY */ && error_4 != 6/* NO_CONNECTION */ && error_4 != 128/* TRADE_TIMEOUT */ && error_4 != 129/* INVALID_PRICE */ &&
error_4 != 130/* INVALID_STOPS */ && error_4 != 135/* PRICE_CHANGED */ && error_4 != 136/* OFF_QUOTES */ && error_4 != 137/* BROKER_BUSY */ && error_4 != 138/* REQUOTE */ &&
error_4 != 145/* TRADE_MODIFY_DENIED */ && error_4 != 146/* TRADE_CONTEXT_BUSY */) break;
if (count_8 >= Gi_272) break;
Sleep(1000);
if (error_4 == 128/* TRADE_TIMEOUT */ || error_4 == 129/* INVALID_PRICE */ || error_4 == 130/* INVALID_STOPS */ || error_4 == 136/* OFF_QUOTES */ || error_4 == 145/* TRADE_MODIFY_DENIED */ ||
error_4 == 146/* TRADE_CONTEXT_BUSY */) {
Print("EA must wait a few seconds before attempting to repeat the last trading action to obey MQL rules");
Sleep(5000);
}
count_8++;
Print("OrderDelete retry #" + count_8);
RefreshRates();
}
}
if (error_4 > 1/* NO_RESULT */) {
if (OrderSymbol() == Symbol()) {
point_36 = MarketInfo(OrderSymbol(), MODE_POINT);
if (point_36 == 0.00001) point_44 = 0.0001;
else {
if (point_36 == 0.001) point_44 = 0.01;
else point_44 = point_36;
}
f0_7("error_close_trade_" + Time[0], "ce" + error_4, Yellow, Time[0], Low[0] - 2.0 * point_44);
}
}
if (Li_20) count_16++;
}
}
return (count_16);
}
void f0_7(string A_name_0, string A_text_8, color A_color_16, int A_datetime_20, double A_price_24) {
if (ObjectFind(A_name_0) == -1) ObjectCreate(A_name_0, OBJ_TEXT, 0, A_datetime_20, A_price_24);
ObjectSetText(A_name_0, A_text_8, 8, "Arial Bold", A_color_16);
}
int f0_3(int Ai_0 = 30) {
int Li_4;
if (!IsTradeAllowed()) {
Li_4 = GetTickCount();
Print("Broker trade context is busy! EA will wait until it is free ...");
while (true) {
if (IsStopped()) {
Print("The expert was terminated by the user!");
return (-1);
}
if (GetTickCount() - Li_4 > 1000 * Ai_0) {
Print("The waiting limit exceeded (" + Ai_0 + ")! EA may fail to perform trading actions because broker trade context is busy!");
return (-2);
}
if (!(IsTradeAllowed())) continue;
break;
}
Print("Broker trade context has become free! EA will continue to perform trading actions");
return (0);
}
return (1);
}
string f0_13(int Ai_0) {
string Ls_ret_4;
switch (Ai_0) {
case 0:
case 1:
Ls_ret_4 = "no error";
break;
case 2:
Ls_ret_4 = "common error";
break;
case 3:
Ls_ret_4 = "invalid trade parameters";
break;
case 4:
Ls_ret_4 = "trade server is busy";
break;
case 5:
Ls_ret_4 = "old version of the client terminal";
break;
case 6:
Ls_ret_4 = "no connection with trade server";
break;
case 7:
Ls_ret_4 = "not enough rights";
break;
case 8:
Ls_ret_4 = "too frequent requests";
break;
case 9:
Ls_ret_4 = "malfunctional trade operation (never returned error)";
break;
case 64:
Ls_ret_4 = "account disabled";
break;
case 65:
Ls_ret_4 = "invalid account";
break;
case 128:
Ls_ret_4 = "trade timeout";
break;
case 129:
Ls_ret_4 = "invalid price";
break;
case 130:
Ls_ret_4 = "invalid stops";
break;
case 131:
Ls_ret_4 = "invalid trade volume";
break;
case 132:
Ls_ret_4 = "market is closed";
break;
case 133:
Ls_ret_4 = "trade is disabled";
break;
case 134:
Ls_ret_4 = "not enough money";
break;
case 135:
Ls_ret_4 = "price changed";
break;
case 136:
Ls_ret_4 = "off quotes";
break;
case 137:
Ls_ret_4 = "broker is busy (never returned error)";
break;
case 138:
Ls_ret_4 = "requote";
break;
case 139:
Ls_ret_4 = "order is locked";
break;
case 140:
Ls_ret_4 = "long positions only allowed";
break;
Показано первые 50% кода (символов: 28076)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.