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

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

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

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

    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
  1. Привет коллеги!
    Подскажите пожалуйста можно как то отменить окно сообщения VCL.MessageDlg по условию. Ситуация такая: при наступлении условия из майн выводим окно диалога с подтверждением да..нет, окно висит и ждет... далее по другому условию появляется другое окно с диалогом... как убрать предыдущее если выбор не сделан..то есть кнопки остались не нажаты

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

  2. Добрый день 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
  3. Уважаемые знатоки подскажите как узнать битовый флаг в таблице обезличенных сделок. Как в функции 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