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

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

Страницы: 1 2 3 4 След.
Остановка и запуск Lua через Lua
 
Просто запустить один скрипт из другого средствами QLua нельзя.
Я делаю так:
1. Запустить оба скрипта обычным образом в Quikе.
2. Второй скрипт после инициализации должен уйти в "холостой" цикл в main-е, ожидая команды на собственно "старт" от первого скрипта.
3. Когда первый скрипт решает "запустить" второй, он выдает второму команду на "старт". Сделать это можно разными методами, например, через file mapping object, используя функции WinAPI.

Для получения прямого доступа из lua к функциям любой dll использую модуль alien.lua.
Возобновление работы скрипта после восстановления коннекта
 
Цитата
Анатолий написал:
скрипт останавливается - по той причине что в в этот момент не смог получить какие нибудь данные с сервера
Я написал свой скрипт так, что он практически ничего сам не запрашивает с сервера, а работает с той информацией, которую получает от колбэков. В этом случае для скрипта ситуации отсутствия связи и отсутствия сделок с интересующим инструментом неотличимы. Разумеется об обрыве связи скрипт меня информирует, но сбоев в работе скрипта никаких не происходит. При восстановлении связи сервер досылает всю пропущенную информацию в хронологическом порядке, либо дает команду клиентскому месту о перезапуске высылаемой информации (OnCleanUp). Соответственно, по OnCleanUp скрипт также перезапускается.
Да, в момент стартовой инициализации, в т.ч. по OnCleanUp скрипт смотрит, есть связь с сервером, прежде чем начать считывать необходимую информацию из интересующих таблиц Quikа. И только получив всю необходимую осмысленную стартовую информацию (что происходит вовсе не сразу после OnConnect или OnCleanUp) переходит в обычный рабочий режим.
Как считается расчет прибыли и убытка на фьючерсах?
 
Строго говоря, алгоритм вармаржи чуть-чуть другой:

Алгоритм расчёта вариационной маржи на Срочном рынке ОАО Московская биржа

[TABLE][TR][TD]
Формула расчета вариационной маржи для   фьючерсов и опционов котируемых в пунктах\долларах США:
[/TD][TD]
Формула расчета вариационной маржи для   фьючерсов и опционов котируемых в рублях:
[/TD][/TR][TR][TD]
ВМ = Round (РЦ2 * Round (W / R; 5); 2) – Round (РЦ1 *Round (W / R; 5); 2)

ВМ – вариационная маржа   по Контракту;

Round – функция   округления с указанной точностью по правилам математического округления;

РЦ2 – текущая   (последняя) Расчетная цена Контракта;

РЦ1 –   Расчетная цена Контракта, определенная   по итогам вечернего Расчетного периода предыдущего Торгового дня, или цена   заключения Контракта;

W – стоимость минимального   шага цены;

R   – минимальный шаг цены.

[/TD][TD]
ВМ = (РЦ2 – РЦ1) * W / R,

ВМ – вариационная маржа по Контракту

РЦ2 – текущая (последняя) Расчетная   цена Контракта;

РЦ1 – предыдущая (начальная)   Расчетная цена Контракта;

W – стоимость минимального шага цены;

R – минимальный шаг цены.

[/TD][/TR][/TABLE]

Для приведенных выше примеров по этим формулам получаются те же суммы маржи, т.к. курс кратен 0,0005 руб. В общем же случае, будут возникать ошибки в копейках на 1 контракт. Соответственно для 100 контрактов ошибки уже будут в рублях.

Что касается размера ГО, то он считается по весьма сложным формулам, даже близко не похожим на расчет, приведенный в Примере 1. Размер ГО зависит от индикативного курса $, от расчетной цены Si, от расчетной цены самого контракта RI, от расчетного значения индекса RTS, от количества дней, оставшихся до экспирации, и т.д. При этом размер ГО продавца от ГО покупателя может отличаться более чем 1% (разница уменьшается по мере приближения ко дню экспирации).

Как бороться с nil?
 
Вторую строчку можно записать короче:
Код
start6 = fh and fh.totalnet or 0
Как бороться с nil?
 
Код
fh = getFuturesHolding('SPBFUT000000','SPBFUT000pf','BRG9', 0)
if fh then start6 = fh.totalnet else start6 = 0 end
Ошибка при вызове ds:Close()
 
Уважаемые разработчики Quik!

Ответьте, пожалуйста, в каких случаях вызов функции ds:Close() для закрытия источника свечек в скрипте может вернуть false.
Ну и на вопрос в начале темы тоже хотелось бы что-нибудь от Вас услышать.
Ошибка при вызове ds:Close()
 
Quik 7.19.3.1
В процессе завершения работы (после получения OnStop) скрипт вызывает ds:Close() для всех открытых с помощью CreateDataSource в процессе своей работы источников данных свечек.
В руководстве Qlua сказано, что при успешном завершении вызова должно возвращаться true. Однако приходит false.
Может быть после прихода OnStop уже нет смысла беспокоится о закрытии ds, т.к. Quik уже сам все закрыл?
Поместить колбек в dll
 
OnQuote()
   runfast.OnQuote()
end
Каков порядок информирования скриптов и индикаторов о сделке с инструментом?
 
Еще вопрос:
3. Гарантирует ли Quik, что ни одна из вышеперечисленных функций обратного вызова не будет вызвана для следующей сделки, пока не будут отработаны все вызовы (для всех скриптов и индикаторов) для предыдущей сделки?
Каков порядок информирования скриптов и индикаторов о сделке с инструментом?
 
