Дмитрий Косолапов (Автор тем)

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

Страницы: 1
При экспорте по ODBC таблицы сделок в базе данных появляются сделки, которых не было.
 
Добрый день. Терминал на компьютере всего один, брокер БКС, счет реальный, не демо-счет.

Вот скриншот таблицы сделок по инструменту GOLD-3.18:



На последних строках видно, что последняя продажа (открытие короткой позиции) была совершена 29.01.2018 в 18:04:46, закрыта короткая позиция  29.01.2018 в 21:03:17

Вот скриншот таблицы заявок по инструменту  GOLD-3.18:



Последние строки показывают, что заявка на продажу 29.01.2018 в 18:04:46 была исполнена, заявка на покупку 29.01.2018 в 21:02:04 была снята, следующая заявка на покупку 29.01.2018 в 21:03:17 была исполнена.

В базу данных может записывать только терминал quik.

В базу данных делаю запрос в таблицу сделок:

SEL ECT distinct * FR OM trade WHERE paper_code = 'GDH8' AND date = '2018-01-29' ORDER BY "date", "time"



На скриншоте видно, что последняя продажа (открытие короткой позиции) была совершена 29.01.2018 в 18:04:46, затем была совершена покупка 29.01.2018 в 20:56:33 и затем была покупка 29.01.2018 в 21:03:17. Проблема в том, что сделки 29.01.2018 в 20:56:33 не было и в quik ее не показывает.  
Как определить, когда идет торговая сессия, а когда нет?
 
Доброе утро. Написал торгового робота, который умеет подавать заявки и снимать заявки. Этот торговый робот работает круглосуточно. Проблема в том, что сама биржа не работает круглосуточно. Из-за этого часто появляются сообщения "Ошибка создания заявки. [GW][3] "Сейчас эта сессия не идет."." Как определить средствами quik+lua возможно ли подавать заявки или нет?
Как для метода OnAllTrade создать глобальную блокировку?
 
Добрый вечер. Столкнулся с такой проблемой: написал скрипт, который должен работать так:
  1. если нет заявок, то создаем заявку для открытия позиции
  2. если есть заявка, то ни чего не делаем INFO[trade_data.sec_code]['tiks_waiting'] количество тиков
  3. если INFO[trade_data.sec_code]['tiks'] количество тиков прошло, то отменяем заявку
  4. если есть открытая позиция, то через INFO[trade_data.sec_code]['tiks'] количество тиков закрываем позицию.
Проблема в том, что событие OnAllTrade срабатывает не последовательно тик за тиком, а как-то параллельно. То есть может быть несколько тиков одновременно обрабатывает. Из-за этого мой скрипт может открыть сразу 5 позиций. Я пробовал при помощи таблицы INFO[trade_data.sec_code]['ignore_tiks'] сделать блокировку, но эта блокировка не помогает. Какие есть способы эту блокировку создать?


Код
is_run = true

-- глобальная таблица, в ней хранится информация о тиках и флаг блокировки
INFO = {
    ["SiU7"]={
        ['tiks']=4, -- Подсчет тиков, не надо трогать
        ['tiks_waiting']=4, -- подсчет тиков в ожидании сделки, не надо трогать
        ['ignore_tiks']=false, -- игнорируем тики, если выполняется какая-то операция, не надо руками трогать
        ['TIKS_IN_BAR']=10, -- Количество тиков в баре, можно изменять
        ['TIKS_NOTHING']=4, -- Количество тиков для запроса, можно изменять
        ['BARS']=5, -- Количество баров для анализа, можно изменять
        ['WAITING']=10}, -- Количество тиков после выставления заявки, можно изменять
}

TRADE_ACCOUNT = getItem("trade_accounts", 0) -- поменять цифру, если будет ругаться на счет
message(TRADE_ACCOUNT.trdaccid)

order_number = 1

function OnStop(signal)
    stopped = true
end

function main()
    while not stopped do
        sleep(100)
    end
end


-- Отменяем просроченную транзакцию, удаляется заявка
function cancel_transaction(trade_data, futures)
    INFO[trade_data.sec_code]['tiks_waiting'] = 0
    return


