Eldar (Автор тем)

Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
ошибка в использовании io, вопрос по синтаксису
 
Создал скрипт (по аналогии с тремя экранами Элдера) и в нем пишу лог.
Код
f = nil            --указатель на файл лога
MA = 0
sec_code = "SRH3"
function main()
    while is_run do
        if IsWindowClosed(t) then
            is_run=false
            return        
        end 
        exMA()
        f, error_desc   = io.open(getScriptPath() .. "\\M15_".. sec_code ..".log", "a")
        if not f then 
      message("Ошибка получения файла лога:" .. error_desc)
   else
      writeToLog("MA" .. tostring(MA))
   end
        sleep(50) 
   end
end

function writeToLog(proc_name)
    f:write(os.date() .. " ".. proc_name .. "\n")
    f:flush()
end
работает. делаю копию скрипта. меняю тикер на SRM3 запускаю скрипт и падает квик с ошибкой.
D:\LUA\M15_SRM.lua:524: attempt to index a nil value (global 'f')причем файл создается.
делаю третий файл с тикером RIH3. запускаю SRH3 - работает, запускаю RIH3 - работает. запускаю SRM3 - падает.
открываю снова терминал. закрываю все скрипты. запускаю SRM3 - работает. запускаю SRH3 - работет. запускаю RIH3 - работает.
с правами на папку со скриптами и логами все в порядке.

что за пролтергейст какой-то.
Многомерные массивы и получение CreateDataSource
 
Доброе время суток.
для теста стратегии хочу выбрать сумму ОИ по всем страйкам. много кода, но упростил для теста до минимума и есть путаница
кусок скрипта:
Код
OI_Opt = {}
SecList = getClassSecurities("SPBOPT")
SecCode="BRX7" --тест по текущей нефти. заработает, допилим по газпрому
interval = 1

for TempSecCode in string.gmatch(SecList, "([^,]+)") do --перебираем опционы по очереди. --опускаю код сравнения базового актива опциона с нужным.
   ds_oi, dserror = CreateDataSource("SPBOPT", TempSecCode , interval, "NUMCONTRACTS") --подписался на ОИ
   ds_oi:SetEmptyCallback() --если нет в ТТП опциона, подпишемся
        
   for candle_num = 1, ds_oi:Size() do --перебираю исторические данные

-- отладочная информация.
      PrintDbgStr("QLua: " .. TempSecCode .. " " .. ds_oi:T(candle_num).month .. "." .. ds_oi:T(candle_num).day .. "." .. ds_oi:T(candle_num).hour .. "." .. ds_oi:T(candle_num).min .. " " ..ds_oi:C(candle_num))

--получаю по порядковому номеру значение ОИ
      OI_Opt[candle_num] = tonumber(OI_Opt[candle_num]) + ds_oi:C(candle_num)
   end
end
не получается по одной причине. данные минутного графика (я же запросил минутки) выдает мне в таком виде (Тикер) месяц.дата.час.минута значение
QLua: BR34BV7 7.4 12.50 4
QLua: BR34BV7 7.5 9.17 4
QLua: BR34BV7 7.5 17.51 8
QLua: BR34BV7 7.6 9.17 8
QLua: BR34BV7 7.7 9.17 8
QLua: BR34BV7 7.10 9.17 8

центральные страйки выдают более менее кучные результаты. но тоже есть пропуски интервалов.
но для того, чтобы их получить сумму, мне необходимо раскидать по времени и суммировать.
не понимаю как создать многомерный массив. плюс хочу хранить отдельно колы и путы. плюс теоретическую цену на тот момент, волатильность и т.д.
потом, почему ОИ мне показывает по времени вне торгов (в примере стоит 09.17)?!

многое пробовал, сейчас уже на пути создания базы данных (MySQL), чтобы и там все дело хранить, суммировать.
плохо, что CreateDataSource не работает в коде индикатора. там могу получить текущие данные из таблицы параметров. а из скрипта не могу, по рассчитаным данным, изменить линию индикатора.
делаешь индикатор по текущим данным, но изменение ТФ, добавление другого индикатора или изменение параметров Другого индикатора пересчитывает текущий индикатор и исторические показатели очищаются, он становится бесполезен, так как нет предыдущих данных.

как мне создать многомерный массив/таблицу, где хранить данные типа ДатаВремя (пусть будет строка, потом распарсю), ОИ Путов, ОИ Колов, Теорит.Цена. запутался в ключах, вложеных таблицах.
Спасибо.
Уровни Фибоначчи
 
Интересует логика программирования уровней фибоначчи.
если я по тренду строю уровни. например при нисходящем тренде. тяну от 69 от 65. при этом 65 - 0%, 69 - 100%
соответственно в настройках 65 - цена справа и 69 - слева, что не соответствует логике построения. уровень от которого тяну - должен быть 0%, куда тяну - 100%.
как мне забить дополнительные уровни, как 76,4%, -161,8%, чтобы они были установлены каждый раз, когда размещаю инструмент Уровни Фибоначчи на графике?
Работа с OnOrder
 
простенький робот со скользяшками.
интересующие куски кода:


Код
TRANS_ID = 1

function main()
   while is_run do
        sleep(350)
        robot()
   end
end

function robot()
   --сигнал на вход
   if (price ~= 0) and (need_order) and (quantity_total() < Maximum_quantity) and (quantity_total() > 0-Maximum_quantity) then --проверка на цену, необходимость выставления заявки и что текущее количество не больше разрешенного для лонга/шорта
      SetOrder("B", price, 1) --выставляем заявку
      need_order = false --условие, что есть заявка, то новую не ставим
   end
end

function SetOrder(type, price, qua) -- подать заявку
    Status =  tonumber(getParamEx(ClassCode,  SecCode, "status").param_value);    
    if (Status ~= 1) then 
        writeToLog("Status of " .. SecCode .. " is " .. Status)
        return
    end    
    if  (qua == 0) then
        writeToLog("QUANTITY is 0")
        return
    end
    
    if  (price == 0) then
        writeToLog("Price is 0")
        return
    end
    
    local    trans = {
      ["CLASSCODE"]=ClassCode,
      ["SECCODE"]=SecCode,
      ["ACTION"]="NEW_ORDER",
      ["ACCOUNT"]=ACCOUNT,
      ["CLIENT_CODE"]=CLIENT_CODE,
      ["TYPE"]="L",
      ["OPERATION"]=type,
      ["QUANTITY"]=tostring(qua),
      ["PRICE"]=tostring(price),
      ["TRANS_ID"]=TRANS_ID
                    }        
    local res = sendTransaction(trans)
end

function OnOrder(trans_reply) -- обработка  событий по заявке
    nord = trans_reply["order_num"]  -- номер заявки ORDERNUM    
    
    if nord==nil or nord==0 or nord=="0" then
        message("Заявка не выставилась",1)
        need_order = true
        return        
    elseif tostring(trans_reply["trans_id"]) == tostring(TRANS_ID) then        
        writeToLog(table2string(trans_reply))
        if trans_reply["flags"] == 24 or trans_reply["flags"] == 26 or trans_reply["flags"] == 28 then
            if trans_reply["balance"] == 0 then
                need_order = true --здесь условие, что выставленная заявка выполнилась и дальше контроль только на превышение разрешенного от депо
            end
        end
    end
    
end

вопрос у меня следующего характера. сигналы получаю по идентификатору скользяшки.
НО! функция OnOrder срабатывает три или четыре раза с одинаковыми флагами
вот возвращаемая таблица по функции

withdraw_datetime={week_day=1;hour=0;ms=0;mcs=0;day=1;month=1;sec=0;year=1601;
min=0;};price=10242;value_entry_type=0;balance=0;repo_value_balance=0;value=20
484;qty=2;passive_only_order=0;class_code=SPBFUT;activation_time=0;userid=*****;expiry=-1;flags=28;linkedorder=0;ordernum=********;sec_code=SRH6;s
ide_qualifier=0;client_code=********;firmid=SPBFUT;datetime={week_day=2;hour=13
;ms=937;mcs=937000;day=15;month=12;sec=52;year=2015;min=13;};yield=0;reject_re
ason=;capacity=0;acnt_type=0;repo2value=0;start_discount=0;min_qty=0;ext_order
_flags=0;exec_type=0;order_num=******;repovalue=0;repoterm=0;accruedint=0
;account=******;seccode=SRH6;uid=******;brokerref=********;exchange_code=;settl
ecode=;price2=0;trans_id=1;bank_acc_id=;

и таких строчек несколько. соответственно несколько.
временами заявка срабатывает, а таблица FUTURES_CLIENT_HOLDINGS не обновляет количество в позиции и выставляется новая заявка, которая превышает лимит по возможному количеству.
возврат количества


Код
function quantity_total() --подсчет количество позиций
    local q_total=0
    
    for i = 0,getNumberOf("FUTURES_CLIENT_HOLDINGS") - 1 do
        if getItem("FUTURES_CLIENT_HOLDINGS",i).sec_code == SecCode then -- ЕСЛИ строка по нужному инструменту           
            q_total = getItem("FUTURES_CLIENT_HOLDINGS",i).totalnet
            if q_total== nil then
                return 0
            else
                return q_total -- возвращаем количество позиций
            end
       end;
    end;
    return 0
end

как мне контролировать, чтобы только одна заявка заявка выставлялась?
Использование Subscribe_Level_II_Quotes, получение данных стакана без открытия стакана
 
мне нужно по 30 бумагам получить цену закрытия предыдущего дня из ТТП (через getParamEx(class_code,tiket_code,"prevlegalclosepr").param_value)
найти в стакане самый большой объем на продажу и открытие. взять из них цену и вывести процентное соотношение.
чтобы не открывать 30 стаканов (а мне еще заявки ставить). пробую сделать через Subscribe_Level_II_Quotes.
работает медленно, но я пробую так:
из файла в таблицу TIKETS загружен список бумаг. key - код бумаги
function main()
   while is_run do
       for key, value in spairs(tikets) do
           Subscribe_Level_II_Quotes(class_code, key)
           Quotes(key)
 end
end
end

function Quotes(code)
sleep(250)
for i=1, 30 do
q = getQuoteLevel2(class_code, code)
--получаю стакан, перебираю его. добавляю в таблицу в окне данные.
max_bid_price и max_ask_price

prevlegalclosepr=tonumber(getParamEx(class_code, code,"last").param_value)
if (max_bid_price==0) or (max_ask_price==0) then
               delta==0
           else
if max_bid_price >= max_ask_price then
delta = (prevlegalclosepr/max_bid_price)
else
delta = (prevlegalclosepr)
end
           end

SetCell(Таблица, НомерСтрокиПоБумаге, 6, delta)

и т.д.
первая проблема -  перебор 30 строк в таблице это долго. вторая -  если сделаю меньший sleep то часто не получаю данные стакана.

в этой строке
delta = (prevlegalclosepr/max_bid_price)
временами ошибка attempt to perform arithmetic on local 'delta ' (a string value)
причину отловить не могу. механизмов отладки нет (или я не нашел где они).
как мне эффективнее сделать данный алгоритм?
или при инициализации, где я загружаю коды тикетов в таблицу сделать Subscribe_Level_II_Quotes по каждой бумаге, а потом просто перебирать через getQuoteLevel2?
Страницы: 1
Наверх