Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Вы могли бы подсказать способ как это можно корректно сделать для моей задачи? Пока что согласно Вашей рекомендации мы получаем следующее. Функция 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, чтобы началась КОРРЕКТНАЯ работа эксперта на тестере.
Ну так проблема то и состоит как раз в том, что мы не можем обратиться к истории, чтобы что-то там подсчитать! Так как при запуске тестера её просто напросто ещё НЕ СУЩЕСТВУЕТ! При этом НИКАКИХ диагностических ошибок не выдаётся. Выдавались бы ошибки, то проблемы в общем-то и не существовало бы. Поэтому мы вынуждены каким-либо искуственным образом её сначала создавать, например, гарантированно вбив туда какой-нибудь ордер.
Значение же HistoryTotal() ты можешь посмотреть.
Тогда при первой проверке history_checked будет true, а после установки и до следующих подходящих условий будет false.
Ну и проверку HistoryTotal() сначала тоже можно ;)
Тогда при первой проверке 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)
for(i=0;i<accTotal;i++)
Также пробовал перед открытием ордера ставить
if(HistoryTotal()==0) history_checked=true;
В результате получил огроменное количество открытых ордеров, которые закрылись по стоплоссу, уничтожив весь баланс.
Конечно! Пока ордер не закрыт, он не в истории, поэтому на каждом тике выставляется ордер.
Добавь еще проверку количества открытых ордеров. Если в истории равно нулю и нет открытых, тогда true.
УРААААААААААА!!! Я нашёл в чём именно оказалась вся проблема!!!!!! Как я и предполагал ранее тестер в комментарии закрытого ордера не добавляет признак закрытия ордера!!! То есть на реальной работе в комментариях закрытого по стоплоссу ордера будет написано "TEST_H[sl]", а на тестере [sl] не добавляется!!! То есть остаётся как и прежде "TEST_H". А мой эксперт как раз проверяет этот самый комментарий закрытого ордера и не может его найти.
И поэтому эксперт на тестере сразу же впадает в непонятное состояние, из-за чего я и начал предполагать, что работа на истории в тестере просто-напросто не реализована! Уважаемые разработчики, Вы сможете подправить тестер в плане корректности внесения комментариев? Чтобы комментарии в истории на тестере и на реальной работе совпадали?