MQL4 - automated forex trading   /  

Форум

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

К списку тем  | 1 2 Авторизуйтесь или зарегистрируйтесь, чтобы создать новую тему

avatar
6581
Integer 01.12.2009 23:45 

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

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(). В результате - имеем списки тикетов отсортированные по времени закрытия и по времени открытия.

article

Отчет о заседании Жюри 17 декабря 2007 года

На заседании Жюри обсуждался вопрос о дисквалификации некоторых Участников.


avatar
1436
Urain 01.12.2009 23:49 
Integer писал(а) >>

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

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

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

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


avatar
6581
Integer 02.12.2009 00:07 
Urain писал(а) >>

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

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


avatar
577
keekkenen 02.12.2009 00:20 
Integer писал(а) >>

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

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

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




avatar
717
DDFedor 02.12.2009 00:22 

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


avatar
6581
Integer 02.12.2009 00:36 
keekkenen писал(а) >>

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

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

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

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

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

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

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


avatar
577
keekkenen 02.12.2009 04:29 

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

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

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


avatar
741
khorosh 02.12.2009 04:59 
Integer писал(а) >>

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

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

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

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


avatar
6581
Integer 02.12.2009 05:54 
keekkenen писал(а) >>

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

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

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

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

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


avatar
6581
Integer 02.12.2009 05:55 
khorosh писал(а) >>

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

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


avatar
577
keekkenen 02.12.2009 06:55 
Integer писал(а) >>

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

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

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

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

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

К списку тем   | 1 2  

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий