Вопрос-ответ

Автор записи: Дмитрий (Admin)
1 звезда2 звезды3 звезды4 звезды5 звезд (Голосов 8, среднее: 5,00 из 5)
Загрузка...
LogoNew
Если Ваш вопрос не имеет отношения к какой-то определенной статье на данном сайте, то, пожалуйста, задавайте его в комментариях здесь.

Добавить комментарий

Вопрос-ответ: 2 356 комментариев

  1. Здравствуйте. Спасибо за оперативность. Для построения скользящей средней с нулевой задержкой. Берётся скользящая средняя с каким то периодом, она усредняется (сглаживается ). Эта разница прибавляется к скользящей средней с меньшим периодом и всё, получается, как бы средняя с "нулевой задержкой". В метастоке реализовать это пустяк, а вот, если не хватает грамотёшки в программировании на Lua для меня это проблема. Спасибо. Если возможно пример рабочего кода скользящей средней на среднюю на Lua.

  2. добрый день, всем участникам форума. Нужна помощь в программировании LUA: кто-нибудь подскажите, как экспоненциальную скользящую среднюю усреднить. Спасибо.

          1. Дмитрий запретил ссылки сторонних ресурсов, дабы не спамили рекламу, но к сожалению он просто не модерирует сайт и его тут нет и его людей, поэтому тут вы вряд-ли чего дождетесь. Ну либо ждите, пока моё сообщение с сылкой будет видно

  3. Как узнать за сколько миллисекунд происходит например три, десять или 100 рыночных ордера. но не внутри одной цены, а когда цена стреляет. То есть к примеру за секунду образуется новый длинный бар по рынку в котором 10 или 100 тиков цены. Какая функция возвратит миллисекунды за которые этот бар вырос?
    И тоже интересный вопрос - удар по рынку всегда имеет одну и ту же скорость (если идут только! покупки или продажи) или могут быть более медленные врывы и более быстрые, в миллисекундах? (по логике, если покупатель\продавец выкупает нужное количество шагов цены, то технически скорость должна быт неизменной...)

      1. даже, если вы разберетесь, то хочу вас огорчить в 30% случаев цена продолжает движение без откатов и гораздо больше, чем первоначальный толчек

  4. После обновления QUIK не запускает скрипт, пишет ошибку "invalid escape sequence near" на строку

    1
    
     price = string.gsub(tostring(price),'[\.]+', ',')

    в блоке, который приводит переданную цену к требуемому для транзакции по инструменту виду. Кто-нибудь сталкивался с таким же?

    1. Судя по комментариям на форуме QUIK, начиная с версии 8.5 терминала выполнено обновление ядра Lua и, как я понял, цена теперь возвращается в другом формате.

      1. Для начала обратите внимание, что запись '[\.]+' не верна ни для Lua 5.1 ни для Lua 5.3
        В Lua используются шаблоны, на этом сайте есть список доступных классов, используемых в шаблонах. Для вставки магических символов используется символ '%', но не '\'. Именно по этой причине Вы получаете ошибку.
        Используя данную запись

        1
        
        price = string.format("%.0f", price)

        Вы избавились от ошибки, а проверили что возвращает эта функция?
        Выполните следующий код:

        1
        2
        3
        
        local prc = 25.78;
        local price = string.format("%.0f", prc);
        message("Цена = " .. price);

        В ответ получите сообщение 'Цена = 26'
        Если Вас устраивает, что цены округляются до целых значений, то используйте свой вариант.

        Но все же правильнее будет заменить символ '\' на '%' и будет работать Ваш первый вариант.
        Выполнив такой код:

        1
        2
        3
        
        local prc = 25.78;
        local price = string.gsub(tostring(prc),'[%.]+', ',')
        message("Цена = " .. price);

        в ответ увидите сообщение 'Цена = 25,78'

        1. Благодарю за совет.

          Запись с '[\.]+' я брал как раз таки с этого сайта и она успешно работала с 17го года, пока QUIK не обновился до 8.5

          Округление цены до целого значения меня полностью устраивает, т.к. работаю только с RI, а у неё дробных цен не бывает.

    1. можно перебрать все индексы в цикле, получить дату время свечи и если совпадает, то вернуть индекс и нужные значения.
      а можно на старте создать таблицу с индексами в формате: ["YYYYMMDD_HHMM"] = index и добавлять в нее новые индексы, тогда поиск сократиться многократно.

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      
       local hash_tm = {}
      local oindex = 0
      function OnCalculate(index)
      	if index == 1 then
      		oindex = Size()
      		for i = 1, oindex do
      			local tm = os.date("%Y%m%d_%H%M", os.time(T(i)))
      			hash_tm[tm] = {i}
      		end
      		message("index= " .. tostring(hash_tm["20201022_2105"]), 2)
      	end
      --какой-то код
      end

      Если пользуетесь функцией чтения с графика, то принцип тот же

      1. хочу попробовать создать индикатор который берет значения из файла, который был создан скриптом, ранее который обсуждали. Что если определяем дату/время текущего индекса, далее в цикле сравниваем эту дату/время с таблицей из файла и если совпало то возвращаем текущему индексу значение из таблицы и так далее для следующих индексов? Получится так?

        1. файл не потокобезопасный и нужно делать кучу проверок и доступ к данным медленнее, чем через общее пространство имен.
          лучше начните сразу со сложного варианта, сэкономите свое время.

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          15
          16
          17
          18
          19
          20
          21
          22
          23
          24
          25
          26
          27
          28
          29
          30
          31
          32
          33
          34
          35
          36
          37
          38
          39
          40
          41
          42
          43
          44
          45
          46
          47
          48
          49
          50
          51
          52
          53
          54
          55
          
          --скачать lua_share https://quik2dde.ru/viewtopic.php?id=306
          --lua_share.dll кладем в корень квик в папку scripts
          --индикатор не "отпускает" библиотеку lua_share и поддерживает пространство имен, даже при выключенных роботах
          package.cpath=package.cpath..";"..getWorkingFolder().."/scripts/?.dll"
          local sh = require'lua_share'
           
          Settings ={}
          Settings.Name = "*sh_intervalEx"
           
          function Init()
          	return 1
          end
           
          local strInt = {
          	[0]		= "tick",  
          	[1]		= "M1", 
          	[2]		= "M2", 
          	[3]		= "M3", 
          	[4]		= "M4",
          	[5]		= "M5",
          	[6]		= "M6",
          	[10]	= "M10",
          	[15]	= "M15",
          	[20]	= "M20",
          	[30]	= "M30",
          	[60]	= "M60",
          	[120]	= "H2",
          	[240]	= "H4",
          	[-1]	= "D",
          	[-2]	= "W",
          	[-3]	= "MN",
          }
          local old_index
          local ns --пространство имен
          function OnCalculate(index)
          	if index == 1 then
          		old_index = Size()
          		local info = getDataSourceInfo()
          		local ticker= tostring(info.sec_code)
          		local ns_name = ticker:sub(1,2) --для срочного рынка
          		--для акций следует использовать: ns_name  = market.."_"..ticker
          		ns = sh.GetNameSpace(ns_name)
          		ns.market = tostring(info.class_code)
          		ns.ticker = ticker
          		ns.interval= strInt[info.interval]
          		ns.bar_px = os.time(T(old_index))
          		--считываем из пространства имен
          		message(tostring(ns.ticker).."\n"..tostring(os.date("%H:%M:%S", ns.bar_px)).."\ninterval= "..tostring(ns.interval), 2)
          	end
          	if index > old_index then
          		old_index = index
          		ns.bar_px = os.time(T(index))
          	end
          if index == Size() then ns.last = C(index) end
          end

          и бот:

          1
          2
          3
          4
          5
          6
          7
          8
          9
          
          package.cpath=package.cpath..";"..getWorkingFolder().."/scripts/?.dll"
          local sh = require'lua_share'
           
          function main()
          	local ns_name = "Si" --у меня индикатор sh_intervalEx добавлен на график "SiZ0"
          	local ns = sh.GetNameSpace(ns_name)
           
          	message(tostring(ns.ticker).." "..tostring(ns.last), 2)
          end
  5. Привет коллеги!
    Подскажите пожалуйста можно как то отменить окно сообщения VCL.MessageDlg по условию. Ситуация такая: при наступлении условия из майн выводим окно диалога с подтверждением да..нет, окно висит и ждет... далее по другому условию появляется другое окно с диалогом... как убрать предыдущее если выбор не сделан..то есть кнопки остались не нажаты

      1. окно висит и ждет) и робот тоже курит) так себе решение.
        проще сделать форму для сообщений и при нажатии кнопок сбрасывать флаг: Visible = false

  6. Добрый день kalikazandr. Попробовал проверить ваш ответ не идет - attempt to call a nil value (global 'all_trades_bs') . Сам скрипт прост, но не понятно какую переменную передовать в функцию local function all_trades_bs(flags)
    попробовал переменную f не правильно, попробовал (all_trades.flags) тоже нет. Что передовать в ф-ю ???

    Run = true
    function main()
    local p,f = nil,nil

    while Run do
    for i=1,getNumberOf("all_trades") - 1 do
    if 10 == getItem("all_trades",i).datetime.hour and 0 == getItem("all_trades",i).datetime.min and 1 == getItem("all_trades",i).datetime.sec then
    p = getItem("all_trades",i).price; f = getItem("all_trades",i).flags
    if all_trades_bs(f) == "S" then message("SHELL p="..p)
    else message("BUY p="..p)
    end
    elseif i==10 then Run = false message(" I=20")
    end
    end

    end
    end
    local function all_trades_bs(flags)
    -- направление обезличенной сделки
    if bit.band(flags, 0x1) ~= 0 then
    return "S", -1
    else
    return "B", 1
    end
    end

    1. Конечно, вы функцию all_trades_bs объявили локально, а точку ее вызова выше ее области видимости
      И честно, перестаньте баловаться вот таким способом получить данные: getItem("all_trades",i).datetime.hour
      функция getItemищет хранилище квик по ключу "all_trades" и нужную строку по "i", хранилище это в Пекине.
      поэтому один раз получаете строку:
      Local item = getItem("all_trades",i)

      и дальше работаете уже с ней:
      local price = item.price
      local hour = item.datetime.hour

      попробуйте так:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      
      local function all_trades_bs(flags)
      -- направление обезличенной сделки
      	if bit.band(flags, 0x1) ~= 0 then
      		return "S", -1
      	else
      		return "B", 1
      	end
      end
       
      function main()
      	local dt = {}
      	dt.day, dt.month, dt.year = string.match(getInfoParam("TRADEDATE"),"(%d*)%p(%d*)%p(%d*)")
      	dt.hour, dt.min, dt.sec = 9, 59, 59
      	local timestart = os.time(dt) -- время 9:59:59 текущей серверной даты в секундах
      	local c = 0 --счетчик сделок с 10:00:00
       
      	local n = 10 --искомая строка с 10:00:00
      	for i=1,getNumberOf("all_trades") - 1 do
      		local item = getItem("all_trades",i)
      		local tm = os.time(item.datetime)
      		if tm > timestart then
      			c = c + 1
      			if c == n then
      				local sign_str, sign_num = all_trades_bs(item.flags)
       
      				message(
      					item.sec_code.."\n"..
      					os.date("%x %X",tm)..
      					"\n i= "..i..
      					"\n sign_str= "..sign_str..
      					"\n sign_num= "..sign_num..
      					"\n p="..item.price, 2)
      				break
      			end
      		end
      	end
       
      end
  7. Уважаемые знатоки подскажите как узнать битовый флаг в таблице обезличенных сделок. Как в функции bit.band указывают необходимую строку ?
    if bit.band ( all_trades.flags и как указать необходимую строчку ....?

    1. Попробуйте так.

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      
      local function all_trades_bs(flags)
      -- направление обезличенной сделки
      	if bit.band(flags, 0x1) ~= 0 then
      		return "S", -1
      	else
      		return "B", 1
      	end
      end
      local function trades_orders_bs(flags)
      -- направление сделки/заявки
      	if bit.band(flags, 0x4) ~= 0 then
      		return "S", -1
      	else
      		return "B", 1
      	end
      end
      local function order_status(flags)
      -- статус заявки/стоп-заявки
      -- return status, active
      	if bit.band(flags, 0x8000) ~= 0 then
      		return "C", 3 -- стоп-calculate
      	end
      	if bit.band(flags, 0x1) ~= 0 then
      		return "A", 2
      	else
      		if bit.band(flags, 0x2) ~= 0 then
      			return "K", 0
      		else
      			return "F", 0
      		end
      	end
      end
      1. Добрый день kalikazandr. Попробовал проверить ваш ответ не идет - attempt to call a nil value (global 'all_trades_bs') . Сам скрипт прост, но не понятно какую переменную передовать в функцию local function all_trades_bs(flags)
        попробовал переменную f не правильно, попробовал (all_trades.flags) тоже нет. Что передовать в ф-ю ???

        Run = true
        function main()
        local p,f = nil,nil

        while Run do
        for i=1,getNumberOf("all_trades") - 1 do
        if 10 == getItem("all_trades",i).datetime.hour and 0 == getItem("all_trades",i).datetime.min and 1 == getItem("all_trades",i).datetime.sec then
        p = getItem("all_trades",i).price; f = getItem("all_trades",i).flags
        if all_trades_bs(f) == "S" then message("SHELL p="..p)
        else message("BUY p="..p)
        end
        elseif i==10 then Run = false message(" I=20")
        end
        end

        end
        end
        local function all_trades_bs(flags)
        -- направление обезличенной сделки
        if bit.band(flags, 0x1) ~= 0 then
        return "S", -1
        else
        return "B", 1
        end
        end