Ошибки, баги, вопросы - страница 148

 
EQU:

И опять - код.. код.. Код - это хорошо.. но это ещё и - тактики, циклики.. ;)

Ну неужто в чарт не приходит мессидж о создании нового бара?? Ни в жисть не поверю..)))

А ивент из него слепить - проблемно? а переменную предопределённую хотя бы??

И вообще - события обрабатывать проще, чем наворачивать горы кода.. Да к тому же - с ошибками (ПРОГРАММ же БЕЗ ОШИБОК - НЕ БЫВАЕТ!!!)))))

абсолютно согласен с вами что новый бар это событие и оно может (и должно програмироваться) тут есть ветка https://www.mql5.com/ru/forum/1031 почитайте на досуге,а уже много лет бодаюсь...

З.Ы. Думаю после прочтения вам станет ясно что новый бар может ВООБЩЕ не появиться...дыра...

Обсуждение статьи "Алгоритм генерации тиков в тестере стратегий терминала MetaTrader 5"
Обсуждение статьи "Алгоритм генерации тиков в тестере стратегий терминала MetaTrader 5"
  • www.mql5.com
Обсуждение статьи "Алгоритм генерации тиков в тестере стратегий терминала MetaTrader 5".
 
EQU:

И опять - код.. код.. Код - это хорошо.. но это ещё и - тактики, циклики.. ;)

Ну неужто в чарт не приходит мессидж о создании нового бара?? Ни в жисть не поверю..)))

А ивент из него слепить - проблемно? а переменную предопределённую хотя бы??

И вообще - события обрабатывать проще, чем наворачивать горы кода.. Да к тому же - с ошибками (ПРОГРАММ же БЕЗ ОШИБОК - НЕ БЫВАЕТ!!!)))))

Вообще, как Вы себе это представляете ? 20 таймфреймов x число символов в 'Обзоре рынка' и по каждому генерируется событие OnNewBar ?  А Вы каждое должны обработать, определить, к какому символу и таймфрейму оно относится ? Сейчас у Вас есть выбор: написать собственную функцию NewBar и в ней определить, какие именно Вы хотите получать новые бары: все периоды  по символу,все символы по текущему периоду  или какой то частный случай. Получается конкретная несложная функция. Это лучше, чем универсальная функция OnNewBar с множеством проверок.
 

При тестировании выдает ошибку

CTrade::PositionClose::OrderCheck: Invalid stop(s) request
В советнике есть такие строчки

описание переменных (в процедуре) 

 CTrade  m_trade;

..................

закрываю позицию 

m_trade.PositionClose(_Symbol, eSlippage); 

почему тут выходит ошибка ? CTrade::PositionClose::OrderCheck: Invalid stop(s) request

неправильный SL и/или TP
TRADE_RETCODE_INVALID_STOPS

при чем тут стопы при закрытии позиции? или я что то не понимаю?
 

Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5
 
Prival:

абсолютно согласен с вами что новый бар это событие и оно может (и должно програмироваться) тут есть ветка https://www.mql5.com/ru/forum/1031 почитайте на досуге,а уже много лет бодаюсь...

З.Ы. Думаю после прочтения вам станет ясно что новый бар может ВООБЩЕ не появиться...дыра...

Рискнул заглянуть в ссылку.. Пожалуй, эт и правда надо почитать.. на досуге..;)

на З.Ы.  В этом-то и причина пожелания иметь такое событие.. Нет бара - нет события

 
Valmars:
Вообще, как Вы себе это представляете ? 20 таймфреймов x число символов в 'Обзоре рынка' и по каждому генерируется событие OnNewBar ?  А Вы каждое должны обработать, определить, к какому символу и таймфрейму оно относится ? Сейчас у Вас есть выбор: написать собственную функцию NewBar и в ней определить, какие именно Вы хотите получать новые бары: все периоды  по символу,все символы по текущему периоду  или какой то частный случай. Получается конкретная несложная функция. Это лучше, чем универсальная функция OnNewBar с множеством проверок.

20 таймфреймов.. для ulong параметра - этт не предел.. раз в минутку заполнить целую переменную - право, не сложно..

А что, ОнТик просматривает "х число символов в 'Обзоре рынка' и по каждому генерируется событие.."?????

А побитовая проверка - она, поверьте, штука довольно-таки очень быстрая..

И даже при наличии события

- никто не заставит меня его обрабатывать - без надобности..

- ничто не помешает _дополнительно или _вместо "написать собственную функцию NewBar и в ней определить, какие именно Вы хотите получать новые бары" - при надобности..

 
Interesting:

Да и сейчас это с легкостью делается, если конечно УМЕЛО все делать. Разработчики обещали переписать OnTrade(), добавить туда необходимые параметры. если сделают будет еще проще обрабатывать.

Никто не мешает обрабатывать подобные ситуации на месте, в OnTick() или OnTime() - по месту проведения торговой операции; либо в OnTrade(), если необходимо отловить действия пользователя или торговые операции не контролируемые на прямую из кода.

