Поиск удалившегося ордера по тиккету или магику - страница 2

 
Руслан:

Коллеги, поиск по тиккету в истории это давно решенная задача. Даже время закрыт он был или нет не нужно. Поиск по тиккету или уникальному ордеру. 

Почему мне нужен поиск без обращения к истории. Это скорость обработки, так как рыночных ордеров меньше чем ордеров в истории - рыночных 10, а в истории сотни...

вот набросал функцию:

bool CheckOrders(int ticket_)
  {
   int i,k=OrdersTotal();
   bool result=false;
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if((OrderSymbol()==_Symbol) && OrderTicket()==ticket_)
           {
            result=true;
            break;
           }
        }else Print("Ошибка OrderSelect() ",GetLastError());
     }
   return(result);
  }
если ордера нет среди рыночных, то ф-ция вернет false, но нужно еще проверить если в истории этот тикет, тогда корректно все будет, а так можно попасть на поиск багов
 
Igor Makanu:

а вот Ваш пример с дозаписью комментария я пока не встречал, значит опять же анализ комментария ордера не надежный способ 

Вам ничего не мешает это проверить.. Любой сервер МТ после частичного закрытия делает в комментарии такую запись: from#123456789 - это говорит о том, что это остаток от позиции закрытой частично, а цифры после # это её тикет . Для проверки в тестере запустите приложенный файл и посмотрите логи журнала.

А то что ДЦ могут дописывать комментарий - да это имеет место быть, но опять же дописывать а не тереть, и при желании информацию можно получить.

Файлы:
 
Sergey Kolemanov:

Вам ничего не мешает это проверить.. Любой сервер МТ после частичного закрытия делает в комментарии такую запись: from#123456789 - это говорит о том, что это остаток от позиции закрытой частично, а цифры после # это её тикет . Для проверки в тестере запустите приложенный файл и посмотрите логи журнала.

А то что ДЦ могут дописывать комментарий - да это имеет место быть, но опять же дописывать а не тереть, и при желании информацию можно получить.

спс, посмотрю, но наверное влоб буду задачу решать - считать ордера и в массив тикеты, затем частично закрывать и опять запоминать тикеты, и искать что нового появилось... там мне задачу расширили, нужно еще повторно н аодних и тех же ордерах не выполнять частичное закрытие, все равно придется запоминать все тикеты.... взялся с дуру полуавтомат написать... возни много, графику за час нарисовал, а логику... 

 
Igor Makanu:

спс, посмотрю, но наверное влоб буду задачу решать - считать ордера и в массив тикеты, затем частично закрывать и опять запоминать тикеты, и искать что нового появилось... там мне задачу расширили, нужно еще повторно н аодних и тех же ордерах не выполнять частичное закрытие, все равно придется запоминать все тикеты.... взялся с дуру полуавтомат написать... возни много, графику за час нарисовал, а логику... 

Здесь тоже одни минусы - терминал упал аварийно или свет выключили, и всё потеря данных...как вариант в файл писать, но там тоже свои минусы ...

 
Sergey Kolemanov:

Здесь тоже одни минусы - терминал упал аварийно или свет выключили, и всё потеря данных...как вариант в файл писать, но там тоже свои минусы ...

так то да, но тут полуавтомат хотят, я сам поначалу начал писать как под обычного робота, а потом при обсуждении, все таки понял, что нужна графическая панель с кнопками, т.е. человек всегда будет перед терминалом и все проблемы со связью или электропитанием это его проблемы.... а мои проблемы угадать что сам нажмет... может и трейлинг в терминале включить и может сам закроет какой ордер... сложно все действия юзера предугадать



да кстати, по сабжу, ТС вроде упомянул, что Важна скорость, я гуглил свой вопрос поиском по форуму, и видел фразу @Artyom Trishkin, где он сказал, что OrderSelect() самая затратная по ресурсам операция которая инициализирует окружение терминала..., т.е. что принудительно вызвать поиск ордера по тикету из истории, что перебрать десяток рыночных ордеров.... сложно сказать что будет эффективнее

