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

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

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

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    local next_tm = 0
    function main()
     
         local LASTCHANGE = getParamEx (Class, SecCode, "LASTCHANGE").param_value
    --
        local tm = os.time()
        if tm > next_tm then
          next_tm = tm + 5
          if LASTCHANGE > "0.20" then
            message("БОЛЬШЕ",1)
          elseif LASTCHANGE < "0.17" then
            message("МЕНЬШЕ",2)
          else
            message("МЕЖДУ",3)
          end
        end
        sleep(1000)
    end
  2. 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
    
     IsRun = true
    function OnInit()																				
    		TableRTS = AllocTable()																 
    		AddColumn(TableRTS, 1,"Дата", true, QTABLE_DATE_TYPE, 13)									
    		AddColumn(TableRTS, 2,"Время", true, QTABLE_TIME_TYPE, 10)
    		AddColumn(TableRTS, 3,"Код", true, QTABLE_STRING_TYPE, 10)
    		AddColumn(TableRTS, 4,"Цена", true, QTABLE_INT_TYPE, 10)									
    		AddColumn(TableRTS, 5,"ГО", true, QTABLE_DOUBLE_TYPE, 10)
    		AddColumn(TableRTS, 6,"Лимит, руб.", true, QTABLE_DOUBLE_TYPE, 13)
    		AddColumn(TableRTS, 7,"Контракты", true, QTABLE_INT_TYPE, 13)
    		AddColumn(TableRTS, 8,"Позиция", true, QTABLE_INT_TYPE, 10)
    		CreateWindow(TableRTS)
    		Clear(TableRTS)  
    		SetWindowCaption(TableRTS, "Таблица параметров RIZ7")	
    		SetWindowPos(TableRTS, 0, 10, 600, 70)	
    		InsertRow(TableRTS, -1)
     
    end
     
    function main()
    	while IsRun do
    		local TRADEDATE = getInfoParam("TRADEDATE")
    		local SERVERTIME = getInfoParam("SERVERTIME")
    		local SecCode = "USD000UTSTOM"
    		local Class = "ММВБ Валюта: ЕТС"
    		local LastPrice = getParamEx (Class, SecCode, "LAST").param_value         
    		local BIDDEPTHT = getParamEx (Class, SecCode, "BIDDEPTHT").param_value
    		local VALUE = getParamEx (Class, SecCode, "VALUE").param_value
    		local LASTCHANGE = getParamEx (Class, SecCode, "LASTCHANGE").param_value
    		SetCell(TableRTS,1,1,tostring(TRADEDATE))
    		SetCell(TableRTS,1,2,tostring(SERVERTIME))
    		SetCell(TableRTS,1,3,tostring(SecCode))
    		SetCell(TableRTS,1,4,tostring(LastPrice))
    		SetCell(TableRTS,1,5,tostring(BIDDEPTHT))
    		SetCell(TableRTS,1,6,tostring(VALUE))
    		SetCell(TableRTS,1,7,tostring(LASTCHANGE))			
    		if LASTCHANGE > "0.20" then
                    message("БОЛЬШЕ",1)
                    sleep(100000)
                elseif LASTCHANGE < "0.17" then
                    message("МЕНЬШЕ",2)    
    				sleep(100000)
    		end
     
    		sleep(1000) 
    	end	 
     
    end	 
     
    function OnStop()
          IsRun = false
          DestroyTable(TableRTS)
     
    end
  3. Добрый вечер! Не подскажите как сделать так что бы задержка в основном цикле и сообщении была разная.А то у меня и сообщение и цикл зависает на столько сколько я прописываю для сообщения!

    IsRun = true
    function OnInit()
    TableRTS = AllocTable()
    AddColumn(TableRTS, 1,"Дата", true, QTABLE_DATE_TYPE, 13)
    AddColumn(TableRTS, 2,"Время", true, QTABLE_TIME_TYPE, 10)
    AddColumn(TableRTS, 3,"Код", true, QTABLE_STRING_TYPE, 10)
    AddColumn(TableRTS, 4,"Цена", true, QTABLE_INT_TYPE, 10)
    AddColumn(TableRTS, 5,"ГО", true, QTABLE_DOUBLE_TYPE, 10)
    AddColumn(TableRTS, 6,"Лимит, руб.", true, QTABLE_DOUBLE_TYPE, 13)
    AddColumn(TableRTS, 7,"Контракты", true, QTABLE_INT_TYPE, 13)
    AddColumn(TableRTS, 8,"Позиция", true, QTABLE_INT_TYPE, 10)
    CreateWindow(TableRTS)
    Clear(TableRTS)
    SetWindowCaption(TableRTS, "Таблица параметров RIZ7")
    SetWindowPos(TableRTS, 0, 10, 600, 70)
    InsertRow(TableRTS, -1)

    end

    function main()
    while IsRun do
    local TRADEDATE = getInfoParam("TRADEDATE")
    local SERVERTIME = getInfoParam("SERVERTIME")
    local SecCode = "USD000UTSTOM"
    local Class = "ММВБ Валюта: ЕТС"
    local LastPrice = getParamEx (Class, SecCode, "LAST").param_value
    local BIDDEPTHT = getParamEx (Class, SecCode, "BIDDEPTHT").param_value
    local VALUE = getParamEx (Class, SecCode, "VALUE").param_value
    local LASTCHANGE = getParamEx (Class, SecCode, "LASTCHANGE").param_value
    SetCell(TableRTS,1,1,tostring(TRADEDATE))
    SetCell(TableRTS,1,2,tostring(SERVERTIME))
    SetCell(TableRTS,1,3,tostring(SecCode))
    SetCell(TableRTS,1,4,tostring(LastPrice))
    SetCell(TableRTS,1,5,tostring(BIDDEPTHT))
    SetCell(TableRTS,1,6,tostring(VALUE))
    SetCell(TableRTS,1,7,tostring(LASTCHANGE))
    if LASTCHANGE > "0.20" then
    message("БОЛЬШЕ",1)
    sleep(100000)
    elseif LASTCHANGE < "0.17" then
    message("МЕНЬШЕ",2)
    sleep(100000)
    end

    sleep(1000)
    end

    end

    function OnStop()
    IsRun = false
    DestroyTable(TableRTS)

    end

  4. Добрый день, такой вопрос: сколько скриптов возможно одновременно запустить в Quik? Это для тестирования, сделки не производиться, но каждый скрипт выводит инфу в Excel. Или может быть есть ограничения по выводу через DDE?

  5. Добрый вечер. Прошу, помогите разобраться с SetUpdateCallback и SetEmptyCallback
    Какую строку кода (используя SetUpdateCallback или SetEmptyCallback) надо добавить в нижеуказанный код, чтобы при появлении новой свечи вывести сообщение "Появилась новая свеча"?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    IsRun = true;
     
    function OnStop()
       IsRun = false;
    end; 
     
    function main()
    	while IsRun do
     		ds, Error = CreateDataSource("SPBFUT", "SiM0", INTERVAL_M1); --получаем свечки в набор данных
    		while (Error == "" or Error == nil) and ds:Size() == 0 do sleep(1) end
    		if Error ~= "" and Error ~= nil then message("Ошибка подключения к графику: "..Error) end
     
    	end
    end
    1. Смотрите документацию по QLua (в интернете много информации)

      Нужно использовать SetUpdateCallback
      Формат вызова:
      BOOLEAN res SetUpdateCallback (FUNCTION callback_function)
      В качестве параметра принимает функцию обратного вызова.
      Формат функции обратного вызова:
      function call_back(NUMBER index)
      Параметры:
      • index – номер изменившейся свечки. Индексы свечек начинаются с 1.
      Функция возвращает «true» в случае успешного завершения, иначе – «false».
      Код:

      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
      
      IsRun = true;
       
      function OnStop()
         IsRun = false;
      end; 
       
      function main()
              ds, Error = CreateDataSource("SPBFUT", "SiM0", INTERVAL_M1); -- создаем источник данных
      	while (Error == "" or Error == nil) and ds:Size() == 0 do sleep(1) end
      	if Error ~= "" and Error ~= nil then 
                   message("Ошибка подключения к графику: "..Error) 
                   OnStop()  --- принудительное завершение скрипта
             еlse
                    if not SetUpdateCallback (call_back)   then    --- подписка на функцию call_back  (вызывается при появлении новой свечи)
                          message("Ошибка  подписка на функцию call_back") 
                          OnStop()  --- принудительное завершение скрипта
                    end          
             end 
       
      	while IsRun 	do	 -- 
                  -----   ----
                  sleep (10)
      	end
      end
       
      function call_back(index)
         message(  "Появилась новая свеча " .. index)
      end
        1. while (Error == "" or Error == nil) and ds:Size() == 0 do sleep(1) end
          так нельзя делать вообще
          1. данных может не быть, тупо не было сделок никогда (лпционы, например);
          2, после дисконекта данные могут появится часов через 5
          цикл будет крутить "вечно", а ошибки не будет.
          вот так можно сделать обезличенный калбэк:

          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
          
          local exitflag
          local DS = {}
          local DSINDEX = {}
          local function sb(ds, key, market, ticker, index) 
          	local o_index = DSINDEX[key]
          	if o_index == 0 then
          		DSINDEX[key] = ds:Size()
          		message("Зашёл "..key.."\n index= "..index, 2)
          		--
          		return
          	end
           
          	if index > o_index then
          		DSINDEX[key] = index
          		message("Новый бар "..key.."\n o_index= "..o_index.."\n C= "..ds:C(o_index), 2)
          		--
          	end
          end
          local function cds(key, market, ticker, interval)
          	local ds, err = CreateDataSource(market, ticker, interval)
          	assert(ds, ticker.." "..tostring(err))
          	DSINDEX[key] = 0
          	DS[key] = ds
          	ds:SetUpdateCallback(function(...) sb(ds, key, market, ticker, ...) end)
          	sleep(1000)
          end
           
          function main()
          	cds("SiM0_M1", "SPBFUT", "SiM0", INTERVAL_M1)
          	cds("SiM0_M2", "SPBFUT", "SiM0", INTERVAL_M2)
           
          	cds("RIM0_M1", "SPBFUT", "RIM0", INTERVAL_M1)
          	cds("SiM0_M2", "SPBFUT", "RIM0", INTERVAL_M2)
           
          	while not exitflag do
          		sleep(1)
          	end
           
          	local index = DSINDEX["SiM0_M1"]
          	message("Exit SiM0_M1\n C= "..DS["SiM0_M1"]:C(index - 1), 2)
           
          	for k, ds in pairs(DS) do
          		ds:Close()
          	end
          end
          function OnStop()
          	exitflag = true
          	return 1000
          end
          1. а, забыл,
            в калбэке первой строкой стоит сделать проверку
            if exitflag then return end
            иначе может быть ошибка при выключении скрипта, но тут это не критично

            1. Здравствуйте kalikazandr!

              Ваши замечания правильные. Я ответил "Good_man" формально, исходя из того, что , похоже, он только начал заниматься программированием на QLua.

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

  6. Здравствуйте. Подскажите как работать с метками.
    Добавил я на график несколько меток.
    С помощью: AddLevel()
    А как изменить местоположение определенной метки?
    Я понимаю сначала DelLabel(), а потом снова добавить AddLevel()
    Или через SetLabelParams()
    Но не пойму где взять: label_id–идентификатор метки

    1. для начала добавляете тестовую метку, пофик на какой бар, получаете ее id и сразу удаляете.
      test_id = AddLebel(tag, param)
      теперь вам известно примерное кол-во меток на графике:
      for chart_id =1, test_id do
      local param = GetLabelParams(tag, chart_id)
      if type(param) == "table" then
      --это метка, ее id = chart_id
      end
      end