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

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

Страницы: Пред. 1 2 3 4 5 След.
[ Закрыто] Ищу спеца по ЛуаКвик, для долгосрочного сотрудничества по созданию робота и его доработкам или для консультаций и наставничества.
 
Цитата
Anton написал:
лучше dofile вместо require использовать

Anton, почему?
Синхронизация потоков
 
Цитата
_sk_ написал:
Есть следующий "хак", гарантирующий, что выполнение кода будет только в одном потоке.

Код
   table.ssort ({  0 ,  1  },  function (a, b) 
  тут_ваш_код
   return   true 
 end )  

Запускаю одновременно два скрипта. Использую "хак", рассчитывая, что скрипты будут писать в файл по очереди:
Скрытый текст

Но в файле строки оказываются вперемешку:
Скрытый текст

Почему так? "Хак" не работает с файловыми операциями?
Колбек при отправке транзакции в торговую систему, Контроль количества отправляемых транзакций
 
Цитата
Незнайка написал:
Дать нормальное описание и/или привести в соответствие значения флагов:
https://forum.quik.ru/messages/forum10/message53237/topic6249/#message53237

Цитата
Незнайка написал:
262144 + 1 = "отправлена с помощью LUA" + "отправлена с помощью файла импорта"
Взаимоисключающие значения
Запись в один файл из разных скриптов.
 
Если писать только внутри колбеков, то в пределах одного квика запись в один файл из разных скриптов корректна.
Из разных квиков пока не придумал, как сделать.
Запись в один файл из разных скриптов.
 
Цитата
s_mike@rambler.ru написал:
правильный путь - это формирование флага. Например, если один скрипт хочет писать, он пробует создать папку-семафор на диске. Если папка создалась удачно, дописывает файл. Если при создании папки была ошибка (папка существует), то надо подождать. По окончании записи нужно закрыть файл и удалить папку.
В Lua есть штатные средства создания папки?
Если только создавать файл-флаг. Но это не поможет: несколько скриптов увидят, что флага нет и начнут запись одновременно. Результат будет тот же.

Цитата
s_mike@rambler.ru написал:
использовать механизмы мютексов или что то в этом роде, Но это уже с++
Для торговых ботов использую только QLua.
Если только Арка когда-нибудь сделает мютексы. Но рассчитывать, что это произойдёт в ближайшем будущем я бы не стал.

Цитата
s_mike@rambler.ru написал:
а ещё лучше пересмотреть логику скриптов, чтобы писать из одного скрипта
У каждого скрипта свои данные, которые он пишет в общий файл. Если вести запись только из одного скрипта, то другие скрипты должны будут ему эти данные передать. По сути это будет та же самая задача - обмен данным между скриптами.
Запись в один файл из разных скриптов.
 
Цитата
Владимир написал:
закрывать файл после каждой записи
И что это даст?

Цитата
Владимир написал:
объединять файлы после окончания работы скриптов
Исключено: файл должен заполняться реалтайм.

Цитата
Владимир написал:
использовать один скрипт вместо двух
На самом деле их не два. Объединять скрипты не планирую.
Колбек при отправке транзакции в торговую систему, Контроль количества отправляемых транзакций
 
Цитата
Roman Azarov написал:
Текущая реализация данных флагов именно такова. Опишите, пожалуйста, подробнее, в каком виде Вы бы хотели ее видеть?

Дать нормальное описание и/или привести в соответствие значения флагов:
https://forum.quik.ru/messages/forum10/message53237/topic6249/#message53237
Вы не можете заменить заявку XXX. Повторите попытку позже.
 
Daniil Pozdnyakov, сам скрипт прислать не могу. Но вы можете воспользоваться, например, этим:
Код
local run = true
function OnStop()
  run = false
end

local trans_id, order_num
function OnTransReply(trans_reply)
  if trans_reply.trans_id == trans_id then
    if trans_reply.status == 3 and trans_reply.order_num > 0 then
      order_num = trans_reply.order_num
    end
  end
end