Допустим запущено несколько скриптов, установивших обработчики через SetUpdateCallback от CreateDataSource для одного и того же инструмента. Одновременно с этим в системе работают несколько пользовательских индикаторов для того же инструмента.
1. Существует ли определенный порядок вызовов функций обратного вызова скриптов и индикаторов при поступлении с сервера информации о совершенной на бирже с инструментом сделке, т.е., например, сначала вызываются все OnCalculate для пользовательских индикаторов и лишь за тем все Callback-и в скриптах (или наоборот), либо порядок вызовов Callback-ов и OnCalculate - произвольный?
2. Если определенный порядок существует, то каков он, и каково в нем место для OnAllTrade?
Можно ли одним скриптом луа запустить другой.?
 
Цитата
Andrei2016 написал:
Зачем вообще заморачиваться...
Заморачиваться с запуском одного скрипта из другого, наверное, действительно не стоит.
Вопрос был для решения другой задачи: как позволить скриптам обмениваться информацией. Хотя и здесь можно так решить: все скрипты свалить в одну кучу (в один скрипт), решающий в параллельных потоках различные задачи с разными инструментами. Либо пусть каждый из скриптов занимается одними и теми же вычислениями (общими для них), расходуя впустую ресурсы компьютера.

Но вот такую задачу, к сожалению, разработчики QUIK, похоже, сознательно не хотят позволить решать обычными средствами QLua: Нужно построить индикатор, учитывающий события, возможно, происходившие на меньшем таймфрейме, чем таймфрейм окна диаграммы, либо нужно построить индикатор на фиксированном таймфрейме, не зависящем от случайного изменения пользователем таймфрейма окна диаграммы.
Задача решалась бы элементарно, если бы для скрипта индикатора было бы доступно получение альтернативного источника данных через функцию CreateDataSource, пускай даже в усеченном варианте, т. е. без возможности установки SetUpdateCallback.
Единственный видимый мною выход - это запустить обычный скрипт, который закажет данные в необходимом таймфрейме через CreateDataSource и выложит их в "открытый доступ" для скриптов индикаторов.
Как это организовать? Один из вариантов - через MemoryMappedFile.
Можно ли одним скриптом луа запустить другой.?
 
Цитата
s_mike@rambler.ru написал:
Сигналом может быть все что угодно - мьютекс, memorymappedfile и так далее. В простейшем случае файл.

Подскажите, пожалуйста, как в Lua проще всего получить доступ к методам классов Mutex и MemoryMappedFile не создавая собственного внешнего кода на C (dll)?
Есть ли где-то уже готовые lua модули (библиотеки), предоставляющие интерфейс этих классов?
Годится ли для получения доступа к подобным классам библиотека "LuaInterface"? Или такое решение будет слишком медленно работать?
Как закрыть файл?
 
Таблица дескрипторов файлов (rn) у Вас - глобальная. Где-то вне функции rec_big_data Ваш скрипт, судя по всему, в нужный момент понимает, что нужно сменить номер триместра. Что Вам мешает в этот момент просто позакрывать все файлы, зная их дескрипторы из таблицы rn?
Пользователи Telegram-Bot! Как организовать работу через proxy?
 
Артем,
Разве OpenVPN Client позволяет направить только трафик, адресованный Telegram, на vpn сервер, а остальной - по дефолтному сетевому маршруту?
Пользователи Telegram-Bot! Как организовать работу через proxy?
 
Все бы хорошо, но у меня скрипт работает с обратной связью, т.е. он не только отсылает через бот информацию на телефон, но и анализирует, какие команды бот получает с моего телефона. А вот прочитать полученные ботом команды через браузер уже не получится :(
Или я туплю...
Пользователи Telegram-Bot! Как организовать работу через proxy?
 
icebird,
Я жадный :)) (шучу).
Все эти платные решения я вижу ("редирект" на зарубежных серверах, платный vpn с нужным функционалам (например, от TunnelBear) и т.п.)
Я ищу совета по надежным бесплатным решениям :) Ведь есть же для браузеров - friGate (перенаправляет на proxy трафик только при обращении к определенным адресам), так неужели нет аналогичного софта, только работающего не в рамках трафика браузера, а в рамках всего сетевого трафика?
Пользователи Telegram-Bot! Как организовать работу через proxy?
 
Я написал для себя telegram бот, который позволяет не только получать текущую информацию с биржи и о состоянии скрипта, но и менять "налету" настройки работы скрипта, т.е. имеет полноценную "обратную связь". При этом используется контекстная inline клавиатура. В вайбере я не нашел вообще bot- функционала, а во вконтакте позволяет управлять ботом (и подконтрольным ему приложением) только посредством текстовых команд. Причем готовой API-обертки для бота на Lua я так же не нашел.
Настроил бесплатный vpn, все прекрасно заработало. Но теперь и трафик самого quikа идет через vpn. А вот это нежелательно. Могут возникать задержки с передачей данных, да и вовсе vpn сервер может в любой момент отключиться, тогда накроется и скрипт, и работа quikа.

Поэтому теперь меня больше волнует вопрос:
Как в vpn направить только трафик бота  (*.telegram.org)?
Какое стороннее приложение посоветуете (или какого оператора vpn-сервиса, предоставляющего соответствующий функционал), которое позволяет настраивать перечень интернет адресов, трафик к которым нужно направить в vpn, а остальной трафик продолжать направлять по дефолтному сетевому маршруту?  
Странная типизация результата
 
