Автор |
Сообщение |
srtrade
Зарегистрирован: 09.11.2010
Сообщения: 233
|
Хочется создать бивалютную корзину в виде символа в базе, чтобы к нему можно было применять различные инструменты. Этот вариант мне больше нравится, чем писать индикатор, т.к. в объеме у симовла можно указать объем интервенций.
Вопросы:
1. Как написать AFL скрипт, который из курсов USD и EUR наполняет символ "Бивалютная корзина"?
2. Как вызывать код AFL через меню/кнопку по примеру кода Finam? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Какая формула бивалютной корзины? |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
srtrade
Зарегистрирован: 09.11.2010
Сообщения: 233
|
Бивалютная корзина = 0.55 * USD + 0.45 * EUR
Это сейчас, но исторически процент евро менялся. Так ранее было 0.6*USD+0.4EUR - это нужно будет учесть. Точные даты, когда и как менялись весы валют известны. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Автоматически не получится, а вообще делаешь код типа
Код: |
AddToComposite(0.55*Foreign("USD", "C") + 0.45*Foreign("EUR", "C"), "INDEX", "C", 1); |
Запихиваешь его в анализатор и топчешь Scan. Именно Scan (Это важно)
В результате получаешь в базе новый символ INDEX |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
srtrade
Зарегистрирован: 09.11.2010
Сообщения: 233
|
Олег, посоветуй.
Не работает:
Basket1 = Foreign("EURRUB", "C");
AddToComposite(Basket1, "Basket", "C", 1);
1. По коду должна просто скопировать Close символа EURRUB в новый символ. Но реально в новом символе стоят какие-то левые цифры.
2. Все данные в EURRUB имеют флаг EOD. В новом символе в 2011 году появились еще какие-то данные часовиков со временем 00:00:00
3. Когда в редакторе встаю курсором на любое поле, в котором O, H, L = 0, а C = чему-то, то как только курсор на другую строчку перенес, то редактор сам заполняет нули OHL на значение, которое находится в С. Что происходит?? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
А обязательно надо чтобы OHL были равны 0 ??? |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
srtrade
Зарегистрирован: 09.11.2010
Сообщения: 233
|
1. С 0 в OHL не принципиально. Реально я буду заполнять OHL правильными значениями. Тут я привел кусок кода, чтобы проще было понять, откуда проблемы идут.
2. Понял откуда проблема идет - когда я нажимаю Scan, то он сканирует все бумаги и суммирует Сlose. Поэтому у меня и получается "левое значение" Close.
Параметры Scan, как я понял, не настроешь: или текущая бумага (не вариант, т.к. я хочу делать составной символ из двух других), или фильтр.
Как правильно написать скрипт? Вот этот скрипт не работает, как надо:
USDEUR_Basket_O = 0.55*Foreign("USDRUB", "O", 0) + 0.45*Foreign("EURRUB", "O", 0);
USDEUR_Basket_H = 0.55*Foreign("USDRUB", "H", 0) + 0.45*Foreign("EURRUB", "H", 0);
USDEUR_Basket_L = 0.55*Foreign("USDRUB", "L", 0) + 0.45*Foreign("EURRUB", "L", 0);
USDEUR_Basket_C = 0.55*Foreign("USDRUB", "C", 0) + 0.45*Foreign("EURRUB", "C", 0);
AddToComposite(USDEUR_Basket_O, "USDEUR_Basket", "O", atcFlagResetValues);
AddToComposite(USDEUR_Basket_H, "USDEUR_Basket", "H", atcFlagResetValues);
AddToComposite(USDEUR_Basket_L, "USDEUR_Basket", "L", atcFlagResetValues);
AddToComposite(USDEUR_Basket_C, "USDEUR_Basket", "C", atcFlagResetValues); |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Если ты используешь в коде Foreign, то и сканировать достаточно и нужно только один, любой символ т.к. в противном случае сколько символов в скане, столько раз Ами и суммирует числа в новом символе. Кажется в таком случае поможет флаг atcFlagResetValues
Лучше Foreign не использовать а сканировать именно символы USDRUB EURRUB и заносить их с нужным коэф. в составной символ. Суммируются они там сами с флагом по умолчанию.
Посмотри в хелпере Calculating multiple-security statistics with AddToComposite function |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
srtrade
Зарегистрирован: 09.11.2010
Сообщения: 233
|
Написал вот такой код:
Код: |
procedure Composite_Basket (Basket_Name, OHLC, OHLC_name, Weight)
{
AddToComposite(OHLC*Weight, Basket_Name, OHLC_name, atcFlagDeleteValues );
}
_SECTION_BEGIN( "USDEUR_Basket" );
Filter = (Name() == "USDRUB") OR (Name() == "EURRUB");
switch ( Name() )
{
case "USDRUB": Weight = 0.55; break;
case "EURRUB": Weight = 0.45; break;
default: Weight = 0; break;
}
Composite_Basket ("USDEUR_Basket_1", O, "O", Weight);
Composite_Basket ("USDEUR_Basket_1", H, "H", Weight);
Composite_Basket ("USDEUR_Basket_1", L, "L", Weight);
Composite_Basket ("USDEUR_Basket_1", C, "C", Weight);
_SECTION_END();
|
Если запускаю с фильтром выбора рынка "Валюты", отрабатывает нормально.
НО если запускаю по всем символам, то откуда-то появляются дублирующиеся строчки с одними нулями, т.е. сначала на какую-то дату стоят значения, а ниже идет строка с этой же датой, но с одними нулями. Рисунок приложил.
В чем проблема? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Так попробуй
Код: |
procedure Composite_Basket (Basket_Name, OHLC, OHLC_name, Weight)
{
AddToComposite(OHLC*Weight, Basket_Name, OHLC_name, atcFlagDeleteValues );
}
Filter = (Name() == "USDRUB") OR (Name() == "EURRUB");
switch ( Name() )
{
case "USDRUB": Composite_Basket ("USDEUR_Basket_1", O, "X", 0.55); break;
case "EURRUB": Composite_Basket ("USDEUR_Basket_1", O, "X", 0.45); break;
default: Weight = 0; break;
}
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
srtrade
Зарегистрирован: 09.11.2010
Сообщения: 233
|
Спасибо, все работает.
Пару моментов:
1. Filter при сканировании НЕ работает? Нет никакой реакции на него.
2. Можно ли как-то в коде задать номер рынка, который нужно сканировать? Сейчас сканируются все символы, каждый раз в самом скане задавать фильтр неудобно. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Фильтруй сканируемые инструменты в настройках АА. Поставь там опцию use filter и настрой его как тебе надо. Хочешь включи нужные рынки, хочешь наоборот исключи. Можно сканировать только фавориты и т.п. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
srtrade
Зарегистрирован: 09.11.2010
Сообщения: 233
|
Выявилась проблема:
есть ситуации, когда у Евро на какую-то дату есть значение, а у Доллара нет - тогда итоговый символ считается неверно. Как быть? Вроде как-то можно сделать, чтобы при отсутствие значения подставлялось значение на предыдущую дату. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
srom_tr писал(а): |
Вроде как-то можно сделать, чтобы при отсутствие значения подставлялось значение на предыдущую дату. |
Это возможно при использовании foreign( TICKER, DATAFIELD, fixup = 1) |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
srtrade
Зарегистрирован: 09.11.2010
Сообщения: 233
|
Еще можно выставить флаг в настройках на "Pad and align to reference symbol", тогда тоже дополняет пропущенные даты.
Но тут у меня другая вылезла проблема - он в конце добавляет строки с одними нулями.
Я хочу их отсечь, сделав проверку Close > 0, но как в условии If можно подставить текущее значение Close при переборе Scan? LastValue() и CurrentValue() не помогают. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
|