Начать новую тему Ответить на тему |
Список форумов AmiSite.ru » Вопросы по AFL |
На страницу 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 След. |
Автор |
Сообщение |
home30
Зарегистрирован: 17.06.2015
Сообщения: 105
|
Контррендовая торговля по параболику. Для примера рассмотрим торговлю в лонг. В момент перескока цены параболиком на шорт запоминаем в переменные два значения SAR1 и SAR2.Далее из этих двух значений вычисляем уровень входа в лонг (против тренда) и храним его в переменной. Ну для примера формула: Buy=SAR1-(SAR2-SAR1). Как только цена дошла до этого значения, то покупаем.
Выход из позиции по обратному пересечению параболика.
Соответсвенно, выходя из лонга, тут же считаем уровни для входа в шорт, обнуляем значение Buy, ну и т.д.
Реальный трейд виден на графике.
Мне бы примерный код в AFL. Направьте, пожалуйста,на путь истинный, дальше уж сам допилю.
Заранее спасибо. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Типа так
Код: |
Parab = SAR( 0.02, 0.2 );
SAR2 = ValueWhen( Cross(Parab, C), Parab);
SAR1 = ValueWhen( Cross(Parab, C), Ref(Parab, -1));
BuyLevel = SAR1-(SAR2-SAR1);
Buy = Cross(H, BuyLevel);
BuyPrice = Max(BuyLevel, O);
Sell = Cross(C, Parab);
// для посмотреть на графике
Plot(C, "", colorBlack, styleCandle);
Plot(Parab, "", ColorRed);
Plot(SAR1, "", ColorBlue);
Plot(SAR2, "", ColorGreen);
Plot(BuyLevel, "", colorOrange);
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
home30
Зарегистрирован: 17.06.2015
Сообщения: 105
|
Ого ! Так просто ? А вот еще вопрос. Чтобы результаты теста были более точными (вход не на открытии следующей свечи, а прямо на текущей свече, как только дошли до BuyLevel), как мне получить все значения минутной свечи ? Правильно ли я понимаю, что надо с Финама скачать тиковые значения, а в настройках тестера указать 1 минута ? Или это ничего не даст ? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
home30
Зарегистрирован: 17.06.2015
Сообщения: 105
|
Короче, написал так:
Код: |
TradeTime = TimeNum() >= 100400 AND TimeNum() <= 184400;
Parab = SAR( 0.02, 0.2 );
SAR2 = ValueWhen( Cross(Parab, C), Parab);
SAR1 = ValueWhen( Cross(Parab, C), Ref(Parab, -1));
BuyLevel = SAR1-(SAR2-SAR1);
Buy = Cross(L, BuyLevel) AND TradeTime;
BuyPrice = Min(BuyLevel, C);
Sell = Cross(C, Parab) AND TradeTime;
// Для графика
Plot(C, "", colorBlack, styleCandle);
Plot(Parab, "", colorRed);
Plot(SAR_100L, "", colorBlue);
Plot(SAR_0L, "", colorGreen);
Plot(BuyLevel, "", colorOrange);
|
Но почему-то при тестировании вот такие ошибки (см. картинку). Что не так ? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
home30 писал(а): |
Ого ! Так просто ? А вот еще вопрос. Чтобы результаты теста были более точными (вход не на открытии следующей свечи, а прямо на текущей свече, как только дошли до BuyLevel), как мне получить все значения минутной свечи ? Правильно ли я понимаю, что надо с Финама скачать тиковые значения, а в настройках тестера указать 1 минута ? Или это ничего не даст ? |
Это ничего не даст. В коде и так написано входить по уровню BuyLevel а не по закрытию или открытию. За это отвечает строка
Код: |
BuyPrice = Max(BuyLevel, O); |
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Надо немного поправить код.
Вот эту строку
Код: |
Buy = Cross(L, BuyLevel) AND TradeTime; |
исправь на
Код: |
Buy = Cross(L, BuyLevel) AND TradeTime AND Ref(Parab > C, --1); |
Это исправит ошибку "тут входит хотя не надо".
А вот с "тут не входит" сложнее. Сначала следует выяснить есть ли сигнал.
В настройках тестера на закладке Report включи Detailed log.
http://www.amisite.ru/begin/bk_set5.php
Протестируй и ищи в отчете эту свечку по дате времени. Если сигнал есть (скорее всего он есть), то следует разбираться почему не открыта поза.
Скорее всего что то типа
http://www.amisite.ru/begin/bk_set6.php |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
home30
Зарегистрирован: 17.06.2015
Сообщения: 105
|
Заработало, когда написал так:
Код: |
Buy = Cross(BuyLevel,L) AND Ref(Parab > C, -1) AND TradeTime; |
Теперь входит там, где нужно. Вопрос остался по формированию цены входа. Если пишу так:
Код: |
BuyPrice = Min(L,BuyLevel) AND TradeTime; |
Тогда в тестере в качестве цены входа он показывает Low свечки, которая пересекла BuyLevel. Пробовал вот так:
Все равно пишет low свечи. Он не может в качестве цены входа указать мой расчетный уровень ? Ведь есть же его значение. Выполнилось условие по пересечению, ну и запиши его в цену входа. Или так нельзя и надо писать какой-то условный цикл ? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
home30 писал(а): |
Теперь входит там, где нужно. Вопрос остался по формированию цены входа. Если пишу так:
Код: |
BuyPrice = Min(L,BuyLevel) AND TradeTime; |
Тогда в тестере в качестве цены входа он показывает Low свечки, которая пересекла BuyLevel. Пробовал вот так:
|
Скорее всего у тебя в настройках тестера установлена Задержки исполнения сделок (delay)
http://www.amisite.ru/begin/bk_set3.php
В таком случае цена свечки может быть дальше укровня покупки. В таком случае Ами "сдвигает" цену сделки до реальной на рынке.
В общем поставь делэй 0. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
home30
Зарегистрирован: 17.06.2015
Сообщения: 105
|
Разобрался.
По невнимательности написал
Код: |
BuyPrice = BuyLevel and TradeTime;
|
Убрал TradeTime и стало входить точно по уровню.
Мучаю теперь шорт. Написал так:
Код: |
TradeTime = TimeNum() >= 100400 AND TimeNum() <= 184400;
Parab = SAR( 0.02, 0.2 );
SAR_100 = ValueWhen( Cross(Parab, C), Ref(Parab, -1));
SAR_0 = ValueWhen( Cross(Parab, C), Parab);
ShortLevel = Тут формула;
Short = Cross(H,ShortLevel) AND Ref(Parab > C, -1) AND TradeTime;
ShortPrice = ShortLevel;
Cover = Cross(Parab,Open);
CoverPrice = Min(Ref(Parab, -1),Open);
// Для графика
//Plot(C, "", colorBlack, styleCandle);
//Plot(Parab, "", colorRed);
//Plot(SAR_100, "", colorBlue);
//Plot(SAR_0, "", colorGreen);
//Plot(ShortLevel, "", colorOrange);
|
Не работает тест. Пишет Error 701. Missing buy/sell variable assignments.
Тут что не так, подскажи. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Наверное в настройках тестера стоит не только шорт.
В любом случае допиши в начало кода
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
home30
Зарегистрирован: 17.06.2015
Сообщения: 105
|
Да точно, в настройках тестера не указал, что торгуем и лонг и шорт. Было только лонг. Исправил, заработало. Теперь вопрос по стопу. Он у меня вычисляемый по формуле. Написал так:
Код: |
stopLevelLong=формула вычисления уровня стопа;
ApplyStop(stopTypeLoss,stopModePoint,stopLevelLong,True);
|
Не работает. Не выходит по стопам. А вот если пишу stopLevelLong=500 (т.е. явно указываю в пунктах), тогда в таблице сделок видны стопы, все по 500 пунктов. Что не так то ? В формуле нет ошибки. Даже если просто вот так написать:
Код: |
stopLevelLong=BuyPrice-500;
ApplyStop(stopTypeLoss,stopModePoint,stopLevelLong,True);
|
то все равно не работают стопы. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
В ApplyStop() надо писать не уровень стопа, а его размер. Типа BuyPrice - stopLevelLong |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
home30
Зарегистрирован: 17.06.2015
Сообщения: 105
|
В настройках тестера есть три параметра на закладке Report. А можно как-то вывести что-то вроде трейд листа, но свернутого по дням. Понятно, что можно проводить расчет за период, но это надо вручную каждый день вводить и куда-то в табличку выписывать.
И еще попутный вопрос. В трейд листе (когда выводятся все сделки) есть столбец Cum.Profit. Это прибыль с начала периода нарастающим итогом. Бывают дни, когда прибыль достигает какого-то максимума, а потом до конца дня может откатиться. Можно ли посчитать такие максимумы по прибыли внутри дней и как-то вывести их в отчет ? Если определить такую величину, можно добавить ее в роботов и останавливать расчет до конца дня при достижении нужного уровня маржи. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Проще всего взять отчет как он есть экспртировать в эксель и там уже над ним работать подобным образом. Простых штатных средств в Ами для этого нет. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Да хрен его знает. Трудно так по кускам кода...
Ну допиши выше
SAR1 = SAR2 = 0; |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
|
Начать новую тему Ответить на тему |
Список форумов AmiSite.ru » Вопросы по AFL |
На страницу 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 След. |
|
Следующая тема
Предыдущая тема
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы не можете скачивать файлы
|
|