Алексей Ч (Все сообщения пользователя)

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

Страницы: 1
Повторное выставление меток на график при смене инструмента
 
Уже обсуждали тут. Но ничего так не поменялось. Quik 9.2.2.11
Предложение к разработчикам
 
Этих "придурков" обычно называют маркетмейкерами. На сайте биржи есть все материалы по ним. Они должны присутствовать в стакане, не помню точно, 95% времени. Поэтому они и стоят. И получают вознаграждение от биржи за каждую сделку, в которой они являются пассивной стороной. Поэтому они не совершают сделок между собой...
Отладчик, статистика для теста робота и непонятный висяк, C++ интеграция
 

Какие именно данные нужны? Список всех сделок или нарезка на временные промежутки (к примеру, 5 минутки, дневки и т.п.)

Данные получить можно несколькими способами. Везде куча нюансов.
1. Скачать с финама (https://www.finam.ru/profile/moex-akcii/gazprom/export/). Тут есть и сделки, и временные "нарезки". Общий совет - чем больше объем данных, тем меньше выбирайте временной промежуток запроса. Т.е. сделки лучше скачивать отдельными запросами по каждому торговому дню. 5-ти минутки, например, можно сразу забрать отдельными запросами по годам. А "дневки", думаю, можно сразу запрашивать за несколько лет.
2. Использовать ИСС Московской биржи https://www.moex.com/a2193. Можно получить и сделки по дням и свечи. Что-то бесплатно, что-то за деньги. Есть ограничения по глубине данных (возможно только для бесплатных вариантов, платные не пробовал).
3. http://export.rbc.ru/ - тут можно получить бесплатно только дневные данные, но есть валютные пары и международные индексы и т.п.

Конкретно по фьючам с московской биржи, проще и быстрее скачать данные с финама. Там есть уже склеенные варианты:
https://www.finam.ru/profile/mosbirzha-fyuchersy/rts/export/?market=14&em=17455&code=RTS&apply=0&df=15&mf=5&yf=2019&from=15.06.2019&dt=15&mt=5&yt=2019&to=15.06.2019&p=7&f=RTS_190615_190615&e=.txt&cn=RTS&dtf=1&tmf=1&MSOR=1&mstime=on&mstimever=1&sep=1&sep2=1&datf=1&at=1

Порядок отслеживания процесса выполнения транзакций
 
новичок, не понял, зачем ты мне ссылку на чикагский мануал прислал? Давай еще на китайском найди чтоли. Или лучше место, где в мануале от плазы про стопы написано.
P.s. Хамство - не признак большого ума
Порядок отслеживания процесса выполнения транзакций
 
Цитата
Sergey Gorokhov написал:
Цитата
Алексей Ч написал:
Если 5000 раз вызывать функцию math.random(1, 999), то какова вероятность получать одинаковые числа? Мне опять почему то сильно кажется, то вероятность будет равна 100%
Ну так ведь 5000 в ~5 раз больше чем 999, так что да 100% будут повторения. И что в этом удивительного?
для меня ничего удивительно нет, все так. Удивительно это для того, то применял этот метод несколькими постами выше моего поста.

Удивительная это вещь: общение на форумах! Спрашивают совет про стоп-заявки. Пишу, что стоп-заявок нет, используете лимитки. Один меня (зачем-то) тычет носом в мануал, где написано, что стоп-заявок нет. А вопрошающий вдруг сам рад тому, что где то нашел другой тот же самый совет использовать лимитки.  :shock:  
Порядок отслеживания процесса выполнения транзакций
 
Цитата
а уж если совсем пойти в разнос, то так и до манулов недалеко опуститься ... :)
новичок, т.е. стоп-заявок на самой бирже нет, как я и предполагал. Спасибо
Порядок отслеживания процесса выполнения транзакций
 
