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



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

СообщениеДобавлено: Чт Мар 08, 2012 1:50 am Ответить с цитатой Вернуться к началу

Хочется создать бивалютную корзину в виде символа в базе, чтобы к нему можно было применять различные инструменты. Этот вариант мне больше нравится, чем писать индикатор, т.к. в объеме у симовла можно указать объем интервенций.

Вопросы:
1. Как написать AFL скрипт, который из курсов USD и EUR наполняет символ "Бивалютная корзина"?
2. Как вызывать код AFL через меню/кнопку по примеру кода Finam?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

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

Какая формула бивалютной корзины?

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



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

СообщениеДобавлено: Чт Мар 08, 2012 3:25 pm Ответить с цитатой Вернуться к началу

Бивалютная корзина = 0.55 * USD + 0.45 * EUR

Это сейчас, но исторически процент евро менялся. Так ранее было 0.6*USD+0.4EUR - это нужно будет учесть. Точные даты, когда и как менялись весы валют известны.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

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

Автоматически не получится, а вообще делаешь код типа
Код:
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

СообщениеДобавлено: Вс Июн 03, 2012 5:13 am Ответить с цитатой Вернуться к началу

Олег, посоветуй.

Не работает:
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

СообщениеДобавлено: Вс Июн 03, 2012 7:54 am Ответить с цитатой Вернуться к началу

А обязательно надо чтобы OHL были равны 0 ???

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



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

СообщениеДобавлено: Вс Июн 03, 2012 2:44 pm Ответить с цитатой Вернуться к началу

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

СообщениеДобавлено: Вс Июн 03, 2012 3:47 pm Ответить с цитатой Вернуться к началу

Если ты используешь в коде Foreign, то и сканировать достаточно и нужно только один, любой символ т.к. в противном случае сколько символов в скане, столько раз Ами и суммирует числа в новом символе. Кажется в таком случае поможет флаг atcFlagResetValues
Лучше Foreign не использовать а сканировать именно символы USDRUB EURRUB и заносить их с нужным коэф. в составной символ. Суммируются они там сами с флагом по умолчанию.
Посмотри в хелпере Calculating multiple-security statistics with AddToComposite function

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



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

СообщениеДобавлено: Вт Июн 05, 2012 1:44 am Ответить с цитатой Вернуться к началу

Написал вот такой код:

Код:

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

СообщениеДобавлено: Вт Июн 05, 2012 7:15 am Ответить с цитатой Вернуться к началу

Так попробуй
Код:

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

СообщениеДобавлено: Вт Июн 05, 2012 9:28 pm Ответить с цитатой Вернуться к началу

Спасибо, все работает.

Пару моментов:
1. Filter при сканировании НЕ работает? Нет никакой реакции на него.
2. Можно ли как-то в коде задать номер рынка, который нужно сканировать? Сейчас сканируются все символы, каждый раз в самом скане задавать фильтр неудобно.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Вт Июн 05, 2012 11:08 pm Ответить с цитатой Вернуться к началу

Фильтруй сканируемые инструменты в настройках АА. Поставь там опцию use filter и настрой его как тебе надо. Хочешь включи нужные рынки, хочешь наоборот исключи. Можно сканировать только фавориты и т.п.

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



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

СообщениеДобавлено: Ср Июн 06, 2012 9:06 am Ответить с цитатой Вернуться к началу

Выявилась проблема:
есть ситуации, когда у Евро на какую-то дату есть значение, а у Доллара нет - тогда итоговый символ считается неверно. Как быть? Вроде как-то можно сделать, чтобы при отсутствие значения подставлялось значение на предыдущую дату.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Ср Июн 06, 2012 10:41 am Ответить с цитатой Вернуться к началу

srom_tr писал(а):
Вроде как-то можно сделать, чтобы при отсутствие значения подставлялось значение на предыдущую дату.

Это возможно при использовании foreign( TICKER, DATAFIELD, fixup = 1)

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



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

СообщениеДобавлено: Чт Июн 07, 2012 12:59 am Ответить с цитатой Вернуться к началу

Еще можно выставить флаг в настройках на "Pad and align to reference symbol", тогда тоже дополняет пропущенные даты.
Но тут у меня другая вылезла проблема - он в конце добавляет строки с одними нулями.

Я хочу их отсечь, сделав проверку Close > 0, но как в условии If можно подставить текущее значение Close при переборе Scan? LastValue() и CurrentValue() не помогают.
Посмотреть профиль Отправить личное сообщение
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



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


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

File Attachment © by Meik Sievertsen