Цитата
Andrei2016 написал:
x = (y-z)*param  
-- результат в x оказывается числом с плавающей точкой (double). Ошибка в расчетах!
Приведите, пожалуйста, конкретные значения y, z и param, которые дают x - double.
Где-то выше обсуждалось, что 1.9999.... <> 2, но это здесь ни при чем, т.к. в вашем "целочисленном" умножении невозможно получить x=2 (кроме как в 2*1, но здесь не бывает ошибки)

Кроме того,
Цитата
Andrei2016 написал:
пишу я, скажем, x = 3. Да, по факту оно хранится как double (допустим, как 3,000000000001)
НЕТ! По факту оно хранится как 01000000 00001000 00000000 00000000 00000000 00000000 00000000 00000000, т.е ровно 3, и никак иначе! Любые целые числа (в допустимом диапазоне) представляется в double с абсолютной точностью.

НО, учитывайте, что:
1. При сравнении двух double чисел последние 16 разрядов мантиссы игнорируются, что соответствует 12-13 значащим цифрам в десятичном представлении числа.
2. Перед сложением (вычитанием) двух double чисел их мантиссы выравниваются по экспоненте (порядку), в результате вы получаете ошибку в последнем разряде. У чисел ~2 и ~5 уже экспонента отличается на 1 разряд, т.е при их сложении (вычитании) теоретически может возникнуть ошибка в последнем разряде мантиссы. И ошибка ГАРАНТИРОВАННО возникает, если в мантиссе меньшего из складываемых чисел последние два разряда - не нулевые.
На самом деле, при сложении исходно целых чисел ошибка не возникает, а вот при вычитании ошибка ИНОГДА возникает: вы получаете результат на 1 разряд мантиссы меньше, чем должно быть.
Т.е., например, вместо 100 (01000000 01011001 00000000 00000000 00000000 00000000 00000000 00000000) Вы можете получить ближайшее меньшее в double арифметике число 99.999999999999985789145284798..... (01000000 01011000 11111111 11111111 11111111 11111111 11111111 11111111). Это все еще 100 с "запасом" в 15 разрядов.
При умножении все то же самое. Сделайте подряд более 16 действий с "целыми" double числами и ошибка может накопиться до 16 разряда мантиссы. Результат: вы получаете "нецелое" число в результате.
Пользователи Telegram-Bot! Как организовать работу через proxy?
 
vgi,
Чем посоветуете пользоваться, чтобы на vpn направлять только трафик бота (*.telegram.org) и при этом не заниматься прописыванием вручную маршрутов при каждой смене ip vpn сервера.

Другими словами, есть ли аналог friGate для такого случая? (TunnelBear предоставляет такой функционал только в платной версии)
Пользователи Telegram-Bot! Как организовать работу через proxy?
 
Пользователи Telegram-Bot!

Поделитесь соображениями, как обойти предстоящую блокировку.

Использую lua-telegram-bot API от @cosmonawt.
Но он, в свою очередь, опирается на "LuaSec 0.6 - Copyright © 2009-2016 PUC-Rio" (для поддержки https SSL), который, похоже, не поддерживает работу через proxy. Либо я не понимаю, как прописать настройки для работы через proxy.

Подскажите, как в новых условиях поддерживать работу Telegram-Bot?
Кто как решил вопрос уведомления о сделках?
 
Пользователи Telegram-Bot!

Поделитесь соображениями, как обойти предстоящую блокировку.

Использую lua-telegram-bot API от @cosmonawt.
Но он, в свою очередь, опирается на "LuaSec 0.6 - Copyright © 2009-2016 PUC-Rio" (для поддержки https SSL), который, похоже, не поддерживает работу через proxy. Либо я не понимаю, как прописать настройки для работы через proxy.

Подскажите, как в новых условиях поддерживать работу Telegram-Bot?
какт просто определить число строк вLUA
 
Цитата
s_mike@rambler.ru написал:
Навскидку:

f,i=io.open(file,"r"),0
for _ in string.gmatch(f:read("*a")) do i=i+1
end
f:close()
Можно и так (особенно, если файл слишком большой для единовременного считывания):
Код
for _ in f:lines() do i=i+1 end
или вовсе одной строкой, если стандартный поток ввода (stdin) не задействован Вашим скриптом для других текущих операций:
Код
for _ in io.lines(filename) do i=i+1 end -- Файл сам откроется и сам, по окончании цикла, закроется
Неверная дата и время, Стандартные функции Lua возвращают неверное время сервера
 
Смещение локального часового пояса относительно Гринвича в виде таблицы:
os.date("*t", 0)
(по часам компьютера с учетом региональных настроек операционки, корректно работает для всех случаев, в т.ч. особые часовые пояса, в которых нет перевода на летнее/зимнее время и в тех, где смещение не в целых часах; может Вы из Тегерана торгуете :shock: )
Обращение к DataSource в main-потоке
 
Цитата
_sk_ написал:
Вопрос в том, как добиться стабильности внутреннего состояния в main-потоке?
Обработайте в цикле свечки до size-1, а, затем, оставшиеся 1 или 2 (если в процессе обработки в цикле успела закрыться текущая для начала цикла свечка)
Как разделить строку на отдельные числа?, Исторические данные
 
Конструкция типа:
Код
string.gsub(s, "(%d+%.*%d*)", function (n) table.insert(t, tonumber(n)) end)
отловит в строке s все числа, в т.ч. содержащие десятичную точку и поместит их в таблицу t в виде чисел. Если нужно отлавливать еще и отрицательные числа, то в начале строки шаблона нужно добавить "[+-]?"

Аналог функции split в lua:
Код
delimiter = ","
string.gsub(s .. delimiter , "(.-)%" .. delimiter, function (w) table.insert(t, w) end)
Пришел OnTransReply с пустым brokerref
 