Если совсем не стесняться, то мне почему то сильно кажется, что на бирже нет никаких стоп-заявок. Только лимитки и заявки по рынку (не на фортс). Стоп-заявки реализованы на стороне брокера и им же обрабатываются. Таким образом, стоп-заявка - это алгоритм реализации выставления лимитной заявки, но решенный способами, разработанными квиковцами и на стороне сервера брокера.
Поэтому, если рассматривать работу со стоп-заявками, то естественно, что на стороне брокера "они должны по идее/будут" исполняться быстрее, чем на стороне своего квика. Что лучше, подать лимитную заявку в систему или стоп-заявку, которая еще будет обрабатываться у брокера и потом попадет в систему - это каждый сам решает.
При торговле большим количеством контрактов, действительно, нужно писать отдельный модуль управления заявками (что я и сделал для себя). Мой субъективный подход в том, чтобы не пользоваться стоп-заявками вообще. Это решает и проблему выявления стоп-заявок брокером (если у брокера действительно есть алгоритм собирания стопов, в чем я сильно сомневаюсь). Но в этом случае, алгоритм выставления лимитных заявок тоже приходится изобретать самому.
Если торговля идет небольшим объемом, то проще, опять по моему субъективному мнению, посылать в систему рыночные заявки.
P.S. вопрос на сообразительность. Если 5000 раз вызывать функцию math.random(1, 999), то какова вероятность получать одинаковые числа? Мне опять почему то сильно кажется, то вероятность будет равна 100%
Опять про метки
 
не путаете с кнопкой "ОК"? Обычно с ней двойной перерасчет... Я всем строго настрого советую никогда ни при каких условиях в здравом уме не жать кнопку "ОК". "Применить", потом закрыть крестиком.
Опять про метки
 
s_mike@rambler.ru, Вам удалось победить задваивание меток при переключении в режиме связанных окон?  
Нашел баги, если вы будете каждые 10 мск пересчитывать число строк в таблице
 
есть догадки!
дело в том, что во многих инвест конторах в квике лимиты по деньгам и бумагам (грубо говоря, все позиции клиента) загружаются вручную или автоматически из файла. Т.е. грубо говоря, квик не знает сколько у вас денег и бумаг, пока кто-то ему не "скажет" через загрузку лимитов. Такой пункт в меню квика каждый может увидеть у себя в квике. Но эта опция на клиентских квиках не работает.
Так вот скорее всего в конторе Бориса загрузка лимитов может происходить более 1 раза в день. К примеру, ответственный сотрудник утром загружает лимиты из сохраненного вчера файла лимитов. Далее бэк-офис в течение дня (если не успел до начала торгов) расчитывает новые лимиты и готовит новый файл с лимитами, который снова загружаются в квик. Квик автоматически перечитывает все быстро пересчитывает. Но у Бориса его автоматика успевает получить пустые таблицы. Отсюда "баги"
разработчикам: отладчик, монитор ресурсов
 
есть Decoda для этих целей
Нашел баги, если вы будете каждые 10 мск пересчитывать число строк в таблице
 
не пробовали?

3.6.1 getFuturesHolding
Функция предназначена для получения информации по фьючерсным позициям.
TABLE getFuturesHolding(STRING firmid, STRING trdaccid, STRING sec_code,
NUMBER type)
Функция возвращает таблицу Lua с параметрами Таблицы позиций по фьючерсам.
В случае ошибки функция возвращает «nil».
и снова о горизонтальных объёмах
 
метки не устраивают?

 
Зависание QUIK, Зависание стакана котировок и графика на открытии торгов и вечернем клиринге
 
Виталий, расскажите, пожалуйста, как Вы отправляете в поддержку архив рабочего места? Для тупых по шагам, чем пакуете, как развер архива на выходе.
Пытаюсь запаковать и отправить квик по инструкции без файла справки и т.п. В ответ приходит уведомление, что размер архива превышает лимит. Удаляю из архива файл info.exe. Новое письмо уходит, но общение с тех поддержкой после этого прекращается.
dll против Луа. Странности
 
Отвечу вопросом на вопрос. А почему Вы решили, что dll должно давать преимущество в скорости? "Общеизвестный факт" при проверке оказывается мифом.
dll против Луа. Странности
 
Ну какие странности!?! С луа Вы почему то используете медленный for pairs, а в С++ быстрый for...

Попробуйте такую формулу для lua
Код
function sum(t)
    local sum = 0
    for x=1, #t do
        sum = sum + t[x]
    end
    return sum
end
P.S. Народ тут в поисках скорости в многопоточности и dll на плюсах совсем не видит, что миллион раз сладывает одно и тоже. Понимаю,что код во втором листинге делает это в качестве теста. Но посмотрите внимательно на свой "рабочий", нет ли там того же самого
Арифметические операции со временем
 
