Каждый имеющийся у меня функционал трала использует ряд дополнительных функций, который можно привести вначале:
Функция модификации предварительно выбранного ордера
- Код: выделить все
bool f__ModifyOrder(int ti, double sl, double tp)
{
/*
Описание: модификация предварительно выбранного ордера
Используется функция: f__ProcessError()
Параметры:
ti - OrderTicket()
sl - новый СЛ ордера (-1 - не менять)
tp - новый ТП ордера (-1 - не менять)
*/
int int_Try = 5; // rоличество попыток
if (OrderSelect(ti, SELECT_BY_TICKET) == true)
{
int i = 0;
double dbl_SL = sl; if(sl == -1) dbl_SL = OrderStopLoss();
double dbl_TP = tp; if(tp == -1) dbl_TP = OrderTakeProfit();
if((OrderStopLoss()== dbl_SL) && (OrderTakeProfit() == dbl_TP)) return(true);
GetLastError();
while(i < int_Try)
{
if(OrderModify(OrderTicket(), OrderOpenPrice(), dbl_SL, dbl_TP, 0)) return(true);
else
{
i++;
if(!f__ProcessError(GetLastError())) return(false);
}
}
}
return(false);
}
Другие вспомогательные функции, направленные на обработку ошибок
- Код: выделить все
bool f__ProcessError(int err)
{
/*
Описание : Обработка ошибок
Используется функция: f__PrintError()
Параметры:
err - номер ошибки
*/
int iteration;
if(err > 1) f__PrintError(err);
switch(err)
{
// Некритические ошибки
case 0: // ERR_NO_ERROR
case 135: // ERR_PRICE_CHANGED
case 138: // ERR_REQUOTE
return(true);
// Некритические ошибки, требующие таймаута
case 4: // ERR_SERVER_BUSY
case 128: // ERR_TRADE_TIMEOUT
Sleep(1000 * 60);
return(true);
case 129: // ERR_INVALID_PRICE
case 130: // ERR_INVALID_STOPS
//if (WorkMode==ModeManual && ShowConfirm) MessageBox("Неправильные стопы", VISITCARD, MB_OK);
return(false);
case 136: // ERR_OFF_QUOTES
Sleep(1000 * 5);
return(true);
case 137: // ERR_BROKER_BUSY
case 145: // ERR_TRADE_MODIFY_DENIED
Sleep(1000 * 15);
return(true);
// Нет связи с сервером. Пытаемся восстановить связь
case 6: // ERR_NO_CONNECTION
{
bool connect = false;
iteration = 0;
while((!connect) || (iteration < 60)) // в течение 5 минут пытаемся подконнектиться к серверу
{
Sleep(1000 * 5);
connect = IsConnected();
if(connect)
{
Print("Связь восстановлена");
return(true);
}
iteration++;
Print("Связь не восстановлена, прошло ", iteration * 5, " секунд.");
}
Print("Соединение в течение ", iteration * 5, " секунд восстановить не удалось.");
return(false);
}
// Подсистема торговли занята. Ждем, пока освободится
case 146: // ERR_TRADE_CONTEXT_BUSY
{
bool tradecontextbusy = true;
iteration = 0;
while((tradecontextbusy) || (iteration < 60)) // в течение 5 минут ждем освобождения подсистемы торговли
{
Sleep(1000 * 5);
tradecontextbusy = IsTradeContextBusy();
if(!tradecontextbusy)
{
Print("Подсистема торговли освободилась.");
return(true);
}
iteration++;
Print("Подсистема торговли все еще занята, прошло ", iteration * 5, " секунд.");
}
Print("Подсистема торговли в течение ", iteration * 5, " секунд не освободилась.");
return(false);
}
// Критические ошибки. Прекращаем попытки открытия ордера
case 1: // ERR_NO_RESULT
case 2: // ERR_COMMON_ERROR
case 3: // ERR_INVALID_TRADE_PARAMETERS
case 5: // ERR_OLD_VERSION
case 7: // ERR_NOT_ENOUGH_RIGHTS
case 8: // ERR_TOO_FREQUENT_REQUESTS
case 9: // ERR_MALFUNCTIONAL_TRADE
case 64: // ERR_ACCOUNT_DISABLED
case 65: // ERR_INVALID_ACCOUNT
case 131: // ERR_INVALID_TRADE_VOLUME
case 132: // ERR_MARKET_CLOSED
case 133: // ERR_TRADE_DISABLED
case 134: // ERR_NOT_ENOUGH_MONEY
case 139: // ERR_ORDER_LOCKED
case 140: // ERR_LONG_POSITIONS_ONLY_ALLOWED
case 141: // ERR_TOO_MANY_REQUESTS
case 142:
case 143:
case 144:
case 147: // ERR_TRADE_EXPIRATION_DENIED
case 148: // ERR_TRADE_TOO_MANY_ORDERS
case 4110: // ERR_LONGS_NOT_ALLOWED
case 4111: // ERR_SHORTS_NOT_ALLOWED
return(false);
case 4109: // ERR_TRADE_NOT_ALLOWED
//MessageBox("Для совершения операций необходимо поставить галочку \"Разрешить советнику торговать\" в настройках терминала", VISITCARD, MB_OK);
return(false);
}
return(false);
}
//*********************************************************************************************
int f__PrintError(int err)
{
Print("ERROR ", err, ": ", f__Err2str(err));
return(0);
}
//*********************************************************************************************
//+------------------------------------------------------------------+
//| Получение описания ошибки по ее номеру |
//+------------------------------------------------------------------+
string f__Err2str(int err)
{
switch(err)
{
case 0:
return("Нет ошибки");
case 1:
return("Функция модификации ордера пытается изменить уже установленные значения такими же значениями");
case 2:
return("Общая ошибка");
case 3:
return("В торговую функцию переданы неправильные параметры");
case 4:
return("Торговый сервер занят");
case 5:
return("Старая версия клиентского терминала");
case 6:
return("Нет связи с торговым сервером");
case 7:
return("Недостаточно прав");
case 8:
return("Слишком частые запросы");
case 9:
return("Недопустимая операция нарушающая функционирование сервера");
case 64:
return("Счет заблокирован");
case 65:
return("Неправильный номер счета");
case 128:
return("Истек срок ожидания совершения сделки");
case 129:
return("Неправильная цена");
case 130:
return("Неправильные стопы");
case 131:
return("Неправильный объем сделки");
case 132:
return("Рынок закрыт");
case 133:
return("Торговля запрещена");
case 134:
return("Недостаточно денег для совершения операции");
case 135:
return("Цена изменилась");
case 136:
return("Нет цен");
case 137:
return("Брокер занят");
case 138:
return("Реквот! Новые цены");
case 139:
return("Ордер заблокирован и уже обрабатывается");
case 140:
return("Разрешена только покупка");
case 141:
return("Слишком много запросов");
case 142:
return("Ордер поставлен в очередь");
case 143:
return("Ордер принят дилером к исполнению");
case 144:
return("Ордер аннулирован самим клиентом при ручном подтверждении сделки");
case 145:
return("Модификация запрещена, так как ордер слишком близок к рынку");
case 146:
return("Подсистема торговли занята");
case 147:
return("Использование даты истечения ордера запрещено брокером");
case 148:
return("Количество открытых и отложенных ордеров достигло предела, установленного брокером");
case 4109:
return("Торговля не разрешена. Необходимо включить опцию \"Разрешить советнику торговать\" в свойствах эксперта");
case 4110:
return("Длинные позиции не разрешены");
case 4111:
return("Короткие позиции не разрешены");
}
return("Описание ошибки не известно");
}