Am einfachsten ist es, in das Kommentarfeld die Uhrzeit einzutragen, zu der die Bestellung abgeschlossen werden soll.
Sie können sich nicht auf Kommentare verlassen. Es gibt Maklerunternehmen, die dieses Feld nicht nur ändern (indem sie ihre eigenen Daten hinzufügen), sondern auch die zuvor eingegebenen Informationen einfach löschen.
Suchen Sie den ältesten vom Expert Advisor eröffneten Auftrag. Sie hat die kleinste OrderOpenTime().
Vergleichen Sie, wie viel Zeit vom Zeitpunkt der Eröffnung dieser Bestellung bis zur aktuellen Uhrzeit vergangen ist. Wenn sie gleich oder größer als die angegebene Zeit ist, wird sie geschlossen.
Ihre Variante hat mir sehr gut gefallen. Ich danke Ihnen.
Renat Akhtyamov:
Nach dem Zeitpunkt des Vorhandenseins können Sie sowohl den ersten geöffneten Auftrag als auch den jüngsten Auftrag auswählen. Erinnern Sie sich in diesem Fall an das Ticket und die Anzahl der Sekunden des Bestehens. Zum Beispiel
Ihre Variante funktioniert auch. Ich danke Ihnen.
Ich werde die erste Variante arbeiten lassen))
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);}}}
Verlassen Sie sich nicht auf Kommentare. Es gibt DCs, die dieses Feld nicht nur ändern (indem sie ihre eigenen Daten hinzufügen), sondern einfach die zuvor eingegebenen Informationen löschen.
Bitte stellen Sie der Klarheit halber eine Liste dieser DCs zur Verfügung
Und anstatt den Auftragstyp zu überprüfen, ist es in diesem Fall besser, die Abschlusszeit OrderCloseTime()zu überprüfen, nur für den Fall, dass der Auftrag bereits am Stop/Stop geschlossen wurde.
warum in einem Zyklus suchen, wenn man einfach die Reihenfolge auf dem Ticket auswählen kann
und anstatt den Auftragstyp zu prüfen, wäre es in diesem Fallbesser, die Schlusszeit OrderCloseTime()zu prüfen, nur für den Fall, dass der Auftrag bereits durch einen Stop/Stop geschlossen wurde.
Ich dachte, Natalya wollte es so, weil sie nach dem Ticket suchen wollte, aber anscheinend sind nicht alle Karten gelöst worden
Ihre Option war für mich großartig. Ich danke Ihnen.
Ihr Weg funktioniert auch. Ich danke Ihnen.
Ich behalte die erste Option für die Arbeit))
Ich danke Ihnen allen für Ihre Hilfe, Gewinne für Sie))
Die obigen Bemerkungen sind fair. Warum sollte ich alle Bestellungen noch einmal durchgehen, wenn das Ticket bereits bekannt ist? Außerdem, in der Funktion:
riskieren Sie, das Volumen des Auftrags zu erhalten, den Sie abschließen wollen. Schließlich bezieht sich OrderLots() auf die ausgewählte Bestellung und das Ticket auf eine ganz andere. Es wäre besser, es auf diese Weise zu tun:
Die oben genannten Punkte sind richtig. Warum alle Bestellungen erneut durchgehen, wenn das Ticket bereits bekannt ist? Außerdem, in der Funktion:
riskieren Sie, das Volumen des Auftrags zu erhalten, den Sie abschließen wollen. Schließlich bezieht sich OrderLots() auf die ausgewählte Bestellung und das Ticket auf eine ganz andere. Es ist besser, wenn Sie es so machen:
//закрытие по тикету, переделайте под свой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);
}
Am einfachsten ist es, in das Kommentarfeld die Uhrzeit einzutragen, zu der die Bestellung abgeschlossen werden soll.
Sie können sich nicht auf Kommentare verlassen. Es gibt Maklerunternehmen, die dieses Feld nicht nur ändern (indem sie ihre eigenen Daten hinzufügen), sondern auch die zuvor eingegebenen Informationen einfach löschen.
Wo liegt das Problem?
Ihre Variante hat mir sehr gut gefallen. Ich danke Ihnen.
Nach dem Zeitpunkt des Vorhandenseins können Sie sowohl den ersten geöffneten Auftrag als auch den jüngsten Auftrag auswählen. Erinnern Sie sich in diesem Fall an das Ticket und die Anzahl der Sekunden des Bestehens. Zum Beispiel
Ihre Variante funktioniert auch. Ich danke Ihnen.
Ich werde die erste Variante arbeiten lassen))
Vielen Dank für Ihre Hilfe, viel Glück))
Verlassen Sie sich nicht auf Kommentare. Es gibt DCs, die dieses Feld nicht nur ändern (indem sie ihre eigenen Daten hinzufügen), sondern einfach die zuvor eingegebenen Informationen löschen.
Bitte stellen Sie der Klarheit halber eine Liste dieser DCs zur Verfügung
Um nicht unsubstantiiert zu sein - bitte geben Sie mir eine Liste dieser VCs
Ihre Option war für mich großartig. Ich danke Ihnen.
Ihr Weg funktioniert auch. Ich danke Ihnen.
Ich behalte die erste Option für die Arbeit))
Vielen Dank an alle für Ihre Hilfe, Gewinne für Sie))
Nur eine Frage: Wenn Sie das Ticket kennen
Warum müssen wir in der Schleife danach suchen, wenn wir einfach die Reihenfolge der Tickets auswählen können?
Und anstatt den Auftragstyp zu überprüfen, ist es in diesem Fall besser, die Abschlusszeit OrderCloseTime()zu überprüfen, nur für den Fall, dass der Auftrag bereits am Stop/Stop geschlossen wurde.
Nur eine Frage: Wenn Sie das Ticket kennen
warum in einem Zyklus suchen, wenn man einfach die Reihenfolge auf dem Ticket auswählen kann
und anstatt den Auftragstyp zu prüfen, wäre es in diesem Fallbesser, die Schlusszeit OrderCloseTime()zu prüfen, nur für den Fall, dass der Auftrag bereits durch einen Stop/Stop geschlossen wurde.
Ich dachte, Natalya wollte es so, weil sie nach dem Ticket suchen wollte, aber anscheinend sind nicht alle Karten gelöst worden
)
Ihre Option war für mich großartig. Ich danke Ihnen.
Ihr Weg funktioniert auch. Ich danke Ihnen.
Ich behalte die erste Option für die Arbeit))
Ich danke Ihnen allen für Ihre Hilfe, Gewinne für Sie))
Die obigen Bemerkungen sind fair. Warum sollte ich alle Bestellungen noch einmal durchgehen, wenn das Ticket bereits bekannt ist? Außerdem, in der Funktion:
riskieren Sie, das Volumen des Auftrags zu erhalten, den Sie abschließen wollen. Schließlich bezieht sich OrderLots() auf die ausgewählte Bestellung und das Ticket auf eine ganz andere. Es wäre besser, es auf diese Weise zu tun:
Die oben genannten Punkte sind richtig. Warum alle Bestellungen erneut durchgehen, wenn das Ticket bereits bekannt ist? Außerdem, in der Funktion:
riskieren Sie, das Volumen des Auftrags zu erhalten, den Sie abschließen wollen. Schließlich bezieht sich OrderLots() auf die ausgewählte Bestellung und das Ticket auf eine ganz andere. Es ist besser, wenn Sie es so machen:
Dieser lässt sich überhaupt nicht schließen.
Sie lässt sich überhaupt nicht schließen.
Ich bitte um Verzeihung. Die Linie:
sollte wie folgt umgeschrieben werden: