Главная Quikprofit twiiter Quikprofit Rss

QPile робот Ишимоку. Описываем кресты на QPile

Январь 17, 2011 | Нет комментариев

Начнем переводить блок-схему на язык QPile.


Ну что ж наступило время переписать блок-схемы на язык QPlie. В данной статье мы разберем наиболее ответственный блок — торговые сигналы.

Согласно тех.заданию мы имеем следующие торговые сигналы:


ЛОНГ. Вход (бычьи сигналы)

ШОРТ. Вход (медвежьи сигналы)

Сегодня нас будут интересовать кресты:

  • Тенкан/Киджун,
  • Цена/Киджун,
  • Цена/Облако.

Подробно о перекрещении двух линий было рассмотрено в учебном курсе «Торговый робот. Шаг за шагом»

Шаг. 1 Определяемся с набором необходимых данных

Нам понадобятся значения последней и предпоследней свечи (OHLC)  и всех линий индикатора Ишимоку на этих свечках.

Так как нас интересуют полностью закрытые свечи, то в расчет будем брать предпоследнюю(№2) и пред-предпоследнюю (№3).

В итоге (так сказать на выходе) мы должны иметь переменные:

  • значения линий Ишимоку последней закрытой свечи (№2) — IshimokuLast;
  • значения линий Ишимоку предпоследней закрытой свечи (№3) — IshimokuPrev;
  • значения OHLC последней закрытой свечи (№2) — PriceLast;
  • значения OHLC предпоследней закрытой свечи (№3) — PricePrev;

Шаг. 2 Присваиваем значения переменным

Нам понадобятся функции fGetBar и fGetIchimoku

В шапке робота добавляем строку:
INCLUDE fGetIshimoku.qpl, fGetBar.qpl;
То есть шапка выглядит следующим образом:

1
2
3
4
5
PORTFOLIO_EX Ichimoku;
DESCRIPTION Ichimoku;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST ALL_FIRMS;
INCLUDE fGetIchimoku.qpl, fGetBar.qpl;

Также необходимо, лучше сразу, настроить график:

  1. График должен быть открыт;
  2. Таймфрейм графика должен соответствовать указанному в приложении;
  3. График индикатора Ишимоку должен иметь уникальное имя.

Более подробно настройка графика и вопросы присваивания значений переменным рассматривалась в статье «Торговый робот. Шаг 3»

Одна из особенностей языка QPile в том, что чтобы присвоить переменной значение из графика, необходимо сначала данные из графика записать в массив.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
dataIchimokuLAST = fGetIchimoku("SBER03_Ichimoku_15", 2, 15) 'В массив dataIchimokuLAST записываем все значения линий Ишимоку последней закрытой свечи'
	TenkanLast = get_value(dataIchimokuLAST, "Tenkan") +0'TenkanLast присваивается значение линии Тенкан из массива dataIchimokuLAST'
	KijunLast = get_value(dataIchimokuLAST, "Kijun") +0'аналогично'
	SenkouALast = get_value(dataIchimokuLAST, "SenkouA") +0'аналогично'
	SenkouBLast = get_value(dataIchimokuLAST, "SenkouB") +0'аналогично'
	ChinkouLast = get_value(dataIchimokuLAST, "Chinkou") +0'аналогично'
dataIchimokuPREV = fGetIchimoku("SBER03_Ichimoku_15", 3, 15) 'В массив dataIchimokuPREV записываем все значения линий Ишимоку предпоследней закрытой свечи'
	TenkanPrev = get_value(dataIchimokuPREV, "Tenkan") +0
	KijunPrev = get_value(dataIchimokuPREV, "Kijun") +0
	SenkouAPrev = get_value(dataIchimokuPREV, "SenkouA") +0
	SenkouBPrev = get_value(dataIchimokuPREV, "SenkouB") +0
	ChinkouPrev = get_value(dataIchimokuPREV, "Chinkou") +0
dataPriceLast = fGetBar("SBER03", "EQBR", 2, 15) 'В массив dataPriceLast записываем все значения последней закрытой свечи'
	PriceLast_High = get_value(dataPriceLast, "High") +0''
	PriceLast_Low = get_value(dataPriceLast, "Low") +0''
dataPricePrev = fGetBar("SBER03", "EQBR", 3, 15) 'В массив dataPriceLast записываем все значения предпоследней закрытой свечи'
	PricePrev_High = get_value(dataPricePrev, "High")+0
	PricePrev_Low = get_value(dataPricePrev, "Low")+0

