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

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

Страницы: 1
Поиск подстроки в строке
 
Разобрался. Использовал следующую конструкцию:
p = string.find(s1, s2, 0, true);

где
s1 - строка в которой ищем подстроку s2,

0 - символ с которого начинаем поиск,

true - отключение спецсимволов
Поиск подстроки в строке
 
Не получается решить тривиальную вроде бы задачу: найти подстроку в строке. Есть строка, считываемая из текстового файла
Код
2019-11-29 11:40:57 --- 0.3866 --- 52.1600000
и подстрока, индекс первого вхождения которой нужно найти: " --- " (всего в ней пять символов). Использую следующий код
Код
...

f_a = io.open(testFile1,"r");
f_t = io.open(testFile2,"w");
         
for line in f_a:lines() do 
   ln = line;
   p = ln:find(" --- ");
        f_t:write(p, "\n");
end; 
и получаю p = 11 . Экспериментирую с разными строками и подстроками пришел к выводу, что проблема в следующем: функция find берет первый символ искомой подстроки (в моем примере это пробел) и возвращает его первое вхождение в строку. Как же тогда заставить ее искать вхождение всей подстроки / что я делаю не так?
HHTP запросы в LUA и проблема с 32-битной версией библиотеки LuaSocket
 
Цитата
Вадим написал:
Присоединяюсь к изначальному вопросу. Имею на 64-битной Win10 ту же самую диагностику при обращении
http = require('socket.http')
Существуют какие-то решения данной проблемы, господа Знатоки?
Я в итоге не разобрался ни с проблемой, ни с советами, попробовал как альтернативу настроить подключение из скрипта к базе MySQL и столкнулся с той же самой проблемой (не является приложением Win32) при подключении библиотеки. В итоге отказался от использования библиотек LUA и решил создать на другом языке небольшую программу, которую LUA-скрипт будет запускать как .exe, когда ему нужно, и забирать из текстового файла итоги его работы (данные выкачанные с web-страницы). Также Lua-библиотеки работали в 32-битной версии QUIK, которую для теста скачал с сайта своего брокера, но для меня важно чтобы решение работало в любой версии квика, поэтому такой вариант отбросил
Подключение к базе данных из LUA скрипта
 
Добрый день
Ищу простой способ получения данных lua-скриптом из базы mysql. Узнал, что вроде бы для этих целей есть библиотека LuaSQL, подключаемая кодом

Код
require "luasql.mysql"
но где взять сами файлы библиотеки не понимаю. Как можно подключить эту библиотеку или подключиться к БД любым другим способом?
HHTP запросы в LUA и проблема с 32-битной версией библиотеки LuaSocket
 
Цитата
Anton написал:
Цитата
Nikolay написал:
Но можно и руками отправлять, только с Socket
Ох, не советуйте таких вещей. Многие сайты хотят только тлс, многие ставят куку и делают редирект, некоторые особо одаренные даже жабаскриптом это делают. Все это в общем случае придется обрабатывать. Прошли времена простого веба, сейчас лучше готовую либу заюзать, если, конечно, задача прикладная, а не хорошенько протоколы изучить.
Данные с собственного сайта на самом деле берутся, просто решил их пока выводить на отдельную html страничку и lua-скриптом подцеплять. Так что с этим проблем нет и подойдет любое решение. Просто кажется странным, что ради такого примитивного функционала необходимо смотреть чужой проект и выбирать оттуда нужный кусок
HHTP запросы в LUA и проблема с 32-битной версией библиотеки LuaSocket
 
Добрый день!
Моему скрипту на LUA требуются внешние данные, которые присутствуют на web-странице. В связи с этим пытаюсь найти способ сделать http-запрос. Поиски в интернете и в том числе на этом форуме привели к выводу, что нужно использовать библиотеку LuaSocket. Разобрал следующую тему и сделал всё как рекомендовано: https://forum.quik.ru/messages/forum10/message20352/topic2286
В итоге получаю ошибку "error loading module 'socket.core' from file 'C:\BCS_Work\QUIK_BCS\Include\socket\core.dll': %1 не является приложением Win32.". Похоже, что для моей версии QUIK (8.1.0.30) нужна 64-битная версия библиотеки, но такую в открытом доступе найти не получается.

Прилагаю свой код, буду признателен за помощь. Интересует получение кода web-страницы из скрипта любым способом, использование именно этой библиотеки не принципиально
Код
package.cpath = getScriptPath() .. "\\<CDIR>\\?.dll;" .. package.cpath
package.path = getScriptPath() .. "\\<LDIR>\\?.lua;" .. package.path

local address = 'http://***some_url***'

function main ()
   while true do
      sleep (5000)
     do_smart ()
   end
end

function do_smart ()
   local http_request = require ( "socket.smtp" )
   local headers, stream = assert(http_request.new_from_uri(address):go())
   local body = assert(stream:get_body_as_string())   
end
Шаг цены SEC_PRICE_STEP, Изменения в Текущей таблице параметров
 
Благодарю за поддержку
Шаг цены SEC_PRICE_STEP, Изменения в Текущей таблице параметров
 