"101200" преобразуйте в секунды примерно так 10*3600+12*60+00. Секунды как есть, минуты умножайте на 60, часы на 3600 (3600 секунд в 1 часе). Получаем 36720 секунд.
Потом прибавляйте сколько нужно. К примеру +45 сек. И затем обратные действия.
36720+45 = 36765.
36765 делим на 60. Остаток от деления = 45- это секунды
36765 - 45 = 36720 (остались минуты и часы)
36720 делим на 3600, остаток от деления = 720. Делим на 60, получаем 12 - это минуты
36720 - 720 = 36000 (остались только часы)
36000 / 3600 = 10 - часы.
В итоге 101245...
как то так
Повторный прогон индикатора, Индикатор вызывается 2 раза для всех индексов
 
делайте дополнительную функцию...
У меня практически каждый скрипт индикатора начинается одинаково. Примерно так:
Код
function Start
--инициализация переменных
end

function OnCalculate(index)

if index==1 then
  Start()
end

-- далее расчеты 

end
P.S. в квике к сожалению, есть еще неразрешимые проблемы. Например, задвоение меток при переключении в режиме связанных окон. Периодически (уже третий год пошел) шлю им письма с архивом и тут писал. Письма они не получают, а баг даже типа "пофиксили" в 7.19. Но он и ныне там....
P.P.S извиняюсь, наболело
вывод отладочной информации
 
PrintDbgStr() отлично работает, давно им пользуюсь.

Выводить, правда, на белый экран. Но это ничего, уже привык  :wink:  
ошибки в 7.12
 
пардон...
в Вашем случае нужна только таблица текущих параметров с нужными столбцами
ошибки в 7.12
 
Роман, включите стакан по выбранному в скрипте инструменту или добавьте в таблицу текущих параметров столбцы "Спрос" и "Предложение"
SetLabelParams
 
Добрый день,

к сожалению, после 5-10 переключений проблема вновь повторяется. Выслал на quiksupport архив с квиком.  
QLua и БД, QLua и БД
 
Добрый день.
Проблема скорее всего в Вашем скрипте.
Использую LuaSQLite3. Читаю ТВС. Раз в полсекунды (уверен, можно и чаще) пишу новые сделки в таблицу. Далее транзакциями пишу в базу свежую порцию сделок... Итак уже полгода и по всем акциям и фьючам. База занимает 2 гига.
Защита кода QLua от компрометации, Есть ли возможность исключить доступ к коду на QLua брокера и разработчиков Quik
 
Цитата
Suntor написал:
Цитата
Алексей Ч   написал:
Цитата
для защиты использую обфускатор   https://github.com/efrederickson/XFuscator  . Код на луа сначала "прогоняю" через него, потом пакую в luac.
Обфускатор, в качестве защиты, мало что даёт на самом деле.
Вы его уже пробовали, надеюсь? Да, с ним есть проблемы, но он добавляет 10 Х г...внокода от исходного. Итого 20кб исходного кода превращается 200кб невнятного луатекста
Защита кода QLua от компрометации, Есть ли возможность исключить доступ к коду на QLua брокера и разработчиков Quik
 
для защиты использую обфускатор https://github.com/efrederickson/XFuscator. Код на луа сначала "прогоняю" через него, потом пакую в luac.
SetLabelParams
 
.... в скрипте есть и задвоение меток и Setlabelparams  false. Старая проблема. Я еще в 2016 году писал о ней в версии квика 7.5
 
SetLabelParams
 
Егор, здравствуйте!
Архив выслал на указанную почту. Видео работы тут https://1drv.ms/u/s!ArU667uon_8CoMtElOQbT3Hzup2qnA
SetLabelParams
 
Цитата
Egor Zaytsev написал:
Добрый день.
Цитата
Если из скрипта переустанавливать на графике скществующую метку, а в это время идёт перерисовка графика при смене инструмента, метка не только не переустанавливать я, но ещё и вовсе пропадает из таблиц терминала, делая невозможными любые последующие с ней действия.  
Смена инструмента осуществляется при помощи настроек диаграммы?
Можете выложить Ваш скрипт.
На вопрос выше ответим позднее.
Здравствуйте! Ошибка воспроизводится на следующем скрипте:
Код
Settings = {
    Name = 'Example4',
    Mult = 1,
    Identifier = 'TESTCHART'
}

ChartID = 0
function Init()
    -- ChartID = 0 -- идентификатор метки
    plDate = '' -- дата метки
    plTime = '' -- время метки
    Data = 0 -- данные для графика
    PrintDbgStr('[QLUA]: DelAllLabels ' .. tostring(DelAllLabels(Settings.Identifier)))
    PrintDbgStr('[QLUA]: Init')
    testmodify = false
    return 1
end

function OnCalculate(index)
    -- получение информации об инструменте
    local t = getDataSourceInfo()
    SecCode = t.sec_code
    ClassCode = t.class_code

    -- Дата и время для метки
    plDate = string.format('%4d%02d%02d', T(index).year, T(index).month, T(index).day)
    plTime = string.format('%02d%02d%02d', T(index).hour, T(index).min, T(index).sec)

    Data = getNumberOf('all_trades') -- данные для метки

    -- если ID метки не найден, то рисуем новую. Иначе меняем старую
    if index == Size() then
        if ChartID == 0 then
            ChartID =
                PlotLabel(
                C(index),
                plDate,
                plTime,
                'text ' .. Data .. ' ' .. SecCode,
                Data .. ' ' .. SecCode,
                Settings.Identifier,
                'green'
            )
            PrintDbgStr('[QLUA]: ChartID =0, new Label, new ChartID= ' .. ChartID)
        else
            testmodify =
                ModifyLabel(
                C(index),
                plDate,
                plTime,
                'text ' .. Data .. ' ' .. SecCode,
                Data .. ' ' .. SecCode,
                Settings.Identifier,
                ChartID,
                'green'
            )
            PrintDbgStr('[QLUA]: ChartID =' .. ChartID .. ' modified ' .. tostring(testmodify))
        end
    end

    return index
end

function PlotLabel(fPRICE, fDATE, fTIME, fTEXT, fHINT, fCHARTTAG, fCOLOR)
    local r, g, b = 255, 255, 255

    if fCOLOR == 'green' then
        r = 0
        g = 255
        b = 0
    elseif fCOLOR == 'red' then
        r = 255
        g = 0
        b = 0
    end

    local label_params = {
        TEXT = tostring(fTEXT),
        IMAGE_PATH= "",
        ALIGNMENT = 'LEFT',
        YVALUE = fPRICE,
        DATE = fDATE,
        TIME = fTIME,
        R = r,
        G = g,
        B = b,
        TRANSPARENCY = 0,
        TRANSPARENT_BACKGROUND = 1,
        FONT_FACE_NAME = 'Lucida Console',
        FONT_HEIGHT = 10,
        HINT = tostring(fHINT)
    }

    return AddLabel(fCHARTTAG, label_params) or -1
end

function ModifyLabel(fPRICE, fDATE, fTIME, fTEXT, fHINT, fCHARTTAG, fCHARTID, fCOLOR)
    local r, g, b = 255, 255, 255

    if fCOLOR == 'green' then
        r = 0
        g = 255
        b = 0
    elseif fCOLOR == 'red' then
        r = 255
        g = 0
        b = 0
    end

    local label_params = {
        TEXT = tostring(fTEXT),
        IMAGE_PATH= "",
        ALIGNMENT = 'LEFT',
        YVALUE = fPRICE,
        DATE = fDATE,
        TIME = fTIME,
        R = r,
        G = g,
        B = b,
        TRANSPARENCY = 0,
        TRANSPARENT_BACKGROUND = 1,
        FONT_FACE_NAME = 'Lucida Console',
        FONT_HEIGHT = 10,
        HINT = tostring(fHINT)
    }
    return SetLabelParams(fCHARTTAG, fCHARTID, label_params)
end

function OnDestroy()
    DelAllLabels(Settings.Identifier)
end


В режиме связанных окон переключаемся на другой инструмент и потом обратно. Получаем две (!) потерявшиеся метки
GetItem запаздывает в индикаторе?
 
Обнаружил, что getItem из таблицы всех сделок в индикаторе запаздывает.
Итак, делаем простой, но "тяжелый" индикатор
Код
Settings = {
    Name = "*MyTest3",
    line =  {Name = "Test", Color = RGB(0, 100, 0), Type = TYPE_CANDLE, Width = 1}
}

local counter = 0
local lastNum = 0
function Init()
    return 1
end

function OnCalculate(index)
    if index == Size() then
        local n = getNumberOf("all_trades")
        for i = lastNum, n - 1 do
            row = getItem("all_trades", i)
            if row.period == 1 and row.sec_code == "RIM8" and row.class_code == "SPBFUT" then
                counter = counter + row.qty
            end
        end
        lastNum = n
        return counter
    end
end



