Список форумов AmiSite.ru AmiSite.ru
Форум по Ами
 FAQ  •  Поиск  •  Пользователи  •  Группы   •  Регистрация  •  Профиль  •  Войти и проверить личные сообщения  •  Вход
 Как раскрасить гистограмму MACD, подскажите пожалуйста? Следующая тема
Предыдущая тема
Начать новую тему  Ответить на тему
Автор Сообщение
Денис



Зарегистрирован: 05.04.2009
Сообщения: 9

СообщениеДобавлено: Вс Апр 05, 2009 12:00 pm Ответить с цитатой Вернуться к началу

Хочу раскрсить гистрограмму MACD, в зависимости от роста или падения.... вопрос конечно простой, но начинающему ничего не понятно, хотя имеют опыт примитивного программирования и логическое мышление.... Подскажите пожалуйста Embarassed
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Вс Апр 05, 2009 4:20 pm Ответить с цитатой Вернуться к началу

Макди гистограмму можно вычислить так
Код:

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

СообщениеДобавлено: Вс Апр 05, 2009 8:19 pm Ответить с цитатой Вернуться к началу

Огромное спасибо ОлегSmile У меня есть еще кое какие вопросы, но боюсь не корректно будет тебя грузить примитивными вопросами.... если у тебя есть возможность выложи пожалуйста простейшие коды с комментариями, что бы иметь возможность самостоятельно разобраться.... Заранее благодарюSmile
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Вс Апр 05, 2009 9:28 pm Ответить с цитатой Вернуться к началу

Не стесняйся. Спрашивай. Готовить простые коды да еще и с коментами это сложнее. Smile
В хелпере в коментах к некоторым функциям есть простые примеры. Можно смотреть их.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Денис



Зарегистрирован: 05.04.2009
Сообщения: 9

СообщениеДобавлено: Пн Апр 06, 2009 4:47 pm Ответить с цитатой Вернуться к началу

Еще раз добрый день, Олег! Спасибо за твои ответы на вопросыSmile Правда чем дальше в лес, тем больше их становитсяSmile

В связи с этим еще один вопрос: задумал я написать систему в кратце опишу ее:
Система анализирует цену трех таймфреймах (дневной, часовик и 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

СообщениеДобавлено: Пн Апр 06, 2009 10:24 pm Ответить с цитатой Вернуться к началу

Денис писал(а):


Подскажи пожалуйста где я напортачил?

Стратегия работает неправильно. Напортачил в том, что не использовал 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

СообщениеДобавлено: Вт Апр 07, 2009 12:42 pm Ответить с цитатой Вернуться к началу

Понятно.... да не всеSad ладно, попробуем сделать все по шагам.... авось до меня дойдет хоть что тоSmile

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 в воз и ныне там..... только шишек набилSmile
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Вт Апр 07, 2009 1:08 pm Ответить с цитатой Вернуться к началу

Вот эту строку
Код:

Lnapravl = IIf(DMACDHistogram > Ref(DMACDHistogram, -1), 1, 0);

надо писать до TimeFrameExpand
А то получается, что сигнал есть только на первом баре дня потому, что после экспанда все значения DMACDHistogram внутри дня равны между собой. Smile

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Денис



Зарегистрирован: 05.04.2009
Сообщения: 9

СообщениеДобавлено: Вт Апр 07, 2009 7:04 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Вот эту строку
Код:

Lnapravl = IIf(DMACDHistogram > Ref(DMACDHistogram, -1), 1, 0);

надо писать до TimeFrameExpand
А то получается, что сигнал есть только на первом баре дня потому, что после экспанда все значения DMACDHistogram внутри дня равны между собой. Smile




Ура заработало!!!! Хоть что то у мен получилосьSmile

Да вот только правильно и логически верно все работает только в том случае, если Backtester settings на вкладке General параметр Periodicity установить Daily.
Если же установить часы, 15-ти минутки или 5-ти минутки, то получается белибирда..... хотя данные импортированы 5-ти минутные..... Так и должно быть или я опять что то не то натворил?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Вт Апр 07, 2009 7:54 pm Ответить с цитатой Вернуться к началу

Денис писал(а):
000 писал(а):
Вот эту строку
Код:

Lnapravl = IIf(DMACDHistogram > Ref(DMACDHistogram, -1), 1, 0);

надо писать до TimeFrameExpand
А то получается, что сигнал есть только на первом баре дня потому, что после экспанда все значения DMACDHistogram внутри дня равны между собой. Smile




Ура заработало!!!! Хоть что то у мен получилосьSmile

Да вот только правильно и логически верно все работает только в том случае, если 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

СообщениеДобавлено: Вт Апр 07, 2009 8:55 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Денис писал(а):
000 писал(а):
Вот эту строку
Код:

Lnapravl = IIf(DMACDHistogram > Ref(DMACDHistogram, -1), 1, 0);

надо писать до TimeFrameExpand
А то получается, что сигнал есть только на первом баре дня потому, что после экспанда все значения DMACDHistogram внутри дня равны между собой. Smile




Ура заработало!!!! Хоть что то у мен получилосьSmile

Да вот только правильно и логически верно все работает только в том случае, если 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-го чила дает нам пять сигналов на короткую продажу....

Получается, что что-то работает не так Sad
Я уж даже не знаю в чем дело Question
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Вт Апр 07, 2009 9:16 pm Ответить с цитатой Вернуться к началу

Построй в виде индикатора и посмотри
Код:

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

СообщениеДобавлено: Вс Дек 27, 2009 10:19 pm Ответить с цитатой Вернуться к началу

Олег, привет! Слушай, у меня почему то Амиброкер не рисует стрелки на графике, когда в тестере жмешь правой мышкой на а поле результаты на одну из сделок..... не подскажешь в чем может быть дело?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Вс Дек 27, 2009 10:27 pm Ответить с цитатой Вернуться к началу

http://www.amisite.ru/begin/chart.htm
в Show trading arrows что стоит?

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Денис



Зарегистрирован: 05.04.2009
Сообщения: 9

СообщениеДобавлено: Пн Дек 28, 2009 11:23 am Ответить с цитатой Вернуться к началу

Спасибо, Олег! Действительно в этом была проблема.
Посмотреть профиль Отправить личное сообщение
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



Следующая тема
Предыдущая тема
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы не можете скачивать файлы


Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme :: Часовой пояс: GMT + 3

File Attachment © by Meik Sievertsen