function main()
  trans_id = getUniqTransID()
  local err = sendTransaction{
    TRANS_ID = tostring(trans_id),
    ACTION = "NEW_ORDER",
    ACCOUNT = account,
    CLASSCODE = class_code,
    SECCODE = sec_code,
    OPERATION = "B",
    TYPE = "L",
    PRICE = price,
    QUANTITY = "1"
  }
  if err ~= "" then
    message(err, 3)
    return
  end
  local n = 0
  while run and n < 100 do
    if order_num then
      trans_id = getUniqTransID()
      if sendTransaction{
        TRANS_ID = tostring(trans_id),
        ACTION = "MOVE_ORDERS",
        CLASSCODE = class_code,
        SECCODE = sec_code,
        MODE = "0",
        FIRST_ORDER_NUMBER = tostring(order_num),
        FIRST_ORDER_NEW_PRICE = price,
        FIRST_ORDER_NEW_QUANTITY = "1"
      } == "" then
        order_num = nil
        n = n + 1
      else trans_id = nil end
    end
    sleep(1)
  end
end
Обратите внимание, что статус транзакции и номер заявки, выставленной в торговую систему, проверяются.

Цитата
Daniil Pozdnyakov написал:
данная ошибка появляется постоянно при попытке заменить заявку или какие-то заявки меняются (то есть транзакция срабатывает), а какие-то нет ?
Наверное, второе.
Запись в один файл из разных скриптов.
 
Возможна ли корректная запись из разных скриптов в один файл?
Запускаю два скрипта:
Код
function main()
    local f = io.open(file, "a+")
    for i = 1, 100 do
      f:write(s..i.."\n")
      f:flush()
      sleep(1)
    end
    f:close()
end
В первом: s = ".."
во втором: s = "+"

В файле
Скрытый текст
часть строк теряются.

Есть идеи как исправить?
Вы не можете заменить заявку XXX. Повторите попытку позже.
 
Цитата
Daniil Pozdnyakov написал:
OnTransReply, помимо номера заявки, возвращает ещё и поле status, которое может показывать, что, например, транзакция была отвергнута ТС.
Цитата
Daniil Pozdnyakov написал:
добавить логику проверки в скрипт, чтобы поле status было равно "3"

Во-первых, проверка поля status давно есть.
Во-вторых, если транзакция была отвергнута ТС, то order_num = 0.

Цитата
Daniil Pozdnyakov написал:
Чтобы решить возникшую проблему
Так это не у меня проблема, а у вас с сервером какая-то шляпа.
Заявка выставлена в торговую систему биржи. Сервер прислал номер заявки в OnTransReply, но утверждает "Вы не можете заменить заявку". С чего вдруг?
Вы не можете заменить заявку XXX. Повторите попытку позже.
 
Цитата
Daniil Pozdnyakov написал:
пока не вызовется функция onOrder , транзакция MOVE_ORDERS не сработает
Что за дичь? На каком основании?
Вы не можете заменить заявку XXX. Повторите попытку позже.
 
Цитата
Daniil Pozdnyakov написал:
обновить версию терминала до актуальной версии (9.2.2)
У меня 9.2.2.11
Вы не можете заменить заявку XXX. Повторите попытку позже.
 
Часто при MOVE_ORDERS заявки от сервера прилетает такое сообщение. Это происходит, если изменять заявку по номеру, полученному из OnTransReply, не дожидаясь OnOrder.
С чего вдруг я не могу заменить заявку?!! Ведь заявка существует в ТС, я получил номер заявки.
MOVE_ORDERS
 
Цитата
Roman Azarov написал:
Обе заявки успешно изменены, либо не изменена ни одна, либо ошибка. Это уже можно понять по реплаю.

Не совсем так:
Цитата
Если при сдвиге пары заявок одна из них наткнулась на кросс-сделку (сведение с заявкой от того же ИНН, либо клиентского регистра), она откатывается, а другая заявка сдвигается.


Цитата
Roman Azarov написал:
Цитата
Андрей написал:
На момент onTransReply нет еще onOrder и записи в заявках
Если в OnTransReply вернулся номер заявки(ок), это значит, что новая заявка была зарегистрирована, что приведет к срабатыванию OnOrder и появлению соответствующей записи в таблице заявок.
OnOrder сработает потом когда-нибудь, а информация по новой заявке нужна уже сейчас в OnTransReply.

Цитата
Roman Azarov написал:
Зарегистрировали пожелание на добавление полей price, quantity и order_num для второй заявки.
Присоединяюсь.
Колбек при отправке транзакции в торговую систему, Контроль количества отправляемых транзакций
 
Цитата
Roman Azarov написал:
В OnTransReply подобный флаг не может быть реализован
О чём же это тогда?
https://forum.quik.ru/messages/forum10/message35476/topic4156/#message35476

Он, как бы есть в OnTransReply, но дает противоречивые значения:
https://forum.quik.ru/messages/forum10/message53237/topic6249/#message53237
Выскакивает ворнинг "Compare string with number", А его не должно быть, по идее!
 
Цитата
Незнайка написал:
Существует ли вероятность того, что значение Time сбросится сразу же после проверки его существования в main
Проверил: вероятность существует.
Выскакивает ворнинг "Compare string with number", А его не должно быть, по идее!
 
Код
local Time = X
function OnCallback()  -- любой колбек
  Time = nil
end

function main()
  if Time and os.time() > Time then
    ...
  end
end

Существует ли вероятность того, что значение Time сбросится сразу же после проверки его существования в main и os.time() > Time вернет ошибку?
Как объявить Двумерный массив с последующим заполнением уже в скрипте?
 
Цитата
Alex написал:
как только переходим на i =2 сразу идет ошибка
Потому что надо сначала создать массив save[2]

Код
save = {}
for i = 1, 20 do
  save[i] = {}
  for j = 1, 20 do
    save[i][j] = "hello"
  end
end
рыночные заявки становятся лимитными
 
Цитата
BlaZed написал:
в документации написано что условия исполнения заявок отсутствуют на срочном рынке
Где именно?

Цитата
BlaZed написал:
Лично не проверял
Лично проверял:
на демке - рыночную заявку
на бою - лимитированную с условием "Снять остаток". О чем пришел ответ по транзакции с сообщением "Заявка XXX успешно зарегистрирована." и ордером со статусом "Снята" и withdraw_datetime = datetime
Колбек при отправке транзакции в торговую систему, Контроль количества отправляемых транзакций
 
Цитата
QApplication написал:
добавить срабатывание OnTransReply callback для все отправляемых транзакций любым способом: вручную, скриптом, из файла, по API.
А также флаг, указывающий источник транзакции. И для OnOrder и OnTrade тоже.
рыночные заявки становятся лимитными
 
Цитата
Незнайка написал:
QUIK подставляет не лучшую, а худшую цену
Ещё заявка выставляется с условием "Снять остаток", поэтому нереализованная заявка сразу снимается.

Цитата
Алексей написал:
Почему
Чтобы ответить на этот вопрос, нужны подробности: какой рынок, как выставлялась заявка.
рыночные заявки становятся лимитными
 
Цитата
Алексей написал:
Насколько это верно?

QUIK подставляет не лучшую, а худшую цену:
Цитата
При включении признака «Рыночная» в пустое поле «Цена» подставляется значение «Максимально возможная цена», а при подаче заявки на продажу – «Минимально возможная цена» для данного инструмента (значение берется из Таблицы текущих торгов)
При таком раскладе в стакане не должно быть встречных заявок, чтобы ваша заявка осталась висеть.

Возможно, вы используете какой-то привод, который формирует цену заявки: текущая цена + отступ или в квике есть какая-то настройка для рыночных цен, о которой мне не известно.
рыночные заявки становятся лимитными
 
Цитата
Roman Azarov написал:
по лучшему встречному предложению
По лучшему для кого, для вашего контрагента?

Цитата
Roman Azarov написал:
если речь идет о выставлении рыночных заявок на срочном рынке, то в таблице заявок они будут выглядеть как лимитные
Это надо, чтобы весь стакан "съели", чтобы заявка, выставленная по min/max возможной цене (на уровне планки) не исполнилась, а встала в стакан.
Колбек при отправке транзакции в торговую систему, Контроль количества отправляемых транзакций
 
Добавить колбек OnSendTransaction(number trans_id), вызываемый, когда из терминала отправляется транзакция любым способом: вручную, скриптом, из файла, по API.
Чтобы любой скрипт, подписавшись на этот колбек мог знать, сколько транзакций отправлено на сервер.
Цель: контроль общего количества отправляемых транзакций в единицу времени, чтобы не натыкаться на ограничения брокера:
https://forum.quik.ru/forum14/topic6093/
https://forum.quik.ru/messages/forum1/message45728/topic2916/#message45728

Факультативно решается вопрос контроля уникальности id транзакций.

Также не лишним было бы иметь доступ к таблице транзакций через getNumberOf, getItem, чтобы знать общее количество транзакций за торговую сессию.
Функция с переменным числом аргументов, Как узнать количество переданных в функцию аргументов?
 
В Lua 5.4 есть table.pack

Код
local function f(...)
  local arg = table.pack(...)
  return arg.n
end

print(f(1, nil, nil))
Индикатор Lua
 
Цитата
nikolz написал:
при выводе просто перечисляете их
Спасибо, Кэп, для 8 значений задача решена во втором сообщении.

Я немного усложнил задачу: написать вывод для бОльшего числа значений, какого угодно количества.
Индикатор Lua
 
Цитата
Незнайка написал:
упаковать значения в две таблицы, а потом объединить их

Но есть косяк: если функции могут возвращать nil, то unpack работает криво.
Когда таблица сразу заполняется при создании, то распаковывается нормально:
Код
  local G = {1, 2, nil, 4, nil, 6}
  return print(unpack(G))  -->  1       2       nil     4       nil     6

А когда значения дописываются после, то работает криво
Код
local G = {1, 2, nil}
G[4] = 4
G[5] = nil
G[6] = 6
print(unpack(G))   -->   1       2       nil     4
Функция с переменным числом аргументов, Как узнать количество переданных в функцию аргументов?
 
Цитата
Незнайка написал:
в Lua 5.4

Нашел:
Код
local function f(...)
  local arg = {...}
  arg.n = select('#', ...)
  return arg.n
end

print(f(1, nil, nil))
Функция с переменным числом аргументов, Как узнать количество переданных в функцию аргументов?
 
В Lua 5.1 количество переданных значений в функцию содержалось в arg.n

Код
local function f(...)
  return arg.n
end
print(f(1, nil, nil))  --> 3

А в Lua 5.4 как?
Индикатор Lua
 
Цитата
Nikolay написал:
Когда число линий действительно больше, то тогда уже лучше хранить значения в таблице, а возвращать через unpack(table).

Не придумал ничего лучше, чем упаковать значения в две таблицы, а потом объединить их
Код
function OnCalculate(index)
  local G = {glo1(index)}
  local n = #G
  local G_ = {glo2(index)}
  for i = 1, #G_ do
    n = n + 1
    G[n] = G_[i]
  end
  return table.unpack(G)
end

Может, есть более красивое решение
Что делает SetEmptyCallback() ?
 
Цитата
BlaZed написал:
есть ситуации когда он еще актуален?
Разве он был когда-то актуален? По-моему всегда без него работало.
Но,
Цитата
BlaZed написал:
на всякий случай оставил вызовы SetEmptyCallback(), мало ли что изменится в будущем
аналогично.

Цитата
BlaZed написал:
Вопрос к разработчикам.
Тссс. Как говорится, работает - не трогай. Лучше туда не лезть, а то что-нибудь другое поломается.
Что делает SetEmptyCallback() ?
 
Цитата
BlaZed написал:
зачем все таки нужна функция SetEmptyCallback()?

Поискал по форуму, нашёл противоречивые ответы поддержки по этому вопросу:

1) https://forum.quik.ru/messages/forum10/message38004/topic4520/#message38004
Цитата
Sergey Gorokhov написал:
Цитата
rpns написал:
Кстати, и без вызова SetEmptyCallback. Зачем он тогда?)
Он нужен для подписки на данные. Ровно эту же подписку можно выполнить через терминал, открыв нужный график.
Если Вы откроете график то по сути SetEmptyCallback не нужен, данные и так будут поступать.
Но не всем удобно открывать графики, по этому существует SetEmptyCallback.

2) https://forum.quik.ru/messages/forum10/message45488/topic5400/#message45488
Цитата
Sergey Gorokhov написал:
На самом деле, заказ данных  после CreateDataSource  происходит независимо от заданного коллбэка.
Для данных на основании обезличенных сделок будут получаться все данные,
Для данных ТТТ в зависимости от настроек терминала для получения ТТТ, т.е. если получение пропущенных данных выключено, то будут доступны только новые данные ТТТ.
[BUG] CreateDataSource не заказывает обезличенные сделки
 
Цитата
Владимир написал:
он находит такие ошибки, которые остальным 99% участников вовек не найти.
Только нахрена он это делает?
Permission denied при удалении файла
 
Если из запущенного процесса запустить другой(ие) процесс(ы), то файл останется заблокированным, пока не закроешь всю ветвь.
Permission denied при удалении файла
 
Цитата
s_mike@rambler.ru написал:
Цитата
Незнайка написал:
Цитата
Anton  написал:
хэндл файла наследуется запускаемым процессом и удерживается открытым до его завершения
Похоже, так и есть, запускаемый процесс удерживает все открытые (на момент его запуска) файлы до своего завершения.
легко проверить.
сделайте между запуском oos.execute и os. remove паузу, достаточную чтобы руками закрыть созданное окно шелла

Подтверждается.
Как и то, что, даже если сам скрипт завершится раньше, то файл останется заблокированным до закрытия шелла.
Permission denied при удалении файла
 
Цитата
s_mike@rambler.ru написал:
и без os.execute то же самое
Без os.execute() файл удаляется.

Цитата
Anton написал:
хэндл файла наследуется запускаемым процессом и удерживается открытым до его завершения
Похоже, так и есть, запускаемый процесс удерживает все открытые (на момент его запуска) файлы до своего завершения.
Permission denied при удалении файла
 
Цитата
Anton написал:
В os.execute точно эта самая команда, что приведена
Код, на котором наблюдается проблема, приведен полностью. Его можно запустить и убедиться в этом.
Permission denied при удалении файла
 
Перед вызовом os.remove() файл закрыт, о чем указывается в окне сообщений:
Цитата
true
file (closed)
Permission denied при удалении файла
 
Цитата
QApplication написал:
если файл открыт

f:close() закрывает файл
os.remove() - удаление файла файла
Permission denied при удалении файла
 
Скрипт не может удалить закрытый файл.
Код:
Код
function main()
  local filename = "file.txt"
  local f = assert(io.open(filename, "w"))
  os.execute("start cmd.exe")
  message(tostring(f:close()) .. "\n" .. tostring(f))
  assert(os.remove(filename))  -- file.txt: Permission denied
end
Если поместить вызов os.execute() после закрытия файла, то удаляется.
Добавить функции QLUA "Поверх всех окон" и "Показывать на всех"
 
Цитата
Daniil Pozdnyakov написал:
Вы хотите иметь именно функции QLUA, чтобы использовать их в lua-скриптах и при помощи них устанавливать определённое окно поверх других или отражать на других вкладках?
Да, для окон, созданных самим скриптом.
Перемещение заявки 2 транзакциями
 
Цитата
nikolz написал:
Не парьтесь никаких нарушений не возникнет.
nikolz, наверное, и про УДС, НПР и пр. ничего не слышал.
Ещё и маржин-колл какой-то придумали. Не, не слышал...
Перемещение заявки 2 транзакциями
 
Цитата
Андрей написал:
ошибки типа данный инструмент запрещен в шорт
Цитата
Андрей написал:
Сделайте вторую версию sendTransaction, которая бы не проверяла подобные локальные условия. Чтобы можно было вызывать 2 транзакции сразу друг за другом.
Вы не подумали, что первая заявка может исполниться, пока транзакция на её снятие дойдёт до биржи?
Тогда, при исполнении второй заявки, получится как раз шорт.
А это нарушение. Брокер будет вынужден закрывать ваш шорт принудительно.

Цитата
Игорь М написал:
вам нужен прямой доступ на биржу
А кто в этом случае контролирует лимиты?
Добавить функции QLUA "Поверх всех окон" и "Показывать на всех"
 
Здравствуйте.
А сильно сложно будет добавить для Lua-окон команды "Поверх всех окон" и "Показывать на всех"?
Можно, конечно использовать для этого WinAPI, но не хочется подключать ради двух команд стороннюю библиотеку, тем боле что QUIK с библиотеками работает не стабильно.
Нехватка видеопамяти
 
Цитата
s_mike@rambler.ru написал:
Когда задают вопрос про версию, это означает, что никто даже и не пошевелился, чтобы найти ошибку.  Она проявляется на любой версии
ккогда спрашивают код скрипта, это означает, что никто даже не почесался прочитать первые три сообщения ветки
когда спрашивают скриншот окна сообщения, это значит, что никто  даже не пробовал поискать в текстах терминала  слово "видеопамяти "

Ну если вместо того, чтобы просто открыть график, неделю задавали тупые вопросы, то тут задачка посложнее.
Каталог luac-скрипта, выполняемого через dofile
 
Цитата
swerg написал:
даже пробовать не будете?

Еще до создания темы перепробовал.
Каталог luac-скрипта, выполняемого через dofile
 
Цитата
TGB написал:
В Lua 5.4 у меня работает это.
Сомневаюсь, что это работает внутри откомпилированного скрипта.
Каталог luac-скрипта, выполняемого через dofile
 
Можно ли внутри скомпилированного luac-скрипта, выполняемого через dofile, узнать его расположение?
Очевидный вариант - передать параметром из запускающего скрипта - не интересует.
Отладка QUIK 9.1
 
Цитата
Egor Zaytsev написал:
Инструмент?
А есть инструменты, на которых указанной проблемы нет?
Отладка QUIK 9.1
 
График цены и объёма
Страницы: Пред. 1 2 3 4 5 След.
Наверх