Шаг 3. Что есть крест и прорыв

Чтобы дальше переписывать на язык QPile наш алгоритм, просто необходимо определиться с такими понятиями как крест и пересечение. Казалось бы проще не бывает «крест = пересечение линии А линией Б». Но не все так просто, как кажется на первый взгляд.

На графиках крест может выглядеть так:

То есть после пересечения линии обязательно (!) расходятся, а до пересечения могут либо сходиться либо совмещаться друг с другом.

А прорыв ценой облака может иметь виды:

Здесь все гораздо сложнее.  На графике А прорыв выглядит как «Open ниже SenkouA, Close выше SenkouA». На графике В имеем как минимум две подобные свечи. Встает резонный вопрос — в какой момент считать «прорыв» свершившимся?

Как показывает наш опыт, оптимальным вариантом служит условие: «Low предпоследней закрытой свечи (3) ниже границы облака, а Low последней закрытой свечи (2) выше границы облака» - для бычьего (вверх) прорыва и симметрично для медвежьего (вниз) прорыва.

Шаг 4. Описываем кресты и прорывы

Тенкан/Киджун

1
2
3
4
5
6
7
8
'Бычий Крест Тенкан/Киджун'
if (TenkanLast > KijunLast) and (TenkanPrev <= KijunPrev)
	message ("Образовался бычий крест тенкан/киджун", 1) 'Выводим сообщение на экран'
end if
'Медвежий Крест Тенкан/киджун'
if (TenkanLast < KijunLast) and (TenkanPrev >= KijunPrev)
	message ("Образовался медвежий крест тенкан/киджун", 1)
end if

Цена/Киджун

1
2
3
4
5
6
7
8
'Бычий прорыв Цена/Киджун'
if (PriceLast_Low > KijunLast) and (PricePrev_Low <= KijunPrev)
	message ("Образовался бычий прорыв цена/киджун", 1)
end if
'Медвежий прорыв Цена/Киджун'
if (PriceLast_High < KijunLast) and (PricePrev_High >= KijunPrev)
	message ("Образовался медвежий прорыв цена/киджун", 1)
end if

Цена/Облако.
Возникает некоторая сложность в том, что верхней (нижней) границей облака может быть либо СенкоуА, либо СенкоуВ. Вот один из вариантов:

1
2
3
4
5
6
7
8
9
10
11
''Вариант 1. Сенкоу А ниже СенкоуВ, тогда бычьим прорывом будет считаться прорыв СенкоуВ. Поэтому добавлем еще одно условие: СенкоуВ больше СенкоуА
if (SenkouBLast >= SenkouALast) and (PriceLast_Low > SenkouBLast) and (PricePrev_Low <= SenkouBPrev)
	message ("Образовался бычий прорыв цена/облако СенкоуВ", 1)
end if
''Вариант 2. Сенкоу А выше СенкоуВ, тогда бычьим прорывом будет считаться прорыв СенкоуА. Поэтому добавлем еще одно условие: СенкоуА больше СенкоуВ
if (SenkouBLast < SenkouALast) and (PriceLast_Low > SenkouALast) and (PricePrev_Low <= SenkouAPrev)  	message ("Образовался бычий прорыв цена/облако СенкоуA") end if 'Медвежий прорыв Цена/Облако' Аналогично бычьему прорыву. if (SenkouBLast >= SenkouALast) and (PriceLast_High < SenkouALast) and (PricePrev_High >= SenkouAPrev)
	message ("Образовался медвежий прорыв цена/облако СенкоуА", 1)
end if
if (SenkouBLast < SenkouALast) and (PriceLast_High < SenkouBLast) and (PricePrev_High >= SenkouBPrev)
	message ("Образовался медвежий прорыв цена/облако СенкоуВ", 1)
end if

Для описания прорыва облака получился список из 4х операторов if. Это значит, что Quik поочередно будет проверять все 4 if, при том, что два условия (какая из линий выше) повторяется. В таких случаях следует некоторым образом оптимизировать код, а именно объединить условия: сначала определяем верхнюю и нижнею линии облака, а уже затем ищем прорыв. Код изменится на следующий:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
''Оптимизированный код
if (SenkouBLast >= SenkouALast)
	if (PriceLast_Low > SenkouBLast) and (PricePrev_Low <= SenkouBPrev)
		message ("Образовался бычий прорыв цена/облако СенкоуВ", 1)
	end if
	if (PriceLast_High < SenkouALast) and (PricePrev_High >= SenkouAPrev)
		message ("Образовался медвежий прорыв цена/облако СенкоуА", 1)
	end if
else
	if (PriceLast_Low > SenkouALast) and (PricePrev_Low <= SenkouAPrev)
		message ("Образовался бычий прорыв цена/облако СенкоуA", 1)
	end if
	if (PriceLast_High < SenkouBLast) and (PricePrev_High >= SenkouBPrev)
		message ("Образовался медвежий прорыв цена/облако СенкоуВ", 1)
	end if
end if

Шаг 5. Добавляем журнал

О том как делать журнал и следить за действиями торгового робота подробно описано в статье «Что он там делает?» Следим за работой робота.
Мы воспользуемся функцией, описанной в данной статье. (Не забудьте ее прикрепить! и создать папку c:/logs — именно в нее будут записываться файл журнала)
Какая же информация нас интересует? На данном этапе, нас будет интересовать факты и правильность определения крестов, а также исходные данные для данного определения (данные переменных).
Чтобы в журнале отображался факт формирования креста, достаточно добавить после каждой строки message (в каждом операторе If) строку вида:

1
fDebugLog ("Образовался медвежий крест тенкан/киджун")

Значения переменных можно просто перечислить через запятую, но тогда «чтение» такого журнала будет неудобным для человека. Поэтому предлагаем вам такой вариант ведения журнала:
Функцию записи значений переменных выставляем непосредственно перед группой операторов If и указываем лишь те переменные, которые участвуют в операторе If. Такой журнал будет легко восприниматься, так как он логичен: значения переменных и результат (если крест или прорыв имеет место быть). Например для креста Тенкан/Киджун:

1
2
fDebugLog ("TenkanLast	" & "KijunLast	" & "TenkanPrev	" & "KijunPrev	")
fDebugLog (TenkanLast & "	" &  KijunLast & "	" & TenkanPrev & "	" &  KijunPrev)

Шаг. 6 Выводим информацию на экран

На данном этапе разработки робота нам важно проверить правильность получения данных и их первичной обработки. Поэтому в таблицу на экран выведем все переменные и дополнительный столбец «Событие», в котором, при обнаружении креста или прорыва, будет выводится информация об этом.
О том, как вывести значения переменных на экран уже было неоднократно рассказано в учебном курсе «Торговый робот. Шаг за шагом», поэтому останавливаться на этом не будем. Зато подробно рассмотрим столбец «Событие».
QPile позволяет нам выводить на экран либо переменные либо просто текст, так что необходимо ввести переменную Sobitie и в каждом операторе if после функции fDebugLog присваивать данной переменной в качестве значения текст вида «Образовался медвежий крест тенкан/киджун».

Пример для креста Тенкан/Киджун

1
2
3
4
5
6
7
8
9
10
11
12
13
14
fDebugLog ("TenkanLast	" & "KijunLast	" & "TenkanPrev	" & "KijunPrev	")
fDebugLog (TenkanLast & "	" &  KijunLast & "	" & TenkanPrev & "	" &  KijunPrev)
'Бычий Крест Тенкан/Киджун'
if (TenkanLast > KijunLast) and (TenkanPrev <= KijunPrev)
	message ("Образовался медвежий крест тенкан/киджун", 1) 'Выводим сообщение на экран'
	fDebugLog ("Образовался медвежий крест тенкан/киджун")
	sobitie = "Образовался медвежий крест тенкан/киджун"
end if
'Медвежий Крест Тенкан/киджун'
if (TenkanLast < KijunLast) and (TenkanPrev >= KijunPrev)
	message ("Образовался медвежий крест тенкан/киджун", 1)
	fDebugLog ("Образовался медвежий крест тенкан/киджун")
	sobitie = "Образовался медвежий крест тенкан/киджун"
end if

Заключительное слово.
На данный момент это все, что мы хотели вам рассказать.

Полный текст кода урока можно как всегда бесплатно скачать.

Понравилось? Следите за обновлениями по RSS! Также можете следить за обновлениями в Twitter.
* * * * * 6 проголосовавших

Комментарии

Оставить комментарий





Поля помеченные (*) обязательны к заполнению

Страница 1 из 11
  • Меню

  • Облако тегов

  • Рубрики

  • Для пользователя