156 lines
15 KiB
Plaintext
156 lines
15 KiB
Plaintext
//+------------------------------------------------------------------+
|
||
//| CloseAllOrders.mq5 |
|
||
//| Copyright © 2017, Nikolay Kositsin |
|
||
//| Khabarovsk, farria@mail.redcom.ru |
|
||
//+------------------------------------------------------------------+
|
||
#property copyright "Copyright © 2017, Nikolay Kositsin"
|
||
#property link "farria@mail.redcom.ru"
|
||
//---- номер версии скрипта
|
||
#property version "1.10"
|
||
//---- показывать входные параметры
|
||
#property script_show_inputs
|
||
//+----------------------------------------------+
|
||
//| ВХОДНЫЕ ПАРАМЕТРЫ СКРИПТА |
|
||
//+----------------------------------------------+
|
||
input uint RTOTAL=4; // Число повторов при неудачных сделках
|
||
input uint SLEEPTIME=1; // Время паузы между повторами в секундах
|
||
input uint Deviation_=10; // Отклонение цены
|
||
//+------------------------------------------------------------------+
|
||
//| start function |
|
||
//+------------------------------------------------------------------+
|
||
void OnStart()
|
||
{
|
||
//----
|
||
for(uint count=0; count<=RTOTAL && !IsStopped(); count++)
|
||
{
|
||
//---- закрываем все выставленные ордера по текущему символу
|
||
int total=OrdersTotal();
|
||
if(!total) return; // все ордера закрыты
|
||
for(int pos=total-1; pos>=0; pos--)
|
||
{
|
||
ulong ticket=ulong(OrderGetTicket(pos));
|
||
if(!OrderSelect(ticket)) continue;
|
||
string symbol=OrderGetString(ORDER_SYMBOL);
|
||
bool _Close=true;
|
||
OrderCloseByTicket(_Close,symbol,ticket,Deviation_);
|
||
}
|
||
if(!OrdersTotal()) break;
|
||
Sleep(SLEEPTIME*1000);
|
||
}
|
||
//----
|
||
}
|
||
//+------------------------------------------------------------------+
|
||
//| Закрываем длинную позицию |
|
||
//+------------------------------------------------------------------+
|
||
bool OrderCloseByTicket
|
||
(
|
||
bool &Signal, // флаг разрешения на сделку
|
||
const string symbol, // торговая пара сделки
|
||
ulong ticket, // тикет
|
||
uint deviation // слиппаж
|
||
)
|
||
{
|
||
//----
|
||
if(!Signal) return(true);
|
||
|
||
//---- Объявление структур торгового запроса и результата торгового запроса
|
||
MqlTradeRequest request;
|
||
MqlTradeResult result;
|
||
//---- Объявление структуры результата проверки торгового запроса
|
||
MqlTradeCheckResult check;
|
||
|
||
//---- обнуление структур
|
||
ZeroMemory(request);
|
||
ZeroMemory(result);
|
||
ZeroMemory(check);
|
||
|
||
//---- Инициализация структуры торгового запроса MqlTradeRequest для удаления отложенного ордера
|
||
request.action=TRADE_ACTION_REMOVE;
|
||
request.deviation=deviation;
|
||
request.order=ticket;
|
||
//----
|
||
string comment="";
|
||
string ordertype=EnumToString(ENUM_ORDER_TYPE(OrderGetInteger(ORDER_TYPE)));
|
||
StringConcatenate(comment,"<<< ============ ",__FUNCTION__,"(): Удаляем отложенный ",ordertype," ордер по ",symbol," с тикетом ",string(ticket)," ============ >>>");
|
||
Print(comment);
|
||
|
||
//---- Отправка приказа на закрывание позиции на торговый сервер
|
||
if(!OrderSend(request,result) || result.retcode!=TRADE_RETCODE_DONE)
|
||
{
|
||
Print(__FUNCTION__,"(): Невозможно удалить ",ordertype," ордер с тикетом ",string(ticket),"!");
|
||
Print(__FUNCTION__,"(): OrderSend(): ",ResultRetcodeDescription(result.retcode));
|
||
return(false);
|
||
}
|
||
else
|
||
if(result.retcode==TRADE_RETCODE_DONE)
|
||
{
|
||
Signal=false;
|
||
comment="";
|
||
StringConcatenate(comment,"<<< ============ ",__FUNCTION__,"(): Отложенный ",ordertype," ордер по ",symbol," с тикетом ",string(ticket)," удалён ============ >>>");
|
||
Print(comment);
|
||
PlaySound("ok.wav");
|
||
}
|
||
else
|
||
{
|
||
Print(__FUNCTION__,"(): Невозможно удалить ",ordertype," ордер с тикетом ",string(ticket),"!");
|
||
Print(__FUNCTION__,"(): OrderSend(): ",ResultRetcodeDescription(result.retcode));
|
||
return(false);
|
||
}
|
||
//----
|
||
return(true);
|
||
}
|
||
//+------------------------------------------------------------------+
|
||
//| возврат стрингового результата торговой операции по его коду |
|
||
//+------------------------------------------------------------------+
|
||
string ResultRetcodeDescription(int retcode)
|
||
{
|
||
string str;
|
||
//----
|
||
switch(retcode)
|
||
{
|
||
case TRADE_RETCODE_REQUOTE: str="Реквота"; break;
|
||
case TRADE_RETCODE_REJECT: str="Запрос отвергнут"; break;
|
||
case TRADE_RETCODE_CANCEL: str="Запрос отменен трейдером"; break;
|
||
case TRADE_RETCODE_PLACED: str="Ордер размещен"; break;
|
||
case TRADE_RETCODE_DONE: str="Заявка выполнена"; break;
|
||
case TRADE_RETCODE_DONE_PARTIAL: str="Заявка выполнена частично"; break;
|
||
case TRADE_RETCODE_ERROR: str="Ошибка обработки запроса"; break;
|
||
case TRADE_RETCODE_TIMEOUT: str="Запрос отменен по истечению времени";break;
|
||
case TRADE_RETCODE_INVALID: str="Неправильный запрос"; break;
|
||
case TRADE_RETCODE_INVALID_VOLUME: str="Неправильный объем в запросе"; break;
|
||
case TRADE_RETCODE_INVALID_PRICE: str="Неправильная цена в запросе"; break;
|
||
case TRADE_RETCODE_INVALID_STOPS: str="Неправильные стопы в запросе"; break;
|
||
case TRADE_RETCODE_TRADE_DISABLED: str="Торговля запрещена"; break;
|
||
case TRADE_RETCODE_MARKET_CLOSED: str="Рынок закрыт"; break;
|
||
case TRADE_RETCODE_NO_MONEY: str="Нет достаточных денежных средств для выполнения запроса"; break;
|
||
case TRADE_RETCODE_PRICE_CHANGED: str="Цены изменились"; break;
|
||
case TRADE_RETCODE_PRICE_OFF: str="Отсутствуют котировки для обработки запроса"; break;
|
||
case TRADE_RETCODE_INVALID_EXPIRATION: str="Неверная дата истечения ордера в запросе"; break;
|
||
case TRADE_RETCODE_ORDER_CHANGED: str="Состояние ордера изменилось"; break;
|
||
case TRADE_RETCODE_TOO_MANY_REQUESTS: str="Слишком частые запросы"; break;
|
||
case TRADE_RETCODE_NO_CHANGES: str="В запросе нет изменений"; break;
|
||
case TRADE_RETCODE_SERVER_DISABLES_AT: str="Автотрейдинг запрещен сервером"; break;
|
||
case TRADE_RETCODE_CLIENT_DISABLES_AT: str="Автотрейдинг запрещен клиентским терминалом"; break;
|
||
case TRADE_RETCODE_LOCKED: str="Запрос заблокирован для обработки"; break;
|
||
case TRADE_RETCODE_FROZEN: str="Ордер или позиция заморожены"; break;
|
||
case TRADE_RETCODE_INVALID_FILL: str="Указан неподдерживаемый тип исполнения ордера по остатку"; break;
|
||
case TRADE_RETCODE_CONNECTION: str="Нет соединения с торговым сервером"; break;
|
||
case TRADE_RETCODE_ONLY_REAL: str="Операция разрешена только для реальных счетов"; break;
|
||
case TRADE_RETCODE_LIMIT_ORDERS: str="Достигнут лимит на количество отложенных ордеров"; break;
|
||
case TRADE_RETCODE_LIMIT_VOLUME: str="Достигнут лимит на объем ордеров и позиций для данного символа"; break;
|
||
case TRADE_RETCODE_INVALID_ORDER: str="Неверный или запрещённый тип ордера"; break;
|
||
case TRADE_RETCODE_POSITION_CLOSED: str="Позиция с указанным POSITION_IDENTIFIER уже закрыта"; break;
|
||
case TRADE_RETCODE_INVALID_CLOSE_VOLUME: str="Закрываемый объем превышает текущий объем позиции"; break;
|
||
case TRADE_RETCODE_CLOSE_ORDER_EXIST: str="Для указанной позиции уже есть ордер на закрытие"; break;
|
||
case TRADE_RETCODE_LIMIT_POSITIONS: str="Количество открытых позиций, которое можно одновременно иметь на счете, может быть ограничено настройками сервера"; break;
|
||
//case : str=""; break;
|
||
//case : str=""; break;
|
||
//case : str=""; break;
|
||
//case : str=""; break;
|
||
default: str="Неизвестный результат";
|
||
}
|
||
//----
|
||
return(str);
|
||
}
|
||
//+------------------------------------------------------------------+
|