GPS Forex Robot USDCHF
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «gpsforexrobotusdchf_edu.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
GPS Forex Robot USDCHF — торговый советник для платформы MetaTrader 4, предназначенный исключительно для работы с парой USDCHF. При запуске проверяет допустимость DLL-импортов, корректность торгового инструмента и режим тестирования, после чего выводит информацию об аккаунте и настройках GMT в комментарий графика.
Советник поддерживает управление лотами с возможностью включения money management, автоматического или ручного задания GMT-смещения, а также отправку email-уведомлений и звуковых сигналов при открытии и закрытии сделок. Внутренняя логика работы частично закомментирована, а функция аутентификации приведена в виде заглушки с фиксированным результатом.
Основной обработчик start() выполняет проверку ордеров, отслеживает уровни закрытия, управляет открытием позиций по временным условиям и поддерживает реверс-позиции после стоп-лосса. Все торговые операции выполняются через стандартные функции OrderSend и OrderClose с обработкой типичных ошибок торгового сервера.
Настройки программы
| Настройка | Описание |
|---|---|
| GPS_Forex_Robot_USDCHF | Текстовый параметр-заголовок, используемый для группировки настроек в интерфейсе советника. |
| ____Size_of_lots________ | Текстовый параметр-разделитель для группировки настроек размера лота. |
| UseMM | Включает или отключает автоматический расчёт размера лота (money management) на основе свободного маржинального баланса и заданного коэффициента риска. |
| Lots | Размер торгового лота по умолчанию, используемый при выключенном money management (UseMM = false). |
| LotsRiskReductor | Коэффициент риска, применяемый при расчёте размера лота в режиме money management для определения допустимого объёма позиции на основе свободного маржинального баланса. |
| MaxLots | Максимально допустимый размер торгового лота, ограничивающий результат расчёта лота при money management и ручном задании. |
| ____General_Options_____ | Текстовый параметр-разделитель для группировки общих настроек советника. |
| AutoGMTOffset | Включает или отключает автоматическое определение GMT-смещения на основе текущего серверного времени. При активном значении смещение вычисляется автоматически; при выключенном — используется вручную заданное значение GMTOffset. |
| GMTOffset | Числовое значение GMT-смещения в часах, используемое при ручном режиме работы (AutoGMTOffset = false). |
| ____Others______________ | Текстовый параметр-разделитель для группировки дополнительных настроек советника. |
| ExpertComment | Текстовый комментарий, присваиваемый каждой открытой торговой позиции в поле комментария ордера. |
| ColorBuy | Цвет отображения информации о покупке (Buy) в комментарии на графике. |
| ColorSell | Цвет отображения информации о продаже (Sell) в комментарии на графике. |
| SendEmail | Включает или отключает отправку email-уведомлений при открытии и закрытии торговых позиций с информацией о типе ордера, цене, объёме и балансе. |
| SoundAlert | Включает или отключает звуковые уведомления при открытии и закрытии позиций с воспроизведением указанных звуковых файлов. |
| SoundFileAtOpen | Имя звукового файла, который воспроизводится при открытии торговой позиции. |
| SoundFileAtClose | Имя звукового файла, который воспроизводится при закрытии торговой позиции. |
| WriteLog | Включает или отключает запись информационных сообщений и ошибок в журнал терминала MetaTrader 4. |
| WriteDebugLog | Включает расширенное логирование в журнал терминала, включая информацию при инициализации, деинициализации и ошибках торговых операций. При активации также включает общий лог WriteLog. |
Поиск по коду файла
/*
Generated by EX4-TO-MQ4 decompiler V4.0.224.1 []
Website:
E-mail : p******m*@gmail.com
*/
#import "GPSForexRobotUSDCHF.dll"
int GetGMT();
#import
extern string GPS_Forex_Robot_USDCHF = " ";
/*
extern string ____Authentication________ = "---------------------------------------------";
extern string EMail = "";
extern string CBReceipt = "";
*/
extern string ____Size_of_lots________ = "---------------------------------------------";
extern bool UseMM = FALSE;
extern double Lots = 0.01;
extern double LotsRiskReductor = 10.0;
extern double MaxLots = 1000.0;
extern string ____General_Options_____ = "---------------------------------------------";
extern bool AutoGMTOffset = TRUE;
extern int GMTOffset = 1;
bool gi_160 = FALSE;
int gi_164 = 2;
bool gi_168 = TRUE;
double gd_172 = 32.0;
double gd_180 = 8.0;
int gi_188 = 16;
int gi_192 = 0;
bool gi_196 = TRUE;
bool gi_200 = FALSE;
bool gi_204 = FALSE;
bool gi_208 = TRUE;
bool gi_212 = TRUE;
int gi_216 = -4;
int gi_220 = 1;
int gi_224 = 20100109;
bool gi_228 = TRUE;
double gd_232 = 45.0;
double gd_240 = 14.0;
double gd_248 = 4.0;
int gi_256 = 20100129;
extern string ____Others______________ = "---------------------------------------------";
extern string ExpertComment = "GPS Forex Robot";
extern color ColorBuy = Blue;
extern color ColorSell = Red;
extern bool SendEmail = FALSE;
extern bool SoundAlert = FALSE;
extern string SoundFileAtOpen = "alert.wav";
extern string SoundFileAtClose = "alert.wav";
extern bool WriteLog = FALSE;
extern bool WriteDebugLog = FALSE;
bool gi_316 = TRUE;
int gi_320 = 2;
int gi_324 = 1;
string gs_unused_328 = "New Trade Information";
string gs_336 = "New Trade Information";
int g_bool_344;
int gi_348;
int gi_352;
int g_slippage_356;
double gd_360;
double g_maxlot_368;
double g_minlot_376;
double gd_384;
double gd_392;
double g_lotstep_400;
double gd_408;
string g_symbol_416;
string gs_424;
bool gba_432[4];
double gda_436[4];
double gda_440[4];
int gia_444[4];
int gia_448[4];
bool gba_452[4][5];
int gia_456[4];
int gia_460[4];
int gia_464[4];
bool gba_468[4];
double gda_472[4];
double gda_476[4];
double gda_480[4];
int gia_484[4];
bool gi_488;
bool gi_492;
int gi_496 = 0;
bool gi_500 = FALSE;
int gi_504 = 0;
double gda_508[52] = {0};
string gs_512 = "";
string gs_520 = "";
string gs_528 = "";
bool gi_536 = FALSE;
int init() {
// код доступен только после оплаты
}
int deinit() {
Comment("");
if (WriteDebugLog) Print("*************************** Deinitialization ***************************");
return (0);
}
int start() {
// код доступен только после оплаты
}
string ErrorDescription(int ai_0) {
string ls_ret_8;
switch (ai_0) {
case 0:
case 1:
ls_ret_8 = "no error";
break;
case 2:
ls_ret_8 = "common error";
break;
case 3:
ls_ret_8 = "invalid trade parameters";
break;
case 4:
ls_ret_8 = "trade server is busy";
break;
case 5:
ls_ret_8 = "old version of the client terminal";
break;
case 6:
ls_ret_8 = "no connection with trade server";
break;
case 7:
ls_ret_8 = "not enough rights";
break;
case 8:
ls_ret_8 = "too frequent requests";
break;
case 9:
ls_ret_8 = "malfunctional trade operation (never returned error)";
break;
case 64:
ls_ret_8 = "account disabled";
break;
case 65:
ls_ret_8 = "invalid account";
break;
case 128:
ls_ret_8 = "trade timeout";
break;
case 129:
ls_ret_8 = "invalid price";
break;
case 130:
ls_ret_8 = "invalid stops";
break;
case 131:
ls_ret_8 = "invalid trade volume";
break;
case 132:
ls_ret_8 = "market is closed";
break;
case 133:
ls_ret_8 = "trade is disabled";
break;
case 134:
ls_ret_8 = "not enough money";
break;
case 135:
ls_ret_8 = "price changed";
break;
case 136:
ls_ret_8 = "off quotes";
break;
case 137:
ls_ret_8 = "broker is busy (never returned error)";
break;
case 138:
ls_ret_8 = "requote";
break;
case 139:
ls_ret_8 = "order is locked";
break;
case 140:
ls_ret_8 = "long positions only allowed";
break;
case 141:
ls_ret_8 = "too many requests";
break;
case 145:
ls_ret_8 = "modification denied because order too close to market";
break;
case 146:
ls_ret_8 = "trade context is busy";
break;
case 147:
ls_ret_8 = "expirations are denied by broker";
break;
case 148:
ls_ret_8 = "amount of open and pending orders has reached the limit";
break;
case 149:
ls_ret_8 = "hedging is prohibited";
break;
case 150:
ls_ret_8 = "prohibited by FIFO rules";
break;
case 4000:
ls_ret_8 = "no error (never generated code)";
break;
case 4001:
ls_ret_8 = "wrong function pointer";
break;
case 4002:
ls_ret_8 = "array index is out of range";
break;
case 4003:
ls_ret_8 = "no memory for function call stack";
break;
case 4004:
ls_ret_8 = "recursive stack overflow";
break;
case 4005:
ls_ret_8 = "not enough stack for parameter";
break;
case 4006:
ls_ret_8 = "no memory for parameter string";
break;
case 4007:
ls_ret_8 = "no memory for temp string";
break;
case 4008:
ls_ret_8 = "not initialized string";
break;
case 4009:
ls_ret_8 = "not initialized string in array";
break;
case 4010:
ls_ret_8 = "no memory for array\' string";
break;
case 4011:
ls_ret_8 = "too long string";
break;
case 4012:
ls_ret_8 = "remainder from zero divide";
break;
case 4013:
ls_ret_8 = "zero divide";
break;
case 4014:
ls_ret_8 = "unknown command";
break;
case 4015:
ls_ret_8 = "wrong jump (never generated error)";
break;
case 4016:
ls_ret_8 = "not initialized array";
break;
case 4017:
ls_ret_8 = "dll calls are not allowed";
break;
case 4018:
ls_ret_8 = "cannot load library";
break;
case 4019:
ls_ret_8 = "cannot call function";
break;
case 4020:
ls_ret_8 = "expert function calls are not allowed";
break;
case 4021:
ls_ret_8 = "not enough memory for temp string returned from function";
break;
case 4022:
ls_ret_8 = "system is busy (never generated error)";
break;
case 4050:
ls_ret_8 = "invalid function parameters count";
break;
case 4051:
ls_ret_8 = "invalid function parameter value";
break;
case 4052:
ls_ret_8 = "string function internal error";
break;
case 4053:
ls_ret_8 = "some array error";
break;
case 4054:
ls_ret_8 = "incorrect series array using";
break;
case 4055:
ls_ret_8 = "custom indicator error";
break;
case 4056:
ls_ret_8 = "arrays are incompatible";
break;
case 4057:
ls_ret_8 = "global variables processing error";
break;
case 4058:
ls_ret_8 = "global variable not found";
break;
case 4059:
ls_ret_8 = "function is not allowed in testing mode";
break;
case 4060:
ls_ret_8 = "function is not confirmed";
break;
case 4061:
ls_ret_8 = "send mail error";
break;
case 4062:
ls_ret_8 = "string parameter expected";
break;
case 4063:
ls_ret_8 = "integer parameter expected";
break;
case 4064:
ls_ret_8 = "double parameter expected";
break;
case 4065:
ls_ret_8 = "array as parameter expected";
break;
case 4066:
ls_ret_8 = "requested history data in update state";
break;
case 4099:
ls_ret_8 = "end of file";
break;
case 4100:
ls_ret_8 = "some file error";
break;
case 4101:
ls_ret_8 = "wrong file name";
break;
case 4102:
ls_ret_8 = "too many opened files";
break;
case 4103:
ls_ret_8 = "cannot open file";
break;
case 4104:
ls_ret_8 = "incompatible access to a file";
break;
case 4105:
ls_ret_8 = "no order selected";
break;
case 4106:
ls_ret_8 = "unknown symbol";
break;
case 4107:
ls_ret_8 = "invalid price parameter for trade function";
break;
case 4108:
ls_ret_8 = "invalid ticket";
break;
case 4109:
ls_ret_8 = "trade is not allowed in the expert properties";
break;
case 4110:
ls_ret_8 = "longs are not allowed in the expert properties";
break;
case 4111:
ls_ret_8 = "shorts are not allowed in the expert properties";
break;
case 4200:
ls_ret_8 = "object is already exist";
break;
case 4201:
ls_ret_8 = "unknown object property";
break;
case 4202:
ls_ret_8 = "object is not exist";
break;
case 4203:
ls_ret_8 = "unknown object type";
break;
case 4204:
ls_ret_8 = "no object name";
break;
case 4205:
ls_ret_8 = "object coordinates error";
break;
case 4206:
ls_ret_8 = "no specified subwindow";
break;
default:
ls_ret_8 = "unknown error";
}
return (ls_ret_8);
}
string OrderTypeToStr(int ai_0) {
string ls_ret_8;
switch (ai_0) {
case 0:
ls_ret_8 = "Buy";
break;
case 1:
ls_ret_8 = "Sell";
break;
case 2:
ls_ret_8 = "BuyLimit";
break;
case 3:
ls_ret_8 = "SellLimit";
break;
case 4:
ls_ret_8 = "BuyStop";
break;
case 5:
ls_ret_8 = "SellStop";
break;
default:
ls_ret_8 = "Unknown";
}
return (ls_ret_8);
}
int GetGMTCorrection(int ai_0) {
ai_0 += GMTOffset;
while (true) {
if (ai_0 >= 24) {
ai_0 -= 24;
continue;
}
if (ai_0 >= 0) break;
ai_0 += 24;
}
return (ai_0);
}
void SetOrderLevels(double ad_0, double ad_8, int a_magic_16) {
int l_cmd_36;
double ld_40;
double l_price_48;
double ld_56;
double ld_64;
bool li_72;
double l_price_76;
bool li_84;
double l_price_88;
bool l_bool_96;
double ld_20 = NormalizeDouble(MarketInfo(g_symbol_416, MODE_STOPLEVEL) * Point, Digits);
int li_28 = OrdersTotal() - 1;
for (int l_pos_32 = li_28; l_pos_32 >= 0; l_pos_32--) {
if (!OrderSelect(l_pos_32, SELECT_BY_POS, MODE_TRADES)) {
if (WriteLog) Print(StringConcatenate("SetOrderLevels: OrderSelect() error = ", ErrorDescription(GetLastError())));
} else {
if (OrderMagicNumber() == a_magic_16) {
if (OrderSymbol() == g_symbol_416) {
l_cmd_36 = OrderType();
ld_40 = NormalizeDouble(OrderClosePrice(), Digits);
l_price_48 = NormalizeDouble(OrderOpenPrice(), Digits);
if (l_cmd_36 > OP_SELL)
if (NormalizeDouble(MathAbs(l_price_48 - ld_40), Digits) <= ld_20) continue;
ld_56 = NormalizeDouble(OrderStopLoss(), Digits);
ld_64 = NormalizeDouble(OrderTakeProfit(), Digits);
li_72 = FALSE;
if (ld_56 == 0.0) {
if (ad_8 < 0.0) {
if (l_cmd_36 % 2 == 0) {
l_price_76 = NormalizeDouble(l_price_48 + ad_8, Digits);
if (NormalizeDouble(ld_40 - l_price_76, Digits) > ld_20) li_72 = TRUE;
else l_price_76 = ld_56;
} else {
l_price_76 = NormalizeDouble(l_price_48 - ad_8, Digits);
if (NormalizeDouble(l_price_76 - ld_40, Digits) > ld_20) li_72 = TRUE;
else l_price_76 = ld_56;
}
} else l_price_76 = ld_56;
} else l_price_76 = ld_56;
li_84 = FALSE;
if (ld_64 == 0.0) {
if (ad_0 > 0.0) {
if (l_cmd_36 % 2 == 0) {
l_price_88 = NormalizeDouble(l_price_48 + ad_0, Digits);
if (NormalizeDouble(l_price_88 - ld_40, Digits) > ld_20) li_84 = TRUE;
else l_price_88 = ld_64;
} else {
l_price_88 = NormalizeDouble(l_price_48 - ad_0, Digits);
if (NormalizeDouble(ld_40 - l_price_88, Digits) > ld_20) li_84 = TRUE;
else l_price_88 = ld_64;
}
} else l_price_88 = ld_64;
} else l_price_88 = ld_64;
if (li_72 || li_84) {
while (!IsTradeAllowed()) Sleep(1000);
l_bool_96 = OrderModify(OrderTicket(), l_price_48, l_price_76, l_price_88, 0, CLR_NONE);
if (!l_bool_96)
if (WriteLog) Print(StringConcatenate("SetOrderLevels: OrderModify(", OrderTypeToStr(OrderType()), ") error = ", ErrorDescription(GetLastError())));
}
}
}
}
}
}
void WatchOrderLevels(double ad_0, double ad_8, int a_magic_16) {
double ld_28;
double ld_36;
double ld_44;
if (ad_0 <= 0.0 && ad_8 >= 0.0) return;
int li_20 = OrdersTotal() - 1;
for (int l_pos_24 = li_20; l_pos_24 >= 0; l_pos_24--) {
if (!OrderSelect(l_pos_24, SELECT_BY_POS, MODE_TRADES)) {
if (WriteLog) Print(StringConcatenate("WatchOrderLevels: OrderSelect() error = ", ErrorDescription(GetLastError())));
} else {
if (OrderMagicNumber() == a_magic_16) {
if (OrderType() <= OP_SELL) {
if (OrderSymbol() == g_symbol_416) {
ld_28 = NormalizeDouble(OrderClosePrice(), Digits);
ld_36 = NormalizeDouble(OrderOpenPrice(), Digits);
if (OrderType() == OP_BUY) {
ld_44 = NormalizeDouble(ld_28 - ld_36, Digits);
if ((ad_0 > 0.0 && ld_44 >= ad_0) || (ad_8 < 0.0 && ld_44 <= ad_8)) {
if (WriteLog) Print("WatchOrderLevels: level for close BUY");
CloseOrder(OrderTicket(), OrderLots(), 0, g_slippage_356);
}
} else {
ld_44 = NormalizeDouble(ld_36 - ld_28, Digits);
if ((ad_0 > 0.0 && ld_44 >= ad_0) || (ad_8 < 0.0 && ld_44 <= ad_8)) {
if (WriteLog) Print("WatchOrderLevels: level for close SELL");
CloseOrder(OrderTicket(), OrderLots(), 1, g_slippage_356);
}
}
}
}
}
}
}
}
double LotsOptimized(int ai_unused_0) {
double ld_ret_4;
double ld_12;
double ld_20;
if (!UseMM) ld_ret_4 = Lots;
else {
ld_12 = AccountFreeMargin() * gd_408 / 100.0;
ld_20 = MarketInfo(g_symbol_416, MODE_MARGINREQUIRED) * g_lotstep_400;
ld_ret_4 = NormalizeDouble(MathFloor(ld_12 / ld_20) * g_lotstep_400, gi_348);
}
if (ld_ret_4 > MaxLots) ld_ret_4 = MaxLots;
if (ld_ret_4 < g_minlot_376) ld_ret_4 = g_minlot_376;
if (ld_ret_4 > g_maxlot_368) ld_ret_4 = g_maxlot_368;
return (ld_ret_4);
}
int OpenOrder(int a_cmd_0, int a_magic_4, string a_comment_8, double ad_16, double a_price_24 = 0.0) {
color l_color_36;
int l_ticket_72;
int l_error_76;
Показано первые 50% кода (символов: 26891)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.