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



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

СообщениеДобавлено: Вт Мар 21, 2017 10:49 pm Ответить с цитатой Вернуться к началу

Привет Олег. Не подскажешь, вроде логику уловил, но видать не совсем, почему счет разбивается не на всю сумму?
Код:
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
Сообщения: 8486

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

А конкретно что не так работает? Вроде все правильно написано, но не проверял.

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



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

СообщениеДобавлено: Вт Мар 21, 2017 11:17 pm Ответить с цитатой Вернуться к началу

Счет 1 000 000 поставил, а разбивка в сумме меньше, кол-во позиций 5.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

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

Вот тут.
Код:
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
Сообщения: 174

СообщениеДобавлено: Ср Мар 22, 2017 10:22 pm Ответить с цитатой Вернуться к началу

Чет запутался. MaxOpenPosition = 5. Если сегодня 5 сигналов купить, код разобьет счет на 5 частей. Если завтра из 5-ти сделок 2 закрылись и появились 6 новых сигналов, то код будет разбивать свободные деньги на 6 частей и добавит 3 новых сделки исходя из новой разбивки?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Ср Мар 22, 2017 11:52 pm Ответить с цитатой Вернуться к началу

Кажется нет. В хелпере написано
Цитата:
percent of portfolio equity

Соответственно надо брать Cash и его делить на число открываемых позиций.

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



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

СообщениеДобавлено: Чт Мар 23, 2017 4:13 pm Ответить с цитатой Вернуться к началу

Вроде разобрался, все работает, спасибо!
Посмотреть профиль Отправить личное сообщение
il-ir



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

СообщениеДобавлено: Вт Авг 22, 2017 6:31 pm Ответить с цитатой Вернуться к началу

Олег, привет.

Помоги, пожалуйста, разобраться с функцией 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
Сообщения: 8486

СообщениеДобавлено: Вт Авг 22, 2017 7:04 pm Ответить с цитатой Вернуться к началу

C1 это у тебя целый массив Close (только сдвинутый на один бар, но это сути не меняет) и ты целый массив пытаешься сравнить с константой.
Надо использовать или IIf() или в цикле if (C1[1] > 5)

И, кстати, не вижу где ты берешь это C1. Это надо делать функцией VarGet

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



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

СообщениеДобавлено: Ср Авг 23, 2017 9:54 am Ответить с цитатой Вернуться к началу

000 писал(а):
C1 это у тебя целый массив Close (только сдвинутый на один бар, но это сути не меняет) и ты целый массив пытаешься сравнить с константой.

Это я притормозил, спутал тип значения, возвращаемого функцией (RETURNS NUMBER; Returns 1 on success, 0 on failure), с типом создаваемой переменной.
Embarassed

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
Сообщения: 8486

СообщениеДобавлено: Пт Авг 25, 2017 9:19 pm Ответить с цитатой Вернуться к началу

В этот раз ступил я. Действительно VarGet не обязательно. Просто если используешь VarSet(), то без VarGet() это как=бы бессмысленно.

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



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

СообщениеДобавлено: Чт Авг 31, 2017 10:06 am Ответить с цитатой Вернуться к началу

Олег, спасибо за ответ.

000 писал(а):
Просто если используешь VarSet(), то без VarGet() это как=бы бессмысленно.

Так как это был тестовый пример, то я убрал всё лишнее (на мой взгляд), что бы с конкретный вопросом разобраться Embarassed
Посмотреть профиль Отправить личное сообщение
Swell



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

СообщениеДобавлено: Вс Янв 14, 2018 7:27 pm Ответить с цитатой Вернуться к началу

Здравствуйте.
Никто не подскажет, как работает оператор RequestTimedRefresh(0.1)?
Проблема в том, что независимо от аргумента, он не позволяет запускать код чаще, чем раз в секунду. Хотелось бы чаще...
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Пн Янв 15, 2018 4:18 pm Ответить с цитатой Вернуться к началу

Цитата:

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
Сообщения: 93

СообщениеДобавлено: Вт Янв 16, 2018 10:24 pm Ответить с цитатой Вернуться к началу

Действительно работает. Правда переменная EnableHiresRTR отсутствовала в данной директории. Пришлось создать её самому.
Олег, спасибо. Ты как всегда меня очень выручил.)
Посмотреть профиль Отправить личное сообщение
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



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


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

File Attachment © by Meik Sievertsen