1

Тема: Как сделать выборку по свечам?

Доброго времени народ.
Я смотрю форум почти высох. Народу практически нету.
Но всё же спрошу у форумчан кто шарит в lua.
Как правильно задать параметр максимума пяти свечек (или десяти), поясню, нужно получить сигнал когда из перебора пяти свечек пятая будет максимальная.
При том параметр анализа количества свечей должен задаваться  в ручную, 5, 8, 10 и пр.
Ни как не могу сообразить как это правильно прописать?
Подскажите, кто знает.

2 (2020-03-02 20:52:14 отредактировано kalikazandr)

Re: Как сделать выборку по свечам?

RRR пишет:

Доброго времени народ.

Приветствую, нормальный тут форум, спокойный...

local function getMax(tag, N, depth)
    --tag -идентификатор графика
    --N -нужный по счету бар
    --depth -глубина просмотра от последнего бара
    
    local extremum = 0
    local extr_index = 0
    local t, n, l = getCandlesByIndex(tag, 0, getNumCandles(tag) - depth, depth)
    if n == 0 then assert(nil, "не найден указанный график с тэгом "..tostring(tag)) end

    for i=0, n-1 do
        local bar = t[i]
        if bar.high > extremum then
            extremum = bar.high
            extr_index = extr_index + 1
        end
    end
    if extr_index == N then return true, extremum end
    return false, extremum
end

local signal, high = getMax(tag, 8, 25)

3

Re: Как сделать выборку по свечам?

Приветствую, нормальный тут форум, спокойный...

Да, согласен что спокойный, может это и к лучшему.
Я так понимаю
--N -нужный по счету бар, это в моём случае нулевой бар, т.к. сравнение будет происходить с каждом новым поступившим баром, верно? Ну или можно указать любой бар на котором хочу сравнить?
--depth -глубина просмотра от последнего бара, это сколько баров он будет анализировать (5,8,10 и тд)?

4 (2020-03-03 00:44:19 отредактировано kalikazandr)

Re: Как сделать выборку по свечам?

RRR пишет:

Я так понимаю
--N -нужный по счету бар, это в моём случае нулевой бар, т.к. сравнение будет происходить с каждом новым поступившим баром, верно? Ну или можно указать любой бар на котором хочу сравнить?
--depth -глубина просмотра от последнего бара, это сколько баров он будет анализировать (5,8,10 и тд)?

В примере, N это 8 -й по счету бар из 25 рассматриваемых
А depth это сколько баров от последнего бара(самого правого на графике) влево нужно передать в таблицу t.
Если вы в качестве depth передадите getNumCandles(tag), то в t попадет весь график и будет произведено сравнение с 8-м баром на графике, а индекс в t он будет иметь 7-й, т.к. индексирование t начинается с нуля: t[0] это первый бар самый левый на графике, а t[7] это ваш 8-й бар.

5 (2020-03-03 11:37:57 отредактировано toxa)

Re: Как сделать выборку по свечам?

RRR пишет:

--N -нужный по счету бар, это в моём случае нулевой бар, т.к. сравнение будет происходить с каждом новым поступившим баром, верно?

можно решить задачу при помощи двух таблиц. в одной хранить fifo-очереди глубиной depth, в другой dict где ключом будет значение свечи, а значением - кол-во свечек с таким значением в очереди. это будет быстрее работать так как не будет ни одного цикла. так как dict с ключами-числами - сортированный, то вы всегда имеете максимум и минимум.

6

Re: Как сделать выборку по свечам?

toxa пишет:

можно решить задачу при помощи двух таблиц.

Можно вынести всё в доп поток, это снизит нагрузку, Но тогда таблицы должны быть с регулируемым размером, т.к. не всегда
анализ будет только 5 крайних свечек.
Я вообще хотел сделать в идеале индикатор со звуковой сигнализацией, но похоже нужно поднапрячься и попробовать написать  скрипт, который будет совершать сделки.

7

Re: Как сделать выборку по свечам?

RRR пишет:

Можно вынести всё в доп поток, это снизит нагрузку

о каких нагрузках идет речь? выбрать экстремумы во всем графике без фифо, в цикле, не нагрузит процессор - никак, нет математики.

8

Re: Как сделать выборку по свечам?

RRR пишет:

Можно вынести всё в доп поток, это снизит нагрузку

Нельзя, потому, что в lua нет многопоточности.

9

Re: Как сделать выборку по свечам?

kalikazandr пишет:

выбрать экстремумы во всем графике без фифо, в цикле, не нагрузит процессор - никак, нет математики.

Загрузить процессор математикой довольно тяжело. А циклами - легко.

10

Re: Как сделать выборку по свечам?

toxa пишет:

Загрузить процессор математикой довольно тяжело. А циклами - легко.

согласен

11

Re: Как сделать выборку по свечам?

kalikazandr пишет:

согласен

Возможно я чего-то не понимаю, поправьте если ошибаюсь, но я думал если  в скрипте будет несколько циклов перебора по свечкам и добавленным индикаторам это и будет притормаживать и без того не шустрый quik. По этому и планировал вынести все локальные циклы отдельно.

12

Re: Как сделать выборку по свечам?

RRR пишет:

По этому и планировал вынести все локальные циклы отдельно.

Что вы подразумеваете под «отдельно»? В другие скрипты? Тогда нужна коммуникация между скриптами, по-умолчанию этого в квике нет.

13

Re: Как сделать выборку по свечам?

toxa пишет:

Что вы подразумеваете под «отдельно»?

Через    dofile(getScriptPath() .. "\\func_tion.lua") подключение в процессе  файла, где будут  происходить все вычисления.
Или так нельзя?

14

Re: Как сделать выборку по свечам?

RRR пишет:

Через    dofile(getScriptPath() .. "\\func_tion.lua") подключение в процессе  файла, где будут  происходить все вычисления.

Эти вычисления не будут выполняться "отдельно" в смысле в другом потоке.
По сути что в один скрипт всё вписать, что в другой подгружаемый файл вынести исходный код - кроме модульности это ничего не даст.

15

Re: Как сделать выборку по свечам?

toxa пишет:

Нельзя, потому, что в lua нет многопоточности.

Но в qlua есть main(), выполняющаяся в отдельном потоке.
Или вы что-то другие имели ввиду?

16

Re: Как сделать выборку по свечам?

swerg пишет:

Но в qlua есть main(), выполняющаяся в отдельном потоке.
Или вы что-то другие имели ввиду?

ну вот мы зафигачили все в main(). а теперь хотим несколько вычислений "распараллелить" для ускорения. это не так просто, а на чистом lua - невозможно. корутины, которые есть в lua - это кооперативная многозадачность, все корутины выполняются в одном треде.
ps:кстати, интересно выяснить, повалится ли квик, если делать resume корутины из колбэков квика. 4 шанса из 5, что они забыли расставить там критические секции.

17

Re: Как сделать выборку по свечам?

RRR пишет:

Через    dofile(getScriptPath() .. "\\func_tion.lua") подключение в процессе  файла, где будут  происходить все вычисления. Или так нельзя?

можно, только толку не будет. smile ну, в смысле, параллельно ничего не будет выполняться. пока func_tion.lua не завершится - вы из dofile() не выйдете.

18

Re: Как сделать выборку по свечам?

swerg пишет:

Но в qlua есть main()

Да, я как раз про это и говорил.
Я конечно не спец в программировании, пока только учусь.
По этому буду разбираться дальше.
Из всей ветки я понял что нет никакого резона писать в отдельную main().

19

Re: Как сделать выборку по свечам?

swerg, и, кстати, раз уж мы говорим про перекореженную lua-машину квика, то можно попробовать такой концепт: из либы создавать стек при помощи lua_newthread() и в этом стеке можно запустить некую lua-функцию в реально отдельном треде который создать при помощи CreateThread(). так как в квике колбэки реально исполняются не в том же треде, что и main(), следовательно защита все же добавлена в квиковую lua-машину. остается только отловить момент завершения скрипта (можно прям в lua через  __gc() той таблицы, которую создает библиотека, например) и оттуда убивать эти треды, чтобы все не повалилось со страшным грохотом, когда квик прибьет свою lua-машину. есть только одна проблема: нужно добиться того, чтобы в куче не осталось ничего в какой бы момент мы не делали terminatethread(), что довольно проблематично. один из вариантов решения: отладка. вешаем отладочный хук lua_sethook() срабатывающий через count инструкций. в сработавшем хуке мы смотрим, "наш" ли threadid, если "наш", и нужно выходить, то можно сказать что-то вроде lua_pushstring(L, "Abort requested!"); lua_error(L); в хуке, где L - стейт полученный lua_newthread(). это приведет к вываливанию тредового скрипта из lua_pcall() и там дальше дело техники.

20 (2020-03-03 14:27:36 отредактировано toxa)

Re: Как сделать выборку по свечам?

RRR пишет:

Из всей ветки я понял что нет никакого резона писать в отдельную main().

в одном квиковом скрипте, который вы запускаете из окошка "доступные скрипты" может быть только одна main(). точнее, можете написать 10 штук, но каждая следующая переопределит предыдущую:

function main() message("main1", 1); end
function main() message("main2", 1); end

сработает только "main2".

через квиковое окошко "доступные скрипты" можно запустить 10 скриптов, каждый со своим main(), они будут выполняться параллельно, но нужна коммуникация между скриптами, так как они будут исполняться в разных lua-машинах.

21 (2020-03-03 14:47:06 отредактировано RRR)

Re: Как сделать выборку по свечам?

toxa пишет:

в одном квиковом скрипте, который вы запускаете из окошка "доступные скрипты"

Т.е. если я запущу в коде

function main()    
   while  (is_run==true) do
   Body()         
   end 
end

то уже не смогу в

dofile(getScriptPath() .. "\\func_tion.lua")

указать Body(), в которм будет другая main().?

22

Re: Как сделать выборку по свечам?

RRR пишет:

то уже не смогу в dofile(getScriptPath() .. "\\func_tion.lua") указать Body(), в которм будет другая main().?

dofile() не запускает функций. он сам запускает скрипт. если в вашем скрипте func_tion.lua написано:

function main() message("hello, world", 1); end

то dofile() не запустит main() внутри этого скрипта, надпись "hello, world" не появится.
если вы напишите скрипте:

function main() message("hello, world", 1); end
main()

то main() из скрипта будет запущена, но dofile() не выйдет до тех пор, пока не отработает main() внутри скрипта func_tion.lua. глобальный main() переопределится, но никто об этом не узнает, так как основной main(), который запустил, собственно, quik уже исполняется. если мы даже напишем в какой-нибудь ветке алгоритма main = nil и, тем самым, удалим функцию main(), это ни на что не повлияет. в отличие от предыдущего моего примера, так как там переопределение функции main() происходит до вызова main() квиком.

23

Re: Как сделать выборку по свечам?

toxa пишет:

то main() из скрипта будет запущена, но dofile() не выйдет

Ясно одно, что стоит хорошенько разобраться прежде чем удастся что-то написать...

24

Re: Как сделать выборку по свечам?

RRR пишет:

Ясно одно, что стоит хорошенько разобраться прежде чем удастся что-то написать...

https://quik2dde.ru/viewtopic.php?id=16

25

Re: Как сделать выборку по свечам?

10 из 10