Легкость - понятие относительное, и для одного она измеряется в граммах, для другого в тоннах. Мне в эксперте пришлось сделать это УМЕЛО (если мой код можно назвать таковым), ибо вариантов с ПРОСТО сейчас в языке не существует, а очень даже могли бы существовать, имхо. И особой радости от того, что кода стало образно на сто строк больше, и он стал казаться сложнее, я не испытал.

Вообще сама проблема вот в чем:

приходит тик, индикатор показывает, что нужно закрываться, делаю закрытие

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

Я не понимаю, почему эта сложность здесь все еще присутствует? Я не понимаю, почему в событии onTrade() нам предлагают написать тонну кода, чтобы понять, что произошло?

Я - за простоту, и когда ее нет, становится грустно

 
Vladix:

Легкость - понятие относительное, и для одного она измеряется в граммах, для другого в тоннах. Мне в эксперте пришлось сделать это УМЕЛО (если мой код можно назвать таковым), ибо вариантов с ПРОСТО сейчас в языке не существует, а очень даже могли бы существовать, имхо. И особой радости от того, что кода стало образно на сто строк больше, и он стал казаться сложнее, я не испытал.

Вообще сама проблема вот в чем:

приходит тик, индикатор показывает, что нужно закрываться, делаю закрытие

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

Я не понимаю, почему эта сложность здесь все еще присутствует? Я не понимаю, почему в событии onTrade() нам предлагают написать тонну кода, чтобы понять, что произошло?

 Я - за простоту, и когда ее нет, становится грустно

Сделал так, кода меньше чем сто строк...:) решение надежное и сразу для мультивалютников

//+----------------------------------------------------------------------------+
// Функция контроля открытия ордера на текущем баре               MQL5         |
//-----------------------------------------------------------------------------+
bool ЕстьОрдернаТекущемБаре(ENUM_ORDER_TYPE тип)
  {
   ulong тикет;
   HistorySelect(SeriesInfoInteger(СИМВОЛ,Period(),SERIES_LASTBAR_DATE),TimeCurrent());
   for(int i=0;i<HistoryDealsTotal();i=i+1)
     {
      тикет=HistoryDealGetTicket(i);
      if(HistoryDealGetString(тикет,DEAL_SYMBOL)!=СИМВОЛ || HistoryDealGetInteger(тикет,DEAL_ENTRY)==DEAL_ENTRY_STATE)// || HistoryDealGetInteger(тикет,DEAL_MAGIC)!=MAGIC
         continue;
      if(HistoryDealGetInteger(тикет,DEAL_TYPE)==тип || HistoryDealGetInteger(тикет,DEAL_TYPE)==DEAL_ENTRY_INOUT)
         return(true);
     }
   return(false);
  }
Вместо периода на котором советник висит можно любой нужный указать. Т. е. ордера будут ставиться не чаще чем раз в период

Ну и после любого торгового запроса нужно сделать задержку, запрещающую торговый запрос в течение 30сек(например). А то ордер может еще в истории не появиться на следующем тике.
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
  • www.mql5.com
Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса - Документация по MQL5
 
Valmars:
Вообще, как Вы себе это представляете ? 20 таймфреймов x число символов в 'Обзоре рынка' и по каждому генерируется событие OnNewBar ?  А Вы каждое должны обработать, определить, к какому символу и таймфрейму оно относится ? Сейчас у Вас есть выбор: написать собственную функцию NewBar и в ней определить, какие именно Вы хотите получать новые бары: все периоды  по символу,все символы по текущему периоду  или какой то частный случай. Получается конкретная несложная функция. Это лучше, чем универсальная функция OnNewBar с множеством проверок.

Если говорить о стандартном решении все должно выглядеть примерно так

1. Событие привязывается к открытому графику, к его периоду и символу. Событие должно возникать при появлении нового бара (дыры игнорируются).

2. Обработка событий как понимаю должна происходить в отдельном потоке терминала (или потоках).

PS

Как-то так. Конечно это грубое приближение, без учета множества особенностей...

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 

Vladix:

Вообще сама проблема вот в чем:

приходит тик, индикатор показывает, что нужно закрываться, делаю закрытие

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

Я не понимаю, почему эта сложность здесь все еще присутствует? Я не понимаю, почему в событии onTrade() нам предлагают написать тонну кода, чтобы понять, что произошло?

Я - за простоту, и когда ее нет, становится грустно

Возможно разработчики добавят в OnTrade() параметры, по крайней мере они об этом задумывались. Насколько я знаю даже были определенные заявления по этому поводу.
 
Dmitriy2:

Сделал так, кода меньше чем сто строк...:) решение надежное и сразу для мультивалютников

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

Ну и после любого торгового запроса нужно сделать задержку, запрещающую торговый запрос в течение 30сек(например). А то ордер может еще в истории не появиться на следующем тике.

Поставить задержку - да, принимаю, сколько строк кода уйдет на это? А если речь о мультивалютнике, это нужно по каждому учитывать задержку, не так ли?

Я код, который это решает, написал. Только не нравится мне он, так же, как, простите, и ваш. И дело не в предвзятости, дело в том, что вариантов нет других, простых и элегантных.