Автор |
Сообщение |
Денис
Зарегистрирован: 05.04.2009
Сообщения: 9
|
Хочу раскрсить гистрограмму MACD, в зависимости от роста или падения.... вопрос конечно простой, но начинающему ничего не понятно, хотя имеют опыт примитивного программирования и логическое мышление.... Подскажите пожалуйста |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Макди гистограмму можно вычислить так
Код: |
r1 = Param( "Fast avg", 12, 2, 200, 1 );
r2 = Param( "Slow avg", 26, 2, 200, 1 );
r3 = Param( "Signal avg", 9, 2, 200, 1 );
ml = MACD(r1, r2);
sl = Signal(r1,r2,r3);
MACDHistogram = ml-sl;
|
Дальше вычислим её цвет
Код: |
MACDHistogramColor = IIf(MACDHistogram > Ref(MACDHistogram, -1), colorGreen, colorRed);
// если текущее значение MACDHistogram больше чем предыдущее, то colorGreen
// в противном случае colorRed
|
Вот собственно и все. Осталось вывести на график
Код: |
Plot( MACDHistogram, "MACD Histogram", MACDHistogramColor, styleHistogram );
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Денис
Зарегистрирован: 05.04.2009
Сообщения: 9
|
Огромное спасибо Олег У меня есть еще кое какие вопросы, но боюсь не корректно будет тебя грузить примитивными вопросами.... если у тебя есть возможность выложи пожалуйста простейшие коды с комментариями, что бы иметь возможность самостоятельно разобраться.... Заранее благодарю |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Не стесняйся. Спрашивай. Готовить простые коды да еще и с коментами это сложнее.
В хелпере в коментах к некоторым функциям есть простые примеры. Можно смотреть их. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Денис
Зарегистрирован: 05.04.2009
Сообщения: 9
|
Еще раз добрый день, Олег! Спасибо за твои ответы на вопросы Правда чем дальше в лес, тем больше их становится
В связи с этим еще один вопрос: задумал я написать систему в кратце опишу ее:
Система анализирует цену трех таймфреймах (дневной, часовик и 15-ти минутка).... на дневном мы выяснем куда направлено гистограмма MACD (если вверх, то будем покупать, если вниз, то - продавать).... на часовом выясняется наиболее выгодный момент сделки.... если цена выше EMA20, то продаем, если ниже то покупаем.... ну а сама сделка совершается на 15-ти минутке сигналом ожет быть пересечение сигнальной линии и MACD или же пресечение ценой EMA 20..... Это еще предстоит выяснить, что же лучше....
Код я написал следующий:
// вычисляем направление движения цены на дневном графике по направлению Гистограммы MACD
TimeFrameSet(inDaily); // меняем таймфрейм на дневной
r1 = Param( "Fast avg", 12, 2, 200, 1 );
r2 = Param( "Slow avg", 26, 2, 200, 1 );
r3 = Param( "Signal avg", 9, 2, 200, 1 );
ml = MACD(r1, r2);
sl = Signal(r1,r2,r3);
MACDHistogram = ml-sl;
Lnapravl = IIf(MACDHistogram > Ref(MACDHistogram, -1), 1, 0);
// если текущее значение MACDHistogram на дневных графиках больше чем предыдущее, Lnapravl = 1 (лонг)
// в противном случае Lnapravl = 0 (шорт) (первое условия для выявления направления открываемой позиции
// на самом длинном интервале)
TimeFrameRestore(); // восстанавливаем оригинальный период
// вычисляем возможность входа в сделку на часовом графике по 21-ти периодной EMA
TimeFrameSet (inHourly); // меняем таймфрейм на часовой
Mnapravl = IIf ((Close < EMA (Close , 20)), 1,0); // если цена ниже 20ти периодной то можно открывать лонг
// если же выше, то открывается шорт
TimeFrameRestore(); // восстанавливаем оригинальный период
// теперь ведется работа на самом коротком таймфрейме - 15 минуи, при пересечении ценой EMA 55 вверх - покупка,
// вниз - продажа
TimeFrameSet(in15Minute); // меняем таймфрейм на 15-ти минутный
//Snapravl = IIf ((Close > EMA (Close , 20)), 1,0); // если цена поднимается выше 55-ти периодной, то покупаем,
// опускается ниже 55-ти периодной - продаем
TimeFrameRestore(); // восстанавливаем оригинальный период
// теперь формируем приказ об открытии длинной позиции и о ее закрытии на 5ти минутках
// открытие лонга
Buy = ((Lnapravl > 0) AND (Mnapravl > 0) AND Cross( Close, EMA(Close, 60)));
// закрытие лонга
Sell = Cross(EMA(Close, 60), Close);
// формируем приказ об открытии и закрытии коротких позиций
// открытие шорта
Short = ((Lnapravl < 1) AND (Mnapravl < 1) AND (Cross(EMA(Close, 60), Close)));
Cover = Cross( Close, EMA(Close, 60));
Но вот проблема Анализатор не хочет анализировать весь период (а он у меня с 2004 года, берет в анализ только март 2009), да и потом я не могу точно понять правильно ли прошел тест системы, работает ли она так как я задумывал?....
Подскажи пожалуйста где я напортачил? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Денис писал(а): |
Подскажи пожалуйста где я напортачил? |
Стратегия работает неправильно. Напортачил в том, что не использовал TimeFrameExpand()
Коротенько объясню. Когда сжимаешь фрейм свечек более высокого фрейма получается как бы меньше и они все сгруппированы к концу чарта. Соответственно так же выглядят и построенные на них мувинги и др. индикаторы. Чтобы растянуть эти графики до исходного фрейма и используется TimeFrameExpand
Вот два кода
Код: |
TimeFrameSet(inHourly);
HMA = MA(C, 20);
TimeFrameRestore();
HMA = TimeFrameExpand(HMA, inHourly);
Plot(C, "", colorBlack, styleCandle);
Plot(HMA, "HMA20", colorRed);
|
На картинке сверху
Код: |
TimeFrameSet(inHourly);
HMA = MA(C, 20);
TimeFrameRestore();
Plot(C, "", colorBlack, styleCandle);
Plot(HMA, "HMA20", colorRed);
|
На картинке результат снизу.
Надеюсь понятно. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Денис
Зарегистрирован: 05.04.2009
Сообщения: 9
|
Понятно.... да не все ладно, попробуем сделать все по шагам.... авось до меня дойдет хоть что то
1. В AmiBroker я закрузил 5-ти минтуки Лукойла.
2. Сначала я хочу проанализировать Гистограмму MACD на дневных данных (растет - значит можно покупать, падает - значит можно продавать).
Вот такой код получился (с учетом прошлых замечаний):
// вычисляем направление движения цены на дневном графике по направлению Гистограммы MACD
TimeFrameSet(inDaily); // меняем таймфрейм на дневной
r1 = Param( "Fast avg", 12, 2, 200, 1 );
r2 = Param( "Slow avg", 26, 2, 200, 1 );
r3 = Param( "Signal avg", 9, 2, 200, 1 );
ml = MACD(r1, r2);
sl = Signal(r1,r2,r3);
MACDHistogram = ml-sl;
DMACDHistogram = MACDHistogram ;
TimeFrameRestore(); // восстанавливаем оригинальный период
DMACDHistogram = TimeFrameExpand(DMACDHistogram, inDaily);
Lnapravl = IIf(DMACDHistogram > Ref(DMACDHistogram, -1), 1, 0);
т.е. теперь у меня есть массив Lnapravl, который состоит из нулей и едениц....
В принципе (как я понимаю) массив этот был вычислен на днеынх данных и может применяться теперь на любом временном интервале. Но при тестировании:
Buy = Lnapravl > 0 ;
Sell = Lnapravl < 1 ;
Short = Sell;
Cover = Buy;
Если в настройках тестера (в параметрах) устанвалением "тестирование на днях", то все получается логично, все правильно.... но как только ставим часови или другой какой нить период, то получается белеберда....
А суть то самой системы заключаетс в том что бы проанализировать Гистограмму MACD на дневных данных, а потом продолжить анализ на более коротких интервалах (часовиках, 15-ти минутках)..... Вобще бюсь я головой об этот AmiBroker в воз и ныне там..... только шишек набил |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Вот эту строку
Код: |
Lnapravl = IIf(DMACDHistogram > Ref(DMACDHistogram, -1), 1, 0);
|
надо писать до TimeFrameExpand
А то получается, что сигнал есть только на первом баре дня потому, что после экспанда все значения DMACDHistogram внутри дня равны между собой. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Денис
Зарегистрирован: 05.04.2009
Сообщения: 9
|
000 писал(а): |
Вот эту строку
Код: |
Lnapravl = IIf(DMACDHistogram > Ref(DMACDHistogram, -1), 1, 0);
|
надо писать до TimeFrameExpand
А то получается, что сигнал есть только на первом баре дня потому, что после экспанда все значения DMACDHistogram внутри дня равны между собой. |
Ура заработало!!!! Хоть что то у мен получилось
Да вот только правильно и логически верно все работает только в том случае, если Backtester settings на вкладке General параметр Periodicity установить Daily.
Если же установить часы, 15-ти минутки или 5-ти минутки, то получается белибирда..... хотя данные импортированы 5-ти минутные..... Так и должно быть или я опять что то не то натворил? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Денис писал(а): |
000 писал(а): |
Вот эту строку
Код: |
Lnapravl = IIf(DMACDHistogram > Ref(DMACDHistogram, -1), 1, 0);
|
надо писать до TimeFrameExpand
А то получается, что сигнал есть только на первом баре дня потому, что после экспанда все значения DMACDHistogram внутри дня равны между собой. |
Ура заработало!!!! Хоть что то у мен получилось
Да вот только правильно и логически верно все работает только в том случае, если Backtester settings на вкладке General параметр Periodicity установить Daily.
Если же установить часы, 15-ти минутки или 5-ти минутки, то получается белибирда..... хотя данные импортированы 5-ти минутные..... Так и должно быть или я опять что то не то натворил? |
Если самый маленький используемый фрейм будет 5 мин, то и в настройках тестера надо ставить 5 min
Код я бы написал так. Правда не проверял.
Код: |
r1 = Param( "Fast avg", 12, 2, 200, 1 );
r2 = Param( "Slow avg", 26, 2, 200, 1 );
r3 = Param( "Signal avg", 9, 2, 200, 1 );
TimeFrameSet(inDaily); // меняем таймфрейм на дневной
ml = MACD(r1, r2);
sl = Signal(r1,r2,r3);
MACDHistogram = ml-sl;
Lnapravl = MACDHistogram > Ref(MACDHistogram, -1);
/* если текущее значение MACDHistogram на дневных графиках больше чем предыдущее (растет),
Lnapravl == 1 (лонг)
в противном случае Lnapravl == 0 (шорт) (первое условия для выявления направления
открываемой позиции на самом длинном интервале) */
TimeFrameRestore(); // восстанавливаем оригинальный период
Lnapravl = TimeFrameExpand(Lnapravl, inDaily);
TimeFrameSet(inHourly); // меняем таймфрейм на часовой
Mnapravl = Close < EMA(Close, 20);
/* если цена ниже 20ти периодной то можно открывать лонг
если же выше, то открывается шорт */
TimeFrameRestore(); // восстанавливаем оригинальный период
Mnapravl = TimeFrameExpand(Mnapravl, inHourly);
// теперь формируем приказ об открытии длинной позиции и о ее закрытии на 5ти минутках
// открытие лонга
Buy = Lnapravl AND Mnapravl AND Cross( Close, EMA(Close, 60));
// закрытие лонга
Sell = Cross(EMA(Close, 60), Close);
// формируем приказ об открытии и закрытии коротких позиций
Short = Lnapravl == 0 AND Mnapravl == 0 AND Cross(EMA(Close, 60), Close);
Cover = Cross( Close, EMA(Close, 60));
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Денис
Зарегистрирован: 05.04.2009
Сообщения: 9
|
000 писал(а): |
Денис писал(а): |
000 писал(а): |
Вот эту строку
Код: |
Lnapravl = IIf(DMACDHistogram > Ref(DMACDHistogram, -1), 1, 0);
|
надо писать до TimeFrameExpand
А то получается, что сигнал есть только на первом баре дня потому, что после экспанда все значения DMACDHistogram внутри дня равны между собой. |
Ура заработало!!!! Хоть что то у мен получилось
Да вот только правильно и логически верно все работает только в том случае, если Backtester settings на вкладке General параметр Periodicity установить Daily.
Если же установить часы, 15-ти минутки или 5-ти минутки, то получается белибирда..... хотя данные импортированы 5-ти минутные..... Так и должно быть или я опять что то не то натворил? |
Если самый маленький используемый фрейм будет 5 мин, то и в настройках тестера надо ставить 5 min
Код я бы написал так. Правда не проверял.
Код: |
r1 = Param( "Fast avg", 12, 2, 200, 1 );
r2 = Param( "Slow avg", 26, 2, 200, 1 );
r3 = Param( "Signal avg", 9, 2, 200, 1 );
TimeFrameSet(inDaily); // меняем таймфрейм на дневной
ml = MACD(r1, r2);
sl = Signal(r1,r2,r3);
MACDHistogram = ml-sl;
Lnapravl = MACDHistogram > Ref(MACDHistogram, -1);
/* если текущее значение MACDHistogram на дневных графиках больше чем предыдущее (растет),
Lnapravl == 1 (лонг)
в противном случае Lnapravl == 0 (шорт) (первое условия для выявления направления
открываемой позиции на самом длинном интервале) */
TimeFrameRestore(); // восстанавливаем оригинальный период
Lnapravl = TimeFrameExpand(Lnapravl, inDaily);
TimeFrameSet(inHourly); // меняем таймфрейм на часовой
Mnapravl = Close < EMA(Close, 20);
/* если цена ниже 20ти периодной то можно открывать лонг
если же выше, то открывается шорт */
TimeFrameRestore(); // восстанавливаем оригинальный период
Mnapravl = TimeFrameExpand(Mnapravl, inHourly);
// теперь формируем приказ об открытии длинной позиции и о ее закрытии на 5ти минутках
// открытие лонга
Buy = Lnapravl AND Mnapravl AND Cross( Close, EMA(Close, 60));
// закрытие лонга
Sell = Cross(EMA(Close, 60), Close);
// формируем приказ об открытии и закрытии коротких позиций
Short = Lnapravl == 0 AND Mnapravl == 0 AND Cross(EMA(Close, 60), Close);
Cover = Cross( Close, EMA(Close, 60));
|
|
Посмотрел и попробовал протестить, тестил на 5 ти минтуках как ты и сказал.... но вот результат меня огорчил..... на прилагаемом рисунке крысным обведены ключивые моменты, что бы было проще понять о чем я говорю.... Открыт дневной таймфрейм, что бы было нагляднее
И так, посмотрим на второе число.... Гистограмма MACD 2-го числа выше, чем первого следовательно согласно согласно правилам нашей системе (если сегодняшняя гистограмма MACD выше вчерашней, то может быть отрыт ТОЛЬКО лонг), но в списке сделок система 2-го чила дает нам пять сигналов на короткую продажу....
Получается, что что-то работает не так
Я уж даже не знаю в чем дело |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Построй в виде индикатора и посмотри
Код: |
r1 = Param( "Fast avg", 12, 2, 200, 1 );
r2 = Param( "Slow avg", 26, 2, 200, 1 );
r3 = Param( "Signal avg", 9, 2, 200, 1 );
TimeFrameSet(inDaily); // меняем таймфрейм на дневной
ml = MACD(r1, r2);
sl = Signal(r1,r2,r3);
MACDHistogram = ml-sl;
Lnapravl = MACDHistogram > Ref(MACDHistogram, -1);
/* если текущее значение MACDHistogram на дневных графиках больше чем предыдущее (растет),
Lnapravl == 1 (лонг)
в противном случае Lnapravl == 0 (шорт) (первое условия для выявления направления
открываемой позиции на самом длинном интервале) */
TimeFrameRestore(); // восстанавливаем оригинальный период
MACDHistogram = TimeFrameExpand(MACDHistogram, inDaily);
Lnapravl = TimeFrameExpand(Lnapravl, inDaily);
Plot(MACDHistogram, "MACDHistogram", colorRed, styleHistogram);
|
Имей ввиду, что внутри дня показывается вчерашнее значение MACD и соответственно разрешение на вход тоже вчерашнее т.к. сегодня (до закрытия) еще не известна цена закрытия и соответственно не известно значение MACD |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Денис
Зарегистрирован: 05.04.2009
Сообщения: 9
|
Олег, привет! Слушай, у меня почему то Амиброкер не рисует стрелки на графике, когда в тестере жмешь правой мышкой на а поле результаты на одну из сделок..... не подскажешь в чем может быть дело? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Денис
Зарегистрирован: 05.04.2009
Сообщения: 9
|
Спасибо, Олег! Действительно в этом была проблема. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
|
|
Следующая тема
Предыдущая тема
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы не можете скачивать файлы
|
|