Цитата
Sergey Gorokhov написал:
Алексей  ,
Сообщите версию терминала QUIK на котором повторяется проблема.
Были ли какие-то особенные события которые происходили 22го числа?
Возможно что 22го была более старая версия терминала чем сейчас?
1. Quik 7.14.1.7. Стоит давно, обновлений не было.
2. Брокер Сбербанк. UID 60172. Пример конкретной заявки: 22.02.2018 в 11:59:56 на FORTS заявка 29545190638
3. Проблема наблюдалась на всех транзакциях только 22.02.2018 г. Ни ранее, ни позднее не наблюдалась.
4. Особенные события: на следующий торговый день 26.02.2018 г. у Сбербанка с момента открытия торгов более чем на 2 часа рухнули все серверы для клиентов с SMS авторизацией. Может быть после этого все наладилось?
Комментарий при выставлении заявки - проблемы с обработкой в OnTransReply, Комментарий отображается в таблице Quik, но не считывается в OnTransReply
 
Та же проблема:
Пришел OnTransReply с пустым brokerref
Пришел OnTransReply с пустым brokerref
 
Цитата
Egor Zaytsev написал:
Цитата
Алексей   написал:
Цитата
Egor Zaytsev   написал:
Проблема с brokerref возникает периодически или при каждой отправки транзакции?
Сообщите версию QUIK и если есть возможность выложите свой скрипт.
Единичный случай. Поэтому указал номер заявки.
Quik 7.14.1.7
С этим вопросом необходимо разбираться.
Можно попробовать решить через брокера. Обратитесь к нему, пожалуйста.
От Вас же потребуется номер заявки/архив рабочего места QUIK без ключей доступа/полный скрипт/
Дату выставления транзакции.
Цитата
Алексей написал: (самое первое сообщение)
Сегодня 22.02.2018 в 11:59:56 на FORTS lua-скриптом была выставлена заявка 29545190638 с заполненным полем CLIENT_CODE.
Брокер - Сбербанк.
Что же касается:
Цитата
От Вас же потребуется номер заявки/архив рабочего места QUIK без ключей доступа/полный скрипт/
то судя по Комментарий при выставлении заявки - проблемы с обработкой в OnTransReply проблема не только у меня и, значит, не связана со скриптом.
Еще раз обращу внимание: brokerref  пропал только в OnTransReply. В OnOrder и OnTrade он был корректно заполнен. Это было видно и в логах скрипта и визуально в соответствующих таблицах Quik (например, в "Таблица транзакций" для OnTransReply).
Впрочем, проблема наблюдалась только 22.02.2018 г. Сейчас OnTransReply приходит с корректным brokerref.
Пришел OnTransReply с пустым brokerref
 
Цитата
Egor Zaytsev написал:
Проблема с brokerref возникает периодически или при каждой отправки транзакции?
Сообщите версию QUIK и если есть возможность выложите свой скрипт.
Единичный случай. Поэтому указал номер заявки.
Quik 7.14.1.7
OnTrade, OnOrder
 
И еще, по поводу многократных OnTrade, OnOrder и т.п.
Повторюсь, сам колбек OnTrade - это не событие заключения сделки, а "приезд" с сервера брокера той или иной информации о заключенной сделке. Информация о сделке может "приехать" сразу вся в полном объеме (тогда будет один OnTrade со всеми заполненными полями), а может "приезжать" по частям (тогда будет несколько OnTrade со все большим количеством заполненных полей).
OnTrade, OnOrder
 
Строго говоря, практически любой колбэк в Quikе - это событие вывода информации в соответствующей таблице (даже, если она не выведена сейчас на экран) по факту прихода соответствующей информации с сервера брокера. При этом в колбэк передается ссылка на копию строки таблицы, которая была выведена (и не обязательно при этом, что в ней что-то изменилось).
Цитата
Андрей написал:
1) Считаются и операции совершенные вручную тоже ?
Да. (Они ведь отображаются в вашей таблице сделок (заявок))
Цитата
Андрей написал:
2) Вызываются ли эти коллбеки во время клиринга ?
В принципе, да. Но в очень специфических случаях, например, когда во время клиринга происходит перевыставление долгосрочных заявок.
Правда, сделки собственно во время клиринга не заключаются, поэтому OnTrade не придет со временем datetime внутри клиринга.
Но если у Вас в конце торговой сессии были кратковременные перебои с интернетом, не приведшие к обрыву связи с сервером брокера, то информация о заключенной сделке может попасть на Ваше клиентское место уже во время клиринга (после восстановления связи), при этом в OnTrade Вы получите поле datetime реального времени совершения сделки. т.е. в пределах времени торговой сессии.
Пришел OnTransReply с пустым brokerref
 
Сегодня 22.02.2018 в 11:59:56 на FORTS lua-скриптом была выставлена заявка 29545190638 с заполненным полем CLIENT_CODE.
В ответ пришел OnTransReply с пустым полем brokerref = "".
Последующие OnOrder и OnTrade содержали правильно заполненное поле brokerref.
Проблема в том, что мой скрипт фильтрует поток по brokerref. В итоге его модуль обработки содержимого OnTransReply, OnOrder и OnTrade не получил OnTransReply.

Не заполненное поле brokerref в OnTransReply - это единичный баг сервера брокера или допустимое событие в протоколе обмена сервера с клиентским местом?
Как вывести график для SPBUSR?
 
К сожалению, ничего не получается.

Видимо, терминал Quik сам не формирует историю параметров?
Получается, чтобы вывести график изменения какого-либо параметра, сервер Quik (т.е. брокер) должен вести трансляцию не только текущих значений параметра, но и в отдельном потоке трансляцию свечей параметра?
Вы новых версиях Квика INIT в индикаторах появляется только один раз
 
Цитата
Eldar написал:
если не инициализируется скрипт индикатора, зачем пересчитывать все свечи?!
Некоторые индикаторы рассчитываются по разному для разных ТФ. О том, что он сменился из-за действий пользователя, скрипт индикатора может узнать, получив свечу 1.
Как вывести график для SPBUSR?
 
Подключен к Сбербанку без доступа к валютному рынку.
Однако Брокер транслирует в классе FORTS: Кросс-курсы инструмент SPBUSR (я так понимаю, что это индикативный курс Мосбиржи, рассчитываемый по USDRUB_TOM).
Для этого инструмента не транслируется параметр Price (Цена), но есть параметр Курс.
Можно ли как-то вывести график изменения этого параметра?
Некорректно отрисовывается вертикальный sсrollbar в окне диаграммы
 
Сценарий, воспроизводящий ошибку:
1. Растянуть вертикальную ось диаграммы до появления вертикального scrollbara.
2. Развернуть окно диаграммы на весь экран
3. Восстановить размер окна диаграммы (свернуть в окно).
В результате scrollbar не отрисовывается, на его месте остается неперерисованный кусок, заполненный участком изображения, оставшегося от развернутого окна.
Scrollbar восстанавливается после наведения на него мышкой (либо после любого другого события, приводящего к получению контролом win сообщения).
quik 7.14.1.7
win vista
Очистка таблиц Quikа по OnCleanUp может вырубить скрипт. Как уберечься?
 
Цитата
Sergey Gorokhov написал:
Алексей  ,
На приведенном Вами коде, проблема не воспроизводится.
Естественно! Вероятность воспроизведения проблемы менее 0.1%. Я же указал, что ошибка за почти год эксплуатации скрипта возникла всего дважды.
Чтобы она возникла необходимо, чтобы OnTransReply пришел после OnInit, но до исполнения в main() TEname = "abc" (скрипт вырубается), или вообще до старта потока main (скрипт не вырубается).

Но сегодня я получил новое интересное событие: пришел OnCleanUp два раза подряд (подряд в том смысле, что между ними ни одного другого колбека). Мой скрипт действительно некорректно обрабатывает такой сценарий (исправлю) и в результате одна из функций, вызываемых из обработчика OnFuturesLimitChange входит в бесконечный рекурсивный вызов самой себя. В результате имеем:



Ошибка горит, а скрипт спокойно занят своими делами и успешно торгует.
Очистка таблиц Quikа по OnCleanUp может вырубить скрипт. Как уберечься?
 
Цитата
Sergey Gorokhov написал:
Алексей  ,
Вы сказали что ошибка проявилась после того как была исправлена проблема с TEname. А в приведенном коде она не исправлена.
Цитата
Алексей написал (в #21):
За все время работы моего скрипта (до исправления) ошибка было поймана лишь дважды, один раз скрипт вырубило, а второй случай - мы обсуждаем.
Я, видимо, ранее по ходу переписки недостаточно сакцентировал внимание на описании ситуации с возникновением второго варианта ошибки (когда ошибка высветилась, но скрипт продолжал работать). Эта, как и первая ошибка (просто вырубающая скрипт) была "поймана" на еще не исправленном скрипте. Т.е. обе ошибки были пойманы на скрипте, схема которого показана в #21 посте.
Очистка таблиц Quikа по OnCleanUp может вырубить скрипт. Как уберечься?
 
Цитата
Sergey Gorokhov написал:
Однако ранее у нас были обращения от клиентов с тем что сообщение оставалось и это чинилось.
Quik 7.14.1.7 - уже исправлено?

Скрипт, который, по идее, может воспроизвести такую ошибку может выглядеть как-то так:
Код
function OnInit()
  main_run = true
end

function main()
  TEname = "abc"
  while main_run do
    sleep(100)
  end
end

function OnTransReply(tab)
  if tab.brokerref and tab.brokerref:find(TEname) then
    message("Пришел мой OnTransReply")
  end
end

function OnStop()
  main_run = false
end
Скрипт должен быть запущен уже после соединения с сервером. С брокером должен идти обмен служебными транзакциями (в моей ситуации), или должен параллельно работать другой скрипт, отсылающий транзакции.
И нужно "подгадать" запуск скрипта так, чтобы пришел OnTransReply до старта main.
За все время работы моего скрипта (до исправления) ошибка было поймана лишь дважды, один раз скрипт вырубило, а второй случай - мы обсуждаем.
Очистка таблиц Quikа по OnCleanUp может вырубить скрипт. Как уберечься?
 
Цитата
Sergey Gorokhov написал:
Цитата
Алексей написал:
Вообще-то, по моему, после перезапуска скрипта содержание ошибки от прошлого сеанса его работы должно стираться из окна "Доступные скрипты" раздел "Ошибки выполнения скрипта". Разве не так?
А Вы проверили, действительно ли сообщение от предыдущего запуска?
Или это сообщение появилось после?
Кажется, я все никак не могу донести до Вас мысль, что сообщение горело в окне "Доступные скрипты" ВО ВРЕМЯ работы скрипта (зеленый треугольничек горит у наименования скрипта, скрипт явно функционирует, а внизу, в "Ошибки выполнения скрипта" - сообщение об ошибке.) Как во время работы скрипта в "Ошибки выполнения скрипта" может оставаться запись от предыдущего запуска скрипта?
По-моему - никак. Значит ошибка возникла после последнего старта скрипта, но не прервала его работу.
Очистка таблиц Quikа по OnCleanUp может вырубить скрипт. Как уберечься?
 
По поводу самой ошибки.
Цитата
Sergey Gorokhov написал:
вообще, использовать заранее не инициализированные переменные является плохим тоном.
даже в документации об этом сказано (см описание OnInit)
Полностью с Вами согласен, исправлюсь. И по моему, мы с Вами уже давно пришли в выводу, что ошибка возникала из-за того, что обработчик OnTransReply в редких случаях вызывался раньше, чем была инициализирована TEname. Теперь это делается в OnInit и об ошибке можно забыть. Спасибо.

Продолжил же я переписку, чтобы обратить внимание на то, что в документации к QLua я не нашел деталей реализации работы lua скрипта под Quikом, точнее вообще её неправильно понял. А именно:
Цитата
Sergey Gorokhov написал:
Какими правилами, Вы вообще о чем? Колбеки выполняются по событию.
Событие произошло до main вот и колбек сработал до main.
В чем вопрос, не понятно.
И я о том, что правил нет. Реализовать работу lua скрипта под Quikом можно было не менее, чем тремя способами:

Первый способ: сначала интерпретатор в основном потоке Quik проходит <Body>, получая адреса OnInit, main и обработчиков событий, затем вызывает OnInit(), затем, организует выделенный поток, запускает в нем main() и только потом настраивает вызовы описанных в скрипте обработчиков событий; (я изначально решил исходя из стр.6, что реализация такова; о стр. 6 - ниже)

Второй способ: сначала интерпретатор в основном потоке Quik проходит <Body>, получая адреса OnInit, main, и обработчиков событий, затем вызывает OnInit(), затем настраивает вызовы описанных в скрипте обработчиков событий, и только потом организует выделенный поток и запускает в нем main(); (теперь, по результатам переписки с Вами, полагаю, что в Quik реализована именно такая схема)

Третий способ: сначала интерпретатор в основном потоке Quik проходит <Body>, получая адреса main, и обработчиков событий (в т.ч. OnInit), затем настраивает вызовы описанных в скрипте обработчиков событий (в т.ч. OnInit), генерирует событие для вызова обработчика OnInit, и только потом организует выделенный поток и запускает в нем main(). То же возможный вариант для реализации, хотя в нем, очевидно, может случится так, что обработка прочих событий может начаться до OnInit().

И в документации к QLua я не увидел на этот счет четкой конкретики. Собственно поэтому и продолжил переписку.

Цитата
Sergey Gorokhov написал:
Цитата
Алексей написал:
И глядя на стр. 6 "Использование Lua в Рабочем месте QUIK.pdf"
На стр 6, данного документа рассказано как запустить скрипт Lua.
...
Что не так?
Вы, по ошибке, заглянули в "Интерпретатор языка Lua.pdf", а я ссылался на стр. 6 "Использование Lua в Рабочем месте QUIK.pdf". Приведенная там схема и натолкнула меня на мысль, что в Quik реализован первый способ работы lua скрипта.

Цитата
Sergey Gorokhov написал:
А может все проще и сообщение осталось от предыдущего запуска, до исправления ошибки?
Вообще-то, по моему, после перезапуска скрипта содержание ошибки от прошлого сеанса его работы должно стираться из окна "Доступные скрипты" раздел "Ошибки выполнения скрипта". Разве не так?

И столкнувшись с этим в работе моего скрипта (в версии с еще не исправленной ошибкой), я сделал предположение №2:
Цитата
Sergey Gorokhov написал:
где из всего поста предположение №2? а то Вы их не нумеруете.
Предположение №2 из #10-го поста:
2. Ошибки интерпретатора, возникающие между окончанием OnInit, но до старта main, не вырубают скрипт.

Теперь уже, после столь детального обсуждения следует, наверное, уточнить:
2. Ошибки интерпретатора, возникающие между окончанием OnInit, но до организации выделенного для main потока, не вырубают скрипт.
Как открыть файл на запись в кодировке DOS (866)
 
Цитата
Sergey Denegin написал:
Здравствуйте.
Возникла такая задача - хочу дописывать информацию в файлы Descript.ion (которые использует FAR manager для комментариев к файлам).
Столкнулся с загвоздкой, что FAR эти файлы делает в DOS кодировке. А lua пишет в файлы в кодировки Windows
Может кто-то подскажет, есть ли в lua возможность открыть файл на запись (да и чтение тоже) в кодировке DOS?
Или на крайний случай функцию, которая конвертирует текст в нужную кодировку. Т.е. чтобы я писал в файл Descript.ion текст под кодировкой Windows, а FAR ее видел нормально
Штатных средств перекодировки ни в Lua, ни в QLua - нет.
Вы должны сами перекодировать строку из win1251 кодировки (она же ANSI-RUS в терминах WinAPI), установленной по умолчанию для Quik Lua, в Dos 866 (она же OEM-RUS в терминах WinAPI), перед тем, как ее записывать в файл.
Сделать это можно разными способами.
1. Если для Вас не проблема вызвать dll функцию из Lua, то проще всего воспользоваться штатными средствами Windows: CharToOemA или CharToOemBuffA из user32.dll (при условии, что у Вас русскоязычная версия Windows).
2. Написать самим элементарный перекодировщик. Коды букв русского алфавита для Win1251: А-Я  0xC0 - 0xDF, а-я 0xE0 - 0xFF, Ё 0xA8, ё 0xB8; для Dos866: А-Я  0x80 - 0x9F, а-п 0xA0 - 0xAF, р-я 0xE0 - 0xEF, Ё 0xF0, ё 0xF1.
Очистка таблиц Quikа по OnCleanUp может вырубить скрипт. Как уберечься?
 
Цитата
Sergey Gorokhov написал:
Цитата
Алексей   написал:
1. Колбеки начинают вызываться после окончания OnInit, но могут выполняться до старта потока main.
Колбеки могут начать выполняться до старта main и в этом нет ничего удивительного.
main выполняется после OnInit, остальные колбеки никакого значения не имеют.

В этом действительно нет ничего удивительного.
Только вопрос о том, могут или нет колбеки начать выполняться до main, возник потому, что это определяется не какими-то вселенскими правилами реализации многопоточности, а конкретным решением разработчика конкретного программного продукта. Вариант, при котором до страта main не могут вызываться колбеки, тоже имеет право на существование и свою логику для реализации. И глядя на стр. 6 "Использование Lua в Рабочем месте QUIK.pdf" я, по простоте душевной, решил что разработчики Quik руководствовались логикой из второго варианта. И обнаружив обратное, был несколько озадачен.

Цитата
Sergey Gorokhov написал:
Цитата
Алексей   написал:
2. Ошибки интерпретатора, возникающие между окончанием OnInit, но до старта main, не вырубают скрипт.
Так не должно быть.
Если требуется анализ, приведите полный код скрипта на котором возникает проблема и сообщите версию терминала QUIK

Однако и к моему удивлению так случилось!
Весь код - более 8 тысяч строк, заставлять Вас его изучать в поисках ошибок мне совесть не позволяет :)
Код же, исполнение которого вызывает ошибку, приведен в посте #3.

Ошибка, напомню, возникает в обработчике OnTransReply, когда происходит обращение к еще не инициализированной TEname, как к строке.
Переменной TEname присваивается строковое значение в самом начале main. (Теперь то я перенес это в OnInit, но на исходное решение были свои соображения).
Однако я столкнулся с необъяснимой ситуацией: в "Ошибки выполнения скрипта" светилось: "bad argument #1 to 'find' (string expected, got nil)", а скрипт прекрасно продолжал свою кипучую деятельность.
Я себе не представляю ситуации, чтобы скрипт при такой ошибке в потоке терминала не был принудительно завершен Quikом, если поток main уже запущен.
Из этого я и сделал предположение №2.
Очистка таблиц Quikа по OnCleanUp может вырубить скрипт. Как уберечься?
 
Цитата
Sergey Gorokhov написал:
Цитата
Алексей   написал:
1. Колбеки начинают вызываться после окончания OnInit, но могут выполняться до старта потока main.
Колбеки могут начать выполняться до старта main и в этом нет ничего удивительного.
main выполняется после OnInit, остальные колбеки никакого значения не имеют.
Какой вариант экономнее?
 
Если же действительно хотите освоить Lua, наберите в любом поисковике "Lua Performance Tips"
Какой вариант экономнее?
 
Компьютеру особо тяжело не будет. Заметной разницы в производительности современного компьютера Вы не заметите.
Но просто с точки зрения элементарной оптимизации кода для любого языка программирования (только если не пишете программу для Commodore 64 :) второй вариант лучше.
Причем лучше, даже если бы для получения num_candles не нужно было бы вызывать какую-либо функцию, а, допустим, требовалось бы всего лишь обращение к какому-то элементу таблицы (num_candles =memsize[Бумага]).

Кроме того, следует помнить, что результат вызова :Size() может в любой момент поменяться (придет новая свечка), что вообще "сломает" первый алгоритм.

P.S. и не забудьте num_candles объявить локальной переменной.
работа с фьючерсами
 
Цитата
алексей ратов написал:
Алексей за пример спасибо, если я правильно все понял валютные фьючерсы можно торговать среднесрочно, прибыль идет в пунктах шага цены. При выходе из позиции доход просто может уменьшиться из-за укрепления рубля.
При проходе Вашей позиции в валютном инструменте через каждый основной (вечерний) клиринг фиксируется Ваш текущий доход/убыток в рублях, как если бы Вы закрывали позицию по цене вечернего клиринга (цена последней сделки на бирже в дневной сессии (18:45)) и затем вновь открывали бы ее по той же цене в начале вечерней сессии (19:00).
Пример (все цифры - условные, контракт BR):
1. вход 19.12.2017 22:12  в длинную позицию по цене 62,50$
2. вечерний клиринг 20.12.2017 18:45 цена 63,15$, индикативный курс 57,5 руб./$
3. выход 20.12.2017 23:28 по цене 62,50$
4. вечерний клиринг 21.12.2017 18:45 индикативный курс 58,0 руб./$

первый расчет прибыли/убытков на 20.12.2017 18:45 : (63,15$(цена клиринга - она же условная цена выхода) - 62,5$(цена входа)) * 10 * 57,5 = 373,75 руб.
второй расчет прибыли/убытков на 21.12.2017 18:45 : (62,5$(цена выхода) - 63,15$(цена клиринга - она же условная цена входа для следующего торгового дня)) * 10 * 58,0 = -377,00 руб.
Итоговый результат: 0 шагов цены, но 3,25 руб. убытка.

Также следует иметь в виду, что в 14:00 биржа еще производит промежуточный (дневной) клиринг, по индикативному курсу, зафиксированному в 13:55. Этот клиринг не влияет на Ваш конечный финансовый результат в рублях. Но если в результате него окажется, что средств на Вашем счете недостаточно для покрытия обязательного гарантийного обеспечения открытых позиций, то брокер может их принудительно закрыть. Такая ситуация может возникнуть, если Вы играете с максимально возможным плечом.

P.S. В примере я опустил пересчет прибыли через шаг цены, т.к. инструмент котируется в $. Для инструментов, котирующихся в условных единицах с шагом цены, привязанном к $ (например, фьючерс на индекс RTS), расчет удобнее вести через шаг цены, как я это продемонстрировал в предыдущем посте.
Size()
 
Цитата
Николай Камынин написал:
Вы не дали определение свечки.
Вы правы. Такой вывод действительно напрашивается из моего поста. А все из-за того, что я сам не недостаточно четко изложил свои мысли.
На самом деле, я хотел написать:

"Как мне кажется, большая часть пользователей, только начинающих изучать QLua, читая в документации "индекс свечки", изначально для всех типов скриптов воспринимают это понятие в том смысле, как это определено для CreateDataSource. И лишь потратив впустую много времени и сил, осознают, что такое понимание "индекса" не имеет ничего общего с нумерацией интервалов времени на диаграмме графика для скрипта индикатора."

А описание понятия "свечки", как и других рыночных терминов, думаю, действительно не должно входить в Руководство пользователя интерпретатора QLua.

Цитата
Николай Камынин написал:
Поэтому оставьте все как есть.
Ну как же можно оставить как есть?

Ведь s_mike@rambler.ru  совершенно справедливо открыл эту ветку, обращая внимание разработчиков на то, что в документации QLua в разделе о скрипте индикатора написан полный бред:
Цитата
• Функция  Size  возвращает текущее количество свечек в источнике данных.
Если есть желание сохранить здесь слово "свечка", то надо написать хотя бы так:
"Функция  Size  возвращает текущее количество свечек, отображаемых в окне диаграммы графика."

Документация как-то должна дать понять читателю, что первая/последняя свечка, отображаемая в окне диаграммы графика, вовсе не обязательно является первой/последней (из существующих) свечкой источника данных; что первая существующая свечка источника данных вовсе не обязательно под индексом 1; что последняя существующая свечка источника данных вовсе не обязательно под индексом Size.

Почитайте также подряд идущие "3.10.3 getCandlesByIndex" и "3.10.4 CreateDataSource"! Как в их описании можно использовать один и тот же термин "индекс свечки" не пояснив, что речь идет о НЕ ИМЕЮЩИХ НИЧЕГО ОБЩЕГО ИНДЕКСАХ. Почитайте форум. Подавляющее большинство читателей решают, что речь идет об одном и том же, просто сдвинутом на 1!
Size()
 
Код
7.2 Функции и глобальные переменные скрипта
индикатора
...
7.2.2 OnCalculate
...
Формат вызова:
NUMBER v1 [, NUMBER vn] OnCalculate(NUMBER index)
Параметры:
• index – индекс свечки в источнике данных. Начинается с «1».
Если значение vi не определено, то функция возвращает nil в качестве значения линии на интервале index.
...
7.2.4 Функции для доступа к источнику данных
• Функции для доступа к источнику данных O, H, L, C, V, T принимают в качестве параметра
индекс свечи и возвращают соответствующее значение в формате:
NUMBER <название функции>(NUMBER index)
• Функция Size возвращает текущее количество свечек в источнике данных. Формат функции:
NUMBER Size()
Уважаемые разработчики QUIK!
Как мне кажется, большая часть пользователей, только начинающих изучать QLua, читая в документации слово "свечка", изначально для всех типов скриптов воспринимают это понятие в том смысле, как это определено для CreateDataSource. И лишь потратив впустую много времени и сил, осознают, что такое понимание "свечки" не имеет ничего общего с интервалами времени на диаграмме графика для скрипта индикатора.

Я уже неоднократно предлагал Вам не вводить пользователей в заблуждение в отношении index в OnCalculate и функции Size для скрипта индикатора, а четко указать в документации:

1. "7.2.2 OnCalculate
...
• index – номер интервала на шкале времени в окне диаграммы графика, для которого необходимо вычислить значение индикатора. Начинается с «1».
Если значение vi не определено, то функция должна вернуть nil в качестве значения линии на интервале index.
...
При перезапуске расчета индикатора Quik вызывает OnCalculate с index = 1 вне зависимости от того, определены или нет данные для инструмента для первого интервала диаграммы графика.
Можно описать ситуации, когда Quik "перезапускает" расчет индикатора.

2. "7.2.4 Функции для доступа к источнику данных
• Функции для доступа к источнику данных O, H, L, C, V, T принимают в качестве параметра индекс интервала на шкале времени в окне диаграммы графика и возвращают соответствующее для времени интервала значение инструмента, если оно определено, в формате:
NUMBER <название функции>(NUMBER index).
Определить имеются ли данные инструмента для указанного интервала можно вызвав функцию CandleExist. Если данные инструмента для указанного интервала отсутствуют, то функции O, H, L, C, V
возвращают «nil», а функция T – время указанного интервала.

• Функция Size возвращает количество интервалов на шкале времени, используемых для отображения в окне диаграммы графика, с учетом пустых интервалов."

"Интервал на шкале времени диаграммы графика" можно "обозвать" как-то по-другому, например, "временной интервал диаграммы графика" или как-то еще. Но надо четко развести понятия номер свечки инструмента и номер интервала.
Cteatedatasource
 
По OnCleanUp и OnConnected, я не перезапускаю CreateDataSource. За неполный год работы скрипта еще ни разу проблем не возникало. Если скрипт уже был успешно подключен к трансляции через CreateDataSource, то после указанных событий трансляция (вызов пользовательского колбека) сама прекрасно рестартовала с первого индекса.
Страницы: 1 2 3 4 След.
Наверх