Автор |
Сообщение |
VladimirN
Зарегистрирован: 07.11.2009
Сообщения: 49
|
Надеюсь, в старых темах можно поднимать новые вопросы...
Предположим, тестируем систему на минутном графике. Входим (только лонги) с оптимистичным запаздыванием по цене открытия следующего бара: Open 1.
Выходим только по скользящим стопам, выставляемым простым перемещением выхода за последней ценой . Т.е., цена выхода известна заранее, до завершения бара. Кажется логичным тестировать такой выход "без задержки", на тиковом графике (а не минутном), с паузой... ну например секунды три.
Buy = есть сигнал на минутках.
Sell = есть сигнал на тиках (но делаем выход через три секунды после сигнала Sell)
Как это прописать в коде системы? Я уже понял, что основной таймфрейм графика и само тестирование должны быть тиковыми (минимальными). А для входа надо переводить таймфрейм в минутки.
Непонятно, как после перехода в минутки продолжать проверять условие для Sell на тиках?
заранее спасибо за советы. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Не совсем понял.
1. При тестировании на фреймах крупнее тикового можно выходить именно по цене стопа.
2. Если есть такая необходимость выходить именно по тикам, то тестировать систему следует на тиковом интервале, а внутри кода, функцией TimeFrameSet() переключиться на минутный фрейм, сделать там необходимые расчеты, получить сигналы на вход и затем переключившись обратно на базовый фрейм (TimeFrameRestore()) считать выход. Сдвинуть сигнал выхода на несколько тиков можно. Правда как это сделать если использовать ApplyStop, то не помню. Ами сейчас под рукой нет....
Только вот есть ли в этом смысл? Если ФР, то в любом случае неизвестно цена было по биду или офферу и что было в этот момент в стакане тоже тайна. Теоретически сделка могла и скользануть. Ну если форекс, то там все понятно.
Такие дела... |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
MrDrJOKER
Зарегистрирован: 22.06.2009
Сообщения: 489
|
000 писал(а): |
qq = Optimize("qq", 1, 1, 5, 1);
if (qq == 1)
Frame = ;
else if (qq == 2)
Frame = ;
else if (qq == 3)
....... |
Код: |
TimeFrame = Optimize("Timeframe", 8, 1, 15, 1); //optimizatsija po timeframe
if (TimeFrame == 1) //Minutes
Frame = in1Minute;
else if (TimeFrame == 2)
Frame = 3*in1Minute;
else if (TimeFrame == 3)
Frame = in5Minute;
else if (TimeFrame == 4)
Frame = 7*in1Minute;
else if (TimeFrame == 5)
Frame = 10*in1Minute;
else if (TimeFrame == 6)
Frame = 12*in1Minute;
else if (TimeFrame == 7)
Frame = in15Minute;
else if (TimeFrame == 8)
Frame = 20*in1Minute;
else if (TimeFrame == 9)
Frame = 30*in1Minute;
TimeFrameSet(Frame);
P1 = Optimize("Period", 14, 8, 32, 1); //optimizazija po periodam
SetTradeDelays(0,0,0,0);
BuyPrice = Close+0.0001; // zeni pokupki/prodazhi w bare
SellPrice = Close-0.0001;
ShortPrice = Close-0.0001;
CoverPrice = Close+0.0001;
MyPDI= PDI(P1);//Positive Directional Indicator
MyMDI= MDI(P1);//Negative Directional Indicator (Minus)
MyADX= ADX(P1);//Average Directional Movement Index
Buy = (MyADX > Ref(MyADX, -1)) AND (Ref(MyADX, -1) > Ref(MyADX, -2)) AND (MyPDI > MyMDI);
Sell = (MyADX < Ref(MyADX, -1)) AND (Ref(MyADX, -1) < Ref(MyADX, -2));
Short = (MyADX > Ref(MyADX, -1)) AND (Ref(MyADX, -1) > Ref(MyADX, -2)) AND (MyPDI < MyMDI);
Cover = (MyADX < Ref(MyADX, -1)) AND (Ref(MyADX, -1) < Ref(MyADX, -2));
TimeFrameRestore(); |
простенькая стратегия, таймфрейм для обычного бектеста должен быть 20 мин. тестер выдаёт сделки практически поминутно.
убираю оптимизацию по времени из кода и в АА переключаю на фреймы - 20 мин, получаю совсем другие результаты.
я что-то напутал?
такое ощущение, что расчёт самого индекса и торговля идёт на минутках, а условия покупки/продажи на 20-минутках работают. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
А где TimeFrameExpand() ????
Смотри внимательно примеры в хелпе. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
MrDrJOKER
Зарегистрирован: 22.06.2009
Сообщения: 489
|
000 писал(а): |
А где TimeFrameExpand() ????
Смотри внимательно примеры в хелпе. |
зачем мне разжимать какие-то массивы? пока внутри стратегии я данными из разных интервалов оперировать не хочу.
я просто хочу прогнать стратегию на разных временных интервалах, чтоб вручную в тестере "Periodicity" не менять. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Вот смотри. Был у тебя массив
11111111111111111111
ты его сжал и получил
2222222222
Допустим на каждом втором баре сжатого массива сигнал
0101010101
Если его не расжать, то на первый массив он так и ляжет
01010101010000000000
11111111111111111111
А должно получиться так
00110011001100110011
Для этого и служит Expand.
А когда уберутся лишние сигналы
00100010001000100010 |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
MrDrJOKER
Зарегистрирован: 22.06.2009
Сообщения: 489
|
спасибо, прояснил.
Код: |
TimeFrame = Optimize("Timeframe", 8, 1, 15, 1); //optimizatsija po timeframe
if (TimeFrame == 1) //Minutes
Frame = in1Minute;
else if (TimeFrame == 2)
Frame = 3*in1Minute;
else if (TimeFrame == 3)
Frame = in5Minute;
else if (TimeFrame == 4)
Frame = 7*in1Minute;
else if (TimeFrame == 5)
Frame = 10*in1Minute;
else if (TimeFrame == 6)
Frame = 12*in1Minute;
else if (TimeFrame == 7)
Frame = in15Minute;
else if (TimeFrame == 8)
Frame = 20*in1Minute;
else if (TimeFrame == 9)
Frame = 30*in1Minute;
P1 = Optimize("Period", 14, 8, 32, 1); //optimizazija po periodam
SetTradeDelays(0,0,0,0);
BuyPrice = Close+0.0001; // zeni pokupki/prodazhi w bare
SellPrice = Close-0.0001;
ShortPrice = Close-0.0001;
CoverPrice = Close+0.0001;
TimeFrameSet(Frame);
High_PDI= PDI(P1);//Positive Directional Indicator
High_MDI= MDI(P1);//Negative Directional Indicator (Minus)
High_ADX= ADX(P1);//Average Directional Movement Index
TimeFrameRestore();
MyPDI = TimeFrameExpand(High_PDI, Frame);
MyMDI = TimeFrameExpand(High_MDI, Frame);
MyADX = TimeFrameExpand(High_ADX, Frame);
Buy = (MyADX > Ref(MyADX, -1)) AND (Ref(MyADX, -1) > Ref(MyADX, -2)) AND (MyPDI > MyMDI);
Sell = (MyADX < Ref(MyADX, -1)) AND (Ref(MyADX, -1) < Ref(MyADX, -2));
Short = (MyADX > Ref(MyADX, -1)) AND (Ref(MyADX, -1) > Ref(MyADX, -2)) AND (MyPDI < MyMDI);
Cover = (MyADX < Ref(MyADX, -1)) AND (Ref(MyADX, -1) < Ref(MyADX, -2)); |
значит то, что я задумывал выглядит правильно так? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Похоже на правильный код. Проверяй. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
MrDrJOKER
Зарегистрирован: 22.06.2009
Сообщения: 489
|
000 писал(а): |
Похоже на правильный код. Проверяй. |
оптимизация срабатывает на минутках, на всех других таймфреймах выдаёт нули. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Так попробуй.
Код: |
TimeFrame = Optimize("Timeframe", 1, 1, 9, 1); //optimizatsija po timeframe
if (TimeFrame == 1) //Minutes
Frame = in1Minute;
else if (TimeFrame == 2)
Frame = 3*in1Minute;
else if (TimeFrame == 3)
Frame = in5Minute;
else if (TimeFrame == 4)
Frame = 7*in1Minute;
else if (TimeFrame == 5)
Frame = 10*in1Minute;
else if (TimeFrame == 6)
Frame = 12*in1Minute;
else if (TimeFrame == 7)
Frame = in15Minute;
else if (TimeFrame == 8)
Frame = 20*in1Minute;
else
Frame = 30*in1Minute;
P1 = Optimize("Period", 14, 8, 32, 1); //optimizazija po periodam
SetTradeDelays(0,0,0,0);
BuyPrice = Close+0.0001; // zeni pokupki/prodazhi w bare
SellPrice = Close-0.0001;
ShortPrice = Close-0.0001;
CoverPrice = Close+0.0001;
TimeFrameSet(Frame);
High_PDI = PDI(P1);//Positive Directional Indicator
High_MDI = MDI(P1);//Negative Directional Indicator (Minus)
High_ADX = ADX(P1);//Average Directional Movement Index
MyBuy = (High_ADX > Ref(High_ADX, -1)) AND (Ref(High_ADX, -1) > Ref(High_ADX, -2)) AND (High_PDI > High_MDI);
MySell = (High_ADX < Ref(High_ADX, -1)) AND (Ref(High_ADX, -1) < Ref(High_ADX, -2));
MyShort = (High_ADX > Ref(High_ADX, -1)) AND (Ref(High_ADX, -1) > Ref(High_ADX, -2)) AND (High_PDI < High_MDI);
MyCover = (High_ADX < Ref(High_ADX, -1)) AND (Ref(High_ADX, -1) < Ref(High_ADX, -2));
TimeFrameRestore();
Buy = TimeFrameExpand(MyBuy, Frame);
Sell = TimeFrameExpand(MySell, Frame);
Short = TimeFrameExpand(MyShort, Frame);
Cover = TimeFrameExpand(MyCover, Frame);
|
Если бы дал себе труд посмотреть на то как выглядит расжатый MyADX, то понял бы что нельзя сравнивать три значения подряд. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
MrDrJOKER
Зарегистрирован: 22.06.2009
Сообщения: 489
|
Цитата: |
Если бы дал себе труд посмотреть на то как выглядит расжатый MyADX, то понял бы что нельзя сравнивать три значения подряд |
tnx.
в смысле прорисовывать линии на графике?
ADX тоже разжимается и на всём нижнем интервале остаётся неизменчив? |
Последний раз редактировалось: MrDrJOKER (Вт Дек 29, 2009 6:40 pm), всего редактировалось 2 раз(а) |
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
MrDrJOKER писал(а): |
Цитата: |
Если бы дал себе труд посмотреть на то как выглядит расжатый MyADX, то понял бы что нельзя сравнивать три значения подряд |
tnx.
в смысле прорисовывать линии на графике?
|
Да
MrDrJOKER писал(а): |
ADX тоже разжимается и на всём нижнем интервале остаётся неизменчив? |
??? |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
MrDrJOKER
Зарегистрирован: 22.06.2009
Сообщения: 489
|
000 писал(а): |
MrDrJOKER писал(а): |
Цитата: |
Если бы дал себе труд посмотреть на то как выглядит расжатый MyADX, то понял бы что нельзя сравнивать три значения подряд |
tnx.
в смысле прорисовывать линии на графике?
|
Да
MrDrJOKER писал(а): |
ADX тоже разжимается и на всём нижнем интервале остаётся неизменчив? |
??? |
1.я с рисованием пока не очень дружу. думаешь имеет смысл всегда прорисовывать сигнальные линии?
2.в смысле ADX будет в форме ступенек и мои условия не будут срабатывать. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
MrDrJOKER писал(а): |
1.я с рисованием пока не очень дружу. думаешь имеет смысл всегда прорисовывать сигнальные линии?
|
Не всегда, а для посмотреть при использовании незнакомых технологий желательно.
MrDrJOKER писал(а): |
2.в смысле ADX будет в форме ступенек и мои условия не будут срабатывать.
|
Код: |
Frame = 10*in1Minute;
TimeFrameSet(Frame);
High_ADX = ADX(15);//Average Directional Movement Index
TimeFrameRestore();
My_ADX = TimeFrameExpand(High_ADX, Frame);
Plot(C, "", colorBlack, styleCandle);
Plot(My_ADX, "", colorRed, styleOwnScale);
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
MrDrJOKER
Зарегистрирован: 22.06.2009
Сообщения: 489
|
оптимизирую по двум ТФ (модернизировал тот код, что выше), при чём втотрой ТФ должен быть как минимум на уровень больше первого.
в AFL кроме этой конструкции ничего в голову не приходит.
Код: |
TimeFrame = Optimize("Timeframe", 10, 1, 12, 1); //optimizatsija po timeframe
if (TimeFrame == 1) //Minutes
{Frame = in1Minute;
TimeFrameHigh = Optimize("TimeFrameHigh+", 10, 1, 10, 1); }
else if (TimeFrame == 2) //3 min
{Frame = 3*in1Minute;
TimeFrameHigh = Optimize("TimeFrameHigh+", 10, 1, 10, 1); }
...
else if (TimeFrame == 5) //10 min
{Frame = 10*in1Minute;
TimeFrameHigh = Optimize("TimeFrameHigh+", 10, 3, 10, 1); }
...
|
она, конечно, не совсем корректна, но работает.
есть ли другие решения в AFL? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
|
|
Следующая тема
Предыдущая тема
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы не можете скачивать файлы
|
|