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



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

СообщениеДобавлено: Пт Апр 09, 2010 9:16 am Ответить с цитатой Вернуться к началу

В системе прописано так:

Код:

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

СообщениеДобавлено: Пт Апр 09, 2010 9:50 am Ответить с цитатой Вернуться к началу

Кажется мне нужно покрутить функцию equity , но как это сделать не разобрался пока, поэтому помощь все еще не помешает. Smile
Посмотреть профиль Отправить личное сообщение ICQ Number
000
Site Admin


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

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

В общем это не так просто. Если система работает только на одной бумаге, то действительно см. функцию Equity()

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



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

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

Бумага одна,если можно так сказать, индекс. Но пока не могу приспособить Equity(). Буду думать. Подсказки приветствуются.
Посмотреть профиль Отправить личное сообщение ICQ Number
Dezember



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

СообщениеДобавлено: Пн Май 10, 2010 7:25 am Ответить с цитатой Вернуться к началу

Снова возвращаюсь к этой теме. Так и не могу понять почему если 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

СообщениеДобавлено: Пн Май 10, 2010 7:40 am Ответить с цитатой Вернуться к началу

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

СообщениеДобавлено: Пн Май 10, 2010 7:52 am Ответить с цитатой Вернуться к началу

Цитата:
А вот так запросто можно писать...


в том то и дело, что не работает у меня
пишу
Код:
Buy =C >Line AND Eq ;

совсем нет сделок,
а если добавляю равно <=
Код:
Eq = Ref(Cond ,-1) <=  Ref(Cond ,-2);

то результат как будто просто
Код:
Buy =C >Line
Посмотреть профиль Отправить личное сообщение ICQ Number
000
Site Admin


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

СообщениеДобавлено: Пн Май 10, 2010 7:55 am Ответить с цитатой Вернуться к началу

Наверное не правильно пишешь.
В данном случае надо действовать так.
Сперва писать правила сделок не учитывая эквити.
Потом по этим сделкам строится эквити
Потом переписываются правила сделок с учетом эквити.

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



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

СообщениеДобавлено: Пн Май 10, 2010 8:00 am Ответить с цитатой Вернуться к началу

Тут важный момент, что эквити берется по дням, а система работает на пятиминутках...
В каком порядке это правильно написать в коде используя TimeFrameSet ? А может можно без нее обойтись, так как у меня вначале кода есть выражение
Код:
DayC = TimeFrameGetPrice( "C", inDaily, -1 );
Посмотреть профиль Отправить личное сообщение ICQ Number
000
Site Admin


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

СообщениеДобавлено: Пн Май 10, 2010 8:06 am Ответить с цитатой Вернуться к началу

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

СообщениеДобавлено: Пн Май 10, 2010 8:11 am Ответить с цитатой Вернуться к началу

Система на основании вчерашних данных
Код:
DayH = TimeFrameGetPrice( "H", inDaily, -1 );
DayL = TimeFrameGetPrice( "L", inDaily, -1 );
DayC = TimeFrameGetPrice( "C", inDaily, -1 );
DayO = TimeFrameGetPrice( "O", inDaily, -1 );


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

но не смог Crying or Very sad
Посмотреть профиль Отправить личное сообщение ICQ Number
000
Site Admin


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

СообщениеДобавлено: Пн Май 10, 2010 8:17 am Ответить с цитатой Вернуться к началу

Ну вот смотри.
Сперва просто пишешь свою систему
Код:

DayH = TimeFrameGetPrice( "H", inDaily, -1 );
DayL = TimeFrameGetPrice( "L", inDaily, -1 );
DayC = TimeFrameGetPrice( "C", inDaily, -1 );
DayO = TimeFrameGetPrice( "O", inDaily, -1 );

Buy = ...;
Sell = ...;
Short = ...;
Cover = ...;

Затем строишь эквити этой системы
Код:

Eq = Equity();

Потом берешь значение эквити сегодня, вчера (для примера)
Код:

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

СообщениеДобавлено: Пн Май 10, 2010 8:28 am Ответить с цитатой Вернуться к началу

Вот теперь все понял. Огромное спасибо.
Именно то, что было нужно.
Посмотреть профиль Отправить личное сообщение ICQ Number
Dezember



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

СообщениеДобавлено: Вт Май 11, 2010 7:33 am Ответить с цитатой Вернуться к началу

Олег, у меня возник еще один вопрос. Где бы посмотреть каков должен быть порядок написания кода.
В случае с эквити я бы никогда не догадался, что нужно писать два раза правила сделок.
Теперь вопрос по 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

СообщениеДобавлено: Ср Май 12, 2010 8:18 am Ответить с цитатой Вернуться к началу

Честно говоря я тоже не знаю точно какой правильный порядок.
Руководствуюсь логикой.
Если функции для расчетов нужны какие либо результаты других функций, то эти другие должны стоять перед.
ApplyStop скорее всего переписывать не нужно, он же одинаковый для обоих случаев.
SetPositionSize где угодно если код чисто для теста в АА. Если используется Equity(), то разумеется раньше этой функции.
Optimize - перед функциями которые используют оптимизируемые параметры. Н непоредственно перед, а просто раньше.
ExRem. Если потом используется Equity(), то совсем не надо, т.к. она сама ексремит сигналы, а если нет, то после сигналов, но до вывода стрелок.
После всех нужных правил системы. После Buy/Sell/Short/Cover и ApplyStop().
ApplyStop() размеется перед эквити если она должна использовать стопы.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



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


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

File Attachment © by Meik Sievertsen