Как торговать в промежутке времени?

Программирование прибыли: от азов к секретам мастерства. Читайте, спрашивайте, делитесь опытом.
Бонус за сообщение 0.5$
Ответственный Модератор - Haos

Как торговать в промежутке времени?

Сообщение Haos » 26 янв 2016, 16:42

Часто в советнике возникает необходимость ограничить торговлю определенным промежутком времени. Рассмотрим для начала промежуток времени с точностью до часа.
Для этого используем функцию f_InDiapazon().

Алгоритм действий:
1. Создать новый советник
2. Скопировать код функции f_InDiapazon() и вставить после функции OnTick(), т.е. в самый конец кода.
3. Создать две переменные, определяющие час начала и конец интервала для торговли, которые можно будет редактировать при запуске советника во вкладке "Входные параметры" свойств советника.
Код: выделить все
input int intTradeH1  = 10;    // Час начала торговли (0-23)
input int intTradeH2  = 22;    // Час конца торговли (0-23)

В коде советника эти строки записываются перед функцией OnInit().
4. В теле функции OnTick() ввести следующий код:
Код: выделить все
   bool     bolH = false;       
   int      intHour = TimeHour(TimeCurrent()); 
   bolH = f_InDiapazon(intTradeH1, intTradeH2, intHour);
   Comment("\n", "Находится ли данный час в интервале для торговли: ", bolH);

Переменная bolH определяет находится ли данный час в интервале для торговли. Переменной intHour присваивается значение текущего часа. Присваиваем переменной bolH значение функции f_InDiapazon(), в качестве параметров функции указав начальный час и конечный час диапазона, а также величину текущего часа. Выведем через функцию Comment() в качестве комментария в левом верхнем углу графика расчетное значение переменной bolH.
5. Откомпилируем советник.
Советник готов к использованию. Запустив его на какой-нибудь паре, мы получим сообщение о наличие нахождения в торговом диапазоне времени (true - да, false - нет).
Код советника:
Код: выделить все
//+------------------------------------------------------------------+
//|                                                EA-Example-03.mq4 |
//|                                                             Haos |
//|                                       http://www.investforum.ru/forum/ |
//+------------------------------------------------------------------+
#property copyright "Haos"
#property link      "http://www.investforum.ru/forum/"
#property version   "1.00"
#property strict

//******************************************************************************************

input int intTradeH1  = 10;    // Час начала торговли (0-23)
input int intTradeH2  = 22;    // Час конца торговли (0-23)

//******************************************************************************************

int OnInit()
{
//---

//---
return(INIT_SUCCEEDED);
}

//******************************************************************************************

void OnDeinit(const int reason)
{
//---
   
}

//******************************************************************************************

void OnTick()
{
   bool     bolH = false;       // находится ли данный час в интервале для торговли
   int      intHour = TimeHour(TimeCurrent()); 
   bolH = f_InDiapazon(intTradeH1, intTradeH2, intHour);

   Comment("\n", "Находится ли данный час в интервале для торговли: ", bolH);
}

//******************************************************************************************

bool f_InDiapazon(int h1, int h2, int h)
{
// Функция анализирует находится ли указанный час в диапазоне (между h1 и h2)
   if(h >= h1 && h < h2) return(true);
   else if(h2 < h1)
   {
      if((h >= h1 && h < 23) || (h >= 0 && h < h1)) return(true);
   }
   
return(false);
}

//*********************************************************************************************
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Re: Как торговать в промежутке времени?

Сообщение Haos » 17 июл 2016, 11:07

В продолжении темы, рассмотрим такой случай в написании кода, когда пользователь определяет торговый диапазон с точностью до минуты и этот интервал может занимать несколько суток и более.
В таком случае задание интервала может определяется через две строковые переменные (назовем их, к примеру, strTradeT1 и strTradeT2). Им присваивается строка даты в формате yyyy.mm.dd hh:mi, где
yyyy - год;
mm - месяц;
dd - день;
hh:mi - час и минута.
Следует обратить внимание, что после dd нужно ставить пробел. Ниже приведен пример присвоения значений времени границам торгового диапазона:
Код: выделить все
input string   strTradeT1  = "2016.06.08 00:00";   // Время начала торговли (yyyy.mm.dd hh:mi)
input string   strTradeT2  = "2016.06.25 20:53";   // Время конца  торговли (yyyy.mm.dd hh:mi)


Далее в коде советника разработчик осуществляет конвертацию строковых значений торгового диапазона в формат даты посредством ввода переменных типа даты и применения зарезервированной в MQL функции StringToTime().
Далее в приведенном примере переменные типа даты обозначены как dtmT1 и dtmT2.
Код: выделить все
   
datetime dtmT1 = StringToTime(strTradeT1); // время начала торговли (начало торг. диапазона)
datetime dtmT2 = StringToTime(strTradeT2); // время конца  торговли (начало торг. диапазона)

Чтобы понять находится ли текущее время в торговом диапазоне необходимо его определить. Это делается с помощью стандартной функции TimeCurrent(). В примере ниже переменной dtmT присваивается значение текущего времени.
Код: выделить все
datetime dtmT = TimeCurrent(); // текущее время


Далее остается написать функцию, которая и осуществляет фактическую проверку текущего времени на принадлежность торговому диапазону времени. Ниже представлен код такой функции:
Код: выделить все
bool f_InDiapazonT(datetime t1, datetime t2, datetime t)
{
/*
   Функция анализирует находится ли указанное время в диапазоне (между t1 и t2)
*/
   if(t >= t1 && t <= t2) return(true);
 
return(false);
}

В функцию передаются три параметра: время начала, конца торгового диапазона и текущее время. Если оно принадлежит торговому диапазону времени, то функция возвращает true (истина), иначе - false (ложь).
Далее в коде разработчик вводит условие выбора "если - то" в качестве проверки на принадлежность текущего времени торговому диапазону времени и осуществляет программирование необходимых операций.
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Как торговать в промежутке времени?

Сообщение Torin » 18 июл 2016, 12:32

Скажите, а что будет, если пользователь неправильно введет дату во входных параметрах советника? Как понять не произошла ли ошибка при вводе?
Аватар пользователя
Torin
 
Сообщений: 792
Зарегистрирован: 21 янв 2016, 11:26
Средств на руках: 394.64 Доллар
Награды: 1
Ветеран I (1)
Группа: Базовая
Благодарил (а): 156 раз.
Поблагодарили: 162 раз.

Re: Как торговать в промежутке времени?

Сообщение Haos » 18 июл 2016, 15:34

Torin писал(а):Скажите, а что будет, если пользователь неправильно введет дату во входных параметрах советника? Как понять не произошла ли ошибка при вводе?

Поэтому нужно всегда в коде делать контроль за вводимыми ользователем значениями пееменных. Также ив качестве компентария выводить на экран то, чему равны эти значения.
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Как торговать в промежутке времени?

Сообщение Kalkin » 18 июл 2016, 15:54

Torin писал(а):Скажите, а что будет, если пользователь неправильно введет дату во входных параметрах советника? Как понять не произошла ли ошибка при вводе?

Зачастую код, реализующий "защиту от дурака" по своему объему превосходит сам код непосредственно нужного алгоритма. Здесь нет смысла рассматривать реакцию на нестандартный ввод пользователем данных, так как задача совсем другая - показать принцип работы на промежутке времени.
Аватар пользователя
Kalkin
 
Сообщений: 1589
Зарегистрирован: 05 мар 2015, 06:51
Средств на руках: 108.80 Доллар
Награды: 2
Ветеран I (1) Медаль за научный вклад (1)
Группа: Базовая
Благодарил (а): 633 раз.
Поблагодарили: 1190 раз.
Ace Register Votive

Как торговать в промежутке времени?

Сообщение ВЯЧЕСЛАВПЕТРОВ » 18 июн 2017, 08:54

Как меня достала пятница когда нужно закрывать часть ордеров или все в 23.40. Всегда хочется спать . На базе вашей информации написал дополнение к советнику. Чтобы он закрывал ордера или все ордера в промежутке 20 минут при наличии небольшого профита. Спасибо.
Возник вопрос. Можно в коде поменять string на datetime,а то вводить не удобно можно запутаться.
Код: выделить все
nput string   strTradeT1  = "2016.06.08 00:00";   // Время начала торговли (yyyy.mm.dd hh:mi)
input string   strTradeT2  = "2016.06.25 20:53";   // Время конца  торговли (yyyy.mm.dd hh:mi)
Аватар пользователя
ВЯЧЕСЛАВПЕТРОВ
 
Сообщений: 1522
Зарегистрирован: 06 сен 2016, 21:28
Средств на руках: 90.40 Доллар
Награды: 2
Ветеран I (1) Медаль за эрудицию (1)
Группа: Базовая
Благодарил (а): 3574 раз.
Поблагодарили: 434 раз.
Автор Вячеслав Петров. Возьму капитал или счет в управление. В лс.
Мониторинг трех счетной системы. Первый.Второй. Третий.
Четвертый.

Как торговать в промежутке времени?

Сообщение ВЯЧЕСЛАВПЕТРОВ » 20 июн 2017, 17:01

Вопрос как написать код который будет производить операцию через определенный промежуток времени .
Например через одну минуту, через пять минут, через 15 и так далее. Исключая работу в субботу и воскресение.
Аватар пользователя
ВЯЧЕСЛАВПЕТРОВ
 
Сообщений: 1522
Зарегистрирован: 06 сен 2016, 21:28
Средств на руках: 90.40 Доллар
Награды: 2
Ветеран I (1) Медаль за эрудицию (1)
Группа: Базовая
Благодарил (а): 3574 раз.
Поблагодарили: 434 раз.
Автор Вячеслав Петров. Возьму капитал или счет в управление. В лс.
Мониторинг трех счетной системы. Первый.Второй. Третий.
Четвертый.

Re: Как торговать в промежутке времени?

Сообщение Haos » 20 июн 2017, 18:28

ВЯЧЕСЛАВПЕТРОВ писал(а):Как меня достала пятница когда нужно закрывать часть ордеров или все в 23.40. Всегда хочется спать . На базе вашей информации написал дополнение к советнику. Чтобы он закрывал ордера или все ордера в промежутке 20 минут при наличии небольшого профита. Спасибо.

Вариантов несколько.
Если у Вас есть торговый интервал и нужно чтобы в Пт закрыты были позы вне его, то ставите правую границу интервала за минут 20 до конца сессии и далее условие:
Если не торговый интервал И Если Пт И Профит у открытых поз больше нуля, то Закрыть позиции.
Кодом надо пояснять или сами доботаете?

ВЯЧЕСЛАВПЕТРОВ писал(а):Возник вопрос. Можно в коде поменять string на datetime,а то вводить не удобно можно запутаться.
Код: выделить все
nput string   strTradeT1  = "2016.06.08 00:00";   // Время начала торговли (yyyy.mm.dd hh:mi)
input string   strTradeT2  = "2016.06.25 20:53";   // Время конца  торговли (yyyy.mm.dd hh:mi)

Внешние переменные делаете как типа datetime и - вперед!
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Как торговать в промежутке времени?

Сообщение ВЯЧЕСЛАВПЕТРОВ » 20 июн 2017, 18:32

Haos писал(а):
ВЯЧЕСЛАВПЕТРОВ писал(а):Как меня достала пятница когда нужно закрывать часть ордеров или все в 23.40. Всегда хочется спать . На базе вашей информации написал дополнение к советнику. Чтобы он закрывал ордера или все ордера в промежутке 20 минут при наличии небольшого профита. Спасибо.

Вариантов несколько.
Если у Вас есть торговый интервал и нужно чтобы в Пт закрыты были позы вне его, то ставите правую границу интервала за минут 20 до конца сессии и далее условие:
Если не торговый интервал И Если Пт И Профит у открытых поз больше нуля, то Закрыть позиции.
Кодом надо пояснять или сами доботаете?

ВЯЧЕСЛАВПЕТРОВ писал(а):Возник вопрос. Можно в коде поменять string на datetime,а то вводить не удобно можно запутаться.
Код: выделить все
nput string   strTradeT1  = "2016.06.08 00:00";   // Время начала торговли (yyyy.mm.dd hh:mi)
input string   strTradeT2  = "2016.06.25 20:53";   // Время конца  торговли (yyyy.mm.dd hh:mi)

Внешние переменные делаете как типа datetime и - вперед!

Спасибо с пятничным кодом я разобрался. Сейчас тестирую.
Аватар пользователя
ВЯЧЕСЛАВПЕТРОВ
 
Сообщений: 1522
Зарегистрирован: 06 сен 2016, 21:28
Средств на руках: 90.40 Доллар
Награды: 2
Ветеран I (1) Медаль за эрудицию (1)
Группа: Базовая
Благодарил (а): 3574 раз.
Поблагодарили: 434 раз.
Автор Вячеслав Петров. Возьму капитал или счет в управление. В лс.
Мониторинг трех счетной системы. Первый.Второй. Третий.
Четвертый.

Re: Как торговать в промежутке времени?

Сообщение Haos » 20 июн 2017, 18:37

ВЯЧЕСЛАВПЕТРОВ писал(а):Вопрос как написать код который будет производить операцию через определенный промежуток времени .
Например через одну минуту, через пять минут, через 15 и так далее. Исключая работу в субботу и воскресение.

Скорее всего OnTimer() покрутите. В инете есть примеры его применения на сайте https://www.mql4.com/ru
Сам я с этим еще не сталкивался.
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.


Вернуться в MQL – теория и практика

Кто сейчас на форуме?

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 62

Права доступа к форуму

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения