-= !!! ПРАВИЛЬНАЯ РАБОТА С ИСТОРИЕЙ ОРДЕРОВ !!! =-

 

Список тикетов по времени закрытия:

int      HstSrtByCloseTime_Ticket[];
datetime HstSrtByCloseTime_Time[];

int start(){

   if(!OrdHstByCloseTime(HstSrtByCloseTime_Ticket,HstSrtByCloseTime_Time)){
      return(0);
   } 

   //в массиве HstSrtByCloseTime_Ticket имеем список тикетов осортированные по времени закрытия ордеров
 
}
 

bool OrdHstByCloseTime(int & aTicket[],int & aTime[]){
   static int sLastOrdersHistoryTotal=0;
      for(int ti=sLastOrdersHistoryTotal;ti<OrdersHistoryTotal();ti++){
         if(OrderSelect(ti,SELECT_BY_POS,MODE_HISTORY)){
               if(OrderMagicNumber()==Magic_N){
                  if(OrderSymbol()==Symbol()){
                     if(OrderType()==OP_BUY || OrderType()==OP_SELL){
                           for(int tj=ArraySize(aTicket)-1;tj>=0;tj--){
                              if(OrderCloseTime()>=aTime[tj]){
                                 break;
                              }
                           }
                        tj++;   
                        ArrayResize(aTicket,ArraySize(aTicket)+1);
                        ArrayResize(aTime,ArraySize(aTime)+1);
                           for(int tk=ArraySize(aTicket)-1;tk>tj;tk--){
                              aTicket[tk]=aTicket[tk-1];
                              aTime[tk]=aTime[tk-1];
                           }
                        aTicket[tj]=OrderTicket();
                        aTime[tj]=OrderCloseTime();
                     
                     }
                  }
               }
            sLastOrdersHistoryTotal=ti+1;
         }
         else{
            return(false);
         }
      }
   return(true);
}

Список тикетов по времени открытия:

int      HstSrtByOpenTime_Ticket[];
datetime HstSrtByOpenTime_Time[];
 
int start(){ 
 
   if(!OrdHstByOpenTime(HstSrtByOpenTime_Ticket,HstSrtByOpenTime_Time))return(0); 
 
     // в массиве HstSrtByOpenTime_Ticket имееем список тикетов отсортированных по времени открытия 

}
 

bool OrdHstByOpenTime(int & aTicket[],int & aTime[]){
   static int sLastOrdersHistoryTotal=0;
      for(int ti=sLastOrdersHistoryTotal;ti<OrdersHistoryTotal();ti++){
         if(OrderSelect(ti,SELECT_BY_POS,MODE_HISTORY)){
               if(OrderMagicNumber()==Magic_N){
                  if(OrderSymbol()==Symbol()){
                     if(OrderType()==OP_BUY || OrderType()==OP_SELL){
                           for(int tj=ArraySize(aTicket)-1;tj>=0;tj--){
                              if(OrderOpenTime()>=aTime[tj]){
                                 break;
                              }
                           }
                        tj++;   
                        ArrayResize(aTicket,ArraySize(aTicket)+1);
                        ArrayResize(aTime,ArraySize(aTime)+1);
                           for(int tk=ArraySize(aTicket)-1;tk>tj;tk--){
                              aTicket[tk]=aTicket[tk-1];
                              aTime[tk]=aTime[tk-1];
                           }
                        aTicket[tj]=OrderTicket();
                        aTime[tj]=OrderOpenTime();
                     }
                  }
               }
            sLastOrdersHistoryTotal=ti+1;
         }
         else{
            return(false);
         }
      }
   return(true);
}

Функции OrdHstByCloseTime() и OrdHstByOpenTime() вызываются в самом начале функции start(), если они возвращают false - завершаем работу start(). В результате - имеем списки тикетов отсортированные по времени закрытия и по времени открытия.

 
Integer >>:

Список тикетов по времени закрытия:

Список тикетов по времени открытия:

Функции OrdHstByCloseTime() и OrdHstByOpenTime() вызываются в самом начале функции start(), если они возвращают false - завершаем работу start(). В результате - имеем списки тикетов отсортированные по времени закрытия и по времени открытия.

Дима что это было, крик души, достали однотипными вопросами?

 
Urain писал(а) >>

Дима что это было, крик души, достали однотипными вопросами?

Да. Глядя на эти постоянные вопросы и на их неправильные ответы.
Работа с историей не такая простая штука, и не так просто узнать как закрылся последний ордер. Во первых - неизвестно как же на самом деле отсортированы ордера в списке истории. Разработчики писали, что по времени открытия, фактически есть наблюдение, что по номеру тикета. Что интересно, тикета не всегда идут в порядке возрастания. На запуске терминала ордера отсортированы в одном порядке, по мере работы, закрытые ордера добавляются в конец списка истории. Если сортировать историю при каждой необходимости, советник будет очень медленно работать в тестере. Сразу после закрытия ордера, и попадания его в список истории его еще невозможно выделить и получить по нему данные, поэтому обязательно нужно проверять выделился ли ордер.
Функции. На запуске проходят во всей доступной истории, сортируют список, далее, в процессе работы, реагируют только на появление новых ордеров в списке истории (не просматривают всю историю) и добавляют новые ордера в подходящее место массива.

 
Integer >>:

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

уточни про его еще невозможно выделить и получить по нему данные

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

 

может вообще стОит делать такие вещи и по другим темам... каждую ветку называть "ПРАВИЛЬНАЯ РАБОТА: ......... название темы.... " Если такая практика закрепится очень полезная вещь может получиться... как ни крути, а подобие FAQ - нужно... хотя бы и силами пользователей форума... всеравно ведь каждый раз приходится отвечать. а сделав РАЗ - можно ссылку давать...

 
keekkenen писал(а) >>

уточни про его еще невозможно выделить и получить по нему данные

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

По времени - меньше 0.1 секнды.

Если сделать так:

if(OrderClose(Ticket...)){
   OrderSelect(Ticket...);
}

то ордер не получится выделить. Sleep(100) - помогает. Совсем недавно поднималась эта тема.

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

 

а смысл его выделять.. а ну если нужно..

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

и побоку обновился журнал или нет, был тик или нет..

 
Integer >>:

Список тикетов по времени закрытия:

Список тикетов по времени открытия:

Функции OrdHstByCloseTime() и OrdHstByOpenTime() вызываются в самом начале функции start(), если они возвращают false - завершаем работу start(). В результате - имеем списки тикетов отсортированные по времени закрытия и по времени открытия.

Не помешало бы ещё пояснить когда и как могут использоваться эти функции и дать примеры использования. Спасибо.

 
keekkenen писал(а) >>

а смысл его выделять.. а ну если нужно..

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

и побоку обновился журнал или нет, был тик или нет..

Молодец! Поздравляю!

Не перестаю удивляться, каким говнокодом люди самоудовлетворяются, когда сами для себя пишут, и как они говняются, когда им пишут советника на заказ за их 20-30 ср-ых баксов.

 
khorosh писал(а) >>

Не помешало бы ещё пояснить когда и как могут использоваться эти функции и дать примеры использования. Спасибо.

Может так поможет:

 
Integer >>:

Молодец! Поздравляю!

Не перестаю удивляться, каким говнокодом люди самоудовлетворяются, когда сами для себя пишут, и как они говняются, когда им пишут советника на заказ за их 20-30 ср-ых баксов.

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

я в общем-то говорил о частном случае удалении, другое дело когда история действительна нужна, но тогда ее отдельно в файл писать нужно,

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