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



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

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

trashfx, спасибо за ответ Smile
Посмотреть профиль Отправить личное сообщение
trashfx



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

СообщениеДобавлено: Чт Июл 23, 2015 3:14 am Ответить с цитатой Вернуться к началу

Here is an example using Sparse functions and AddToComposite to create new (shorter) array from original array based on some condition and saving to composite.


http://i.imgur.com/or1SmTu.png

Composiite
http://i.imgur.com/fz6FVBM.png


Код:
function RemoveQuotesWithZeroQuotes( nm ) {
// http://www.amibroker.com/kb/2015/01/13/how-to-delete-quotes/
    AB = CreateObject( "Broker.Application" );
    Stk = AB.Stocks( nm );
    Quotes = Stk.Quotations;
    iQty = Quotes.Count;
    cnt = 0;

    for( i = iQty - 1; i >= 0; i-- ) {
        qt = Quotes.Item( i );

        if( qt.Close == 0 ) {
            cnt++;
            Quotes.Remove( i );
        }
    }
    AB.RefreshAll();
    return cnt;
}


Version( 5.91 );

condition = O > C;

x = SparseCompress( condition, C );
stdv = StDev( x, 20 ); // calculation based on compressed condition data
y = SparseExpand( condition, stdv );
cnew = SparseExpand( condition, x );

// creating composite(s) of new array(s)
if( ParamTrigger( "Save to composite", "Click HERE" )  && Status( "stocknum" ) == 0 && NOT StrFind( Name(), "_SparseCompress" ) ) {
   compname1 = "~" + Name() + "_StDev_SparseCompress";
   compname2 = "~" + Name() + "_Close_SparseCompress";
   AddToComposite( y, compname1, "X", atcFlagDefaults | atcFlagEnableInIndicator );
   AddToComposite( cnew, compname2, "X", atcFlagDefaults | atcFlagEnableInIndicator );
   // removing Null quotes from composite(s)
   n1 = RemoveQuotesWithZeroQuotes( compname1 );
   n2 = RemoveQuotesWithZeroQuotes( compname2 );
}


if( NOT StrFind( Name(), "_SparseCompress" ) ) {
   Plot( x, "Compressed C array based on condition", colorDefault, styleLine );
   //Plot( stdv, "stdev SparseCompress", colorOrange, styleLine | styleOwnScale );
   //Plot( y, "stdev SparseExpand", colorYellow, styleLine | styleOwnScale ); 
   Plot( ValueWhen( condition, y ), "stdev SparseExpand with connection", colorYellow, styleLine | styleOwnScale );
}


// plot composite if composite is selected
if( StrFind( Name(), "_SparseCompress" ) )
   Plot( C, "New array composite", colorYellow, styleLine );
Посмотреть профиль Отправить личное сообщение
Zoringer



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

СообщениеДобавлено: Ср Июн 26, 2019 5:14 pm Ответить с цитатой Вернуться к началу

Thank you trashfx!

I tried to use embedded Javascript in afl formula to access 2d matrix to save and read arrays - and it works so f...ng slowly!!!

EnableScript("jscript");
...
...

I thing the easiest way is to use VarSet/VarGet !!!
I asked AMI official support about any possibility to use 2d arrays and they (not Tomascz!) said no! Thanks to you again!
Посмотреть профиль Отправить личное сообщение
Swell



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

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

Есть ещё вопрос насчёт массивов.
Можно ли каким-нибудь образом получить доступ к данным более ранних баров (O, H, L, C) при включенном QuiсkAFL?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

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

Swell писал(а):
Есть ещё вопрос насчёт массивов.
Можно ли каким-нибудь образом получить доступ к данным более ранних баров (O, H, L, C) при включенном QuiсkAFL?

QuiсkAFL сейчас по умолчанию включен всегда.
Это умная функция и если в коде ты явно лезешь глубоко в историю, то QuiсkAFL настраивается так, чтобы нужные данные были доступны.
Ну либо можно отключить QuiсkAFL функцией SetBarsRequired().

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



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

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

Олег.
Я так и делаю – отключаю QuiсkAFL функцией SetBarsRequired(). Но в этом случае очень сильно замедляется работа кода.
Просто иногда бывает надо залезть глубоко в историю… И тогда выпадает ошибка, что индекс вне диапазона. Но отключать QuiсkAFL только ради этого не хотелось бы.

Меня интересует следующее. Несмотря на то, что QuiсkAFL включен, эти данные (более ранних баров) всё равно ведь присутствуют в системе. И наверняка есть какой-нибудь способ получить доступ к ним.
Например, можно ли получить к ним доступ, используя объектную модель Ami?
Т.е. сделать что-то вроде такого:
AB = CreateObject("Broker.Application");
stocks = AB.Stocks;
stock = stocks.Add("~…..");
quotations = stock.Quotations;
aa=quotations.retrieve(count, Date_, O, H, L C, V, OpenInt);

Но я не знаю, как работает метод retrieve. В Help’е мало информации, а где ещё можно посмотреть, я не знаю...
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

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

Swell писал(а):

Просто иногда бывает надо залезть глубоко в историю… И тогда выпадает ошибка, что индекс вне диапазона.

а можно пример?

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



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

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

У меня код очень длинный, чтобы его сюда поместить.
Но если вкратце, то смысл в следующем. На графике расставлены метки сделок (загружаются из файла), и нужно провести их статистическую обработку, используя соседние с ними бары. Но доступными оказываются только те, которые в пределах видимости QuickAFL.

Т.е. проблема выглядит следующим образом:

SetBarsRequired(10, 10);

bi = BarIndex();
x = StrToDateTime("12.03.2020 15:13:00");
sbi = Lookup(bi, x, 0);
printf(""+sbi);

И если требуемая дата (переменная x) находится за пределами видимости QuickAFL, то результат будет EMPTY.
Либо при попытке получить Close[i], используя адресацию с самого начала цен, выдаётся ошибка, что индекс вне диапазона.
Вобщем требуется по дате найти номер бара и его O,H,L,C,V, даже если он находится за пределами видимости QuickAFL.

У меня была мысль использовать для этого оператор SetBarsRequired. Т.е. по мере надобности вызывать либо SetBarsRequired(10, 10), либо SetBarsRequired(sbrAll, sbrAll). Но я так пробовал – не получается, т.к. SetBarsRequired, судя по всему, обрабатывается только один раз – при компилировании, и далее по ходу выполнения программы его уже не поменять. А было бы неплохо, если бы можно было из программы включать и отключать QuickAFL.
Поэтому у меня и возникла мысль оставить QuickAFL включённым, а эти недоступные данные доставать каким-нибудь другим способом, например через объектную модель.
Не знаю насколько это возможно…
Теоретически, через объектную модель это должно быть возможно…
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Пт Май 14, 2021 3:16 pm Ответить с цитатой Вернуться к началу

Не могу подсказать. Не сталкивался с такими задачами.

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



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

СообщениеДобавлено: Пт Май 14, 2021 4:35 pm Ответить с цитатой Вернуться к началу

Олег, спасибо.
Буду дальше думать, что с этим делать.
Посмотреть профиль Отправить личное сообщение
Astrobiolog



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

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

Я сталкивался с такими задачами.

Swell писал(а):
SetBarsRequired, судя по всему, обрабатывается только один раз – при компилировании, и далее по ходу выполнения программы его уже не поменять...


"По ходу выполнения" НЕЛЬЗЯ УМЕНЬШИТЬ. Увеличить - можно.
Это никак ни изменить, ни обойти.

Swell писал(а):
можно ли получить к ним доступ, используя объектную модель Ami?
Т.е. сделать что-то вроде такого:
AB = CreateObject("Broker.Application");
stocks = AB.Stocks;
stock = stocks.Add("~…..");
quotations = stock.Quotations;
aa=quotations.retrieve(count, Date_, O, H, L C, V, OpenInt);


Да. Но имей в виду, что OLE работает гораздо медленнее, чем AFL.
В зависимости от количества операций
может быть МЕДЛЕННЕЕ НА ПОРЯДКИ.

Swell писал(а):
Буду дальше думать, что с этим делать.


Никаких иных способов, увы - НЕТ.
Посмотреть профиль Отправить личное сообщение
Astrobiolog



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

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

Swell писал(а):
Буду дальше думать, что с этим делать.


https://forum.amibroker.com/t/access-to-price-data-via-ami-object-model/25581

Зря ты там назвался igor_russia...

Томаш прекрасно знает, что все в России и Индии не платят ему.

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


 Перейти:   



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


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

File Attachment © by Meik Sievertsen