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

 

Коллеги, решил расширить свою библиотеку и выполнить поиск не обращаясь к истории. Поиск удалившегося ордера только среди рыночных. Поднимал уже обсуждения, думал решу проблему, но оказалось нет. Мы ищем ордер которого нет в рыночных! Магик или тиккет записан в глобальной переменной. Находим удалившийся ордер и выcтавляем следующий ордер. Найти его мало, надо в отношении его совершить действия(!). Проблема что выдается постоянное значение тру(1): Вот на чем я остановился:

 for(i=0;i<OrdersTotal();i++)
          {
         bool p2=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);             
         if(OrderTicket()==errB2)break;
         Alert(p2);
         Sleep(5000);
         }
                      if (p2==1)
                         {
                         Alert ("!!!!!!!!Ордер errB2 найден в рыночных errB2>0 тикет = " +errB2, "найден значит должна быть1 = "+p2);
                       
                          Sleep (10000);
                         }
                          if (p2==0)
                        {
                        Alert ("Ордера errB2 не найден в рыночных Обнуляем его значение и открываем ордер errB2 значит 0 ="+p2);
                        errB2=0;
             errB2=OrderSend(Symbol(),OP_BUY,Lots2,NormalizeDouble(opB,Digits),3,NormalizeDouble(slb,Digits),NormalizeDouble(tpb,Digits),"Ворота B осн= "+b,MG2,0,Red); 
                       Sleep (10000);
                        }
 
Руслан:

Коллеги, решил расширить свою библиотеку и выполнить поиск не обращаясь к истории. Поиск удалившегося ордера только среди рыночных. Поднимал уже обсуждения, думал решу проблему, но оказалось нет. Мы ищем ордер которого нет в рыночных! Магик или тиккет записан в глобальной переменной. Находим удалившийся ордер и выcтавляем следующий ордер. Найти его мало, надо в отношении его совершить действия(!). Проблема что выдается постоянное значение тру(1): Вот на чем я остановился:

Ну так выбери этот ордер по тикету и проверь время закрытия. Если больше нуля, то он удалён.

 
Alexey Viktorov:

Ну так выбери этот ордер по тикету и проверь время закрытия. Если больше нуля, то он удалён.

 не прокатит, выбрать можно только явно указав MODE_TRADES или MODE_HISTORY, в MODE_TRADES все рыночные ордера и отложенные, а в MODE_HISTORYвсе закрытые ордера и все удаленные будут

задача у топикстартера с "выкрутасами", ну если не обращаться к истории ордеров, значит принудительно выбрать так:

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Ордер открыт"); else Print("Ордера нет в рынке");

только перед вызовом OrderSelect() нужно обязательно проверить доступность сервера иначе ошибку выбора ордера не обработаете, я про: IsConnected(), IsTradeAllowed(),IsTradeContextBusy()

хотя оптимальнее все таки в истории искать закрытый ордер, куда он оттуда денется? ну разве, что юзер поставит глубину истории ордеров текущий день )))

 
Igor Makanu:

 не прокатит, выбрать можно только явно указав MODE_TRADES или MODE_HISTORY, в MODE_TRADES все рыночные ордера и отложенные, а в MODE_HISTORYвсе закрытые ордера и все удаленные будут

задача у топикстартера с "выкрутасами", ну если не обращаться к истории ордеров, значит принудительно выбрать так:

только перед вызовом OrderSelect() нужно обязательно проверить доступность сервера иначе ошибку выбора ордера не обработаете, я про: IsConnected(), IsTradeAllowed(),IsTradeContextBusy()

хотя оптимальнее все таки в истории искать закрытый ордер, куда он оттуда денется? ну разве, что юзер поставит глубину истории ордеров текущий день )))

bool  OrderSelect( 
   int     index,            // индекс или тикет ордера 
   int     select,           // флаг способа выбора 
   int     pool=MODE_TRADES  // источник данных для выбора 
   );

Примечание

Параметр pool игнорируется, если ордер выбирается по номеру тикета. Номер тикета является уникальным идентификатором ордера.

Чтобы определить, из какого списка выбран ордер, необходимо проанализировать его время закрытия. Если время закрытия ордера равно 0, то ордер является открытым или отложенным и взят из списка открытых ордеров терминала. 

 
Taras Slobodyanik:

bool  OrderSelect(
   int     index,            // индекс или тикет ордера
   int     select,           // флаг способа выбора
   int     pool=MODE_TRADES  // источник данных для выбора
   );

Примечание

Параметр pool игнорируется, если ордер выбирается по номеру тикета. Номер тикета является уникальным идентификатором ордера.

Чтобы определить, из какого списка выбран ордер, необходимо проанализировать его время закрытия. Если время закрытия ордера равно 0, то ордер является открытым или отложенным и взят из списка открытых ордеров терминала. 

наверное да, никогда не выбирал по тикету из истории ордеров - не было необходимости, проверять нужно как работает, тогда так:

if(OrderSelect(ticket,SELECT_BY_TICKET))
     {
      if(OrderCloseTime()>0) Print("Ордера нет в рынке"); Print("Ордер открыт");
     }
 

не хочу новую тему открывать, но как оказалось решаю похожую задачу:

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

проблема: оказывается, при частичном закрытии ордера у него тикет изменяется, т.е. если выбрать ордер после частичного закрытия по тикету, то у него окажется время закрытия >0 ?...

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

как правильно закрыть частично серию ордеров и потом найти остатки ордеров? 

 
Igor Makanu:

а бывают случаи, что при частичном закрытии ордера у него не изменяется тикет? 

Нет, тикет всегда новый.

Igor Makanu:

искал на форуме поиском, видел решение этого вопроса через дописывание в комментарий ордера информации и анализ комментария ордера - плохое решение, нужно что то надежнее

как правильно закрыть частично серию ордеров и потом найти остатки ордеров?

А чем не устраивает анализ комментария? При частичном закрытии в комментарий как раз и пишется тикет ордера от которого остался остаток.

 
Sergey Kolemanov:

1. Нет, тикет всегда новый.

2. А чем не устраивает анализ комментария? При частичном закрытии в комментарий как раз и пишется тикет ордера от которого остался остаток.

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

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

 

Вам нужно обратить внимание вот на чти строки в мануале

Отличить открытый ордер от отложенного ордера можно по типу ордера. Если время закрытия ордера не равно 0, то ордер является закрытым или удаленным отложенным и был выбран из истории терминала. Отличить закрытый ордер от удаленного отложенного также можно по типу ордера.


При выборке ордера нужно добавить

OrderCloseTime==0;//Этотот тип ордера который висит в рынке он может быть отложенным или активираванным тоесть ордер в торгах

OrderCloseTime!=0;//Это ордера которые находятся в карзине брокера и которые уже были сняты с рынка.

Как аналоги вы можете сравнить с одеждой на рынке. Если время равно нулю вещь новая. Если не равна значит вещь купленная и возможно ношенная.
 

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

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

 
Евгений спасибо...попробую.
Причина обращения: