_sk_ написал: Стандартная схема работы виртуальных машин: 1) выделяем какой-то объём памяти для работы; 2) работаем, периодически вызывая сборщик мусора (мелкая гребёнка); 3) если после сборки мусора осталось мало свободной памяти, выделяем больше памяти (периодическое повышение объёма) и продолжаем работать с пункта 2). Продвинутые виртуальные машины умеют уменьшать объём выделенной памяти, если потребность в ней снизилась. Похоже, что виртуальная машина lua к таким не относится.
Вы не правильно понимаете работу VMLua. Память выделяется при создании таблиц и их заполнении. Сборщик мусора запускается по времени. Время его запуска можно установить (можно вообще отключить сборщик). сборщик проверяет ссылки и если на данную область ссылок нет то отправляет эту область в кучу. таким образом уменьшается область занятой памяти. ---------------------- Если желаете экономить память и при этом существенно ускорить работу скриптов, то используйте всюду где можно local.
Проблема Вашего алгоритма в том, что Вы не контролируете состояние робота. Чтобы не открывать кучу позиций надо реализовать контроль . Например, если Вы послали заявку на открытие позиции, то надо отслеживать это состояние и блокировать дальнейшую работу робота, пока не поступит сигнал о выставлении либо отклонении вашей заявки. и т д. Все состояния (события) надо контролировать. ------------------------ относительно OnAllTrade Это колбек событий. Но события (сделки) приходят пакетом т е сделки с различным временем в одном пакете поступят одновременно. Если хотите синхронизировать их возникновение то надо обрабатывать время сделки.
Иван Ру написал: П.С. Версия quik - 7.12 Windows 10 64 бит 32 гб RAM.
Цитата
_sk_ написал: У меня компьютер аналогичный, только памяти 16 Гб
Ребят, вы поймите, квик - 32х битный процесс, он не может использовать больше 4гб от слова никак. И ему без разницы 16 у тебя или 32 гб рам.
Надо уменьшать кол-во данных внутри квика, и оптимизировать луа-скрипты.
1) посмотрите диспетчером задач используемый объем памяти. 2) Посмотрите объем используемой скриптом памяти сборщиком мусора ---------------------------------------------- Чтобы исчерпать всю память надо написать очень плохой скрипт .
Иван Ру написал: Любопытно... Я так понимаю картинка именно со срочного рынка?
Увы, у себя в меню "Доступные параметры" для инструментов срочного рынка я не вижу такого параметра "Начало вечерней сессии" и ничего аналогичного. Скажите какую версию терминала и какого брокера используете? (У меня 7911 финам)
В луа я (безуспешно) использовал такие параметры:
local STARTTIME = getParamEx('SPBFUT',value.sec, 'STARTTIME').param_value -- STRING Начало основной сессии local ENDTIME = getParamEx('SPBFUT',value.sec, 'ENDTIME').param_value -- STRING Окончание основной сессии local EVNSTARTTIME = getParamEx('SPBFUT',value.sec, 'EVNSTARTTIME').param_value -- STRING Начало вечерней сессии local EVNENDTIME = getParamEx('SPBFUT',value.sec, 'EVNENDTIME').param_value -- STRING Окончание вечерней сессии local MONSTARTTIME = getParamEx('SPBFUT',value.sec, 'MONSTARTTIME').param_value -- STRING Начало утренней сессии local MONENDTIME = getParamEx('SPBFUT',value.sec, 'MONENDTIME').param_value -- STRING Окончание утренней сессии
имена параметров надо задавать по англицки. Для этого делаете DDE вывод таблицы параметров с именами столбцов в excel и смотрите имя.
ЦитатаИван Ру написал: Сабж. Как известно иногда она начинается в 19.00, иногда - в 19.05 Пробовал разные средства - поля STATUS и TRAIDSTATUS всегда имеют значения 0. Данные о последней сделке и стакане заявок в период клиринга прекрасно выдаются, по ним судить о времени начала и окончания этого периода нельзя :-(getParamEx ---------------------------------- Параметр Начало вечерней сессии
Спасибо Николай, что напомнили. Этот параметр я опробовал еще раньше, с тем же результатом - одни нули. Там куча аналогичных параметров (время начала и конца дневной сессии и т.п.) которые также возвращают всегда нулевые значения.
Очевидно у Вас не выбран этот параметр Посмотрите его в ТТП. Картинка выше. Если есть то должно читаться в луа.
Напишите какой-нибудь индикатор для начала В нем можете сделать так: local tinfo=getDataSourceInfo(); local interval=tinfo.interval; -- интервал графика
Иван Ру написал: Сабж. Как известно иногда она начинается в 19.00, иногда - в 19.05 Пробовал разные средства - поля STATUS и TRAIDSTATUS всегда имеют значения 0. Данные о последней сделке и стакане заявок в период клиринга прекрасно выдаются, по ним судить о времени начала и окончания этого периода нельзя :-(
getParamEx ---------------------------------- Параметр Начало вечерней сессии
Nikolay Pavlov написал: Я уже выше описан, что шлюзы учитывают порядок полученных транзакций на снятие заявок только в момент отправки на Биржу запроса на снятие заявки, но если сама Биржа решит ответить сначала на 2 запрос, а после на 1, шлюз НЕ БУДЕТ ждать пока биржа пришлет ответ на запрос снятия заявки №1, он сразу отправит сообщение о снятии заявки №2 на сервер Quik и соответственно в терминале Вы увидите, что заявка №2 снялась раньше.
Вообще-то,шлюз ничего не может решать. Он работает по правилу FIFO. ----------------------------- Решать могут, например, маршрутизаторы. ----------------------------- Вы уж старайтесь не фантазировать, а придерживаться реальной схемы каналов.
Andrei2016, Суть в том , что Вы в своих вопросах хотите получить 100% гарантии синхронного прихода сообщений при асинхронной передаче потоков от биржи и асинхронной передачи пакетов по интернет. Т е ответ на Ваши вопросы один - гарантий никаких нет. Потоки не синхронизированы. Интернет допускает опережение пакетов, их потерю, повторный запрос. Это же допускают и потоки с биржи. т е можно терять сообщения и повторно их запрашивать т е нарушать последовательность.
что-то тема анекдот напомнила. ------------------------------ сидит группа зеков в тюрьме , все анекдоты давно рассказали и поэтому называют лишь номера анекдотов. Один зек кричит - номер 102. Вся камера - ну это уже не смешно, сколько можно этот анекдот рассказывать. Через пять минут, в дальнем углу раздается смех . Ты что, это? -удивленно спрашивает смотрящий. Так я этот анекдот первый раз слышу - отвечает смеющийся. -------------------------------------------
Василий Артёмов написал: Здравствуйте. Необходимо получать callback только после изменение позиции, без различных других вызовов данного колбэка. Как можно реализовать, подскажите пожалуйста?
Без различных других вызовов данного колбека нельзя. колбек на то и колбек, что вызывается по любому изменению FuturesClientHoldin (так оно задумано изначально). тоже самое касается и других колбеков. ------------------------------- Поэтому Вам надо внутри колбека поставить Ваше условие условие и по true совершать действия.
Пытаюсь написать скрипт, задачей которого является получение значения индикаторов с большого числа инструментов. Делать свыше 70-80 таблиц и называть в них индикаторы смысла не имеет.
Разобрался, что через CreateDataSource можно получить данные со свечей любого инструмента... но можно ли это применить для индикаторов? Для аллигатора или хотя бы обычной скользящей средней? Или есть какие-то другие альтернативы для решения данной задачи?
CreateDataSource получает данные с сервера. Поэтому с помощью этой функции можно получить лишь те индикаторы которые рассчитываются на сервере. Например, свечи. Встроенные индикаторы рассчитываются в терминале, поэтому их невозможно заказать с свервера т е надо считать либо в скрипте либо в терминале. В последнем случае надо открывать окна с графиками и ставить идентификаторы. Это совсем не страшно, так как очевидно делается один раз.
Let_it_go, Выкладываю вариант решения на луа указанной страницы сайта.
Код
require "socket"
http = require 'socket.http'
local address = 'http://smart-lab.ru/dividends/index/order_by_t2_date/desc/'
local ts={"tr","strong","span"}
local lMax=91 --число строк в таблице
--------------------
function nkdelspace(s)
local len=string.len(s); local z=""; local x1=32;
for i=1,len do local x=string.byte(s,i); if x<32 then x=32 end
if (x~=32 or x1~=32) then
if z=="" then z=string.char(x) else z=z..string.char(x) end
x1=x; end
end --убираем проблелы
return z;
end
----------------------
local body = http.request(address)
----------------------
for i=1,#ts do
body = string.gsub (body,"(<%s*"..ts[i].."[^>]*>)","")
body = string.gsub (body,"(<%s*/"..ts[i].."[^>]*>)","")
end
body = string.gsub (body," "," ")
local t={} -- результат
local j=0; local k=0; local text=0;
local m=1;
local n=string.find(body,"td>",m,#body,true);
local x=string.byte(body,n-1);
m=m+3;
-----------------
while #body>m do
n=string.find(body, "td>",m,#body,true);
if n then local n1=n;
if x~=47 then
x=string.byte(body,n-1); if x==47 then n=n-1; end
text = string.sub(body, m,n-2); text = nkdelspace(text);
local len=string.len(text);
if len<20 then
j=j+1; if j==1 then k=k+1; t[k]={} end
local tt=t[k]; tt[#tt+1]=text;
if j==8 then if k==lMax then break end
j=0 end
end
else
x=string.byte(body,n-1);
end
m=n1+3;
else break;
end
end
Результат - таблица t . 91 элемент ( это переменная lMax). каждый элемент - таблица из 8 элементов: -------------------- 1>table ....1 PHOR ....2 08.08.2017 ....3 10.08.2017 ....4 2016 ....5 н/расп ....6 21 ....7 2345 ....8 0,9% -------------------- ..2>table ....1 GAZP ....2 18.07.2017 ....3 20.07.2017 ....4 2016 ....5 год ....6 8,0397 ....7 122,28 ....8 6,6% ----------------- и т д
http = require 'socket.http' local address = 'http://smart-lab.ru/dividends/index/order_by_t2_date/desc/' htmls = http.request(address) ------------------------ а потом вытащить данные используя ручной способ из приведенного примера El El переписав его на луа.
Николай Камынин написал: Let_it_go , Ваша задача немного сложнее, чем пример который я написал. Дело в том,страница, которую вы хотите читать не содержит готовой таблицы. Поэтому кроме парсера Вам придется исполнять джава скрипты. ------------------- Поэтому более правильно решать вашу задачу через использование браузера в качестве ком объекта.
Эта страница - статический html. Пример выше именно ее и достает и парсит. По крайней мере, так было месяц назад, когда пример писался.
Пример очевидно хороший для тех, кто знает CPP и и работу c make. Полагаю, что 99% посетителей этого форума и не знают как с этим работать. Эти особенности и есть недостатки примера. -------------------------------------- Кроме того, пример содержит еще две особенности. 1) Скорректированная библиотека, т е недокументированная поделка. 2) Как сказано в примере: "Преобразование данных из HTML будет осуществляться для простоты "ручным" поиском строк и регулярными выражениями. В более серьезной архитектуре может применен XML-парсер и др., такой вариант оставляется читателю ручной способ поиска." ----------------------------- Следовательно, это скорее всего - готовое частное решение, а не пример для подражания. --------------------------------------- Полагаю, что более универсальное решение , может быть на luacom и InternetExplorer.Application. Т е решении исключительно в рамках стандартов Майкрософт и языка луа. -------------------------------
Let_it_go, Ваша задача немного сложнее, чем пример который я написал. Дело в том,страница, которую вы хотите читать не содержит готовой таблицы. Поэтому кроме парсера Вам придется исполнять джава скрипты. ------------------- Поэтому более правильно решать вашу задачу через использование браузера в качестве ком объекта.
Let_it_go написал: Господа, подскажите пожалуйста как реализовать такую задачу на Луа. 1. Робот заходит на страничку с дивидендами: http://smart-lab.ru/dividends/
2. Читает её 3. Формирует Луа-таблицу с полями Тикер - дата отсечки Т+2 Тикер - дата отсечки Т+2 4. В последний день перед дивидендым гэпом посылает сообщение в КВИК.
Мои роботы на Луа никогда не читали интернет-странички и не брали из них данных. Даже не знаю с чего начать. Спасибо за помощь.
local function off (events)
display.remove (events);
end
local function onGlobal (event )
if (floor = = event.object1) then
if ( event.phase = = "began" ) then
if (event.object2.myName > 0 ) then
mas = event.object2.myName
timer.performWithDelay ( 5000 , off(event.object2))
end
end
end
end
А что у Вас с таймером? Это же Вы написали и только Вы знаете, что у вас с таймером.
kvazar1988 написал: Я ее частично позаимствовал. И где то она зацикливается при покупке и начинает бесконечно покупать...
Тогда Вы не совсем правильно задали вопрос в теме. -------------------------------- Правильно получается так: ------------------------- "Почему эта программа где то зацикливается при покупке и начинает бесконечно покупать." ---------------------------- Чтобы ответить на этот вопрос надо сделать следующее: 1) восстановить алгоритм по тексту 2) поставить отладочную печать 3) сравнить результаты в файле отладки с алгоритмом и найти ошибку, а может быть и не одну. -------------------- Как думаете, кто-нибудь, кроме Вас, будет это делать? =========================
Спасибо за ответ. Я решил проблему (даже если ее нет) отказавшись от обнаружения конкретного номера свечи. Сейчас работаю с 7.5, когда снова возникнет желание обновить, то проверю.
проверить факт обновления без увеличения звгрузки очень просто Надо запоминать текущий номер записи и при следующем входе сравнивать его с новым значением Если новое значение существенно меньше (существенно - это для защиты от дозаписи) то есть факт обновления. ------------------------ Все гениальное - просто.
kvazar1988 написал: Как указать ссылку на график цены? Как указать ссылку на индикатор Parabolic SAR? Как указать условие покупки или продажи - пересечения Parabolic SAR с ценой?
откройте окно редактирования графика. В "Дополнительно" запишите Идентификатор для графика цены и для Parabolic SAR. Это будут их tag. после этого используйте эти функции. Функции для работы с графиками
Sergey Gorokhov написал: Николай, В 7.10 в этом месте ничего не менялось. Изменения были, но в 7.7:
Цитата
Изменен вывод информации функциями O, H, L, C, V, T по свечкам, сформированным на пустых интервалах. Теперь, для таких свечек, функция T возвращает время интервала, а функции O, H, L, C, V возвращают nil. Для корректной проверки существования свечи на графике добавлена новая функция CandleExist().
Собственно, у нас на 7.10 ситуация не воспроизводится. Если требуется анализ, опишите подробней при каких обстоятельствах проявляется проблема.
Добрый день, Просто я пропустил все предыдущие серии и перешел с 7.5 сразу на 7.10. ------------------------ Проблема следующая. Если в одном В одном окне несколько областей, то, при разной длине истории, на более коротких графиках будут пропущены начальные значения. В результате эти графики будут начинаться не с 1 , а с других в общем случае произвольных значений. Т е в скриптах индикаторов на этих графиках никогда не появится индекс равный единицы. Это усложняет обнаружение момента, когда индикатор перерисовывается при изменении его параметров. -------- . Вот пример. Во второй области на графике отсутствуют начальные значения. В версии 7.10( очевидно и в 7.7) индекс начинается с 93.
Добрый день, Если я правильно понял, то в версии 7.10 при отсутствии свечей OnCalculate не вызывается. При этом индекс считается и OnCalculate будет вызван первый раз при произвольном индексе больше 1. -------------------------------------------- Вопрос к разработчикам: 1) Каким образом можно определить, что данная свеча первая в индикаторе, если ее номер может быть любым? Раньше это определялось до безобразия проста по индексу равному 1. -------------------------------- 2) Каким образом определять тот факт, что индикатор строится заново? ------------------------- Спасибо. ----------------------- P.S.: откатился на 7.5.
Время изменения стакана получаемого через OnQuotes, OnQuotes - есть ли возможность параллельно с чтением стакана, получить точное время торгового сервера, когда он возник/изменился
Вот еще информация к размышлению. Результаты тестирования серверов биржи в 2015 году показали следующее: Максимальная производительность серверов Центрального Звена ТКС в ТЦ Space. Скорость обработки в сек: Транзакции 18884; Заявки 10782; Cделки 1775.
Время изменения стакана получаемого через OnQuotes, OnQuotes - есть ли возможность параллельно с чтением стакана, получить точное время торгового сервера, когда он возник/изменился
PFelix написал: И третье. Если Вы, конечно, правы относительно протокола UDP. Биржа, ЧТО, разными протоколами данные шлет? Ленту - одним (TCP, БЕЗ пропусков), остальное - другим?
Время изменения стакана получаемого через OnQuotes, OnQuotes - есть ли возможность параллельно с чтением стакана, получить точное время торгового сервера, когда он возник/изменился
Для особо настойчивых хочу сообщить, что синхронизацизировать эти потоки вообще невозможно. Если я правильно понял протокол биржи то эти потоки биржа выплевывает по протоколу UDP. если кто-то из брокеров что-то не получил, то это проблема брокера. Он конечно может запросить пропуски по протоколы TCP, но это ему нужно? Кроме того, полагаю, что сервер брокера делает парсинг потоков чтобы раздать их клиентам. Период раздачи информации биржей для срочного рынка от 10 мс и более. Делают даже специальные задержки чтобы жизнь не казалась медом.
Время изменения стакана получаемого через OnQuotes, OnQuotes - есть ли возможность параллельно с чтением стакана, получить точное время торгового сервера, когда он возник/изменился
Иван Ру, Возможно я не понял Вашу задачу, но хочу обратить внимание на неточность в Ваших рассуждениях. ------------------------------------------ Во-первых, тот факт что пакеты в TCP соединении приходят последовательно не может знать пользователь винды. Речь идет о пакетах протокола TCP и они собираются стеком TCP, что пользователем не доступно. --------------------------------------------- Во-вторых, интернет построен на маршрутизаторах - а это и есть разное время движение пакетов и возможность их прихода как раньше так и позже. -------------------------------------------------------- В-третьих, время сервера брокера - это время когда в терминал пришла последняя партия данных с сервера. Это может быть и не стакан. ---------------------------------------------------- В-четвертых, поток сделок тоже идет блоками. В одном блоке, который придет в одно время сервера будут сделки с различным временем биржи. ----------------------------------------------------- В итоге, сделкам совершенным в разное время будет соответствовать одно и тоже время сервера брокера, а это значит, сделки могут опередить заявки в стакане, по которым они совершены. --------------------------------------- Поэтому в терминале QUIK и на обычных каналах интернет возможна синхронизация сделок и заявок лишь очень примерно. ---------------------- На это я и пытался обратить Ваше внимание.
Возник вопрос по этой теме. ---------------------- Предположим: 1) цена превысила уровень активации и включился механизм отсчета 2) В следующий момент цена последней сделки ушла вниз на величину большую чем защитный спред, т е возникли условия выставления лимитированной заявки по тейк-профит . 3) эта цена также ниже, чем STOPPRICE2, возникло условие выставление лимит заявки по стоп-лимит. ------------------------------- Вопрос к знатокам: По какому из этих двух условий сервер выставит лимитированную заявку. или иначе сформулирую: какое из условий проверится раньше и будет ли проверятся второе, если первое истина. -------------------- Зная ответ , можно написать скрипт для однозначного определения что сработало. ====================== Вообще-то, можно просто при срабатывании найти максимум цены и просчитать данную ситуацию, т е получить ответ на вопрос - что сработало. ------------------- спасибо
Время изменения стакана получаемого через OnQuotes, OnQuotes - есть ли возможность параллельно с чтением стакана, получить точное время торгового сервера, когда он возник/изменился
PFelix написал: Такой сложный вопросили раскрыл САКРАЛЬНОЕ ЗНАНИЕ?
Ответ на свой вопрос Вы найдете изучив следующее: 1) Особенности обмена информацией при использовании Интернет 2) Особенности протокола TCP. Понятие пакетной передачи, маршрутизации. 3) Алгоритм Нейгла(Нагла) Успехов
Дмитрий написал: Добрый день. Вопрос не совсем по quik, но буду благодарен, если кто-нибудь мне поможет. Для анализа данных хочу написать свою программу, которая по нажатию кнопки будет отправлять свечу OHLC в metastock. При каждом нажатии кнопки должна появляться следующая свеча. Так сказать имитация онлайн торгов.
Ну и вопрос, как подключиться к metastock из своей программы ? Как это делает Quik ? Может можно как-то задействовать файлы winros.exe и iwr.dll из своей программы ? Может есть где-то какая-нибудь документация ? Направьте, пожалуйста меня в нужном направлении.
Эта задача сложная так как Вам надо изучить формат метастока, что не очень доступно. кроме того метасток очень ограниченная программа и древняя. Посмотрите в сторону амиброкера. Для него есть и хорошее API и документация и найдете примеры решения в инете и программа развивается.
DARK написал: Здравствуйте, подскажите у кого регать демо акк forts, что бы не было ограничений (типо можно на демо торговать только в лонг и тд) + что бы данные графика были идентичные как на реал акке(данные графика интересуют, а не стакана), Скиньте пожалуйста линк.
На демо невозможно ничего реального тестировать и не мечтайте. Демо исключительно для вылавливания ошибок в коде программы, а не для отладки торговых алгоритмов. -------------------------------- торговые алгоритмы отлаживаются либо в программа тех анализа например амиброкер, либо в квике на реальных торгах, без выставления реальных заявок а с эмуляцией их.
PFelix написал: Здравствуйте. Однако, я правильно понимаю, (возвращаясь к ПЕРВОНАЧАЛЬНОЙ теме обсуждения): Что, если ПРЕЖДЕ пришел калбек с флагом "расчет", то сохранив "данное знание в переменной", "по исполнении" мы можем ОДНОЗНАЧНО понимать "в какую сторону" выполнилась стоп-заявка? Т.е. если с таким флагом калбек был, значит, - в тейк, иначе - в лосс.
Так как тейк-профит по смыслу это ограничение прибыли, а стоп-лосс - ограничение убытков, то рекомендую определять факт закрытия позиции так: Если вышли с прибылью - то сработал тейк, а если с убытком - то стоп.
Let_it_go написал: Спасибо, Николай. Я хочу получить таблицу-контейнер, в которой будут храниться цены за последние how_many_candles свечей (how_many_candles-пользовательская переменная, например равная 50). В контейнер будет записываться типическая цена (Typical). Всё это нужно для создания синтетических инструментов и их анализа. Я хочу получить значение пары GAZP/SBER: сколько сберов надо отдать за 1 Газпром, получить по GAZP/SBER цены за how_many_candles свечей и эти данные загнать в индикаторы Сергея Горохова INDICATORS.ZIP. Например посчитать RSI по паре GAZP/SBER Вопрос о финальной стадии "запихивания" я задал в этой ветке. https://forum.quik.ru/forum10/topic2733/ Что то не клеится при расчёте RSI. Вот весь код, который на данный момент сырой и глючный.
Код
Про контейнер В приведенном мною варианте Вы получите таблицу container[sec] в которй будут все ваши цены далее вы просто берете от конца этой таблицы нужное вам число значений т е делаем так
Код
local t=container[sec]; --это таблица цен по данному инструменту
local len=#t -- это текущее количество цен в контейнере
local n=len-N; if n<1 then n=1; end -- это номер первого из N значений цен т е Ваши цены в t[n] до t[len]
Теперь про индикатор Я бы не использовал функции из INDICATORS.ZIP, по той причине, что они слишком универсальны и следовательно громоздкие. Я использую обычно один из следующих вариантов: 1) использую встроенную RSI и читаю значения с графика, когда лень или нет надобности в 2). 2) беру формулу и пишу функцию под задачу без излишеств.
PFelix написал: Здравствуйте. Полагаю, не стоит создавать тему для аналогично однозначного ответа на мой вопрос. Поэтому пишу сюда. Подскажите пожалуйста, как будет реагировать "система" в случае "несколько нестандартном". Допустим я разработал ТС, в которой ожидаю повторных "ударов рынка в уровень". Для этого я использую стоп-заявку TAKE_PROFIT_AND_STOP_LIMIT_ORDER, в которой защитный спред равен по величине отступу, но отрицателен. Вопрос в том, останется ли стоп-лосс-половинка этой заявки в активном состоянии после того, как условия по стоп-цене 1 выполнились (фаза расчета прошла), отступ тоже "сработал". Если мы рассчитывали на рост (поставили продажу), стоп-заявка должна выставить лимитную по хаю в сделке. Это - ВСЁ? После того, как срабатывает фаза расчета, защитная часть стоп-заявки снимается? Спасибо.
эту стоп заявку исполняет сервер. Сначала заявка вне расчета. следующий шаг - расчет. Следующий - сработала стоп-заявка и сервер выставил заявку на биржу. Все закончилась стоп-заявка и сервер ее удалил. Поэтому ничего не останется. все стандартно.
Pavel написал: Спасибо. Первый вариант не подойдет по причине движения графика и когда образуется фрактал заранее не узнать. Попробую через массив... Хотя вроде эти же фракталы определены стандартным индикатором и наверное можно вытащить значения цены на этих свечах.
Вот сделал функцию которая выбирает все фракталы https://yadi.sk/d/0eUVB7mC3HFpmH скапируйте этот файл в каталог индикаторов "LuaIndicators" который в каталоге QUIK Вот пример индикатора в котором используется эта функция В окне сообщений покажет все номера выбранных фракталов
Код
--title="<Nikolay Kamynin> kamnik@mail.ru"
Settings={
f1 ="fractals", -- это идентификатор индикатора фрактал его надо записать в дополнительные параметры индикатора
Name = "*nk_fr_get", --имя этого индикатора
mline=0, --номер линии с графиком фрактал
}
-- выбираем фракталы в результате будет создана таблица tf
-- tf - таблица номеров свечей с фракталами
path = "./LuaIndicators/"
package.path =package.path..";"..path.."?.luac;"
require "nk_get_fr";
----------------
function Init()
Settings.line={}; Settings.line[1]={Name = "A",Color = RGB(0,255,0),Type =1,Width = 2 };
return #Settings.line;
end
---------------
function OnCalculate(i)
nk_get_fr.get_fractals(i);
if i==Size() then
local m=1; while #tf>m do message(tostring(tf[m]),1); m=m+1; end
end
end
Начинаете с 1 и ищите до текущей свечи. Когда найдете, то запомните номер свечи в таблице и начнете с этого номера В результате получите таблицу, в которой будут номера свечей фракталов слева направо. Последний фрактал всегда будет последним в таблице. Т е то, что Вы хотите.
Pavel написал: Спасибо. Первый вариант не подойдет по причине движения графика и когда образуется фрактал заранее не узнать. Попробую через массив... Хотя вроде эти же фракталы определены стандартным индикатором и наверное можно вытащить значения цены на этих свечах.
Вам не надо знать когда образуется фрактал, Вам надо его найти Вы ищите от последнего найденного до текущей свечи. Начинаете с 1 и ищите до текущей свечи. Когда найдете, то запомните номер свечи в таблице и начнете с этого номера В результате получите таблицу, в которой будут номера свечей фракталов слева на права. Последний всегда будет последним в таблице потом слева предпоследний и так все существующие. Т е то, что Вы хотите.
local num_candles=ds[sec]:Size() if index==num_candles then container[sec]={} for i=0, how_many_candles do local close_price=ds[sec]:C(num_candles-i) local open_price=ds[sec]:O(num_candles-i) local high_price=ds[sec]:H(num_candles-i) local low_price=ds[sec]:L(num_candles-i) local typical_price=(close_price+open_price+high_price+low_price)/4 container[sec].=typical_price end end end
Можно как-то так:
Код
function mycallbackforallstocks(class,sec,index)
if container==nil then container={} end
if container[sec]==nil then container[sec]={} end
-----------------------------
local close=ds[sec]:C(index)
local open=ds[sec]:O(index)
local high=ds[sec]:H(index)
local low=ds[sec]:L(index)
container[sec][index]=(close+open+high+low)/4
end