ну и в целом, а может быть, что задача у ТС просто  сейчас решается "с хвоста, а не с головы" ? ))

 
 int errB=0;
 int MG1=111;
  int errB2=0;
 int MG2=222; 
 
  if(OrdersTotal()<2)
  {  
          for(i=0;i<OrdersTotal();i++)
          {
         bool  p1=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);                      
         if(OrderTicket()!=errB)continue;
      //   if ( OrderMagicNumber() != MG1 ) continue;
         
               Alert ("Ордера errB не найден в рыночных Обнуляем его значение и открываем ордер errB значит 0 ="+p3);
             errB=OrderSend(Symbol(),OP_BUY,Lots2,NormalizeDouble(opB,Digits),3,NormalizeDouble(slb,Digits),NormalizeDouble(tpb,Digits),"Ворота B осн= "+b,MG1,0,Red); 
                       Sleep (10000);
           break;            
         }         
    
          for(i=0;i<OrdersTotal();i++)
          {
         bool  p2=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);                      
         if(OrderTicket()!=errB2)continue;
      //   if ( OrderMagicNumber() != MG2 ) continue;
         
               Alert ("Ордера errB не найден в рыночных Обнуляем его значение и открываем ордер errB значит 0 ="+p3);
             errB2=OrderSend(Symbol(),OP_BUY,Lots2,NormalizeDouble(opB,Digits),3,NormalizeDouble(slb,Digits),NormalizeDouble(tpb,Digits),"Ворота B осн= "+b,MG2,0,Red); 
                       Sleep (10000);
           break;            
         }         
} 

А я вот что набросал по примеру того что мне когда-то в другой теме написали (Константин). Проверяются ордера без обращения к истории, по тиккету или магику.После закрытия одного другой такой же открывается. Надо проверять. Кто подскажет демо прогу для теста советников когда биржа закрыта?

 

Сергей по каким параметрам тебе надо открывать, закрывать или модифицировать ордера? 

Сколько рыночных ордеров висит? Если не много, то тиккет каждого можно записать в глобальную переменную. Далее при наступлении событий по тиккету модифицируешь каждый...

Но модифицировать ведь можно только отложенные. Либо я не до конца врубаюсь в твою задачу.  Я меня есть елементы где я удаляю либо 1 ордер либо все ордера...  

 
Руслан, у Вас 2 цикла, это потеря времени и производительности
   int i,t,k=OrdersTotal();
   bool result1=false,result2=false;
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         t=OrderTicket();
         if(t==errB) result1=true;
         if(t==errB2) result2=true;
         if(result1&&result2)break;
        }
      else Print("Ошибка OrderSelect() ",GetLastError());
     }
   if(!result1)
     {
      Alert("Ордера errB не найден в рыночных Обнуляем его значение и открываем ордер errB значит 0 ="+p3);
      errB=OrderSend(Symbol(),OP_BUY,Lots2,NormalizeDouble(opB,Digits),3,NormalizeDouble(slb,Digits),NormalizeDouble(tpb,Digits),"Ворота B осн= "+b,MG1,0,Red);
      Sleep(10000);
     }
   if(!result2)
     {
      Alert("Ордера errB не найден в рыночных Обнуляем его значение и открываем ордер errB значит 0 ="+p3);
      errB2=OrderSend(Symbol(),OP_BUY,Lots2,NormalizeDouble(opB,Digits),3,NormalizeDouble(slb,Digits),NormalizeDouble(tpb,Digits),"Ворота B осн= "+b,MG2,0,Red);
      Sleep(10000);
     }
 
Konstantin Nikitin:
Зачем мудрить??? Если известен тикет то и работайте по нему без всяких переборов.

нее не прокатит, я тоже так думал,  Ваш пример может выбрать ордер из истории ордеров, на первой странице уже показали выписку из справки ;)

 
Konstantin Nikitin:
Зачем мудрить??? Если известен тикет то и работайте по нему без всяких переборов.

Константин, висит несколько ордеров. И надо найти удалившийся без обращения к истории. Отсюда вся и сложность.

Игорь, буду пробовать. Вы упростили, спасибо. Если бы я впихнул в один цикл, у меня вышло бы гораздо громоздко)