-- закрываем позицию, просто выставляется заявка на покупку
function close_position(trade_data, futures)
    INFO[trade_data.sec_code]['tiks'] = 0
    INFO[trade_data.sec_code]['tiks_waiting'] = 0
    return


-- открываем позицию, просто выставляется заявка на продажу
function open_position(trade_data)
    INFO[trade_data.sec_code]['tiks'] = 0
    INFO[trade_data.sec_code]['tiks_waiting'] = 0
    return


function OnAllTrade(trade_data)
    if INFO[trade_data.sec_code] == nil then
        return
    end
    if trade_data.sec_code ~= 'SiU7' then
        return
    end
    local bind_available = false
    -- сам способ пропускания тиков
    if INFO[trade_data.sec_code]['ignore_tiks'] then
        return
    end
    -- блок удаления неиспользованных заявок и закрытия сделок, если долго висит заявка
    if getNumberOf("orders") > 0 then
        for number_bind = 0, getNumberOf("orders") do
            local futures = getItem("orders", number_bind)
            if futures ~= nil and futures.sec_code == trade_data.sec_code and bit.band(futures["flags"], 1) == 1 then
                -- удаление неиспользованной заявки
                if INFO[trade_data.sec_code]['tiks_waiting'] >= INFO[trade_data.sec_code]['WAITING'] then
                    -- выставляем флаг запрета тиков, выполняем операцию отмены заявки, возвращаем обратно флаг запрета
                    INFO[trade_data.sec_code]['ignore_tiks'] = true
                    result = cancel_transaction(trade_data, futures)
                    INFO[trade_data.sec_code]['ignore_tiks'] = false
                    message('202')
                    if result == nil then
                        bind_available = false
                    else
                        message(result)
                    end
                    break
                else
                    INFO[trade_data.sec_code]['tiks_waiting'] = INFO[trade_data.sec_code]['tiks_waiting'] + 1
                    bind_available = true
                    break
                end
            end
        end
    end
    -- блок открытых позиций. Если подошло время, закрываем позиции
    if not bind_available and getNumberOf("futures_client_holding") > 0 then
        for index = 0, getNumberOf("futures_client_holding") do
            local futures = getItem("futures_client_holding", index)
            if futures ~= nil and futures.sec_code == trade_data.sec_code and futures.totalnet < 0 then
                INFO[trade_data.sec_code]['tiks'] = INFO[trade_data.sec_code]['tiks'] + 1
                bind_available = true
                if INFO[trade_data.sec_code]['tiks'] >= (INFO[trade_data.sec_code]['TIKS_IN_BAR'] * INFO[trade_data.sec_code]['BARS']) then
                    -- выставляем флаг запрета тиков, выполняем операцию закрытия позиции, возвращаем обратно флаг запрета
                    INFO[trade_data.sec_code]['ignore_tiks'] = true
                    result = close_position(trade_data, futures)
                    INFO[trade_data.sec_code]['ignore_tiks'] = false
                    if result ~= nil then
                        message(result)
                    else
                        bind_available = false
                    end
                else
                    INFO[trade_data.sec_code]['tiks'] = INFO[trade_data.sec_code]['tiks'] + 1
                end
                break
            end
        end
    end

    -- если есть заявка или открыта позиция, то позицию не открываем
    if bind_available then
        return
    end
    
    -- блок открытия позиций
    INFO[trade_data.sec_code]['tiks_waiting'] = INFO[trade_data.sec_code]['tiks_waiting'] + 1
    if INFO[trade_data.sec_code]['tiks_waiting'] >= INFO[trade_data.sec_code]['TIKS_NOTHING'] then
        -- выставляем флаг запрета тиков, выполняем операцию открытия позиции, возвращаем обратно флаг запрета
        INFO[trade_data.sec_code]['ignore_tiks'] = true
        local result = open_position(trade_data)
        INFO[trade_data.sec_code]['ignore_tiks'] = false
        if result ~= nil then
            message(result)
        end
        return
    end
end
Не могу получить данные из таблицы "Позиции по клиентским счетам (Фьючерсы)", Позиции по клиентским счетам (Фьючерсы)
 
