Автор |
Сообщение |
AlexLan73
Зарегистрирован: 25.06.2012
Сообщения: 87
|
trashfx, спасибо за ответ ![Smile](images/smiles/icon_smile.gif) |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
trashfx
Зарегистрирован: 27.06.2015
Сообщения: 90
|
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 ); |
|
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
Zoringer
Зарегистрирован: 19.05.2015
Сообщения: 21
|
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! |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
Swell
Зарегистрирован: 18.01.2013
Сообщения: 117
|
Есть ещё вопрос насчёт массивов.
Можно ли каким-нибудь образом получить доступ к данным более ранних баров (O, H, L, C) при включенном QuiсkAFL? |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
000
Site Admin
![](images/avatars/183029264847fb5337d4ea4.gif)
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Swell писал(а): |
Есть ещё вопрос насчёт массивов.
Можно ли каким-нибудь образом получить доступ к данным более ранних баров (O, H, L, C) при включенном QuiсkAFL? |
QuiсkAFL сейчас по умолчанию включен всегда.
Это умная функция и если в коде ты явно лезешь глубоко в историю, то QuiсkAFL настраивается так, чтобы нужные данные были доступны.
Ну либо можно отключить QuiсkAFL функцией SetBarsRequired(). |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
![](images/spacer.gif) |
Swell
Зарегистрирован: 18.01.2013
Сообщения: 117
|
Олег.
Я так и делаю – отключаю 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’е мало информации, а где ещё можно посмотреть, я не знаю... |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
000
Site Admin
![](images/avatars/183029264847fb5337d4ea4.gif)
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Swell писал(а): |
Просто иногда бывает надо залезть глубоко в историю… И тогда выпадает ошибка, что индекс вне диапазона. |
а можно пример? |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
![](images/spacer.gif) |
Swell
Зарегистрирован: 18.01.2013
Сообщения: 117
|
У меня код очень длинный, чтобы его сюда поместить.
Но если вкратце, то смысл в следующем. На графике расставлены метки сделок (загружаются из файла), и нужно провести их статистическую обработку, используя соседние с ними бары. Но доступными оказываются только те, которые в пределах видимости 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 включённым, а эти недоступные данные доставать каким-нибудь другим способом, например через объектную модель.
Не знаю насколько это возможно…
Теоретически, через объектную модель это должно быть возможно… |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
000
Site Admin
![](images/avatars/183029264847fb5337d4ea4.gif)
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Не могу подсказать. Не сталкивался с такими задачами. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
![](images/spacer.gif) |
Swell
Зарегистрирован: 18.01.2013
Сообщения: 117
|
Олег, спасибо.
Буду дальше думать, что с этим делать. |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
Astrobiolog
Зарегистрирован: 27.01.2013
Сообщения: 66
|
Я сталкивался с такими задачами.
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 писал(а): |
Буду дальше думать, что с этим делать. |
Никаких иных способов, увы - НЕТ. |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
Astrobiolog
Зарегистрирован: 27.01.2013
Сообщения: 66
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
|
|
Следующая тема
Предыдущая тема
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы не можете скачивать файлы
|
|