Автор |
Сообщение |
cowboy
![](images/avatars/5431043164db7e7e117b45.jpg)
Зарегистрирован: 23.04.2011
Сообщения: 21
|
Всем привет! Задался целью, научится программить в ами...
С программированием до этого я не дружил, поэтому это все для меня в новье, сказать честно, дается очень сложно...
Искал в инете что-то в роде "как научиться программировать на AFL", наткнулся на недавно открытую ветку на одном форуме, где автор вопрошал совета по освоению ами, "000" посоветовал ему открыть ветку на данном форуме с таким названием, но автор не внял совета...
Я менее гордый)).. ветка открыта, буду писать здесь этапы своего продвижения, надеюсь на вашу помощь, так как понял, что без посторонней помощи программирование мне не осилить..
Ну что ж....поехали! |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
cowboy
![](images/avatars/5431043164db7e7e117b45.jpg)
Зарегистрирован: 23.04.2011
Сообщения: 21
|
Христос Воскресе! Поздравляю всех с Православной Пасхой!
Начинаем осваивать афл, сегодня немного покопался в справке, почитал разделы.. впринципе, мануал я уже до этого пролистывал, читал перевод функций на русском, выложенный здесь... С пониманием работы языка проблем нет, у меня проблема в другом, проблема с логикой...
Не могу научиться или понять, как "думает программист"...есть задача, есть средства для реализации, не могу правильно составить цепочку выполнения, т.е. грубо говоря не могу составить тех задание, в голове полный сумбур, в итоге когда кто нибудь все разложит по полочкам, т.е. выстроит весь ряд логических решений, кажется как все было просто.... Я бы даже сказал, что конечный результат, для меня представляется почему то как некое творение, типа как работа художника или скульптора..
Думаю, что дело просто в отсутствии банальной практики... с завтрашнего дня постараюсь начать кодить простые индикаторы и постепенно переходя к более сложным... Каждый раз буду писать ход мыслей, как думаю как правильно решить задачу...
Надеюсь на ваши замечания и помощь, в моем нелегком начинании ![Wink](images/smiles/icon_wink.gif) |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
cowboy
![](images/avatars/5431043164db7e7e117b45.jpg)
Зарегистрирован: 23.04.2011
Сообщения: 21
|
Наверно я поторопился с пониманием самого языка...сейчас лазию, смотрю с какого индюка начать, тяму что-то нехватает не для чего, кроме каких нибудь (H+L+C)/3 .. |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
cowboy
![](images/avatars/5431043164db7e7e117b45.jpg)
Зарегистрирован: 23.04.2011
Сообщения: 21
|
Определился с индюком, как и обещал - самый простой.
Описание:
Индикатор рисует сигнал Buy, если МА растет и свеча пересекла нижнюю границу Болинджера снизу вверх. Sell - если МА падает и свеча пересекла верхнюю границу Болинджера сверху вниз.
Решение:
Выявить факт пересечения ценой полос Болинджера.
Сравнить предыдущее значение МА с текущим, выявить изменения.
ConditionBuy = (Close(-2)<BBandBot(-2) AND Close(-1)>BBandBot(-1)) AND MA(-2)<MA(-1)
ConditionSell = (Close(-2)>BBandTop(-2) AND Close(-1)<BBandTop(-1)) AND MA(-2)>MA(-1)
------------------------------------------
Код AFL:
_SECTION_BEGIN("CrossBB_+_MA");
P = ParamField("Price field",-1); //Параметры вычисления Болигджера
PeriodsBB = Param("Periods_BB", 20, 2, 300, 1 ); //Период Болинджера
PeriodsMA = Param("Periods_MA", 50, 5, 250, 1 ); //Период МА
PrevMA = Ref(MA(C, PeriodsMA), -2); //Предыдущее значение МА
LastMA = Ref(MA(C, PeriodsMA), -1); //Текущее значение МА
SignBuy = Cross(C, BBandBot(P,PeriodsBB)) & LastMA > PrevMA; //Сигнал Buy
SignSell = Cross(BBandTop(P,PeriodsBB), C) & LastMA < PrevMA; //Сигнал Sell
Plot(SignBuy,"Buy",colorGreen,styleDots); //Рисуем Buy
Plot(SignSell,"Sell",colorRed,styleDots); //Рисуем Sell
_SECTION_END();
Вроде получилось, единственное, отображается он как то неправильно...если смотреть его в отдельной панели (что есть бред), то как то можно понять где бай, где селл... если на график накинуть, вообще ничего не видно... незнаю как сделать чтобы точки изображались на графике корректно и были хорошо видимыми, жирными, а лучше чтоб вообще рисовались стрелочки вместо точек, но что то не нашел такого стиля..
Зы: Посмотрел на истории, дает неплохие сигналы...боттомы оч неплохо показывает.. |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
000
Site Admin
![](images/avatars/183029264847fb5337d4ea4.gif)
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
По моему проще рисовать график цен прямо в индикаторе. Тогда нет необходимости накидывать его на график цены
Код: |
Plot(C, "Close", ColorBlack, StyleCandle); |
а сигналы проще рисовать стрелками. Функция PlotShapes()
По поводу стратегии. Не нравится, что выход из лонга при пересечении ценой BBBot. А если цена не уйдет выше BB? А начнет валиться? Так и будем сидеть в лонге и ждать? |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
![](images/spacer.gif) |
cowboy
![](images/avatars/5431043164db7e7e117b45.jpg)
Зарегистрирован: 23.04.2011
Сообщения: 21
|
000 писал(а): |
По моему проще рисовать график цен прямо в индикаторе. Тогда нет необходимости накидывать его на график цены
Код: |
Plot(C, "Close", ColorBlack, StyleCandle); |
|
Олег привет! Спасибо за наметку, все равно что-то не получается, результат как в предыдущем случае..
PlotShapes чо то не додумался в функциях нанесения искать, искал в style))
На счет ты системы ты прав, никакой это нафиг не индикатор получился, а просто визуализированная система ...Хотя круто, я чо то раньше даже и не думал что так можно сигналы просмотреть.. |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
000
Site Admin
![](images/avatars/183029264847fb5337d4ea4.gif)
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
А что не получается? Надо просто в индикатор добавить эту строку... |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
![](images/spacer.gif) |
cowboy
![](images/avatars/5431043164db7e7e117b45.jpg)
Зарегистрирован: 23.04.2011
Сообщения: 21
|
Я так и сделал...
То же самое что и до этого:
![Image Image](http://s56.radikal.ru/i151/1104/03/70091c53c575.jpg) |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
000
Site Admin
![](images/avatars/183029264847fb5337d4ea4.gif)
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
А, вон ты про что....
Тут вот в чем дело.
Plot(SignBuy,"Buy",colorGreen,styleDots); //Рисуем Buy
Plot(SignSell,"Sell",colorRed,styleDots); //Рисуем Sell
Когда SignBuy и SignSell отсутствуют функция Plot рисует их равными 0.
Можно сделать так. Когда SignBuy и SignSell равны 0 совсем их удалить. Типа так
SignBuy = IIf(SignBuy == 0 , Null, SignBuy);
В итоге так.
Plot(IIf(SignBuy == 0 , Null, SignBuy),"Buy",colorGreen,styleDots); //Рисуем Buy |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
![](images/spacer.gif) |
belin
Зарегистрирован: 09.09.2009
Сообщения: 230
Откуда: wealth-lab user
|
000 писал(а): |
А, вон ты про что....
В итоге так.
Plot(IIf(SignBuy == 0 , Null, SignBuy),"Buy",colorGreen,styleDots); //Рисуем Buy |
Нет, ты Олег изначально был прав, только Plotshapes, а этим мы сдвинем Buy с ноля на 1 или на целое выше, и будет похожий график. Я в этом примере удивился тому, что Болинджер можно писать только от одного параметра Period, a ширина полосы по умолчанию не ноль, а единица, я думал в данной записи Болинджер будет простой средней. |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
cowboy
![](images/avatars/5431043164db7e7e117b45.jpg)
Зарегистрирован: 23.04.2011
Сообщения: 21
|
Кто нибудь может сказать в чем ошибка?
Пытаюсь добить до конца.. дописываю:
SignBuy = IIf(SignBuy == 0 , Null, SignBuy);
SignSell = IIf(SignSell == 0 , Null, SignSell);
IIf(SignBuy == 1, PlotShapes(shapeUpArrow, colorGreen), Null);
IIf(SignSell == 1, PlotShapes(shapeDownArrow, colorRed), Null);
Что можно прочитать так:
СигналБай = Если нет - удаляем значение ноль, если есть - оставляем сигнал;
СигналСелл = Если нет - удаляем значение ноль, если есть - оставляем сигнал;
Если есть СигналБай, рисуем стрелку вверх, если нет - ничего не делаем;
Если есть СигналСелл, рисуем стрелку вниз, если нет - ничего не делаем;
Почему у меня каждая стрелка на каждом баре рисуется? |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
belin
Зарегистрирован: 09.09.2009
Сообщения: 230
Откуда: wealth-lab user
|
cowboy писал(а): |
Кто нибудь может сказать в чем ошибка?
Почему у меня каждая стрелка на каждом баре рисуется? |
Попробуй вместо
SignBuy = IIf(SignBuy == 0 , Null, SignBuy);
SignSell = IIf(SignSell == 0 , Null, SignSell);
IIf(SignBuy == 1, PlotShapes(shapeUpArrow, colorGreen), Null);
IIf(SignSell == 1, PlotShapes(shapeDownArrow, colorRed), Null);
просто
PlotShapes( shapeUpArrow *SignBuy, colorGreen, -5, L );
PlotShapes( shapeDownArrow * SignSell, colorRed,5, H ); |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
cowboy
![](images/avatars/5431043164db7e7e117b45.jpg)
Зарегистрирован: 23.04.2011
Сообщения: 21
|
Попробывал, не работает... |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
belin
Зарегистрирован: 09.09.2009
Сообщения: 230
Откуда: wealth-lab user
|
cowboy писал(а): |
Попробывал, не работает... |
Извини, я сам ошибся вот этот у меня работает
Код: |
_SECTION_BEGIN("Price");
SetChartOptions(0,chartShowArrows|chartShowDates|chartWrapTitle);
_N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Close %g {{VALUES}}", C ));
Plot( C, "Close", ParamColor("Color", colorBlack ), styleCandle | ParamStyle("Style") | GetPriceStyle() );
_SECTION_END();
_SECTION_BEGIN("CrossBB_+_MA");
P = ParamField("Price field",-1); //Параметры вычисления Болигджера
PeriodsBB = Param("Periods_BB", 20, 2, 300, 1 ); //Период Болинджера
PeriodsMA = Param("Periods_MA", 50, 5, 250, 1 ); //Период МА
PrevMA = Ref(MA(C, PeriodsMA), -2); //Предыдущее значение МА
LastMA = Ref(MA(C, PeriodsMA), -1); //Текущее значение МА
BB=BBandBot(P,PeriodsBB);
BT=BBandTop(P,PeriodsBB);
SignBuy = Cross(C, BB) AND LastMA > PrevMA; //Сигнал Buy
SignSell = Cross(BT, C) AND LastMA < PrevMA; //Сигнал Sell
Plot(BT,"BBandTop",colorBlue,styleLine);
Plot(BB,"BBandbot",colorGreen,styleLine);
Plot(MA(P,PeriodsMA),"",colorRed,styleLine);
//Plot(SignBuy,"Buy",colorGreen,styleDots); //Рисуем Buy
//Plot(SignSell,"Sell",colorRed,styleDots); //Рисуем Sell
PlotShapes( shapeUpArrow *SignBuy, colorGreen, 0, L,-15 );
PlotShapes( shapeDownArrow * SignSell, colorRed,0, H,-15 );
_SECTION_END(); |
|
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
cowboy
![](images/avatars/5431043164db7e7e117b45.jpg)
Зарегистрирован: 23.04.2011
Сообщения: 21
|
Как говорится не понос так золотуха..
Разобрался в чем дело было, просто неправильно оформлял PlotShapes() и объекты обязательно умножать надо на то, что хочешь чтобы рисовалось, хотя вот этого я вообще не понял для чего это делается..
belin, твой код работает прекрасно, но я решил все таки добить свой, хотя там разница в двух строчках ... ну просто как бы для практики, чтобы лучше отложилось...
Все как бы работает, но есть одно НО!, понять не могу что это, скорее всего баг Ами...
Стрелки сейчас выводятся нормально, но когда прокручиваешь график слева-направо, допустим появилась стрелочка селл, прокручиваем дальше, как только появляется вторая стрелочка на селл, между ними появляются какие то маленькие непонятные стрелочки на каждом баре....с сигналами на бай при аналогичной ситуации такого нет, хотя странно коды то для бай и селл одинаковые...поэтому склоняюсь что это баг Ами...
Сделал гифку чтоб нагляднее:
--------------------------
На всякий случай код:
P = ParamField("Price field",-1); //Параметры вычисления Болигджера
PeriodsBB = Param("Periods_BB", 20, 2, 300, 1 ); //Период Болинджера
PeriodsMA = Param("Periods_MA", 50, 5, 250, 1 ); //Период МА
PrevMA = Ref(MA(C, PeriodsMA), -2); //Предыдущее значение МА
LastMA = Ref(MA(C, PeriodsMA), -1); //Текущее значение МА
SignBuy = Cross(C, BBandBot(P,PeriodsBB)) & LastMA > PrevMA; //Сигнал Buy
SignSell = Cross(BBandTop(P,PeriodsBB), C) & LastMA < PrevMA; //Сигнал Sell
SignBuy = IIf(SignBuy == 0 , Null, SignBuy); //Убираем нули
SignSell = IIf(SignSell == 0 , Null, SignSell); //Убираем нули
Plot(C, "Price", colorBlack, styleCandle); //Рисуем цену
IIf(SignBuy == 1, PlotShapes(shapeUpArrow * SignBuy, colorGreen, 0, L, -17), Null); //Рисуем Бай сигнал
IIf(SignSell == 1, PlotShapes(shapeDownArrow * SignSell, colorRed, 0, H, -17), Null); //Рисуем Селл сигнал
--------------------------
Может кто попробует у себя, чтобы убедиться, что это все таки баг? |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
|
|
Следующая тема
Предыдущая тема
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы не можете скачивать файлы
|
|