Добрый день. Мне нужно получить информацию какие есть позиции: код инструмента и это позиция длинная или короткая.

Для получения всей информации о таблице "Позиции по клиентским счетам (Фьючерсы)" использую такой код:
Код
function main()
   message(getItem("futures_client_holding", 1).firmid)
   message(getItem("futures_client_holding", 1).trdaccid)
   message(getItem("futures_client_holding", 1).sec_code)  -- <-- Дальше message не срабатывает
   message(getItem("futures_client_holding", 1).type)
   message(getItem("futures_client_holding", 1).startbuy)
   message(getItem("futures_client_holding", 1).startsell)
   message(getItem("futures_client_holding", 1).startnet)
   message(getItem("futures_client_holding", 1).todaybuy)
   message(getItem("futures_client_holding", 1).todaysell)
   message(getItem("futures_client_holding", 1).totalnet)
   message(getItem("futures_client_holding", 1).openbuys)
   message(getItem("futures_client_holding", 1).opensells)
   message(getItem("futures_client_holding", 1).cbplused)
   message(getItem("futures_client_holding", 1).cbplplanned)
   message(getItem("futures_client_holding", 1).varmargin)
   message(getItem("futures_client_holding", 1).avrposnprice)
   message(getItem("futures_client_holding", 1).positionvalue)
   message(getItem("futures_client_holding", 1).real_varmargin)
   message(getItem("futures_client_holding", 1).total_varmargin)
   message(getItem("futures_client_holding", 1).session_status)
end
Сама таблица с позициями, данные в ней есть:



Собственно вопрос как получить все данные с этой таблице? Или может быть для этих целей следует использовать другую таблицу?
Не удается сделать выгрузку таблицы обезличенных сделок через ODBC
 
Добрый день

Нужно сделать автоматическую выгрузку таблицы обезличенных сделок. На СУБД создал такую таблицу:
Код
CRE ATE   TABLE public.all_trades
(
  paper character varying(50),
  date timestamp without time zone,
  price integer,
  volume integer,
  dir character varying(7)
)

Но при настройки экспорта  мне предлагаются какие-то другие колонки:

Такое ощущение, что выгружаю абсолютно не ту таблицу
Не срабатывает колбек OnTrade
 
Исходный код:
Код
is_run = true

-- вызывается при нажатии кнопки "остановить" в диалоге
function OnStop(signal)
   stopped = true
end

-- крутится в отдельном потоке, ничего не делает
function main()
   while not stopped do
      sleep(100)
   end
end

-- выводим сообщение
function OnTrade(trade_data)
    message('da')
end


Нет сообщение при тике. Вот окно терминала:
Как установить пакет socket?
 
Текст ошибки:
Код
C:\lua\test.lua:2: module 'socket.http' not found:
   no field package.preload['socket.http']
   no file '.\socket\http.lua'
   no file 'C:\Open_Broker_QUIK_Junior\lua\socket\http.lua'
   no file 'C:\Open_Broker_QUIK_Junior\lua\socket\http\init.lua'
   no file 'C:\Open_Broker_QUIK_Junior\socket\http.lua'
   no file 'C:\Open_Broker_QUIK_Junior\socket\http\init.lua'
   no file 'C:\Open_Broker_QUIK_Junior\Include\socket\http.dll'
   no file 'C:\Open_Broker_QUIK_Junior\Include\socket\http.lua'
   no file 'C:\Open_Broker_QUIK_Junior\Include\socket\http.luac'
   no file '.\socket\http.dll'
   no file 'C:\Open_Broker_QUIK_Junior\socket\http.dll'
   no file 'C:\Open_Broker_QUIK_Junior\loadall.dll'
   no file 'C:\Open_Broker_QUIK_Junior\Include\socket.dll'
   no file 'C:\Open_Broker_QUIK_Junior\Include\socket.lua'
   no file 'C:\Open_Broker_QUIK_Junior\Include\socket.luac'
   no file '.\socket.dll'

Исходный код:
Код
is_run = true
local http = require "socket.http"

function main()
    message("Привед!")
end

function OnStop()
    is_run = false
end

function OnTrade(trade_data)
    
end
Страницы: 1
Наверх