Files
-mql5_scripts/CloseAllOrders - script for MetaTrader 5/closeallorders.mq5
T

156 lines
15 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//+------------------------------------------------------------------+
//| 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);
}
//+------------------------------------------------------------------+