самое-самое простое - это писать в поле comment время когда ордер должен быть закрыт.
Низзя надеяться на комментарии. Есть ДЦ, которые не просто изменяют это поле (дополняя своими данными), но и попросту стирают ранее занесенную информацию.
Найти самый старый ордер, открытый экспертом. У него наименьшее OrderOpenTime().
Сравнить, сколько времени прошло от момента открытия этого ордера до текущего времени. Если равно или больше заданного - закрыть.
Ваш вариант мне здорово подошёл. Спасибо.
Renat Akhtyamov:
по времени существования можно выбрать из всех как самый первый открытый ордер, так и самый последний. При этом запоминаем тикет и количество секунд существования. Например
Ваш вариант тоже рабочий. Спасибо.
Оставлю для работы первый вариант))
int TicketCL=-1;
datetime TimeOp=D'3000.12.30';
for(i=OrdersTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()<2 && OrderMagicNumber()==Magic && OrderSymbol()==Symbol()){
if (TicketCL<0||OrderOpenTime()<TimeOp){
TicketCL=OrderTicket();
TimeOp=OrderOpenTime();}
}
if (TimeCurrent()-TimeOp>=MinuteOrdCL*60) CloseOrd(TicketCL);
}//Start END//
void CloseOrd(int ticket){
int close;
double price=0.0;
color cl;
for(i=0;i<OrdersTotal();i++)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()<2 && OrderMagicNumber()==Magic && OrderSymbol()==Symbol()){
if(OrderType()==OP_BUY) {price=NormalizeDouble(Bid,Digits);cl=DeepSkyBlue;}
if(OrderType()==OP_SELL) {price=NormalizeDouble(Ask,Digits);cl=Magenta;}
if(OrderType()<2) {close=OrderClose(ticket,OrderLots(),price,30,cl);}}}
Низзя надеяться на комментарии. Есть ДЦ, которые не просто изменяют это поле (дополняя своими данными), но и попросту стирают ранее занесенную информацию.
чтобы не быть голословным - приведите список этих ДЦ
и вместо проверки типа ордера, в этом случае, лучше проверить время закрытия OrderCloseTime(), просто на всякий случай, вдруг уже закрылся по стопу\тейку.
зачем его потом искать в цикле, если можно просто выбрать ордер по тикету
и вместо проверки типа ордера, в этом случае, лучше проверить время закрытия OrderCloseTime(), просто на всякий случай, вдруг уже закрылся по стопу\тейку.
я думал что Наталья так и хочет т.к. озадачила поиском тикета, но видимо не все карты раскрыла
рискуете получить объем вовсе не того ордера, который собираетесь закрыть. Ведь OrderLots() будет относиться к выбранному ордеру, а тикет - к совершенно другому. Лучше уж тогда так сделать:
Справедливые замечания выше. Зачем еще раз перебирать все ордера, если тикет уже известен? Кроме того, в функции:
рискуете получить объем вовсе не того ордера, который собираетесь закрыть. Ведь OrderLots() будет относиться к выбранному ордеру, а тикет - к совершенно другому. Лучше уж тогда так сделать:
//закрытие по тикету, переделайте под свойif(OrderSelect(MyTicketBuy, SELECT_BY_TICKET)==true)
{
close=OrderClose(MyTicketBuy,OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),0,clrRed);
if(close<0){if(Fun_Error(GetLastError())==1)return;}
}
if(OrderSelect(MyTicketSell, SELECT_BY_TICKET)==true)
{
close=OrderClose(MyTicketSell,OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),0,clrBlue);
if(close<0){if(Fun_Error(GetLastError())==1)return;}
}
//+-------------- ФУНКЦИЯ ОБРАБОТКИ ОШИБОК ---------------------------------+int Fun_Error(int Error)
{ switch(Error)
{
case0: return (0);
case1: Print("Попытка изменить уже установленные значения такими же значениями.");return(1);
case2: Print("Общая ошибка. Прекратить все попытки торговых операций до выяснения обстоятельств.");return(0);
case3: Print("В торговую функцию переданы неправильные параметры.");return(1);
case4: Print("Торговый сервер занят.Пробуем ещё раз..");Sleep(3000);return(1);
case5: Print("Старая версия клиентского терминала.");return(0);
case6: Print("Нет связи с торговым сервером.");return(1);
case7: Print("Недостаточно прав.");return(1);
case8: Print("Слишком частые запросы.");return(1);
case9: Print("Недопустимая операция нарушающая функционирование сервера.");return(1);
case64: Print("Счет заблокирован. Необходимо прекратить все попытки торговых операций.");return(0);
case65: Print("Неправильный номер счета.");return(1);
case128: Print("Истек срок ожидания совершения сделки.");return(1);
case129: Print("Неправильная цена bid или ask, возможно, ненормализованная цена.");return(1);
case130: Print("Слишком близкие стопы или неправильно рассчитанные или ненормализованные цены в стопах (или в цене открытия отложенного ордера).");return(1);
case131: Print("Неправильный объем, ошибка в грануляции объема.");return(1);
case132: Print("Рынок закрыт.");return(1);
case133: Print("Торговля запрещена.");return(0);
case134: Print("Недостаточно денег для совершения операции.");return(0);
case135: Print("Цена изменилась. Пробуем ещё раз..");RefreshRates();return(1);
case136: Print("Нет цен. Ждём новый тик..");
while(RefreshRates()==false)// До нового тикаSleep(1);
return(1);
case137: Print("Брокер занят.Пробуем ещё раз..");Sleep(3000);return(1);
case138: Print("Запрошенная цена устарела, либо перепутаны bid и ask.");return(1);
case139: Print("Ордер заблокирован и уже обрабатывается.");return(1);
case140: Print("Разрешена только покупка. Повторять операцию SELL нельзя.");return(1);
case141: Print("Слишком много запросов.");return(1);
case142: Print("Ордер поставлен в очередь.");return(1);
case143: Print("Ордер принят дилером к исполнению.");return(1);
case144: Print("Ордер аннулирован самим клиентом при ручном подтверждении сделки.");return(1);
case145: Print("Модификация запрещена, так как ордер слишком близок к рынку и заблокирован из-за возможного скорого исполнения.");return(1);
case146: Print("Подсистема торговли занята.Пробуем ещё..");Sleep(500);return(1);
case147: Print("Использование даты истечения ордера запрещено брокером.");return(1);
case148: Print("Количество открытых и отложенных ордеров достигло предела, установленного брокером.");return(1);
case149: Print("Попытка открыть противоположную позицию к уже существующей в случае, если хеджирование запрещено.");return(1);
case4000: return (0);
case4001: Print("Неправильный указатель функции.");return(1);
case4002: Print("Индекс массива - вне диапазона.");return(1);
case4003: Print("Нет памяти для стека функций.");return(1);
case4004: Print("Переполнение стека после рекурсивного вызова.");return(1);
case4005: Print("На стеке нет памяти для передачи параметров.");return(1);
case4006: Print("Нет памяти для строкового параметра.");return(1);
case4007: Print("Нет памяти для временной строки.");return(1);
case4008: Print("Неинициализированная строка.");return(1);
case4009: Print("Неинициализированная строка в массиве.");return(1);
case4010: Print("Нет памяти для строкового массива.");return(1);
case4011: Print("Слишком длинная строка.");return(1);
case4012: Print("Остаток от деления на ноль.");return(1);
case4013: Print("Деление на ноль.");return(1);
case4014: Print("Неизвестная команда.");return(1);
case4015: Print("Неправильный переход.");return(1);
case4016: Print("Неинициализированный массив.");return(1);
case4017: Print("Вызовы DLL не разрешены.");return(1);
case4018: Print("Невозможно загрузить библиотеку.");return(1);
case4019: Print("Невозможно вызвать функцию.");return(1);
case4020: Print("Вызовы внешних библиотечных функций не разрешены.");return(1);
case4021: Print("Недостаточно памяти для строки, возвращаемой из функции.");return(1);
case4022: Print("Система занята.");return(1);
case4050: Print("Неправильное количество параметров функции.");return(1);
case4051: Print("Недопустимое значение параметра функции.");return(1);
case4052: Print("Внутренняя ошибка строковой функции.");return(1);
case4053: Print("Ошибка массива.");return(1);
case4054: Print("Неправильное использование массива-таймсерии.");return(1);
case4055: Print("Ошибка пользовательского индикатора.");return(1);
case4056: Print("Массивы несовместимы.");return(1);
case4057: Print("Ошибка обработки глобальныех переменных.");return(1);
case4058: Print("Глобальная переменная не обнаружена.");return(1);
case4059: Print("Функция не разрешена в тестовом режиме.");return(1);
case4060: Print("Функция не подтверждена.");return(1);
case4061: Print("Ошибка отправки почты.");return(1);
case4062: Print("Ожидается параметр типа string.");return(1);
case4063: Print("Ожидается параметр типа integer.");return(1);
case4064: Print("Ожидается параметр типа double.");return(1);
case4065: Print("В качестве параметра ожидается массив.");return(1);
case4066: Print("Запрошенные исторические данные в состоянии обновления.");return(1);
case4067: Print("Ошибка при выполнении торговой операции.");return(1);
case4099: Print("Конец файла.");return(1);
case4100: Print("Ошибка при работе с файлом.");return(1);
case4101: Print("Неправильное имя файла.");return(1);
case4102: Print("Слишком много открытых файлов.");return(1);
case4103: Print("Невозможно открыть файл.");return(1);
case4104: Print("Несовместимый режим доступа к файлу.");return(1);
case4105: Print("Ни один ордер не выбран.");return(1);
case4106: Print("Неизвестный символ.");return(1);
case4107: Print("Неправильный параметр цены для торговой функции.");return(1);
case4108: Print("Неверный номер тикета.");return(1);
case4109: Print("Торговля не разрешена. Необходимо включить опцию Разрешить советнику торговать в свойствах эксперта.");return(1);
case4110: Print("Длинные позиции не разрешены. Необходимо проверить свойства эксперта.");return(1);
case4111: Print("Короткие позиции не разрешены. Необходимо проверить свойства эксперта.");return(1);
case4200: Print("Объект уже существует.");return(1);
case4201: Print("Запрошено неизвестное свойство объекта.");return(1);
case4202: Print("Объект не существует.");return(1);
case4203: Print("Неизвестный тип объекта.");return(1);
case4204: Print("Нет имени объекта.");return(1);
case4205: Print("Ошибка координат объекта.");return(1);
case4206: Print("Не найдено указанное подокно.");return(1);
case4207: Print("Ошибка при работе с объектом.");return(1);
return(0);
}
return(0);
}
самое-самое простое - это писать в поле comment время когда ордер должен быть закрыт.
Низзя надеяться на комментарии. Есть ДЦ, которые не просто изменяют это поле (дополняя своими данными), но и попросту стирают ранее занесенную информацию.
В чем проблема то?
Ваш вариант мне здорово подошёл. Спасибо.
по времени существования можно выбрать из всех как самый первый открытый ордер, так и самый последний. При этом запоминаем тикет и количество секунд существования. Например
Ваш вариант тоже рабочий. Спасибо.
Оставлю для работы первый вариант))
Всем спасибо за помощь, профитов вам))
Низзя надеяться на комментарии. Есть ДЦ, которые не просто изменяют это поле (дополняя своими данными), но и попросту стирают ранее занесенную информацию.
чтобы не быть голословным - приведите список этих ДЦ
чтобы не быть голословным - приведите список этих ДЦ
Ваш вариант мне здорово подошёл. Спасибо.
Ваш вариант тоже рабочий. Спасибо.
Оставлю для работы первый вариант))
Всем спасибо за помощь, профитов вам))
Только один вопрос: Если известен тикет
зачем его потом искать в цикле, если можно просто выбрать ордер по тикету
и вместо проверки типа ордера, в этом случае, лучше проверить время закрытия OrderCloseTime(), просто на всякий случай, вдруг уже закрылся по стопу\тейку.
Только один вопрос: Если известен тикет
зачем его потом искать в цикле, если можно просто выбрать ордер по тикету
и вместо проверки типа ордера, в этом случае, лучше проверить время закрытия OrderCloseTime(), просто на всякий случай, вдруг уже закрылся по стопу\тейку.
я думал что Наталья так и хочет т.к. озадачила поиском тикета, но видимо не все карты раскрыла
)
Ваш вариант мне здорово подошёл. Спасибо.
Ваш вариант тоже рабочий. Спасибо.
Оставлю для работы первый вариант))
Всем спасибо за помощь, профитов вам))
Справедливые замечания выше. Зачем еще раз перебирать все ордера, если тикет уже известен? Кроме того, в функции:
рискуете получить объем вовсе не того ордера, который собираетесь закрыть. Ведь OrderLots() будет относиться к выбранному ордеру, а тикет - к совершенно другому. Лучше уж тогда так сделать:
Справедливые замечания выше. Зачем еще раз перебирать все ордера, если тикет уже известен? Кроме того, в функции:
рискуете получить объем вовсе не того ордера, который собираетесь закрыть. Ведь OrderLots() будет относиться к выбранному ордеру, а тикет - к совершенно другому. Лучше уж тогда так сделать:
Так вообще не закрывает.
Так вообще не закрывает.
Прошу прощения. Строку:
нужно переписать так: