Дмитрий (Автор тем)

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

Страницы: 1
Работа нескольких скриптов с одним файлом, Выдает периодически ошибку при работе нескольких скриптов с одним файлом
 
function mark_Fail (zap, mark) - моя функция записи в файл
FileWrite = io.open('D:\\QLUA\\fails\\mark.txt', zap)
FileWrite:write(mark)
FileWrite:close()
end
а другой скрипт читает этот файл.
Все работает нормально, но периодически первый скрипт выходит на ошибку "attempt to use a closed file" на строке FileWrite:close(). Ошибка выходит редко, 2-3 раза в день, при этом запись в файл примерно каждые 6-8 секунд, а просмотр другим скриптом каждые 60 секунд)
Я своим скудным умишком полагаю, что происходит наложение запросов двух скриптов на один файл и конфликт.
Вопросы:
1) как сделать "бесшовную" работу нескольких скриптов с одним файлом? Не запись одновременно, а один скрипт пишет - несколько читают и не мешают основному писать.
2) на крайняк, как сделать, чтоб не останавливало скрипт по такой ошибке? Готов просто пропускать запись, если вдруг прошло "наложение" в этот момент
Заранее благодарю отозвавшихся на вопрос.
Номер строки в коде скрипта, Вывести номер строки в коде скрипта
 
Скрипт имеет длинный код (пишу плохо, поэтому структура кода не оптимальна), по ходу коду навставлял "ловушки", которые записывают в файл ключевые данные по работе скрипта. Потом разбираю записи и долго ищу в какой строке кода сработала запись. Вопрос - можно ли как-то вывести строку кода при реализации скрипта? Ну, типа:
message (CodeLine)
выдает сообщение с номером строки кода, где CodeLine - функция определения строки кода скрипта.
Кол-во в заявках стакана на одном ценовом уровне, Кол-во в заявках стакана на одном ценовом уровне
 
Добрый день.
Скрипт:
 StKot = getQuoteLevel2 ('SPBFUT', 'CRM3')
 Q = tonumber (StKot.offer[1].quantity)
В данном случае выдаст сумму всех заявок по лучшему предложению в стакане, или если на данном уровне несколько заявок - выдаст только одну (первую в очереди) ?
Например на уровне 10,987р размещено 3 заявки по 5, 1 и 3 лота соответственно. В стакане вижу 9 лотов суммарно на этом уровне, а что выдаст указанная мной ранее функция? 5 или 9?
Заранее благодарен за помощь.
Ошибка attempt to perform arithmetic on a table value, Ошибка attempt to perform arithmetic on a table value - что значит?
 
Не могу нигде найти описание ошибки "attempt to perform arithmetic on a table value" - в переводе "попытка выполнить арифметику над табличным значением". Ну а почему нельзя выполнить арифметику над табличным значением? Или что имеется ввиду?
Работа со стаканом котировок, Кол-во строк в таблицах стакана
 
Прочитал внимательно, что есть на форуме по работе со стаканом котировок в qlua. Написал простейший скрипт и уперся в такой момент.
Вот скрипт:
function main ()
   StKot = getQuoteLevel2('SPBFUT','RNH3')
   NumBid = StKot.bid_count
   bid_quantity = StKot.bid[NumBid].quantity
   bid_price = StKot.bid[NumBid].price
   ...
end

Понятно, что в таблице спроса строки идут от "худшей", поэтому что получить лучший спрос в стакане - запрашиваю кол-во строк и беру последнюю. Ругается ,что нет такого индекса в этой таблице. Думаю, может начинает с нулевой строки. Делаю [NumBid - 1]. Ошибки не выдает, результат показывает, но на поверку обнаруживаю, что выдает 2-ю сверху позицию спроса в стакане.
При этом по StKot.offer[1] нормально выдает лучшее предложение в стакане.
Помогите, люди добрые, как получить "лучший" спрос из стакана?

p.s. окно стакана котировок открыто при работе скрипта
p.s. вариант получения данных через getParamEx понятен, я не понимаю, почему из стакана не цепляет?
Позиции на счете появляются уже после снятия заявки, Позиции на счете появляются уже после снятия заявки
 
Люди добрый и умные, помогите начинающему скриптеру. Голову сломал.
Выставляю заявку на продажу фьючерса и контролирую ее по битовым флагам на исполнение.
Типа так:
 if bit.band(trade.flags,1) == 0 and bit.band(trade.flags,2) == 0 then
   ZayavkaIspolnena_F_Buy = true
 end
После получения (строго после) условия ZayavkaIspolnena_F_Buy = true проверяю позицию по getFuturesHolding и часто получается так, что позиции теряются (не показывает getFuturesHolding), хотя заявка исполнена.
Ставил задержку между ZayavkaIspolnena_F_Buy и  getFuturesHolding sleep (1000) - уже лучше, но на 5 раз проскочило опять, в этот раз была заявка на 20 позиций реализована частями (15+3+1+1), а на getFuturesHolding выдало наличие =18 (а по факту в портфеле появились все 20 фьючерсов), т.е. последние 2 сделки не успели по системе перейти в позиции до сработки getFuturesHolding.
Топорно увеличивать еще паузу между ZayavkaIspolnena_F_Buy и  getFuturesHolding - но до какого интервала? да и не правильно это, концепт моего бота подламывает.
Уверен, что опытные товарищи эту проблему легко решают в коде, подскажите, как точно получить значение реализованной заявки.

p.s. по-простому расчетно брать из кол-ва в заявке мне не вариант, т.к. скрипт подразумевает частичное исполнение заявки и снятие ее, потом расчет, и перевыставление на остаток, т.е. мне надо контролировать позицию к заявке по наличию в портфеле
Позиции по инструментам - валюта, Позиции по инструментам - валюта - не показывает
 
На валютном счете произвел покупку 3000$, в итоге в "позициях по инструментам" по валютному счете показывает 0, а в позициях по деньгам = 3000USD.
Не могу понять, что тогда означает окно "позиция по инструментам" применительно к валютному счету, если собственно валюта в нем не считается за инструмент?
OnStop, Не могу задать время на остановку скрипта из диалога управления
 
Такая функция (без всяких еще дописок в основном коде) должна мгновенно (за 1 мс) останавливать скрипт или нет?
function OnStop()
return 1
end
в примерах есть еще переменная stopped (которой присваивается true в этой функции) - зачем она?
p.s. я новичок - чур не обзывать тупым ))
KILL_ORDERS, KILL_ORDERS не отрабатывает
 
Такой простенький код:

function transaction_stock_kill ()
   message('transaction_stock_kill poshlo '..Num_Z [j])
   t_kill = tostring (os.time())
   transaction_kill = {
       CLASSCODE = ClassCodeSt,
       SECCODE = "GAZP",
       ACTION = 'KILL_ORDERS',
       ORDER_KEY = tostring (Num_Z [j]),
       TRANS_ID = t_kill
                                  }
  sendTransaction (transaction_kill)
  message('TRANS_ID '..transaction_kill.TRANS_ID)
end

Номер заявки совпадает с табличным в QUIKе (первое сообщение в коде). Транзакции на снятие заявки проходит - второе сообщение в конце с TRANS_ID выходит (т.е. транзакция прошла), а по факту снятие активной заявки не происходит, почему так? чего не хватает?  
OnTransReply для опционов, OnTransReply для опционов не вызывается
 
Напрочь отказывается вызываться функция OnTransReply для опционов. Один в один написан код для заявки на фьючерс и опцион, по факту обе заявки системой выставляются, по итогу  OnTransReply для фьючерса вызывается, а для опциона нет. Пробовал и вместе, и отдельно опцион запускать - ни фига.
p.s. подскажите, а есть на форуме поисковик по ключевым словам? может этот вопрос был в другим темах, но при отсутствии поисковика очень трудоемко все листать  
Сохранение результатов работы скрипта в файл
 
Не могу разобраться как сохранить результаты работы скрипта в файл.
Нагуглил про функцию SaveTable, но она не хочет работать (или я не понимаю как ее использовать).
Что-то типа
t_id = AllocTable()
--дальше формируем таблицу, в конце прошу скинуть в файл:
SaveTable(t_id, SaveResalt)
и в итоге:
attempt to call a nil value (global 'SaveTable')

p.s. таблица сама на экран выводится нормально, никаких ошибок не выдает
Как обойти attempt to index a nil value ?, Как обойти attempt to index a nil value при отсутствии реальных значений в таблице
 
При выполнении этого фрагмента скрипта:
nLKOH = getDepoEx ("NC...", "10...", "LKOH", "NL...", 0).currentbal
выдает ошибку "attempt to index a nil value"
Я понимаю, почему система возвращает ошибку - позиций по "LKOH" просто нет в "позициях по инструментам", но пусть выдаст тогда значение 0 и не останавливает скрипт.
Как это реализовать?  
Страницы: 1
Наверх