Wie lässt sich die Schließung von Positionen nach N Minuten realisieren? - Seite 2

 
Maxim Kuznetsov:

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.

 
Ihor Herasko:

Wo liegt das Problem?

  1. Suchen Sie den ältesten vom Expert Advisor eröffneten Auftrag. Sie hat die kleinste OrderOpenTime().
  2. 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);}}}

Vielen Dank für Ihre Hilfe, viel Glück))

 
Ihor Herasko:

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

 
Maxim Kuznetsov:

Um nicht unsubstantiiert zu sein - bitte geben Sie mir eine Liste dieser VCs

  1. Forex-Dienst
  2. BrockBusinessBank

 
Natalya Dzerzhinskaya:

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

void CloseOrd(int ticket){

Warum müssen wir in der Schleife danach suchen, wenn wir einfach die Reihenfolge der Tickets auswählen können?

if(OrderSelect(i,SELECT_BY_TICKET) && OrderType()<2 && OrderMagicNumber()==Magic && OrderSymbol()==Symbol()){

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.

 
Alexey Viktorov:

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

)

 
Natalya Dzerzhinskaya:

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:

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);}}}

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:

void CloseOrd(int ticket)
{
   if (!OrderSelect(ticket, SELECT_BY_TICKET) || OrderCloseTime() == 0)
      return;
   
   bool bRes = OrderClose(ticket, OrderLots(), OrderClosePrice(), 30, cl);
}
 
Ihor Herasko:

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.

 
Natalya Dzerzhinskaya:

Sie lässt sich überhaupt nicht schließen.


Ich bitte um Verzeihung. Die Linie:

if (!OrderSelect(ticket, SELECT_BY_TICKET) || OrderCloseTime() == 0)

sollte wie folgt umgeschrieben werden:

if (!OrderSelect(ticket, SELECT_BY_TICKET) || OrderCloseTime() > 0)
 
//закрытие по тикету, переделайте под свой

                  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)
     {
           case 0:      return (0);
           case 1:      Print("Попытка изменить уже установленные значения такими же значениями.");return(1);
           case 2:      Print("Общая ошибка. Прекратить все попытки торговых операций до выяснения обстоятельств.");return(0);
           case 3:      Print("В торговую функцию переданы неправильные параметры.");return(1);
           case 4:      Print("Торговый сервер занят.Пробуем ещё раз..");Sleep(3000);return(1);
           case 5:      Print("Старая версия клиентского терминала.");return(0);
           case 6:      Print("Нет связи с торговым сервером.");return(1);
           case 7:      Print("Недостаточно прав.");return(1);
           case 8:      Print("Слишком частые запросы.");return(1);
           case 9:      Print("Недопустимая операция нарушающая функционирование сервера.");return(1);
           case 64:     Print("Счет заблокирован. Необходимо прекратить все попытки торговых операций.");return(0);
           case 65:     Print("Неправильный номер счета.");return(1);
           case 128:    Print("Истек срок ожидания совершения сделки.");return(1);
           case 129:    Print("Неправильная цена bid или ask, возможно, ненормализованная цена.");return(1);
           case 130:    Print("Слишком близкие стопы или неправильно рассчитанные или ненормализованные цены в стопах (или в цене открытия отложенного ордера).");return(1);
           case 131:    Print("Неправильный объем, ошибка в грануляции объема.");return(1);
           case 132:    Print("Рынок закрыт.");return(1);
           case 133:    Print("Торговля запрещена.");return(0);
           case 134:    Print("Недостаточно денег для совершения операции.");return(0);
           case 135:    Print("Цена изменилась. Пробуем ещё раз..");RefreshRates();return(1);
           case 136:    Print("Нет цен. Ждём новый тик..");
                        while(RefreshRates()==false)// До нового тика
                        Sleep(1);
                        return(1);
           case 137:    Print("Брокер занят.Пробуем ещё раз..");Sleep(3000);return(1);
           case 138:    Print("Запрошенная цена устарела, либо перепутаны bid и ask.");return(1);
           case 139:    Print("Ордер заблокирован и уже обрабатывается.");return(1);
           case 140:    Print("Разрешена только покупка. Повторять операцию SELL нельзя.");return(1);
           case 141:    Print("Слишком много запросов.");return(1);
           case 142:    Print("Ордер поставлен в очередь.");return(1);
           case 143:    Print("Ордер принят дилером к исполнению.");return(1);
           case 144:    Print("Ордер аннулирован самим клиентом при ручном подтверждении сделки.");return(1);
           case 145:    Print("Модификация запрещена, так как ордер слишком близок к рынку и заблокирован из-за возможного скорого исполнения.");return(1);
           case 146:    Print("Подсистема торговли занята.Пробуем ещё..");Sleep(500);return(1);
           case 147:    Print("Использование даты истечения ордера запрещено брокером.");return(1);
           case 148:    Print("Количество открытых и отложенных ордеров достигло предела, установленного брокером.");return(1);
           case 149:    Print("Попытка открыть противоположную позицию к уже существующей в случае, если хеджирование запрещено.");return(1);
           case 4000:   return (0);
           case 4001:   Print("Неправильный указатель функции.");return(1);
           case 4002:   Print("Индекс массива - вне диапазона.");return(1);
           case 4003:   Print("Нет памяти для стека функций.");return(1);
           case 4004:   Print("Переполнение стека после рекурсивного вызова.");return(1);
           case 4005:   Print("На стеке нет памяти для передачи параметров.");return(1);
           case 4006:   Print("Нет памяти для строкового параметра.");return(1);
           case 4007:   Print("Нет памяти для временной строки.");return(1);
           case 4008:   Print("Неинициализированная строка.");return(1);
           case 4009:   Print("Неинициализированная строка в массиве.");return(1);
           case 4010:   Print("Нет памяти для строкового массива.");return(1);
           case 4011:   Print("Слишком длинная строка.");return(1);
           case 4012:   Print("Остаток от деления на ноль.");return(1);
           case 4013:   Print("Деление на ноль.");return(1);
           case 4014:   Print("Неизвестная команда.");return(1);
           case 4015:   Print("Неправильный переход.");return(1);
           case 4016:   Print("Неинициализированный массив.");return(1);
           case 4017:   Print("Вызовы DLL не разрешены.");return(1);
           case 4018:   Print("Невозможно загрузить библиотеку.");return(1);
           case 4019:   Print("Невозможно вызвать функцию.");return(1);
           case 4020:   Print("Вызовы внешних библиотечных функций не разрешены.");return(1);
           case 4021:   Print("Недостаточно памяти для строки, возвращаемой из функции.");return(1);
           case 4022:   Print("Система занята.");return(1);
           case 4050:   Print("Неправильное количество параметров функции.");return(1);
           case 4051:   Print("Недопустимое значение параметра функции.");return(1);
           case 4052:   Print("Внутренняя ошибка строковой функции.");return(1);
           case 4053:   Print("Ошибка массива.");return(1);
           case 4054:   Print("Неправильное использование массива-таймсерии.");return(1);
           case 4055:   Print("Ошибка пользовательского индикатора.");return(1);
           case 4056:   Print("Массивы несовместимы.");return(1);
           case 4057:   Print("Ошибка обработки глобальныех переменных.");return(1);
           case 4058:   Print("Глобальная переменная не обнаружена.");return(1);
           case 4059:   Print("Функция не разрешена в тестовом режиме.");return(1);
           case 4060:   Print("Функция не подтверждена.");return(1);
           case 4061:   Print("Ошибка отправки почты.");return(1);
           case 4062:   Print("Ожидается параметр типа string.");return(1);
           case 4063:   Print("Ожидается параметр типа integer.");return(1);
           case 4064:   Print("Ожидается параметр типа double.");return(1);
           case 4065:   Print("В качестве параметра ожидается массив.");return(1);
           case 4066:   Print("Запрошенные исторические данные в состоянии обновления.");return(1);
           case 4067:   Print("Ошибка при выполнении торговой операции.");return(1);
           case 4099:   Print("Конец файла.");return(1);
           case 4100:   Print("Ошибка при работе с файлом.");return(1);
           case 4101:   Print("Неправильное имя файла.");return(1);
           case 4102:   Print("Слишком много открытых файлов.");return(1);
           case 4103:   Print("Невозможно открыть файл.");return(1);
           case 4104:   Print("Несовместимый режим доступа к файлу.");return(1);
           case 4105:   Print("Ни один ордер не выбран.");return(1);
           case 4106:   Print("Неизвестный символ.");return(1);
           case 4107:   Print("Неправильный параметр цены для торговой функции.");return(1);
           case 4108:   Print("Неверный номер тикета.");return(1);
           case 4109:   Print("Торговля не разрешена. Необходимо включить опцию Разрешить советнику торговать в свойствах эксперта.");return(1);
           case 4110:   Print("Длинные позиции не разрешены. Необходимо проверить свойства эксперта.");return(1);
           case 4111:   Print("Короткие позиции не разрешены. Необходимо проверить свойства эксперта.");return(1);
           case 4200:   Print("Объект уже существует.");return(1);
           case 4201:   Print("Запрошено неизвестное свойство объекта.");return(1);
           case 4202:   Print("Объект не существует.");return(1);
           case 4203:   Print("Неизвестный тип объекта.");return(1);
           case 4204:   Print("Нет имени объекта.");return(1);
           case 4205:   Print("Ошибка координат объекта.");return(1);
           case 4206:   Print("Не найдено указанное подокно.");return(1);
           case 4207:   Print("Ошибка при работе с объектом.");return(1);
           return(0);
     }
     return(0);
  }