Помогло копирование папки терминала с другого рабочего места. Видимо отправлять архив уже не буду. Добавлю, что проблема возникала на компьютере с Windows XP
Шаг цены SEC_PRICE_STEP, Изменения в Текущей таблице параметров
 
В таблице текущих торгов все шаги цен отображаются нормально, как и в текущей таблице параметров. Выкладываю упрощенный скрипт, который имеет ту же проблему (оригинал довольно большой). В текстовый файл "testing.txt" записываются строки с значением "0" не зависимо от того, какой тикер перед запуском скрипта вписывать вместо "MAGN".
Код
PORTFOLIO_EX Simple;
DESCRIPTION Пример;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST ALL_FIRMS;

PROGRAM

new_global("step",1/1000)
new_global("path","C:\Программа обработки заявок\Программа быстрого выставления заявок\")
new_global("fn",path&"testing.txt")

step=0+get_value(get_param_ex("TQBR","MAGN","SEC_PRICE_STEP"),"Param_value")
writeln(fn,step)

add_item(1,"")

END_PROGRAM

PARAMETER St;
PARAMETER_TITLE Шаг;
PARAMETER_DESCRIPTION Шаг;
PARAMETER_TYPE STRING(20);
END

END_PORTFOLIO_EX
Шаг цены SEC_PRICE_STEP, Изменения в Текущей таблице параметров
 
Добрый день!
Вчера столкнулся со следующей проблемой: в терминале QUIK подключен QPILE скрипт (давно не изменявшийся и работавший исправно), берущий в ходе работы шаг цены для разных эмитентов из таблицы "Текущая таблица параметров". Используется функция:
Код
= get_value(get_param_ex(classCodeVariable,secCodeVariable,"SEC_PRICE_STEP"),"Param_value")
Скрипт не переподключался к терминалу и не менялся долгое время, Текущая таблица параметров тоже открыта в терминале и отображает все столбцы корректно. Похоже, что со вчерашнего дня имя столбца SEC_PRICE_STEP сменилось на какое-то другое, поскольку теперь шаг цены для любого эмитента определяется равным нулю. Просьба помочь разобраться.

Знаю, что использование не поддерживаемого языка QPILE нежелательно. Всё же хотелось бы обойтись без переписывания всего скрипта, если есть такая возможность.
Уменьшение глубины стакана перед закрытием рынка
 
Уже разобрался. Ошибся, всё же в терминале стаканы также отображались не полностью.
Уменьшение глубины стакана перед закрытием рынка
 
Есть скрипт (QPILE), выгружающий стаканы для определенного набора эмитентов в txt файлы (работал стабильно в течение нескольких недель). Глубина стакана у брокера 20. Недавно обнаружил, что вечером (примерно после 18 30) выгружаемые данные урезаются (выходит не по 20, а по 10 цен в стакане на buy и sell). При этом если смотреть на сами стаканы в терминале, там продолжают отображаться 20 цен в обе стороны. Рынок в это время еще не закрыт.

Подскажите, стандартная ли это ситуация, встречался ли кто-нибудь с ней? В чем искать проблему? Зависит ли это от конкретного брокера, либо терминала или скриптового языка? Спасибо.
Снятия заявки без id транзакции
 
Спасибо. Ошибочно полагал, что TRANS_ID должен содержать ID снимаемой заявки (а не новой транзакции на ее снятие)
Снятия заявки без id транзакции
 
Криво сформулировал последний вопрос. Имел ввиду, если через импорт транзакций снять заявку без trans id невозможно, можно ли это сделать из qpile или lua скрипта?
Снятия заявки без id транзакции
 
Интересует, можно ли составить команду на снятие заявки (и далее передать ее в терминал через модуль "импорт транзакций"), если заявка не имеет trans_id (значение в таблице заявок  постое). Что-то вроде

CLASSCODE=SNGSP; SECCODE=TQBR; TRANS_ID=NONE; ACTION=KILL_ORDER; ORDER_KEY=158510926;

Есть ли такая возможность в lua?
Отловить ошибку при работе скрипта, Отловить ошибку при работе скрипта
 
Существует ли в QPILE какое-либо подобие, например, конструкции try { } catch { } из C# ? Цель — в случае возникновения ошибки не заканчивать работу скрипта, а продолжать его периодическое выполнение.

Если конкретнее, то есть два компьютера, соединенные локальной сетью. Скрипт, работая в терминале на первом компьютере, обращается к директориям (текстовым файлам) на втором компьютере. Скрипт падает каждый раз, когда 2й компьютер оказывается выключен (при запущенном терминале на первом компьютере), и его приходится переподключать. Хотелось бы обернуть в такой try { } catch {} весь код скрипта, чтобы он не падал и сам начинал работать после появления доступа к нужным ему директориям.

Спасибо
Работа с таблицей клиентского портфеля, -
 
Как получить содержимое таблицы "Клиентский портфель" без указания конкретного клиента (для всех)? В руководстве пользователя нашел только следующую функцию для работы с таблицей "Клиентский портфель": GET_CLIENT_MARGINAL_PORTFOLIO_INFO. Но она в качестве входных параметров принимает код клиента и firmID. Можно ли получить информацию по всем пользователям? Или сначала как-то узнать все возможные комбинации (client_code + firmid), чтобы потом для каждой из них получить портфель..

Второй вопрос по работе с самой функцией GET_CLIENT_MARGINAL_PORTFOLIO_INFO. Следующий фрагмент кода в итоговую таблицу почему-то не заносит ничего (на демо счете), хотя таблица "Клиентский портфель" содержит несколько записей с указанными client_code и firmid:
Код
PORTFOLIO_EX ClientPortfolioTXT;
DESCRIPTION Экспорт клиентского портфеля;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST ALL_FIRMS;

PROGRAM
                MAP = GET_CLIENT_MARGINAL_PORTFOLIO_INFO("MC0007400000","141972")
      K = GET_NUMBER_OF(MAP)
      FOR I FROM 1 TO K
         TR = GET_ITEM (MAP, I)
         
         N_ASSETS=GET_VALUE(TR,"ASSETS")
         
         ' ----------------------------
         ' ----- Таблица (запись) -----
         ' ----------------------------
         
         OUTPUT=CREATE_MAP()
         OUTPUT=SET_VALUE(OUTPUT, "AS", N_ASSETS)
         ADD_ITEM(1, OUTPUT)
      END FOR
END_PROGRAM

PARAMETER AS;
PARAMETER_TITLE Assets;
PARAMETER_DESCRIPTION Assets;
PARAMETER_TYPE STRING(15);
END

END_PORTFOLIO_EX
Получить объем из таблицы заявок, GET_VALUE(trade,"VOLUME")
 
Нашел описание таблиц и колонок в 8й главе руководства пользователя QUIK здесь: https://arqatech.com/ru/support/files/
Получить объем из таблицы заявок, GET_VALUE(trade,"VOLUME")
 
...и количества купленных/проданных акций
Код
N_AMOUNT=GET_VALUE(TR,"AMOUNT")
.. TR,"AMOUNT") .. правильно ли это?
Получить объем из таблицы заявок, GET_VALUE(trade,"VOLUME")
 
