a coisa mais fácil a fazer é escrever na caixa de comentários a hora em que o pedido deve ser fechado.
Você não pode confiar nos comentários. Existem corretoras que não só mudam este campo (adicionando seus próprios dados), mas também simplesmente apagam as informações anteriormente inseridas.
Encontre o pedido mais antigo aberto pelo Expert Advisor. Ela tem o menor OrderOpenTime().
Compare o tempo decorrido desde o momento da abertura desta ordem até a hora atual. Se for igual ou maior do que o tempo especificado, feche-o.
Sua variante me serviu muito bem. Obrigado.
Renat Akhtyamov:
No momento da existência, você pode escolher tanto a primeira ordem aberta como a mais recente. Neste caso, lembre-se do bilhete e do número de segundos de existência. Por exemplo
Sua variante também funciona. Obrigado.
Vou deixar a primeira variante para trabalhar))
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);}}}
Não confie em comentários. Existem CDs que não apenas mudam este campo (adicionando seus próprios dados), mas simplesmente apagam as informações anteriormente inseridas.
Para ser claro, favor fornecer uma lista destes CDs
E em vez de verificar o tipo de pedido, neste caso, é melhor verificar a hora de fechamento OrderCloseTime(), para o caso de já ter fechado em stop/stop.
por que procurá-lo em um ciclo, se você pode simplesmente selecionar o pedido no bilhete
e em vez de verificar o tipo de pedido, neste caso,seria melhor verificar o horário de fechamento OrderCloseTime(), caso já tenha sido fechado por uma parada/parada.
Eu pensava que Natalya queria assim, porque ela queria procurar o bilhete, mas aparentemente nem todos os cartões foram resolvidos
você corre o risco de receber o volume do pedido que você vai fechar. Afinal de contas, OrderLots() se referirá à ordem selecionada, e o bilhete - a uma ordem absolutamente diferente. Seria melhor fazer isso dessa maneira:
Pontos justos acima. Por que passar por todos os pedidos novamente se o bilhete já é conhecido? Além disso, na função:
você corre o risco de receber o volume do pedido que você vai fechar. Afinal de contas, OrderLots() se referirá à ordem selecionada, e o bilhete - a uma ordem absolutamente diferente. É melhor fazer dessa maneira:
//закрытие по тикету, переделайте под свой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);
}
a coisa mais fácil a fazer é escrever na caixa de comentários a hora em que o pedido deve ser fechado.
Você não pode confiar nos comentários. Existem corretoras que não só mudam este campo (adicionando seus próprios dados), mas também simplesmente apagam as informações anteriormente inseridas.
Qual é o problema?
Sua variante me serviu muito bem. Obrigado.
No momento da existência, você pode escolher tanto a primeira ordem aberta como a mais recente. Neste caso, lembre-se do bilhete e do número de segundos de existência. Por exemplo
Sua variante também funciona. Obrigado.
Vou deixar a primeira variante para trabalhar))
Obrigado a todos por sua ajuda, boa sorte))
Não confie em comentários. Existem CDs que não apenas mudam este campo (adicionando seus próprios dados), mas simplesmente apagam as informações anteriormente inseridas.
Para ser claro, favor fornecer uma lista destes CDs
Para não ser infundado - por favor, me dê uma lista desses CVs
Sua opção foi ótima para mim. Obrigado.
Sua maneira também funciona. Obrigado.
Eu vou manter a primeira opção de trabalho))
Obrigado a todos por sua ajuda, lucros para você))
Apenas uma pergunta: Se você conhece o bilhete
Por que precisamos procurá-lo no loop, se podemos simplesmente selecionar a ordem do bilhete
E em vez de verificar o tipo de pedido, neste caso, é melhor verificar a hora de fechamento OrderCloseTime(), para o caso de já ter fechado em stop/stop.
Apenas uma pergunta: Se você conhece o bilhete
por que procurá-lo em um ciclo, se você pode simplesmente selecionar o pedido no bilhete
e em vez de verificar o tipo de pedido, neste caso,seria melhor verificar o horário de fechamento OrderCloseTime(), caso já tenha sido fechado por uma parada/parada.
Eu pensava que Natalya queria assim, porque ela queria procurar o bilhete, mas aparentemente nem todos os cartões foram resolvidos
)
Sua opção foi ótima para mim. Obrigado.
Sua maneira também funciona. Obrigado.
Eu vou manter a primeira opção de trabalho))
Obrigado a todos por sua ajuda, lucros para você))
Comentários justos acima. Por que eu passaria por todos os pedidos mais uma vez se o bilhete já é conhecido? Além disso, na função:
você corre o risco de receber o volume do pedido que você vai fechar. Afinal de contas, OrderLots() se referirá à ordem selecionada, e o bilhete - a uma ordem absolutamente diferente. Seria melhor fazer isso dessa maneira:
Pontos justos acima. Por que passar por todos os pedidos novamente se o bilhete já é conhecido? Além disso, na função:
você corre o risco de receber o volume do pedido que você vai fechar. Afinal de contas, OrderLots() se referirá à ordem selecionada, e o bilhete - a uma ordem absolutamente diferente. É melhor fazer dessa maneira:
Isto não fecha de forma alguma.
Não fecha de forma alguma.
Peço desculpas. A linha:
deve ser reescrita da seguinte forma: