Начать новую тему Ответить на тему |
Список форумов AmiSite.ru » Вопросы по AFL |
На страницу Пред. 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 След. |
Автор |
Сообщение |
DMITRY
Зарегистрирован: 18.09.2009
Сообщения: 179
|
Привет Олег. Не подскажешь, вроде логику уловил, но видать не совсем, почему счет разбивается не на всю сумму?
Код: |
SetCustomBacktestProc( "" );
if( Status("action") == actionPortfolio )
{
bo = GetBacktesterObject();
bo.PreProcess();
for( bar = 0; bar < BarCount; bar++ )
{
j = 0;
for( sig = bo.GetFirstSignal( bar ); sig; sig = bo.GetNextSignal( bar ) )
{
j++;
}
for( sig = bo.GetFirstSignal( bar ); sig; sig = bo.GetNextSignal( bar ) )
{
sig.PosSize = int(-100/j);
}
bo.ProcessTradeSignals( bar );
}
bo.PostProcess();
}
Buy = cross(C, Ref(H,-1));
Sell = Day() != Ref(Day(),-1); |
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
А конкретно что не так работает? Вроде все правильно написано, но не проверял. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
DMITRY
Зарегистрирован: 18.09.2009
Сообщения: 179
|
Счет 1 000 000 поставил, а разбивка в сумме меньше, кол-во позиций 5. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Вот тут.
Код: |
for( sig = bo.GetFirstSignal( bar ); sig; sig = bo.GetNextSignal( bar ) )
{
j++;
} |
ты считаешь сигналы. Но у тебя на этом баре не только сигналы на вход но и на выход. Поэтому в итоге сигналов получается больше чем открывается позиций.
Надо так
Код: |
for( sig = bo.GetFirstSignal( bar ); sig; sig = bo.GetNextSignal( bar ) )
{
if( sig.IsEntry() )
{
j++;
}
} |
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
DMITRY
Зарегистрирован: 18.09.2009
Сообщения: 179
|
Чет запутался. MaxOpenPosition = 5. Если сегодня 5 сигналов купить, код разобьет счет на 5 частей. Если завтра из 5-ти сделок 2 закрылись и появились 6 новых сигналов, то код будет разбивать свободные деньги на 6 частей и добавит 3 новых сделки исходя из новой разбивки? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Кажется нет. В хелпере написано
Цитата: |
percent of portfolio equity |
Соответственно надо брать Cash и его делить на число открываемых позиций. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
DMITRY
Зарегистрирован: 18.09.2009
Сообщения: 179
|
Вроде разобрался, все работает, спасибо! |
|
|
Посмотреть профиль Отправить личное сообщение |
|
il-ir
Зарегистрирован: 28.05.2013
Сообщения: 189
|
Олег, привет.
Помоги, пожалуйста, разобраться с функцией VarSet.
В справке написано (http://www.amibroker.com/guide/afl/varset.html):
SYNTAX VarSet( ''varname'', value )
RETURNS NUMBER
FUNCTION Sets the value of dynamic variable. Returns 1 on success, 0 on failure.
Dynamic variables are variables that are named dynamically, typically by creating a variable name from a static part and a variable part. The following example dynamically constructs the variable name from a variable prefix and a static suffix. Dynamic variables are always global. Starting from version 6.10 the function accept matrix variables in addition to numbers and arrays.
Соответственно, если возвращает тип число, то может использоваться в условии if.
Или я не прав?
Но когда делаю тестовый код:
Код: |
for( i = 1; i < 10; i++ )
{
VarSet( "C"+i, Ref( C, -i ) );
}
// creates variables C1, C2, C3, C4, ...., C10 equal to Ref( C, -1 ), Ref( C, -2 ), ..., Ref( C, -10 )
// respectively
if (C1 > 5)
{
} |
то получаю сообщение об ошибке:
Цитата: |
Error 6. Condition in IF, WHILE, FOR statements has to be Numeric or Boolean type. You can not use array here, please use [] (array subscript operator) to access array elements |
Что делаю не правильно?
Спасибо за ответ(ы). |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
C1 это у тебя целый массив Close (только сдвинутый на один бар, но это сути не меняет) и ты целый массив пытаешься сравнить с константой.
Надо использовать или IIf() или в цикле if (C1[1] > 5)
И, кстати, не вижу где ты берешь это C1. Это надо делать функцией VarGet |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
il-ir
Зарегистрирован: 28.05.2013
Сообщения: 189
|
000 писал(а): |
C1 это у тебя целый массив Close (только сдвинутый на один бар, но это сути не меняет) и ты целый массив пытаешься сравнить с константой. |
Это я притормозил, спутал тип значения, возвращаемого функцией (RETURNS NUMBER; Returns 1 on success, 0 on failure), с типом создаваемой переменной.
000 писал(а): |
И, кстати, не вижу где ты берешь это C1. Это надо делать функцией VarGet |
а разве требуется брать значения через VarGet?
Я так понял, что VarSet позволяет имя переменной конструировать через программный код и присваивать начальное значение. А дальше в программе этой переменной можно спокойно пользоваться, как обычной.
А VarGet используется, если требуется сконструировать имя переменной программным путем и такой переменной пользоваться..
Например,
Имеем массивы:
C1 = Ref( C, -1);
C2 = Ref( C, -2);
C3 = Ref( C, -2);
C4 = Ref( C, -3);
C5 = Ref( C, -4);
Но если нам потребуется как-то однообразно эти массивы обработать, то тут и используется VarGet:
Код: |
C1 = Ref( C, -1);
C2 = Ref( C, -2);
C3 = Ref( C, -3);
C4 = Ref( C, -4);
C5 = Ref( C, -5);
for( i = 1; i < 5; i++ )
{
Plot( VarGet( "C"+i ), "C"+i, colorRed );
} |
Или опять не так понял? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
В этот раз ступил я. Действительно VarGet не обязательно. Просто если используешь VarSet(), то без VarGet() это как=бы бессмысленно. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
il-ir
Зарегистрирован: 28.05.2013
Сообщения: 189
|
Олег, спасибо за ответ.
000 писал(а): |
Просто если используешь VarSet(), то без VarGet() это как=бы бессмысленно. |
Так как это был тестовый пример, то я убрал всё лишнее (на мой взгляд), что бы с конкретный вопросом разобраться |
|
|
Посмотреть профиль Отправить личное сообщение |
|
Swell
Зарегистрирован: 18.01.2013
Сообщения: 117
|
Здравствуйте.
Никто не подскажет, как работает оператор RequestTimedRefresh(0.1)?
Проблема в том, что независимо от аргумента, он не позволяет запускать код чаще, чем раз в секунду. Хотелось бы чаще... |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Цитата: |
Starting from version 5.30.3 RequestTimedRefresh supports sub-second (down to 0.1 sec) resolution, when enabled via registry setting (HKCU/Software/TJP/Broker/Settings/EnableHiresRTR, DWORD value = 1 )
|
Яндекс переводчик.
Цитата: |
Начиная с версии 5.30.3 RequestTimedRefresh поддерживает суб-второй резолюции (до 0,1 сек), при включении через настройки реестра (hkcu/программное обеспечение/TJP/брокер/настройки/EnableHiresRTR, значение DWORD = 1 )
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Swell
Зарегистрирован: 18.01.2013
Сообщения: 117
|
Действительно работает. Правда переменная EnableHiresRTR отсутствовала в данной директории. Пришлось создать её самому.
Олег, спасибо. Ты как всегда меня очень выручил.) |
|
|
Посмотреть профиль Отправить личное сообщение |
|
|
Начать новую тему Ответить на тему |
Список форумов AmiSite.ru » Вопросы по AFL |
На страницу Пред. 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 След. |
|
Следующая тема
Предыдущая тема
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы не можете скачивать файлы
|
|