Появился аналогичный вопрос для получения даты совершения сделки:
Код
TR = GET_ITEM ("TRADES", I)
N_EXECUTION_DATE=GET_VALUE(TR,"DATE")
.. TR,"DATE") .. правильно ли это?
Получить объем из таблицы заявок, GET_VALUE(trade,"VOLUME")
 
Благодарю, помогло
Получить объем из таблицы заявок, GET_VALUE(trade,"VOLUME")
 
Добрый день

Ищу способ получить объемы из таблицы заявок. Код ниже создает таблицу, аналогичную таблице заявок. Но столбец с объемами остается пустым (при том что в оригинальную таблицу заявок он добавлен и содержит нужные значения). Полагаю, что вместо GET_VALUE(TR,"VOLUME") должно стоять какое-то другое обращение, но в интернете ничего по теме найти не смог.

Спасибо
Код
K = GET_NUMBER_OF("ORDERS")

FOR I FROM 1 TO K
   TR = GET_ITEM ("ORDERS", I)
   
   N_NUMBER=GET_VALUE(TR,"NUMBER")
   N_CLASS=GET_VALUE(TR,"CLASSCODE")
   N_EMIT=GET_VALUE(TR,"SECCODE")
   N_OPERATION=GET_VALUE(TR,"OPERATION")
   N_CLIENT=GET_VALUE(TR,"CLIENTCODE")
   N_ACCOUNT=GET_VALUE(TR,"ACCOUNT")
   N_PRICE=GET_VALUE(TR,"PRICE")
   N_VOLUME=GET_VALUE(TR,"VOLUME") 'здесь переменная остается пустой
   N_STATUS=GET_VALUE(TR,"STATUS")
   
        ' ----- Запись в таблицу -----
   
   OUTPUT=CREATE_MAP()
   OUTPUT=SET_VALUE(OUTPUT, "NUMBER_N", N_NUMBER)
   OUTPUT=SET_VALUE(OUTPUT, "CLASS_N", N_CLASS)
   OUTPUT=SET_VALUE(OUTPUT, "EMIT_N", N_EMIT)
   OUTPUT=SET_VALUE(OUTPUT, "OPERATION_N", N_OPERATION)
   OUTPUT=SET_VALUE(OUTPUT, "CLIENT_N", N_CLIENT)
   OUTPUT=SET_VALUE(OUTPUT, "ACCOUNT_N", N_ACCOUNT)
   OUTPUT=SET_VALUE(OUTPUT, "PRICE_N", N_PRICE)
   OUTPUT=SET_VALUE(OUTPUT, "VOLUME_N", N_VOLUME)
   OUTPUT=SET_VALUE(OUTPUT, "STATUS_N", N_STATUS)
   ADD_ITEM(1, OUTPUT)
   
END FOR   
Страницы: 1
Наверх