Автор |
Сообщение |
Dezember
Зарегистрирован: 04.08.2009
Сообщения: 35
|
В системе прописано так:
Код: |
Cond1 = TimeNum() == 235000 ;
Buy =C > Cond2 ;
BuyPrice = C;
Short = C < Cond3 ;
ShortPrice = C ;
//закрытие позиции
Sell=Cond1 ;
Cover=Cond1 ;
SellPrice = C;
CoverPrice = C;
Buy=ExRem(Buy,Cond1 );
Short=ExRem(Short,Cond1 );
ApplyStop(0,2,500,1,False,0); |
Как правильно прописать в коде, чтобы после прибыльного дня не торговать следующие n дней? Система на пятиминутках. Одна сделка в день. Для убыточных, закрывшихся по стоп-лоссу вроде бы понятно, что можно в формулу дописать количество баров после срабатывания стопа во время которых не хочем торговать( хотя хотелось бы не в 5-минутных барах писать), а для прибыльных и убыточных закрывшихся по времени непонятно как реализовать. Для меня сейчас убыточные мало интересны, разговор о профитных днях.
Было бы удобно просто сравнить капитал на начало дня и на конец и если второе больше первого, пропускаем n дней. Т.е. добавить условие для открытия позиции .
Код: |
Cond4 = Ref(капитал на нач.дня, -1) >= Ref(капитал на конец дня,-1);
Buy =C > Cond2 AND Cond4 ;
BuyPrice = C;
Short = C < Cond3 AND Cond4;
ShortPrice = C ;
// и так далее.... |
Как создать эти массивы? А может я просто не знаю о них....
Ну, и если мои мысли совсем не в ту сторону направились, поправьте, плиз . |
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
Dezember
Зарегистрирован: 04.08.2009
Сообщения: 35
|
Кажется мне нужно покрутить функцию equity , но как это сделать не разобрался пока, поэтому помощь все еще не помешает. |
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
В общем это не так просто. Если система работает только на одной бумаге, то действительно см. функцию Equity() |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Dezember
Зарегистрирован: 04.08.2009
Сообщения: 35
|
Бумага одна,если можно так сказать, индекс. Но пока не могу приспособить Equity(). Буду думать. Подсказки приветствуются. |
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
Dezember
Зарегистрирован: 04.08.2009
Сообщения: 35
|
Снова возвращаюсь к этой теме. Так и не могу понять почему если Equity() массив я не могу сравнить его значения разнесенные по времени используя функции REF или VALUEWHEN, например.
Как же извлечь размер капитала допустим на каждый клоуз?
Почему нельзя написать
Код: |
Cond = ValueWhen( C ,Equity(0,-1,0,0),1); |
или
Код: |
Cond = Ref(Equity(0,-1,0,0),-1); |
а затем сравнить
Код: |
Eq = Ref(Cond ,-1) < Ref(Cond ,-2) |
и еще один вопрос если Equity(0,-1,0,0) это значение по умолчанию, корректно ли написать просто Equity(), и если да, то применимо ли это ко всем функциям? |
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Dezember писал(а): |
Снова возвращаюсь к этой теме. Так и не могу понять почему если Equity() массив я не могу сравнить его значения разнесенные по времени используя функции REF или VALUEWHEN, например.
Как же извлечь размер капитала допустим на каждый клоуз?
Почему нельзя написать
Код: |
Cond = ValueWhen( C ,Equity(0,-1,0,0),1); |
|
Так может и можно писать, но это ерунда какая-то. Первый параметр функции ValueWhen должно быть логическое выражение...
Dezember писал(а): |
или
Код: |
Cond = Ref(Equity(0,-1,0,0),-1); |
а затем сравнить
Код: |
Eq = Ref(Cond ,-1) < Ref(Cond ,-2) |
|
А вот так запросто можно писать...
Dezember писал(а): |
и еще один вопрос если Equity(0,-1,0,0) это значение по умолчанию, корректно ли написать просто Equity(), и если да, то применимо ли это ко всем функциям? |
Да применимо. Только я не уверен, что у всех функций есть згачение по умолчанию. Но у тех которых есть можно. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Dezember
Зарегистрирован: 04.08.2009
Сообщения: 35
|
Цитата: |
А вот так запросто можно писать... |
в том то и дело, что не работает у меня
пишу
Код: |
Buy =C >Line AND Eq ; |
совсем нет сделок,
а если добавляю равно <=
Код: |
Eq = Ref(Cond ,-1) <= Ref(Cond ,-2); |
то результат как будто просто
|
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Наверное не правильно пишешь.
В данном случае надо действовать так.
Сперва писать правила сделок не учитывая эквити.
Потом по этим сделкам строится эквити
Потом переписываются правила сделок с учетом эквити. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Dezember
Зарегистрирован: 04.08.2009
Сообщения: 35
|
Тут важный момент, что эквити берется по дням, а система работает на пятиминутках...
В каком порядке это правильно написать в коде используя TimeFrameSet ? А может можно без нее обойтись, так как у меня вначале кода есть выражение
Код: |
DayC = TimeFrameGetPrice( "C", inDaily, -1 ); |
|
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
TimeFrameSet преобразует в другой фрейм только OHLCV. На массив эквити он влияние не окажет.
Трудно предположить что именно надо, но скорее всего примерно так
Код: |
Buy = ...;
Sell = ...;
Short = ...;
Cover = ...;
Eq = Equity();
BeginDay = Day() != Ref(Day(), -1);
QQQ = ValueWhen(BeginDay, Eq, ...);
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Dezember
Зарегистрирован: 04.08.2009
Сообщения: 35
|
Система на основании вчерашних данных
Код: |
DayH = TimeFrameGetPrice( "H", inDaily, -1 );
DayL = TimeFrameGetPrice( "L", inDaily, -1 );
DayC = TimeFrameGetPrice( "C", inDaily, -1 );
DayO = TimeFrameGetPrice( "O", inDaily, -1 ); |
строит уровни, что то наподобие пивота,
а затем при пересечении этих линий возникает сигнал, т.к. у меня уже есть данные вчерашнего дня я и хотел привязать к ним значение эквити..
но не смог |
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Ну вот смотри.
Сперва просто пишешь свою систему
Код: |
DayH = TimeFrameGetPrice( "H", inDaily, -1 );
DayL = TimeFrameGetPrice( "L", inDaily, -1 );
DayC = TimeFrameGetPrice( "C", inDaily, -1 );
DayO = TimeFrameGetPrice( "O", inDaily, -1 );
Buy = ...;
Sell = ...;
Short = ...;
Cover = ...;
|
Затем строишь эквити этой системы
Потом берешь значение эквити сегодня, вчера (для примера)
Код: |
BeginDay = Day() != Ref(Day(), -1);
TodayEq = ValueWhen(BeginDay, Eq, 1);
yesterdayEq = ValueWhen(BeginDay, Eq, 2);
Cond = TodayEq > yesterdayEq;
|
и переписываешь правила сделок
Код: |
Buy = Buy AND Cond;
.....
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Dezember
Зарегистрирован: 04.08.2009
Сообщения: 35
|
Вот теперь все понял. Огромное спасибо.
Именно то, что было нужно. |
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
Dezember
Зарегистрирован: 04.08.2009
Сообщения: 35
|
Олег, у меня возник еще один вопрос. Где бы посмотреть каков должен быть порядок написания кода.
В случае с эквити я бы никогда не догадался, что нужно писать два раза правила сделок.
Теперь вопрос по ApplyStop. Я всегда в коде ставил ее на последнее место, перед функциями которые рисуют индикаторы, а сейчас засомневался.
Мой код выглядел примерно так:
Код: |
_SECTION_BEGIN("Price");
SetChartOptions(0,chartShowArrows|chartShowDates);
_N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) Vol " +WriteVal( V, 1.0 ) +" {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 )) ));
Plot( C, "Close", ParamColor("Color", colorBlack ), styleNoTitle | ParamStyle("Style") | GetPriceStyle() );
if( ParamToggle("Tooltip shows", "All Values|Only Prices" ) )
{
ToolTip=StrFormat("Open: %g\nHigh: %g\nLow: %g\nClose: %g (%.1f%%)\nVolume: "+NumToStr( V, 1 ), O, H, L, C, SelectedValue( ROC( C, 1 )));
}
_SECTION_END();
_SECTION_BEGIN("Volume");
Plot( Volume, _DEFAULT_NAME(), ParamColor("Color", colorLavender ), styleNoTitle | ParamStyle( "Style", styleHistogram | styleOwnScale | styleThick | styleNoLabel, maskHistogram ), 2 );
_SECTION_END();
SetPositionSize(1, 4);
Period1 = Optimize("Period1", 100, 50,500,5);
empty = Optimize("empty", 1, 1, 3, 1);
k =
//определяем максимум, минимум и закрытие предыдущего дня
DayH = TimeFrameGetPrice( "H", inDaily, -1 );
DayL = TimeFrameGetPrice( "L", inDaily, -1 );
DayC = TimeFrameGetPrice( "C", inDaily, -1 );
Cond1 = TimeNum() == 230000 ;
Cond2 =
Cond3 =
Cond5 =
TakeUp = ... ;
TakeDown = .... ;
Buy =C >TakeUp AND Cond2 AND Cond3;
BuyPrice = C;
Short = TakeDown > C AND Cond2 AND Cond3;
ShortPrice = C ;
Sell=Cond1 ;
Cover=Cond1 ;
SellPrice = C;
CoverPrice = C;
Buy=ExRem(Buy,Cond1 );
Short=ExRem(Short,Cond1 );
Stop = ATR() * k ;
ApplyStop(0,2,Stop ,1,False,0);
Plot(TakeUp ,"TakeUp ",colorBlue, styleLine);
Plot(TakeDown ,"TakeDown ",colorBlue, styleLine); |
После твоих советов стало так:
Код: |
_SECTION_BEGIN("Price");
SetChartOptions(0,chartShowArrows|chartShowDates);
_N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) Vol " +WriteVal( V, 1.0 ) +" {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 )) ));
Plot( C, "Close", ParamColor("Color", colorBlack ), styleNoTitle | ParamStyle("Style") | GetPriceStyle() );
if( ParamToggle("Tooltip shows", "All Values|Only Prices" ) )
{
ToolTip=StrFormat("Open: %g\nHigh: %g\nLow: %g\nClose: %g (%.1f%%)\nVolume: "+NumToStr( V, 1 ), O, H, L, C, SelectedValue( ROC( C, 1 )));
}
_SECTION_END();
_SECTION_BEGIN("Volume");
Plot( Volume, _DEFAULT_NAME(), ParamColor("Color", colorLavender ), styleNoTitle | ParamStyle( "Style", styleHistogram | styleOwnScale | styleThick | styleNoLabel, maskHistogram ), 2 );
_SECTION_END();
SetPositionSize(1, 4);
Period1 = Optimize("Period1", 100, 50,500,5);
empty = Optimize("empty", 1, 1, 3, 1);
k =
//определяем максимум, минимум и закрытие предыдущего дня
DayH = TimeFrameGetPrice( "H", inDaily, -1 );
DayL = TimeFrameGetPrice( "L", inDaily, -1 );
DayC = TimeFrameGetPrice( "C", inDaily, -1 );
Cond1 = TimeNum() == 230000 ;
Cond2 =
Cond3 =
Cond5 =
TakeUp = ... ;
TakeDown = .... ;
Buy =C >TakeUp AND Cond2 AND Cond3;
BuyPrice = C;
Short = TakeDown > C AND Cond2 AND Cond3;
ShortPrice = C ;
Sell=Cond1 ;
Cover=Cond1 ;
SellPrice = C;
CoverPrice = C;
Buy=ExRem(Buy,Cond1 );
Short=ExRem(Short,Cond1 );
Eq = Equity();
BeginDay = Day() != Ref(Day(), -1);
TodayEq = ValueWhen(BeginDay, Eq, 1);
YesterdayEq= ValueWhen(BeginDay, Eq, 2);
Cond10 = TodayEq <= YesterdayEq;
Buy =C >TakeUp AND Cond2 AND Cond3 AND Cond10;
BuyPrice = C;
Short = TakeDown > C AND Cond2 AND Cond3 AND Cond10;
ShortPrice = C ;
Sell=Cond1 ;
Cover=Cond1 ;
SellPrice = C;
CoverPrice = C;
Buy=ExRem(Buy,Cond1 );
Short=ExRem(Short,Cond1 );
Stop = ATR() * k ;
ApplyStop(0,2,Stop ,1,False,0);
Plot(TakeUp ,"TakeUp ",colorBlue, styleLine);
Plot(TakeDown ,"TakeDown ",colorBlue, styleLine); |
В каком порядке написания должны располагатся функции ?
SetPositionSize
Optimize
ExRem
Equity
ApplyStop
И нужно ли ApplyStop прописывать тоже дважды( именно в этом коде)?
Подозреваю, что в хелпе может быть подобная информация, но, к сожалению, не владею английским.
Я думаю эта информация будет полезна таким новичкам как я, потому что к примеру перенос ApplyStop перед правилами покупки/продажи и после них дает совсем разные результаты тестирования.
Если я невнимателен, то ткни, пожалуйста, где об этом написано. |
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Честно говоря я тоже не знаю точно какой правильный порядок.
Руководствуюсь логикой.
Если функции для расчетов нужны какие либо результаты других функций, то эти другие должны стоять перед.
ApplyStop скорее всего переписывать не нужно, он же одинаковый для обоих случаев.
SetPositionSize где угодно если код чисто для теста в АА. Если используется Equity(), то разумеется раньше этой функции.
Optimize - перед функциями которые используют оптимизируемые параметры. Н непоредственно перед, а просто раньше.
ExRem. Если потом используется Equity(), то совсем не надо, т.к. она сама ексремит сигналы, а если нет, то после сигналов, но до вывода стрелок.
После всех нужных правил системы. После Buy/Sell/Short/Cover и ApplyStop().
ApplyStop() размеется перед эквити если она должна использовать стопы. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
|
|
Следующая тема
Предыдущая тема
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы не можете скачивать файлы
|
|