Накладываем на дневной график только за сегодня на подключенный квик. По идее, объем и показания индикатора должны совпадать, но есть разница на одну самую последнюю сделку.
Направление прошлой сделки
 
"Цирк" легко проверить на таблице сделок и стакану....Либо прочитайте уже наконец инструкцию. Раздел 3. Таблица обезличенных сделок. Там черным по белому написано "«Купля» – заключена сделка путем выставления заявки на покупку против находящейся в торговой системе котировки на продажу;"
Похоже очередная дырка в qlua
 
Цитата
Egor Zaytsev написал:
Дополнительно сообщите версию рабочего места QUIK.
Примерно 7.5 и выше....

 
Кто как решил вопрос уведомления о сделках?
 
Перезалил бота сюда.
В telegram_settings.lua нужно указать настройки бота. В квике запустить telegram.lua
Помимо сообщений о сделках и заявках, сообщает так же по запросам:
Fut - деньги на фортс (вариационная маржа)
Pos - позиции на фортс
Usd - текущие котировки USDRUB_TOM
Eur - соответственно EURRUB_TOM
Если написать код фьюча, то можно получить его котировку.
Любые другие символы сообщают, подключен ли квик или нет. В файл log.txt пишет номер последнего запроса
Кто как решил вопрос уведомления о сделках?
 
да, верно, запуск тормозит, но не минуты. Обычно 10-15 секунд. Может быть кто подскажет, почему.
Кто как решил вопрос уведомления о сделках?
 
У меня данная штука запустилась. Накидал все везде)))
Данным ботом пользуюсь уже с месяц. В файле telegram_settings.lua нужно ввести настройки своего бота. Сам бот тут. Там есть что еще допиливать...
Сохранение истории индикатора
 
Задача больше концептуальная. Есть индикатор, который обрабатывает таблицу все сделок. Соответственно, таблица каждый день новая... Вопрос в том, чтобы как то сохранять историю вычислений за предыдущие дни, допустим, в файл. Сохранение в файл не проблема, проблема в том, что скрипт индикатора должен как -то узнать, когда записывать данные в файл.
Вряд ли функция OnCalculate знает, что она сегодня вызывается последний раз. Возможно ли как-то запустить функцию OnCalculate (или какую то другую функция) по времени из индикатора, допустим в 23:55?
OnCalculate. Двойной проход при изменении свойств индикатора
 
Код
Settings= 
{
 Name = "Example1" ,
 Mult = 1 
} 
function Init() 
 OnCalcCo unt=0
 return 1 
end 
function OnCalculate(index) 
 if index==1 then message ("Index= " .. tostring(index) .."  Mult= " .. tostring(Settings.Mult)) end
 return index*Settings.Mult
end
Добавляю индикатор - получаю одно окно сообщений. Меняю в свойствах индикатора Mult, получаю еще два окна!

OnCalculate. Двойной проход при изменении свойств индикатора
 
Причем судя по записям в DebugView, сначала скрип прогнал OnCalculate со старым параметром Mult, затем (второй раз с новым)
OnCalculate. Двойной проход при изменении свойств индикатора
 
Так и задумано. К INIT() вопросов нет. Все что я сделал, это :
1. Добавил индикатор (приложил скрин). Счетчик вырос на число свечек.
2. Один раз изменил его свойства, Mult менял на 2 (второй скрин).

После шага 2 счетчик должен вырасти на число баров,а фактически вырос на (число баров)*2
OnCalculate. Двойной проход при изменении свойств индикатора
 
Добрый день.
Заметил такую особенность. При добавлении своего индикатора, OnCalculate, как и положено, "проходит" по всем свечкам. Но при изменении свойств индикатора, происходит два "прохода". Первый со старыми свойствами, второй с новыми. Так и должно быть? Квик в офлайне.
Код
Settings= 
{
 Name = "Example1" ,
 Mult = 1 
} 
function Init() 
 OnCalcCo unt=0
 return 1 
end 
function OnCalculate(index) 
 OnCalcCo unt=OnCalcCount+1
 PrintDbgStr("[QLUA] " .. tostring(OnCalcCount) .. "  Mult " .. tostring(Settings.Mult))
 return index*Settings.Mult
 -- return nil 
end
После добавления (счетчик увеличился на количество свечек)

Счетчик соответствует количеству свечей.
При изменении свойств счетчик вырос на двойное число свечей (два прохода)
Страницы: 1
Наверх