Обсуждение статьи "Торговые транзакции. Структуры запросов и ответов, описание и вывод в журнал" - страница 8

 
MrBrooklin #:

А как же этот обработчик событий нашёл открытую позицию через один торговый день?

С уважением, Владимир.

Чудес не бывает. Логику же делали Вы. Вот Вам и смотреть почему ... Что Вы искали в обработчике при его срабатывании? Как Вы искали... И от чего он именно сработал.

Есть событие - обработчик сигналит. В нём нужно эти события фильтровать ...

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

 
Artyom Trishkin #:
Алексей же отвечал. От брокера зависит.

Это утверждение или предположение? Вопрос задаю не из-за того, что мне делать больше нечего. Хочу разобраться.

С уважением, Владимир.

 
Artyom Trishkin #:
Чудес не бывает.

Также говорил мой первый наставник по электронике, когда работал в Региональном Центре Обслуживания ЭВМ (во времена СССР). С ним и с Вами полностью согласен. Поэтому должно быть какое-то логичное объяснение возникновения проблемы. Причём один раз за 8 месяцев торговли советником на реальном счёте. Поэтому и пытаюсь разобраться, чтобы устранить любую возможность возникновение подобной ситуации.

С уважением, Владимир.

 

Попробую применить на реале вот такой вариант использования функции OnTradeTransaction(), чтобы советник всегда находил открытую позицию. Выделил желтым цветом, ту часть кода, которая должна исключить "выпадение из поля зрения" факт наличия открытой позиции:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void  OnTradeTransaction(
   const MqlTradeTransaction&    trans,   // структура торговой транзакции
   const MqlTradeRequest&        request, // структура запроса
   const MqlTradeResult&         result   // структура ответа
)
  {
   if(trans.type==TRADE_TRANSACTION_DEAL_ADD)
     {
      if(HistoryDealSelect(trans.deal) && HistoryDealGetInteger(trans.deal,DEAL_ENTRY)==DEAL_ENTRY_IN)
        {
         pos_ticket=trans.position;
         pos_open=trans.price;
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Open_Add_Position()
  {
//--- если по текущему символу выбрана позиция с меджиком и тикетом последней открытой позиции
   if((PositionSelectByTicket(pos_ticket) || PositionSelect(_Symbol)) &&
      PositionGetString(POSITION_SYMBOL)==_Symbol &&
      PositionGetInteger(POSITION_MAGIC)==Magic_Number)
     {
      ....... тогда выполняем определённые действия с целью открытия дополнительной позиции
     }
  }

В тестере работает нормально, посмотрю, как поведёт себя в реальной торговле.

С уважением, Владимир.

 
MrBrooklin #:

Попробую применить на реале вот такой вариант использования функции OnTradeTransaction(), чтобы советник всегда находил открытую позицию. Выделил желтым цветом, ту часть кода, которая должна исключить "выпадение из поля зрения" факт наличия открытой позиции:

В тестере работает нормально, посмотрю, что будет в реальной торговле.

С уважением, Владимир.

Владимир, между этими функциями никакой связи нет. Удали функцию OnTradeTransaсtion() и код будет работать точно так-же.

Если стратегия предусматривает открытие нескольких позиций и счёт hadge, то вот эта часть кода

if((PositionSelectByTicket(pos_ticket) || PositionSelect(_Symbol)) &&

может сильно навредить.

 
Alexey Viktorov #:

Владимир, между этими функциями никакой связи нет. Удали функцию OnTradeTransaсtion() и код будет работать точно так-же.

Если стратегия предусматривает открытие нескольких позиций и счёт hadge, то вот эта часть кода

может сильно навредить.

Алексей, спасибо тебе за то, что постоянно подсказываешь и помогаешь мне в усовершенствовании кода советника. Теперь по делу. Да, у меня счёт хэдж и предусматривается открытие нескольких позиций. Связь между OnTradeTransaсtion() и той частью кода, которую предлагаешь удалить - прямая. В  OnTradeTransaсtion() получаю тикет позиции и цену её открытия, чтобы использовать для открытия дополнительной(ых) позиции(й). Всё идеально работало до поры, до времени. Проблема возникла тогда, когда советник один раз не "увидел" открытую позицию. Раньше не замечал и думал, что проблема возникла только один раз, а прогнав по истории и более детально вникнув в распечатку, понял, что это происходило не раз и не два. Просто раньше не замечал., а теперь разглядел, что проблема иногда случалась при переходе позиции с одной торговой сессии на другую. Подчёркиваю - ИНОГДА. Почему? Сам не могу понять. У моего форекс-дилера есть ролловер между торговыми сессиями. Может быть из-за него, а может быть и не из-за него. Не знаю. Сейчас у меня сложилась подобная ситуация, но пока ещё не достаёт одного условия, чтобы открылась дополнительная позиция. Хочу новый код проверить и посмотреть - навредит или нет. Эксперимент провести не боюсь, т.к. хуже точно не будет и тем более, что уже научился "разруливать" плохие ситуации руками. Просто останавливаю работу обоих роботов и руками открываю позицию по нужной мне цене.

С уважением, Владимир.

 
MrBrooklin #:

Алексей, спасибо тебе за то, что постоянно подсказываешь и помогаешь мне в усовершенствовании кода советника. Теперь по делу. Да, у меня счёт хэдж и предусматривается открытие нескольких позиций. Связь между OnTradeTransaсtion() и той частью кода, которую предлагаешь удалить - прямая. В  OnTradeTransaсtion() получаю тикет позиции и цену её открытия, чтобы использовать для открытия дополнительной(ых) позиции(й). Всё идеально работало до поры, до времени. Проблема возникла тогда, когда советник один раз не "увидел" открытую позицию. Раньше не замечал и думал, что проблема возникла только один раз, а прогнав по истории и более детально вникнув в распечатку, понял, что это происходило не раз и не два. Просто раньше не замечал., а теперь разглядел, что проблема иногда случалась при переходе позиции с одной торговой сессии на другую. Подчёркиваю - ИНОГДА. Почему? Сам не могу понять. У моего форекс-дилера есть ролловер между торговыми сессиями. Может быть из-за него, а может быть и не из-за него. Не знаю. Сейчас у меня сложилась подобная ситуация, но пока ещё не достаёт одного условия, чтобы открылась дополнительная позиция. Хочу новый код проверить и посмотреть - навредит или нет. Эксперимент провести не боюсь, т.к. хуже точно не будет и тем более, что уже научился "разруливать" плохие ситуации руками. Просто останавливаю работу обоих роботов и руками открываю позицию по нужной мне цене.

С уважением, Владимир.

Проблема в том, что PositionSelect(_Symbol) выбирает не обязательно последнюю позицию. Следовательно, если в OnTradeTransaction() ты не получил тикет позиции, то рискуешь принять решение на основании не тех данных.

 
Alexey Viktorov #:

Проблема в том, что PositionSelect(_Symbol) выбирает не обязательно последнюю позицию. Следовательно, если в OnTradeTransaction() ты не получил тикет позиции, то рискуешь принять решение на основании не тех данных.

Спасибо за подсказку. Подумаю и посмотрю, как это сможет навредить в реальной торговле. По поводу того, чтобы отказаться от функции OnTradeTransaction(), пока не могу согласиться. Нужно досконально разобраться с проблемой и уже тогда принять окончательное решение.

С уважением, Владимир.

 
MrBrooklin #:

Спасибо за подсказку. Подумаю и посмотрю, как это сможет навредить в реальной торговле. По поводу того, чтобы отказаться от функции OnTradeTransaction(), пока не могу согласиться. Нужно досконально разобраться с проблемой и уже тогда принять окончательное решение.

С уважением, Владимир.

Я не говорил чтобы отказаться. Но пользы от такого её использования ровно ноль.

 
Alexey Viktorov #:
Удали функцию OnTradeTransaсtion() и код будет работать точно так-же

Удалить функцию, в моём понимании - это всё равно, что отказаться от её использования. Да, ладно, не важно кто и как сказал, главное разобраться. :) 

С уважением, Владимир.

Причина обращения: