la cosa più semplice da fare è scrivere nella casella dei commenti l'ora in cui l'ordine dovrebbe essere chiuso.
Non si può fare affidamento sui commenti. Ci sono compagnie di brokeraggio che non solo cambiano questo campo (aggiungendo i propri dati), ma anche semplicemente cancellano le informazioni precedentemente inserite.
Trova l'ordine più vecchio aperto dall'Expert Advisor. Ha il più piccolo OrderOpenTime().
Confronta quanto tempo è passato dal momento dell'apertura di questo ordine all'ora corrente. Se è uguale o superiore al tempo specificato, lo chiude.
La tua variante mi è piaciuta molto. Grazie.
Renat Akhtyamov:
È possibile selezionare tra tutti gli ordini aperti il primo e il più recente. In questo caso, ricorda il biglietto e il numero di secondi di esistenza. Per esempio
Anche la tua variante funziona. Grazie.
Lascerò la prima variante per lavorare))
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);}}}
Grazie a tutti per il vostro aiuto, buona fortuna))
Non fare affidamento sui commenti. Ci sono DC che non si limitano a cambiare questo campo (aggiungendo i propri dati), ma semplicemente cancellano le informazioni precedentemente inserite.
Per essere chiari, si prega di fornire una lista di questi DC
E invece di controllare il tipo di ordine, in questo caso, è meglio controllare il tempo di chiusura OrderCloseTime(), nel caso in cui abbia già chiuso allo stop/stop.
perché cercarlo in un ciclo, se si può semplicemente selezionare l'ordine sul biglietto
e invece di controllare il tipo di ordine, in questo caso,sarebbe meglio controllare il tempo di chiusura OrderCloseTime(), solo nel caso sia già stato chiuso da uno stop/stop.
Pensavo che Natalya volesse così, perché voleva cercare il biglietto, ma a quanto pare non tutte le carte sono state risolte
si rischia di ottenere il volume dell'ordine che si sta per chiudere. Dopo tutto, OrderLots() si riferirà all'ordine selezionato, e il biglietto - ad uno assolutamente diverso. Sarebbe meglio fare così:
Punti giusti sopra. Perché ripassare tutti gli ordini se il biglietto è già noto? Inoltre, nella funzione:
si rischia di ottenere il volume dell'ordine che si sta per chiudere. Dopo tutto, OrderLots() si riferirà all'ordine selezionato, e il biglietto - ad uno assolutamente diverso. È meglio che tu lo faccia così:
//закрытие по тикету, переделайте под свой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);
}
la cosa più semplice da fare è scrivere nella casella dei commenti l'ora in cui l'ordine dovrebbe essere chiuso.
Non si può fare affidamento sui commenti. Ci sono compagnie di brokeraggio che non solo cambiano questo campo (aggiungendo i propri dati), ma anche semplicemente cancellano le informazioni precedentemente inserite.
Qual è il problema?
La tua variante mi è piaciuta molto. Grazie.
È possibile selezionare tra tutti gli ordini aperti il primo e il più recente. In questo caso, ricorda il biglietto e il numero di secondi di esistenza. Per esempio
Anche la tua variante funziona. Grazie.
Lascerò la prima variante per lavorare))
Grazie a tutti per il vostro aiuto, buona fortuna))
Non fare affidamento sui commenti. Ci sono DC che non si limitano a cambiare questo campo (aggiungendo i propri dati), ma semplicemente cancellano le informazioni precedentemente inserite.
Per essere chiari, si prega di fornire una lista di questi DC
Per non essere infondato - per favore dammi una lista di questi VC
La tua opzione era ottima per me. Grazie.
Anche il tuo modo funziona. Grazie.
Terrò la prima opzione per il lavoro))
Grazie a tutti per il vostro aiuto, profitti a voi))
Solo una domanda: se conosci il biglietto
Perché abbiamo bisogno di cercarlo nel ciclo, se possiamo semplicemente selezionare l'ordine del biglietto
E invece di controllare il tipo di ordine, in questo caso, è meglio controllare il tempo di chiusura OrderCloseTime(), nel caso in cui abbia già chiuso allo stop/stop.
Solo una domanda: se conosci il biglietto
perché cercarlo in un ciclo, se si può semplicemente selezionare l'ordine sul biglietto
e invece di controllare il tipo di ordine, in questo caso,sarebbe meglio controllare il tempo di chiusura OrderCloseTime(), solo nel caso sia già stato chiuso da uno stop/stop.
Pensavo che Natalya volesse così, perché voleva cercare il biglietto, ma a quanto pare non tutte le carte sono state risolte
)
La tua opzione era ottima per me. Grazie.
Anche il tuo modo funziona. Grazie.
Terrò la prima opzione per il lavoro))
Grazie a tutti per il vostro aiuto, profitti a voi))
Commenti giusti sopra. Perché dovrei ripassare tutti gli ordini ancora una volta se il biglietto è già noto? Inoltre, nella funzione:
si rischia di ottenere il volume dell'ordine che si sta per chiudere. Dopo tutto, OrderLots() si riferirà all'ordine selezionato, e il biglietto - ad uno assolutamente diverso. Sarebbe meglio fare così:
Punti giusti sopra. Perché ripassare tutti gli ordini se il biglietto è già noto? Inoltre, nella funzione:
si rischia di ottenere il volume dell'ordine che si sta per chiudere. Dopo tutto, OrderLots() si riferirà all'ordine selezionato, e il biglietto - ad uno assolutamente diverso. È meglio che tu lo faccia così:
Questo non si chiude affatto.
Non si chiude affatto.
Chiedo scusa. La linea:
dovrebbe essere riscritto come segue: