Барный трейлинг / Bar hinterher

 
// объявляем глобальную переменную

datetime timeprev=0; 

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+

// Проверка открытия текущего бара 

   if(timeprev==Time[0]) return;
   timeprev=Time[0];

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

// В этом варианте мы не объявляем глобальную переменную (комментируем её)



//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+

// Проверка открытия текущего бара 


   datetime timeprev=Time[0]; 

В данном варианте советник закроет позиции по достижении ими TakeProfit.


Представим что есть переменная типа булево TrailX, каким образом можно сочинить здесь возможность для пользователя советника включать и выключать опцию для того чтобы выбирать поведение советника при достижении прибыли? то есть либо советник работает по первому варианту, либо по второму.


Пытался придумать что-то вроде

// Здесь глобальную переменную datetime timeprev=0; не объявляю

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+

// Дальше действия такие:

// Проверка открытия текущего бара 

if (TrailX==true)
{
        datetime timeprev=0; //

        if(timeprev==Time[0]) return;
        timeprev=Time[0];
}
else if (TrailX==false)
{
        datetime timeprev=Time[0];
}

// но ничего не работает - советник при таком подходе выходит из бара с закрытием позиций при достижении ими TakeProfit.

// Здесь глобальную переменную datetime timeprev=0; не объявляю

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+

// Дальше действия такие:

// Проверка открытия текущего бара 

 datetime timeprev;
if (TrailX==true) {         timeprev=0;         if(timeprev==Time[0]) return;         timeprev=Time[0]; } else if (TrailX==false) {         timeprev=Time[0]; } // так тоже не работает, советник аналогично выходит из бара при достижении позициями TakeProfit
Совершение сделок - Торговые операции - MetaTrader 5
Совершение сделок - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
geratdc_:

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

В данном варианте советник закроет позиции по достижении ими TakeProfit.


Представим что есть переменная типа булево TrailX, каким образом можно сочинить здесь возможность для пользователя советника включать и выключать опцию для того чтобы выбирать поведение советника при достижении прибыли? то есть либо советник работает по первому варианту, либо по второму.


Пытался придумать что-то вроде

Команду на открытие ордера покажите. 

 
geratdc_:

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

Представим что есть переменная типа булево TrailX, каким образом можно сочинить здесь возможность для пользователя советника включать и выключать опцию для того чтобы выбирать поведение советника при достижении прибыли? то есть либо советник работает по первому варианту, либо по второму.

Если вы работаете с реальным TP, то он будет обработан в любом случае если наступит подходящая ситуация на символе.
На виртуальном, подобное поведение реализовать проще простого.
Как уже было сказано, неплохо бы больше вводной информации. Чтоб более конкретно понять суть проблемы.

 
Алексей Тарабанов:

Команду на открытие ордера покажите. 


Файл прилагаю советника. Но вот одной этой фичи не хватает. 


Может это с тестером именно связано? а на реалтайме всё будет работать?

Файлы:
 
Konstantin Nikitin:

Если вы работаете с реальным TP, то он будет обработан в любом случае если наступит подходящая ситуация на символе.
На виртуальном, подобное поведение реализовать проще простого.
Как уже было сказано, неплохо бы больше вводной информации. Чтоб более конкретно понять суть проблемы.

Да уж не знаю как больше информации дать. Всё вроде рассказал )) Советник пропатчил на основе идей напарника, правда эта идея с булевной переменной для datetime timeprev уже самоделка конечно. Может найдём варьянт решения какой.

 
geratdc_:


Файл прилагаю советника. Но вот одной этой фичи не хватает. 


Может это с тестером именно связано? а на реалтайме всё будет работать?

Кошмарики... Не надо так много букв. 

// https://www.mql5.com/ru/users/starij

Обратитесь к автору. 

Общие принципы - Торговые операции - MetaTrader 5
Общие принципы - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и позиция. — это распоряжение брокерской компании купить или продать финансовый инструмент. Различают два основных типа ордеров: рыночный и отложенный. Помимо них существуют специальные ордера Тейк Профит...
 
geratdc_:

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

советник не закрывает позиции - потому что они отсутствуют.
В МТ4 нет позиций - там только ордера: 1) четыре вида отложенных ордеров  2) рыночные или активные ордера
А вот в МТ5 дело обстоит сложнее!  
1) ордера - много разных.
ордер может быть удален сервером по разным причинам:
а) мало денег
б) истек срок действия отложенного ордера
в) ошибки
отложенный ордер может удалить с терминала человек или робот (модно говорить бот)
Если ордер сработает - появляется 2) сделка.
Каждая сделка приводит к появлению, удалению или изменению 3) позиции
На неттинговом счете все сделки суммируются в одну позицию.
На хеджинговом счете позиций может быть много.

Сейчас переписываю робот с MQL-4 на MQL-5  -  понял это на практике

Открытие позиции или вход в рынок — в торговой платформе это можно осуществить путем выставления рыночного ордера, в результате которого заключается сделка. Позиция также может быть открыта и при срабатывании отложенного ордера.

Итого: в МТ4 только ордера, в МТ5 - ордера, сделки, позиции
Совершение сделок - Торговые операции - MetaTrader 5
Совершение сделок - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
Ну как минимум
if((!PipsTrading && op>=TakeProfit) || (PipsTrading && op>=TakeProfit*_Point))
  • op: Профит открытых позиций
  • TakeProfit: Насколько понял профит при котором все закрывается

Тогда возникает вопрос. К чему умножение на _Point? Вполне достаточно

if(/*какое-то свое условие &&*/op>=TakeProfit)

Если тут идет сразу подсчет профита не в pips, а в валюте депозита

op=CalculateProfit();

Это то что сразу бросилось в глаза.

 
Алексей Тарабанов:

Кошмарики... Не надо так много букв. 

Обратитесь к автору. 

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


Как здесь можно сделать переключалку-то?

 
Konstantin Nikitin:
Ну как минимум
  • op: Профит открытых позиций
  • TakeProfit: Насколько понял профит при котором все закрывается

Тогда возникает вопрос. К чему умножение на _Point? Вполне достаточно

Если тут идет сразу подсчет профита не в pips, а в валюте депозита

Это то что сразу бросилось в глаза.

А TakeProfit (тип int) при пипсовой торговле в пунктах, поэтому умножаем на цену 1 пункта.

На форум по теме отписался, потому что сам не справился. Крутил и так и сяк, не хочет советник менять режим в зависимости от этой булевной переменной TrailX, собственно я её потом и удалил из внешних настроек советника. По умолчанию советник сидит в баре до упора (окончания), а а хочется тчобы пользователь решал как ему удобней, поскольку отсидка в баре несколько сбивает Step как я подозреваю, а если сделать так чтобы советник выходил сразу при достижении тейкпрофита, то может ещё Step будет выдерживаться советником согласно настройкам.

 
geratdc_:

А TakeProfit (тип int) при пипсовой торговле в пунктах, поэтому умножаем на цену 1 пункта.

На форум по теме отписался, потому что сам не справился. Крутил и так и сяк, не хочет советник менять режим в зависимости от этой булевной переменной TrailX, собственно я её потом и удалил из внешних настроек советника. По умолчанию советник сидит в баре до упора (окончания), а а хочется тчобы пользователь решал как ему удобней, поскольку отсидка в баре несколько сбивает Step как я подозреваю, а если сделать так чтобы советник выходил сразу при достижении тейкпрофита, то может ещё Step будет выдерживаться советником согласно настройкам.

Тогда наверно так будет правильней

if((!PipsTrading && op>=TakeProfit) || (PipsTrading && op>=TakeProfit*SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE)))
Умножаем на стоимость одного пункта
Причина обращения: