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



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

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

Всем привет! Задался целью, научится программить в ами...
С программированием до этого я не дружил, поэтому это все для меня в новье, сказать честно, дается очень сложно...
Искал в инете что-то в роде "как научиться программировать на AFL", наткнулся на недавно открытую ветку на одном форуме, где автор вопрошал совета по освоению ами, "000" посоветовал ему открыть ветку на данном форуме с таким названием, но автор не внял совета...
Я менее гордый)).. ветка открыта, буду писать здесь этапы своего продвижения, надеюсь на вашу помощь, так как понял, что без посторонней помощи программирование мне не осилить..

Ну что ж....поехали!
Посмотреть профиль Отправить личное сообщение
cowboy



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

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

Христос Воскресе! Поздравляю всех с Православной Пасхой!

Начинаем осваивать афл, сегодня немного покопался в справке, почитал разделы.. впринципе, мануал я уже до этого пролистывал, читал перевод функций на русском, выложенный здесь... С пониманием работы языка проблем нет, у меня проблема в другом, проблема с логикой...
Не могу научиться или понять, как "думает программист"...есть задача, есть средства для реализации, не могу правильно составить цепочку выполнения, т.е. грубо говоря не могу составить тех задание, в голове полный сумбур, в итоге когда кто нибудь все разложит по полочкам, т.е. выстроит весь ряд логических решений, кажется как все было просто.... Я бы даже сказал, что конечный результат, для меня представляется почему то как некое творение, типа как работа художника или скульптора..
Думаю, что дело просто в отсутствии банальной практики... с завтрашнего дня постараюсь начать кодить простые индикаторы и постепенно переходя к более сложным... Каждый раз буду писать ход мыслей, как думаю как правильно решить задачу...
Надеюсь на ваши замечания и помощь, в моем нелегком начинании Wink
Посмотреть профиль Отправить личное сообщение
cowboy



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

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

Наверно я поторопился с пониманием самого языка...сейчас лазию, смотрю с какого индюка начать, тяму что-то нехватает не для чего, кроме каких нибудь (H+L+C)/3 ..
Посмотреть профиль Отправить личное сообщение
cowboy



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

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

Определился с индюком, как и обещал - самый простой.

Описание:
Индикатор рисует сигнал 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();


Вроде получилось, единственное, отображается он как то неправильно...если смотреть его в отдельной панели (что есть бред), то как то можно понять где бай, где селл... если на график накинуть, вообще ничего не видно... незнаю как сделать чтобы точки изображались на графике корректно и были хорошо видимыми, жирными, а лучше чтоб вообще рисовались стрелочки вместо точек, но что то не нашел такого стиля..

Зы: Посмотрел на истории, дает неплохие сигналы...боттомы оч неплохо показывает..
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

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

По моему проще рисовать график цен прямо в индикаторе. Тогда нет необходимости накидывать его на график цены
Код:
Plot(C, "Close", ColorBlack, StyleCandle);

а сигналы проще рисовать стрелками. Функция PlotShapes()


По поводу стратегии. Не нравится, что выход из лонга при пересечении ценой BBBot. А если цена не уйдет выше BB? А начнет валиться? Так и будем сидеть в лонге и ждать?

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



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

СообщениеДобавлено: Ср Апр 27, 2011 11:34 am Ответить с цитатой Вернуться к началу

000 писал(а):
По моему проще рисовать график цен прямо в индикаторе. Тогда нет необходимости накидывать его на график цены
Код:
Plot(C, "Close", ColorBlack, StyleCandle);



Олег привет! Спасибо за наметку, все равно что-то не получается, результат как в предыдущем случае..

PlotShapes чо то не додумался в функциях нанесения искать, искал в style))

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


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

СообщениеДобавлено: Ср Апр 27, 2011 11:44 am Ответить с цитатой Вернуться к началу

А что не получается? Надо просто в индикатор добавить эту строку...

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



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

СообщениеДобавлено: Ср Апр 27, 2011 11:55 am Ответить с цитатой Вернуться к началу

Я так и сделал...
То же самое что и до этого:

Image
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

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

А, вон ты про что....
Тут вот в чем дело.
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
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
belin



Зарегистрирован: 09.09.2009
Сообщения: 230
Откуда: wealth-lab user

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

000 писал(а):
А, вон ты про что....
В итоге так.

Plot(IIf(SignBuy == 0 , Null, SignBuy),"Buy",colorGreen,styleDots); //Рисуем Buy

Нет, ты Олег изначально был прав, только Plotshapes, а этим мы сдвинем Buy с ноля на 1 или на целое выше, и будет похожий график. Я в этом примере удивился тому, что Болинджер можно писать только от одного параметра Period, a ширина полосы по умолчанию не ноль, а единица, я думал в данной записи Болинджер будет простой средней.
Посмотреть профиль Отправить личное сообщение
cowboy



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

СообщениеДобавлено: Ср Апр 27, 2011 3:22 pm Ответить с цитатой Вернуться к началу

Кто нибудь может сказать в чем ошибка?

Пытаюсь добить до конца.. дописываю:

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);

Что можно прочитать так:

СигналБай = Если нет - удаляем значение ноль, если есть - оставляем сигнал;
СигналСелл = Если нет - удаляем значение ноль, если есть - оставляем сигнал;

Если есть СигналБай, рисуем стрелку вверх, если нет - ничего не делаем;
Если есть СигналСелл, рисуем стрелку вниз, если нет - ничего не делаем;


Почему у меня каждая стрелка на каждом баре рисуется?
Посмотреть профиль Отправить личное сообщение
belin



Зарегистрирован: 09.09.2009
Сообщения: 230
Откуда: wealth-lab user

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

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 );
Посмотреть профиль Отправить личное сообщение
cowboy



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

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

Попробывал, не работает...
Посмотреть профиль Отправить личное сообщение
belin



Зарегистрирован: 09.09.2009
Сообщения: 230
Откуда: wealth-lab user

СообщениеДобавлено: Ср Апр 27, 2011 5:57 pm Ответить с цитатой Вернуться к началу

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();
Посмотреть профиль Отправить личное сообщение
cowboy



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

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

Как говорится не понос так золотуха..
Разобрался в чем дело было, просто неправильно оформлял PlotShapes() и объекты обязательно умножать надо на то, что хочешь чтобы рисовалось, хотя вот этого я вообще не понял для чего это делается..

belin, твой код работает прекрасно, но я решил все таки добить свой, хотя там разница в двух строчках Smile ... ну просто как бы для практики, чтобы лучше отложилось...

Все как бы работает, но есть одно НО!, понять не могу что это, скорее всего баг Ами...

Стрелки сейчас выводятся нормально, но когда прокручиваешь график слева-направо, допустим появилась стрелочка селл, прокручиваем дальше, как только появляется вторая стрелочка на селл, между ними появляются какие то маленькие непонятные стрелочки на каждом баре....с сигналами на бай при аналогичной ситуации такого нет, хотя странно коды то для бай и селл одинаковые...поэтому склоняюсь что это баг Ами...
Сделал гифку чтоб нагляднее:

Image

--------------------------
На всякий случай код:

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); //Рисуем Селл сигнал

--------------------------

Может кто попробует у себя, чтобы убедиться, что это все таки баг?
Посмотреть профиль Отправить личное сообщение
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



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


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

File Attachment © by Meik Sievertsen