Работает ли обращение к истории ордеров MODE_HISTORY в тестере стратегий?

 
Работает ли обращение к истории ордеров MODE_HISTORY в тестере стратегий?
Данный вопрос уже где-то поднимался на форуме. Не могу найти просто ссылку.
Там что-то говорилось про то, что при тестировании стратегий на тестере невозможна работа с историей ордеров (историей счёта). А почему собственно говоря нельзя доработать тестер до выполнения этой весьма полезной функции? Ведь например мне это принципиально важно! Например какой смысл входить по той же цене, если предыдущий ордер закрылся в убыток? В эксперте этот факт отслеживается, но только в режиме тестирования это проверить невозможно в текущей версии MetaTrader.
 
Все работает и ограничений нет.

Вроде легко написать одну строчку кода и проверить?
 
Все работает и ограничений нет.

Вроде легко написать одну строчку кода и проверить?


Тогда, пожалуйста, помогите отыскать ошибку в тестовой программе.
Советник работает следующим образом.
Рассчитывает какую-то определённую цену открытия ордера openprice на ближайшие 4 часа (в смысле на текущую 4х часовую свечу). В течение 4х часов цена openprice неизменна.
Далее он проверяет по истории счёта является ли последний ордер, закрытый по стоплоссу, ордером открытым по текущей цене openprice. Если это так, то новый ордер не устанавливается. И советник ждёт когда наступят следующие 4 часа и изменится цена открытия ордера.
На живой работе по графику советник проводит проверку истории счёта. А вот при запуске его на тестере он пропускает проверку истории и ордера просто не открывает. Я специально поставил переменную history_checked, которая становится true только если прошла проверка истории счёта. На реальной работе эта переменная становится true, а в тестере она остаётся false.
Пожалуйста, помогите найти ошибку в программе, которую я отловить не в состоянии.

//+------------------------------------------------------------------+
//|                                                 TEST_HISTORY.mq4 |
//|                      Copyright © 2006, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
double openprice,last_stoploss_openprice=0;
int counter=0,i,ticket;
bool history_checked=false;

double tH4yesterday_high,tH4yesterday_low,tH4yesterday_close,tH4yesterday_open,tdeltaH4;
double tH4P,tH4R2,tH4S2,tH4M0,tH4M5;


   tH4yesterday_high = iHigh(Symbol(),240,1);
   tH4yesterday_low = iLow(Symbol(),240,1);
   tH4yesterday_close = iClose(Symbol(),240,1);
   tH4yesterday_open = iOpen(Symbol(),240,1);
   
   tH4P = ((tH4yesterday_high + tH4yesterday_low + tH4yesterday_close + tH4yesterday_open)/4);
   
   tdeltaH4 = tH4yesterday_high - tH4yesterday_low;
   
   tH4R2 = tH4P + tdeltaH4;
   
   
openprice=MathRound(10000*tH4R2)/10000;

 datetime last_stoploss_CloseTime=0;
  
 
     for(i=HistoryTotal()-1;i>0;i--)
    {//---- начало for
     if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
       {
        Print("Ошибка при доступе к исторической базе (",GetLastError(),")");
        break;
       }
     else  {//начало else
        if(OrderSymbol()==Symbol() && OrderComment()=="TEST_H[sl]" && last_stoploss_CloseTime<OrderCloseTime()) 
     {      last_stoploss_CloseTime=OrderCloseTime();
            last_stoploss_openprice=OrderOpenPrice();
            
     }
            history_checked=true;
     
      }//конец else
    }//конец for
    

{//начало for    
for(ticket=0;ticket<OrdersTotal();ticket++)
  
   if (OrderSelect(ticket,SELECT_BY_POS,MODE_TRADES)==false) break;
      
   else
   {//начало else
   
    if (OrderComment()=="TEST_H") 
    {    counter++;
         if(counter>1 && OrderType()!=OP_SELL) OrderDelete(OrderTicket());
            
    }
        
   }//конец else
   
}//конец for

 
   
if(history_checked && counter==0 && (openprice-last_stoploss_openprice>0.9*Point || openprice-last_stoploss_openprice<-0.9*Point))
{
   OrderSend(Symbol(),OP_SELLLIMIT,1,openprice,5,openprice+5*Point,openprice-10*Point,"TEST_H",16394,0); 
   Sleep(60000);
}
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
>> for(ticket=0;ticket<OrdersTotal();ticket++)

Total - это какие позиции? Открытые или закрытые?
 
>> for(ticket=0;ticket<OrdersTotal();ticket++)

Total - это какие позиции? Открытые или закрытые?


OrdersTotal() - количество открытых позиций и отложенных ордеров.
В этом цикле мы просто подсчитываем количество открытых и отложенных ордеров с комметарием "TEST_H".
Если количество открытых и отложенных ордеров "TEST_H" == 0, то открываем отложенный ордер "TEST_H" при условии, что проведена проверка истории (history_checked=true) и значение цены открытия закрытого по стоплоссу ордера "TEST_H[sl]" отличается от текущей цены открытия отложенного ордера более чем на 0.9*Point.
Помогите, пожалуйста, как нужно откорректировать этот тестовый эксперт, чтобы отложенные ордера устанавливались и в тестере, а не только при реальной работе эксперта?

if(history_checked && counter==0 && (openprice-last_stoploss_openprice>0.9*Point || openprice-last_stoploss_openprice<-0.9*Point))
{
   OrderSend(Symbol(),OP_SELLLIMIT,1,openprice,5,openprice+5*Point,openprice-10*Point,"TEST_H",16394,0); 
   Sleep(60000);
}
 
может попробовать цикл запускать в прямом порядке?

Затем, попробовать убрать

из участка

if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
{
Print("Ошибка при доступе к исторической базе (",GetLastError(),")");
break;
}

оператор break, а в принт добавить номер ордера i и посмотреть как эта конструкция себя ведет в тесте. Т.е. на всех ли ордерах истории выдает false.

Вобщем исследовать всеми возможными способами этот участок кода.

Было множествоо случаев - вроде всё правильно, а не работает. Перепишешь чуть подругому и ОК.
 
может попробовать цикл запускать в прямом порядке?

Затем, попробовать убрать

из участка

if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
{
Print("Ошибка при доступе к исторической базе (",GetLastError(),")");
break;
}

оператор break, а в принт добавить номер ордера i и посмотреть как эта конструкция себя ведет в тесте. Т.е. на всех ли ордерах истории выдает false.

Вобщем исследовать всеми возможными способами этот участок кода.

Было множествоо случаев - вроде всё правильно, а не работает. Перепишешь чуть подругому и ОК.


Попробовал считать цикл не по i--, а по i++ с соответствующей коррекцией условия.
Пробовал цикл while. Также пробовал убрать break и пропечатать номер ордера с ошибкой в Print.
Но, к сожалению, ситуация никак не поменялась. В тестере стратегий вообще в журнале ничего не пишется! Только вот эти 2 строчки и отсутствие каких-либо сделок вообще!
19:09:00 TEST_HISTORY: loaded successfully
19:09:05 TEST_HISTORY started for testing
Если бы были хоть какие-то указания на ошибки, то можно было бы что-то предположить, а то складывается такое впечатление, что тестер просто не воспринимает либо вот эту строку
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)
либо вот эту
if(OrderSymbol()==Symbol() && OrderComment()=="TEST_H[sl]" && last_stoploss_CloseTime<OrderCloseTime())
и у меня соответственно просто сложилось такое впечатление, что эта возможность в тестере просто не реализована. Из-за чего я и написал первое сообщение с просьбой это дело реализовать.

Renat, Вы могли бы изучить эту проблему?
Либо если мой код исправить невозможно, то может быть Вы смогли бы написать свой, который будет работать? Описание задачи следующее.
Нужно после анализа истории счёта иметь в результате цену открытия последнего ордера TEST_H, закрывшегося по стоплоссу, то есть имеющего в истории счёта комментарий TEST_H[sl].

PS: Мне так кажется, что что-то не так у тестера работает при работе с комментариями закрытых ордеров. Хотя Вы наверняка сможете установить истинную причину.
 
"Чтобы продать что-нибудь ненужное, надо сначала купить что-нибудь ненужное" (ц) Дядя Фёдор
Стуация вот в чём. Сначала Вы бежите в цикле по истории и внутри цикла взводите флаг history_checked. А так как у Вас нет ни одной сделки, то и флаг не взводится.
Далее. Открытие новой позиции напрямую зависит от этого самого флага.
Замкнутый круг.
 
Т.е. надо объявлять history_checked = true; а после открытия позиции ставить его в false ;)
 
Т.е. надо объявлять history_checked = true; а после открытия позиции ставить его в false ;)

достаточно history_checked = true; чтобы процесс запустился
 
достаточно history_checked = true; чтобы процесс запустился
а чтобы потом корректно работал - "после открытия позиции ставить его в false ;)"
Причина обращения: