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

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


Вы могли бы подсказать способ как это можно корректно сделать для моей задачи? Пока что согласно Вашей рекомендации мы получаем следующее. Функция start() запускается с каждым новым тиком. То есть это означает, что согласно Вашей рекомендации эксперт на каждом тике должен открывать позицию при установленном history_checked = true, потом переводить history_checked=false, и далее проверять историю счёта? Только вот зачем это нужно если мы позицию УЖЕ открыли БЕЗ проверки истории?!

Я конечно же понимаю, что для решения этой всплывшей проблемы с историей, которой нет на реальной работе, можно использовать более корявый и неудобный способ забить в историю хотя бы один начальный стоплосс. Например выбрать определённую дату и точное время, посмотреть по графику как нужно поставить ордер, чтобы он закрылся по стоплоссу и таким образом образовалась история счёта в тестере. Но ведь почему Вам как разработчикам не предусмотреть более простой и понятный способ решения проблемы с отсутсвием начальной истории в тестере? Например при отсутствии истории на реальной работе в журнале пишетсяследующая строчка
10:37:12 AccountHistory: '237140' error 'OK
А в тестере в журнале при использовании кода
int err=GetLastError();
Print("error(",err,"): ",ErrorDescription(err));
пишется что нет никаких ошибок
10:51:07 2005.05.05 23:45 TEST_HISTORY: error(0): no error
Почему бы не доработать тестер чтобы он понимал, что история отсутствует и писал вместо того, что пишет сейчас примерно следующее:
10:51:07 2005.05.05 23:45 TEST_HISTORY: error(1234567): AccountHistory does not exist
Ведь ВСЁ сразу же становилось бы на свои места! И можно было бы при этой ошибке принудительно ставить history_checked = true, чтобы началась КОРРЕКТНАЯ работа эксперта на тестере.
 
Проверь количество ордеров в истории, если 0, то true.
 
Проверь количество ордеров в истории, если 0, то true.

Ну так проблема то и состоит как раз в том, что мы не можем обратиться к истории, чтобы что-то там подсчитать! Так как при запуске тестера её просто напросто ещё НЕ СУЩЕСТВУЕТ! При этом НИКАКИХ диагностических ошибок не выдаётся. Выдавались бы ошибки, то проблемы в общем-то и не существовало бы. Поэтому мы вынуждены каким-либо искуственным образом её сначала создавать, например, гарантированно вбив туда какой-нибудь ордер.
 
О, майн гот!

Значение же HistoryTotal() ты можешь посмотреть.
 
Только вот зачем это нужно если мы позицию УЖЕ открыли БЕЗ проверки истории?
Просто надо объявить history_checked ВНЕ ф-ции start() (т.е. сделать её глобальной).
Тогда при первой проверке history_checked будет true, а после установки и до следующих подходящих условий будет false.

Ну и проверку HistoryTotal() сначала тоже можно ;)
 
Только вот зачем это нужно если мы позицию УЖЕ открыли БЕЗ проверки истории?
Просто надо объявить history_checked ВНЕ ф-ции start() (т.е. сделать её глобальной).
Тогда при первой проверке history_checked будет true, а после установки и до следующих подходящих условий будет false.

Ну и проверку HistoryTotal() сначала тоже можно ;)


Извините, пожалуйста, я наверное просто торможу!!! Сделал глобальной history_checked=true. После открытия ордера перевожу её в false. В этом случае получаем в тестере всего лишь один открытый и в последствии закрывшийся ордер. Также пробовал перед открытием ордера ставить
if(HistoryTotal()==0) history_checked=true;
В результате получил огроменное количество открытых ордеров, которые закрылись по стоплоссу, уничтожив весь баланс. Помогите, пожалуйста, подправьте вот этот код, чтобы он в конце концов реально заработал на тестере. Заранее благодарен!
Также почему-то в этом принте
Print("counter = ",counter,"openprice = ",openprice," last_stoploss_openprice = ",last_stoploss_openprice);
выдаётся следующее
2006.01.18 19:39:33 2006.01.16 10:47 TEST_HISTORY: counter = 0openprice = 1.2182 last_stoploss_openprice = 0
Найдите, пожалуйста, ошибку.
//+------------------------------------------------------------------+
//|                                                 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                                            |
//+------------------------------------------------------------------+
bool history_checked=true;
int start()
  {
//----
double openprice,last_stoploss_openprice=0;
int counter=0,i,ticket;

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(HistoryTotal()==0) history_checked=true;

Print("counter = ",counter,"openprice = ",openprice," last_stoploss_openprice = ",last_stoploss_openprice);
   
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); 
   history_checked=false;
 }
//----
   return(0);
  }
//+------------------------------------------------------------------+

 
Также забыл добавить, что пишется ещё и ошибка доступа к исторической базе.

2006.01.18 19:55:32 2006.01.16 10:59 TEST_HISTORY: counter = 0openprice = 1.2182 last_stoploss_openprice = 0
2006.01.18 19:55:32 2006.01.16 10:59 TEST_HISTORY: Ошибка при доступе к исторической базе (0)
 
справка по ХисториТотал:
int i,accTotal=HistoryTotal();
for(i=0;i<accTotal;i++)
отсчёт начинается с 0. Если ордер один, то его порядковый № будет=0. Поэтому он и не выбирается ;)
 

Также пробовал перед открытием ордера ставить
if(HistoryTotal()==0) history_checked=true;
В результате получил огроменное количество открытых ордеров, которые закрылись по стоплоссу, уничтожив весь баланс.


Конечно! Пока ордер не закрыт, он не в истории, поэтому на каждом тике выставляется ордер.
Добавь еще проверку количества открытых ордеров. Если в истории равно нулю и нет открытых, тогда true.
 
PS: Мне так кажется, что что-то не так у тестера работает при работе с комментариями закрытых ордеров. Хотя Вы наверняка сможете установить истинную причину.


УРААААААААААА!!! Я нашёл в чём именно оказалась вся проблема!!!!!! Как я и предполагал ранее тестер в комментарии закрытого ордера не добавляет признак закрытия ордера!!! То есть на реальной работе в комментариях закрытого по стоплоссу ордера будет написано "TEST_H[sl]", а на тестере [sl] не добавляется!!! То есть остаётся как и прежде "TEST_H". А мой эксперт как раз проверяет этот самый комментарий закрытого ордера и не может его найти.
if(OrderSymbol()==Symbol() && OrderComment()=="TEST_H[sl]" && last_stoploss_CloseTime<OrderCloseTime()) 



И поэтому эксперт на тестере сразу же впадает в непонятное состояние, из-за чего я и начал предполагать, что работа на истории в тестере просто-напросто не реализована! Уважаемые разработчики, Вы сможете подправить тестер в плане корректности внесения комментариев? Чтобы комментарии в истории на тестере и на реальной работе совпадали?