nikolz написал: закройте квик, удалите из папки archive файлы этого инструмента и снова запустите квикили сделайте перезаказ данных, предварительно сохранив архив на всякий случай
nikolz, нет смысла перезаказывать данные, которые не желательны для отображения на графике. В этом конкретном случае, мне нужно сделать доступным для просмотра на графике данные только текущей сессии и убрать исторические данные, тк в них нет периода с 2018 г по настоящую дату и они в таком виде бесполезны.
Кстати, в этой теме мы обсуждаем проблему, относящуюся к дополнительному счету, а в 2018 году его у меня не было. Значит и исторических данных за 2018 для этого "нового" счета накоплено быть не могло.
Цитата
Daniil Pozdnyakov написал: https://forum.quik.ru/messages/forum1/message62752/topic7015/#message62752 Локальное накопление архивов графиков возможно только при наличии на серверной части брокера модулей ведения архивов. Ранее мы с Вами выяснили, что у Вашего брокера соответствующих модулей нет, поэтому у Вас не накапливается информация локально. К сожалению, каких-либо альтернативных решений предложить не можем.Приносим извинения за предоставленные неудобства, а также дезинформацию ранее.
Сервер брокера дает историю максимум 3000 свечей. Если взять 1 часовые свечи, то 3000 свечей - это история не более 2 лет т е не ранее 2020 года. ----------------------- . Если вас интересует лишь текущая сессия, то Вы очевидно берете еще меньший интервал, т е ну никак история с 2018 года на сервере не хранится и к вам не придет. ----------------------------------- А вот в архиве в квике у вас вполне может быть любое говно. Перезаказ или полное удаление позволяет это выявить. Вы бы сделали как вам советую, и потом показали результат, а не разглагольствовали. Проблема то у вас а не у меня, мне Ваши рассуждения не интересны. .
Net error "Удалённый хост принудительно разорвал существующее подключение", Такая ошибка ,как правило, возникает ближе к концу торгов.Подключиться после этой ошибки невозможно в этот день. На пк установлено ещё 2 квика,они при этом работают нормально. Подключение через USB-модем
Глеб написал: Здравствуйте, столкнулся с проблемой "Net error: Удаленный хост принудительно разорвал существующее подключение." Не знаю в чем дело, до этого квик прекрасно работал, так продолжается уже на протяжении недели, с телефона заходит на тот же аккаунт без каких либо проблем. Интернет у меня кабельный, стабильный, минимум 5 м/б. Прошу вас помочь мне с этой проблемой, заходил сегодня, буквально сейчас. Интересно то, что сначала он заходит, но после некоторой загрузки он выдает эту ошибку.
если есть роутер, то сделайте рестарт. Потом проверьте скорость интернет потом сделайте пинг до сервера.
Net error "Удалённый хост принудительно разорвал существующее подключение", Такая ошибка ,как правило, возникает ближе к концу торгов.Подключиться после этой ошибки невозможно в этот день. На пк установлено ещё 2 квика,они при этом работают нормально. Подключение через USB-модем
Mikhail Ran написал: Здравствуйте! Использую Квик 8.13.3.1, торгую RI. Заметил, что в таблице Текущие торги % изменения цены рассчитан не от цены окончания вечерней сессии предыдущего дня, а от цены окончания дневной сессии предыдущего дня. Почему так?
На фьючерсах нет окончание вечерней сессии. Начало вечерней сессии у фьючерсов это начало сессии следующего дня.
NoneB написал: В одном из графиков имелось неудобство - перед "текущей сесией, сегодня" (изображение 12) по воле брокера отображался график за 2018 год (изображение 11), а период 2018-13.09.2022 вообще не отображался. Чтобы отодвинуть часть графика от 2018 года влево, активировал фильтр "Показывать пустые интервалы" (изображение 13) и расход RAM вырос почти на 3Гб.
закройте квик, удалите из папки archive файлы этого инструмента и снова запустите квик или сделайте перезаказ данных, предварительно сохранив архив на всякий случай
Даниил Волошин написал: В случае, если проблема воспроизведётся вновь, просим Вас создать архив именно в момент, когда дата торговой сессии отличается от фактической, но при этом свечки на графике уже с датой текущего дня, далее прислать его на нашу почту.
Подскажите, описываемая Вами проблема проявляется в версии терминала 9.4.2.1? У себя проблему на различных версиях рабочего места QUIK (в том числе на 9.4.2.1) воспроизвести нам не удалось.
Для анализа описываемого поведения просим Вас прислать копию Вашего Рабочего места QUIK.
Инструкция по созданию архива Рабочего места QUIK: 1) воспроизведите проблему, закройте Рабочее место QUIK; 2) убедитесь, что QUIK исчез из списка процессов в диспетчере задач Windows; 3) сделайте копию папки с Рабочим местом QUIK; 4) удалите из копии папки с QUIK файлы ключей *.txk, если они там присутствуют; 5) сделайте архив копии папки с Рабочим местом QUIK, загрузите его на любой удобный Вам файлообменный сервис и пришлите ссылку на файл на нашу почту quiksupport@arqatech.com .
добрый день, В начале темы я уже написал. "От версии КВИКА этот прикол не зависит." -------------------- Ранее на форуме я указывал что подобную ошибку я обнаружил когда поставил 9.4. и после этого вернул 8.7 ------------------ Но в текущей теме , подобную ошибку получил на версии 8.7. ----------------- Эта ошибка возникает не постоянно, а эпизодически. ------------- За последний месяц - два раза. Но раньше я такую ошибку не получал, да и сейчас она вроде бы не возникает. ------------------- если объявится, то сообщу.
таким образом TTT это набор параметров инструментов из таблиц обезличенных сделок, стаканов , листинга торгуемых инструментов, фьючерсных контрактов -------------- Этот набор формируется через определенные биржей интервалы. Сервер биржи собирает эти наборы в пакеты и отправляет всем брокерам, а сервер брокера перенаправляет эти срезы клиентам в соответствии с их подпиской. ---------------- Очевидно, что в TTT будут пропуски информации. кроме того, как указывал ранее, информацию их пакетов в терминале будет пропускать Ваш скрипт, если Вы используете sleep. При этом наиболее часто Вы будете обрабатывать самый старый параметр инструмента т е записанный первым в пакет. Остальные параметры, которые будут поступать с интервалом примерно 0.000005 сек Вы просто пропустите. --------------------- В документации QLUA есть пример использования таблицы для создание очереди параметров. изучите его.
Александр, еще Вы можете получить лучшую цену предложения из стакана, откуда она собственно и берется в TTT. но это более затратный способ получения. ----------------
Владимир написал: А прогрессивная часть человечества использует OnTrade
Так этот колбек вызывается при "получении сделки или при изменении параметров существующей сделки". Т.е. при совершении сделки. А мне зачем это? Мне нужно узнать лучшую цену предложения (продажи) и ее изменение, в случае, если цена предложения изменилась.... Или я что-то не понимаю..
Александр Программным доступом - это путем подписки через CreateDataSource?
Хм, но CreateDataSource нужен для получения параметров свечей из графика и если свеча сформировалась, значит сделка уже произошла. Нет, это не то...
Вы все правильно понимаете. ----------------------------- Немного дополню свой ответ ранее. --------------------- В терминале КВИК понятие таблица относится к двум сущностям. ------------------------------- Например , TTT называют внутреннее хранилище параметров инструментов, которые можно разделить на статические и динамические . и ТТТ называют таблицу отображения этих параметров на экране монитора. --------------- Есть два режима заказа инструментов и их параметров с сервера выбор режима определяется в настройках терминала. На закладке "Формировать список инструментов и параметров" --------------- В зависимости от выбранного режима, открытие ТТТ на экране, либо будет влиять, либо нет.
s_mike@rambler.ru написал: По первому вопросу ответ выше вам дали неправильный.
чтобы вы могли получать данные по параметрам, необходимо, чтобы они приехали в ваш терминал с сервера.
для этого должна быть произведена подписка терминала на нужный параметр. Это можно сделать несколькими способами. Например, открыть ттп с нужной колонкой - в терминале будет сгенерирован запрос на получение соответствующих данных. Можно открыть график этого параметра, точно также будет внутри терминала создан запрос. Можно принудительно из луа исполнить подписку.
надо понимать, что параметры бывают трёх типов. Статические, рассчитываемые и приезжающие с сервера. Все вышенаписанное относится к получаемым с сервера.
статические параметры инструмента доступны всегда, когда инструмент доступен.
что касается рассчитываемых инструментов, то я я точно не помню, всегда ли они доступны или они рассчитываются только при наличии их в наборе параметров открытой ттп. По. Необходимости вы можете это проверить
т е Вы считаете, что 1) для того чтобы в колбек OnParam поступали изменения по бумагам НЕ нужно, чтобы была открыта ТТТ, со столбцами параметры которых хотелось бы получать? -------------- или иначе говоря, если ТТТ с параметрами откроете, то onParam не будет принимать данные? ==================== Полагаю, что чел изучил работу в КВИК и понял что показывает ТТТ. Поэтому для начинающего вполне понятно и достаточно открыть эту таблицу с отображением того что надо и писать скрипт не заморачиваясь источниками и инвми способами смотреть гланды через зад.
swerg написал: По-моему, в этой ветке смешались разные смыслы слова "захват". 1. Захват как контекст, как обрасть видимости, как closure 2. Захват как блокировка обращения к одной области памяти разными потоками.
Про 2 Не важно как вы определили переменную, поступ и изменение её потокобезопасно в смысле структур Lua, в смысле корректности состояния переменной. Если тут возникают проблемы и состояние переменной становится невалидным, то это однозначно ошибка QLua и её исправят.
Про 1 Это чисто семантмческие моменты языка Lua, и, насколько я понял первое сообщение, вопрос совсем не про это.
мой ответ касался п.2 в вопросе темы. Мое мнение в том, что QLUA - это библиотеки функций и в ней нет необходимости синхронизации локальных переменных функций QLUA т к локальные переменные функций - не являются общими main и колбеков. ------------------- Мой оппонент привел пример локальной переменной вне функций, т е это тоже не по теме, но эти локальные переменные являются копией глобальных и их использование внутри колбеков или функций вне QLUA не требует их синхронизации т к в них копии глобальных переменных, которые и синхронизируются.
Александр написал: Товарищи ответы несколько вопросов подскажите пожалуйста: 1) для того чтобы в колбек OnParam поступали изменения по бумагам нужно ли чтобы была открыта ТТТ со столбцами параметры которых хотелось бы получать или как работает OnParam? 2) Колбек OnParam срабатывает на изменение любого параметра по ценной бумаге, а что если параметры по нескольким бумагам изменяются одновременно? Как отслеживать изменение одного параметра по нескольким ценным бумагам если они вдруг изменяются одновременно? 3) OnParam срабатывает именно на изменение любого параметра или просто через определенные временные интервалы? 4) Мне нужно отслеживать цену лучшего предложения. Почитал, люди пишут, что отслеживают цену последней сделки "LAST", но ведь это последняя сделка, а мне надо лучшее предложение, поэтому мне нужно отслеживать параметр "OFFER", верно? 5) Параметрт"OFFER" в ТТТ изменяется одновременно с появлением нового предложения в стакане или всеже с задержками или как этот параметр изменяется?
1) да --------------- 2) 3) данные в TTT приходят срезами в виде блоков. Т е если несколько бумаг или одна бумага изменили(а) свои параметры 10 раз за 1 мс, то терминал квик а потом еще 100 раз за 10 мс, то все эти данные придут в терминал одновременно в виде пакета данных. Терминал будет их распаковывать и отправлять в колбек. В итоге В колбеке вы получите все эти 110 изменений с интервалом примерно 5 мкс. Так как у вас скорее всего в main стоит Sleep, то фактически вы обработаете лишь несколько значений из данного пакета, остальные просто пропустите. ---------------- 4) верно ---------------- 5) с задержками и срезами. Т е смотри ответ на 2) 3)
nikolz написал: Замыкание связывает код функции с её лексическим окружением (местом, в котором она определена в коде). Лексические переменные замыкания отличаются от глобальных переменных тем, что они не занимают глобальное пространство имён. От переменных в объектах они отличаются тем, что привязаны к функциям, а не объектам.
Правильно. Всё тело файла кода, в луа, считается chunk. Переменные, помечены как local внутри chunk, захватываются функциями, когда эти функции определяются в chunk, и эти переменные разделяются между ними.
На этом все.
Т е согласны, что ваш пример не про захват, а про глобальную переменную. Ничто ничего не захватывает, в буквальном смысле как Вы это понимаете. А создается копия. Поэтому локальная переменная сохраняет значение глобальной и не зависит от изменения глобальной, если это скаляр а если это таблица то хранит ссылку на глобальную переменную, а не ее значение, а ссылка тоже не изменяется. в итогу локальная переменная не изменяется при изменении глобальной и синхронизация нужна лишь для глобальной.
An exponential moving average (EMA), also known as an exponentially weighted moving average (E W MA).
А в Квик совсем иной подход к этой экпоненте...
Вы правы, в КВИК перепутаны либо формулы либо названия (кому как удобнее). -------------------------- На самом деле Exponential Moving Average - они назвали Modified Moving Average (MMA) MMA = (MMAi-1*(n-1) + Pi) / n]] ----------------------------- а под названием Exponential Moving Average у них какой-то самопал наверное это будет должно быть Modified Moving Average.
Замыкание — это особый вид функции. Она определена в теле другой функции и создаётся каждый раз во время её выполнения. В записи это выглядит как функция, находящаяся целиком в теле другой функции. При этом вложенная внутренняя функция содержит ссылки на локальные переменные внешней функции. Каждый раз при выполнении внешней функции происходит создание нового экземпляра внутренней функции, с новыми ссылками на переменные внешней функции. Замыкание связывает код функции с её лексическим окружением (местом, в котором она определена в коде). Лексические переменные замыкания отличаются от глобальных переменных тем, что они не занимают глобальное пространство имён. От переменных в объектах они отличаются тем, что привязаны к функциям, а не объектам. ------------------------- https://www.sbup.com/wiki/Замыкание_(программирование)
Constantin, Вы неправильно понимаете механизм замыкания. Ваш пример
Код
local Stopped = false
function main()
while not Stopped do
end
end
function OnStop()
Stopped = true
end
не является замыканием, так как при выходе из функции, значение Stopped не сохраняется в ней для последующего использования. Это глобальная переменная и она может быть изменена вне функции, что у Вас и делается. ---------------------- Пример замыкания Вы можете изучить в скриптах индикаторов, которые предлагаются разработчиками КВИК. Например этот:
Код
function AD() --Accumulation/Distribution ("AD")
local tmp = {pp=nil, p=nil}
local it = {p=0, l=0}
return function (I, Fsettings, ds)
if I == 1 then
tmp = {pp=nil, p=nil}
it = {p=0, l=0}
end
if CandleExist(I,ds) then
if I~=it.p then
it={p=I, l=it.l+1}
tmp.pp = tmp.p
end
local CLH=(2*GetValueEX(it.p,CLOSE,ds)-GetValueEX(it.p,HIGH,ds) - GetValueEX(it.p,LOW,ds))*GetValueEX(it.p,VOLUME,ds)
local HL=GetValueEX(it.p,HIGH,ds) - GetValueEX(it.p,LOW,ds)
if HL==0 then
tmp.p = tmp.pp or 0
else
tmp.p = CLH/HL + (tmp.pp or 0)
end
if it.l==1 then
if HL == 0 then return 0
else return CLH/HL end
else
return tmp.p
end
end
return nil
end
end
это замыкание:
Код
local tmp = {pp=nil, p=nil}
local it = {p=0, l=0}
return function (I, Fsettings, ds)
Stopped = false
function main ()
while not Stopped do
end
end
function OnStop ()
Stopped = true
end
Здесь переменная глобальная и обе функции к ней обращаются через _G.
Вариант 2
Код
local Stopped = false
function main ()
while not Stopped do
end
end
function OnStop ()
Stopped = true
end
Здесь переменная захвачена обеими функциями и доступ к ней идёт через другой механизм. Вот он учитывает, что функции выполняются в разных потоках?
пока это лишь Ваше предположение. Можете привести доказательство своего предположения? ================= Я предположу, что и в первом и во втором случае используется глобальный стек. --------------------------- Но для хранения локальной общей переменной создан общий блок в глобальном стеке. --------------------------- Т к указатель на локальный стек передается в функцию при ее вызове В данном случае никаких вызовов при создании данной переменной нет. ----------------------------------- И уж тем более - этот никакой не захват, в классическом понимании этого механизма , так как он реализуется внутри функций, а в данном случае - это классическая глобальная переменная. ------------------------ если будет настроение напишу тест .
разработчики рекомендуют ставить sleep чайникам и буратинам, как самый простой способ исключить практически монопольный захват процессора одним потоком.
Alexander написал: Т.е. по поводу поста выше если как говорят разрабы main() работает в отдельном потоке, то вообще ничего виснуть не должно. Хоть есть задержка, хоть нет. На то он и отдельный поток. Зачем разрабы рекомендуют ставить sleep(100)? Что не так с потоком?
Потоки, о которых пишут разработчики не есть потоки операционной системы в чистом виде. Если не вдаваться в дебри, sleep() нужен обязательно. Поставьте sleep(50) и все станет хорошо, ничего тормозить не будет
Прикольно читать эту чушь. ------------------------- Вообще не использую sleep. -------------------- Поток main КВИКА - это поток OC - Классика!!! ================ Использую события ядра ОС: CreateEvent и ожидание события WaitForSingleObject ------------------------------------- Более того , дополнительно использую пул потоков ------------------- Для синхронизации колбеков, main и потоков пула использую атомарные операции. -------------------------- Все работает просто идеально. ------------------ Я уже выкладывал результаты тестов, в которых у меня создается до 12 потоков в пуле, обрабатывается 200 инструментов и за 4 часа выставляется и снимается 200 тысяч заявок. И все это синхронизируется и работает без единого сообщения об ошибке. =========== Делал и рекурсии в потоках - все работает. ===================== У Вас проблема с отсутствием знаний . Читайте учебники, а не занимайтесь фантазиями а-ля кулибины. ================
и еще... сообщение об ошибке будет, если эта ошибка обрабатывается перехватчиком и ошибка не приводит к полному кирдык программе. В вашем случае - очевидно полный кирдык.
Даниил написал: Lua-скрипт - продукт стороннего разработчика, его взаимодействие с ресурсами Рабочего места QUIK может быть неоптимальным, поэтому необходимо остановить выполнение таких скриптов, чтобы подтвердить или опровергнуть их возможное влияние на возникновение описанной ошибки.
каждый lua скрипт работает в изолированной виртуальной среде lua интерпритатора, который в свою очередь работает внутри quik.
В случае ошибки в lua - интерпритатор должен был бы показывать ошибку с номером строки и уж точно это не должно вешать намертво сам quik. В случае зависания самого lua интерпритатора: Quik - обязан показывать ошибку - что зависла среда выполнения.
В данном же случае виснет сам Quik и никаких ошибок не выдаёт.
Что же касается подтвердить\опровергнуть. В который раз повторяю: Этим должны заниматься разработчики Quik, а не люди которые ТОРГУЮТ ВСЁ ВРЕМЯ пока работает биржа !!!
Вы представляете какого размера может быть убыток на срочке? Пока клиент дебагом и разбором глюков занимается - вместо того чтобы следить за рынком ?
поставьте вывод меток в лог файл когда зависнет , в лог файле будет последняя метка. По меткам можно будет локализовать место зависания. Если сами не сможете, пишите, подскажем что не так.
nikolz написал: если напишите словами и с картинкой, что хотите получить
ну я просто хочу получить значения high для 3 первых и последних последних свечей, как в примере, в первом сообщении, в коде индикатора, с двух разных графиков, один график источник, другой просто в том же окне, при установке индикатора мне все выдает правильно:
Но если я меняю инструмент, а также просто при старте квика мне выдает совсем другое, пока я не переставлю индикатор, т.е. не видит историю
посмотрите скрипт который я выложил на этом форуме для арбитража В нем вроде бы все есть для вашей хотелки. Если что-то надо еще напишите, добавлю. В вашем примере много вывода переписывать его нет желания.
Alexey Danin написал: Дело в том, что у всех индикаторов в одном окне диаграммы имеется общее пространство позиций для свечек с единой сплошной нумерацией без пропусков
ну так это понятно, вопрос в том что меняется если мы переставляем инидкатор? и почему вдруг все начинает работать нормально? Я также тестировал пример с постоянными попытками забора значений свечей(как первых так и последних), и он также криво работает, тупо не видит цены, ни одной, однако если переставить индикатор все идет как по маслу. Так где пропуски конечно будет по 0 цена, я с этим уже сталкивался, но там где пропусков нет почему такое?
Могу написать пример как это сделать, если напишите словами и с картинкой, что хотите получить.
Насколько мне известно в терминале источником данных всегда является лишь сервер. и все данные с сервера запишутся в архив. Но как создать локальный источник новых данных без соединения с сервером?
Вероятно, данные до 16.02.2022 у Вас были накоплены локально, а с 27.07.2022 - транслируются с сервера QUIK. Архив графика может содержать максимально 65000 свечей если их накапливать, то есть каждый день необходимо подключаться к серверу QUIK и строить график по инструменту. Если же в промежуток времени с февраля по июль Вы не строили данный график, то соответственно исторические данные по этому графику у Вас не накапливались. С сервера QUIK можно же заказать только максимум 3000 свечей (+ текущую торговую сессию). Т.е. в настоящий момент увидеть пропущенные данные с февраля по июль на графике уже возможности нет.
Если же Вам, наоборот, не требуется видеть исторические данные по этому инструменту, то Вы можете удалить исторические данные вручную из папки Archive в директории с терминалом QUIK.
Можете объяснить как локально в QUIK накапливать данные . Очень хочу так делать.
Недавно сообщал на форуме о том, что дата сервера в текущих торгах показывает вчерашнюю дату. сегодня выявил как это можно повторить. ------------------- проблему можно обнаружить, если загрузить квик и подключить его к серверу до начала торгов. В этом случае, после начала торгов дата сервера не обновляется и остается равной дате предыдущих торгов. если разорвать соединение и снова восстановить то дата сервера обновляется до текущей. -------------------- От версии КВИКА этот прикол не зависит.
Шорты осиновые написал: Добрый день! Уже была на форуме аналогичная тема - не хватает длины поля для текстовой выноски и других типов меток, но изменений нет.
nikolz написал: Поставьте 8 версию КВИК в 9 много ошибок.
А как ее поставить? где репозитарий старых версий?
Если Вы обновляли версию 8 на 9 то старая у Вас в папке QUIK/backup/ дата обновления. -------------- Если ставили 9 как новый квик, то можно спросить у брокера или у разработчиков.
Kolossi написал: А как насчет получения средней цены покупки по инструменту, точнее параметра "Балансовая цена" в таблице Состояние счета?
К сожалению, средствами QLUA данную таблицу не получить.
Однако параметры данной таблицы формируются на основе позиций клиента, которые отражены в соответствующих таблицах терминала, к которым в свою очередь можно получить доступ средствами QLUA. Подробное описание полей Таблицы "Состояние счёта" находится в Руководство пользователя QUIK v.9.7zip, 14.6 МБ -> Раздел 3. Просмотр информации -> 3.5 Состояние счета.
Да не получается. Конечно я веду среднюю позиции средствами и возможностями скриптов. Как правило она совпадает с балансовой ценой, но стоит провести сделку мимо скрипта и весь результат можно кидать в помойное ведро. Поэтому возможность получать данные с этой таблицы хотелось бы иметь.
Если интересует цена покупки актива то надо использовать Позиции по инструментам
Описание параметров таблицы «Позиции по инструментам»:
Параметр
Тип
Описание
sec_code
STRING
Код инструмента
trdaccid
STRING
Счет депо
firmid
STRING
Идентификатор фирмы
client_code
STRING
Код клиента
openbal
NUMBER
Входящий остаток
openlimit
NUMBER
Входящий лимит
currentbal
NUMBER
Текущий остаток
currentlimit
NUMBER
Текущий лимит
locked_sell
NUMBER
В продаже. Количество инструментов, заблокированное под исполнение заявок клиента на продажу
locked_buy
NUMBER
В покупке. Количество инструментов в активных заявках клиента на покупку
locked_buy_value
NUMBER
Стоимость инструментов, заблокированных под покупку
locked_sell_value
NUMBER
Стоимость инструментов, заблокированных под продажу
wa_position_price
NUMBER
Цена приобретения
limit_kind
NUMBER
Срок расчётов. Возможные значения:
положительные целые числа, начиная с «0», соответствующие срокам расчётов из таблицы «Позиции по инструментам»: «0» – T0, «1» – T1, «2» – T2 и т.д.;
отрицательные целые числа – технологические лимиты (используются для внутренней работы системы QUIK)
и еще про closure : " Внутренняя функция всегда обращается к свободным переменным (которые называют "внешними локальными переменными") косвенно через структуру, называемую "upval", используя инструкции GETUPVAL и SETUPVAL . Пока включающая функция активна, upval указывает на слот локальной переменной в стеке (хотя Lua является виртуальной машиной на основе регистров, она использует стек внутри) Это удобно, потому что заключающей функции не нужно беспокоиться о том, является ли переменная частью замыкания или нет. Когда функция возвращается, она копирует локальные переменные в элемент структуры upval и указывает на это upval. Upval сохраняется до тех пор, пока на него больше никто не ссылается, и в этот момент он может быть собран для сбора мусора.
это вообще не о том. ------------- Объясняю... -------------- Если функции передается значение скалярной переменной, то при входе внутрь функций луа всегда происходит создание копии скалярной переменной. В отличии от СИ, в луа нельзя передать указатель на скаляр. ----------------- Т е если Вы присваиваете локальной переменной глобальную, то значение глобальной копируется в локальную. ------------------- В этом месте теоретически синхронизация для глобальной переменной нужна, но так как вы читаете, то эта синхронизация не имеет практического смысла. ---------------------- После этого в локальной переменной у вас копия и никакая синхронизация не требуется, а изменение локальной не меняет глобальную. =============== когда локальной переменной вы присваиваете таблицу то в локальную записывается указатель глобальной. синхронизация опять же будет для глобальной, а не для локальной переменной. ================ Таким образом, в любом случае локальная переменная у Вас недоступна из других потоков и ее синхронизация не требуется. ================ а closure это сохранение переданного значения функции вне стека функции. И при новом входе в функцию эти значения могут быть использованы. Но эти значения внутри потока функции и они не доступны по указателю в других потоках. ======================== Поэтому closure - это о сохранении значений внутренних переменных функции при выходе из области видимости этой функции. читаем документацию: "замыкание - это функция плюс все, что ей нужно для правильного доступа к своим значениям... Технически говоря, значение в Lua - это замыкание, а не функция. Сама функция является всего лишь прототипом для замыканий." ===============
Вы же хотите узнать цену сделки, так и читайте ее из таблицы сделок. причем здесь позиция по инструментам? и где Вы в позиции увидели цену?
Ну да, с ценой сделки козе понятно. ) А как насчет получения средней цены покупки по инструменту, точнее параметра "Балансовая цена" в таблице Состояние счета?
Если Вы пытаетесь ответить на вопрос темы, то читайте внимательнее вопрос. Если просто выпендриваетесь, то нахрена?
nikolz написал: так как вы не сможете обратиться к локальным переменным майн из колбека и наоборот.
Так "глобальная" переменная, объявленная с local вне функций, захватывается разными функциями и становится для них "локальной".
Вы это сами придумали или где прочитали? Вы хотя бы поняли, что написали? ----------------------------------------------- Если Вы локальной переменной присваиваете значение глобальной, то будет выполнено копирование значения для скалярной величины и копирование указателя для таблицы. -------------------- Поэтому никто ничего не захватывает и ничем не становится.
1. В main() можно использовать функции получения данных от Квика, которые обычно используются в колбаках? Такие как getParamEx(), getLevel2Quotes() и т.д.
2. QLua нормально синхронизирует обращение к переменным, помеченным как local, если к ним идет доступ и из потока колбаков, и из потока main?
main и колбеки имеют общий глобальный стек VMLua. Поэтому есть синхронизация обращения к глобальным пере5менным. Кроме того, обращение к глобальным переменным в кобеке приводит к блокировке main при обращении к этим же переменным. Т е колбеки и main в этой ситуации работают последовательно. -------------------- локальные стеки у них разные. поэтому синхронизация не требуется , так как вы не сможете обратиться к локальным переменным майн из колбека и наоборот.
Рустам написал: Если использовать условную заявку то они могут не взяться. Например продал акции и с концами пошел наверх оставив лимитку на покупку внизу. Было дело. Пробовал. Есть еще варианты? Чтобы один раз выставил до торговой сессии и забыл на сутки
Рустам написал: Ребята. Подскажите как с начала торгов с помощью стоп заявок сначала продать а затем купить одинаковое число заявок? В данный момент если ставить стоп-лимит на продажу и покупку то при покупке выдает ошибку "не прошла контроль лимитов". Это как бы невозможно купить у себя во время продажи. итог только идет продажа. С помощью тейкпрофита удается но там все зависит от того что первое пошло или покупка или продажа. Я бы его использовал но метод FIFO меня добивает своей неточностью. Нужно сначала продать а затем купить. Подскажите какие есть варианты!!!
надо ставить не по рынку, а по фиксированной цене. и надо использовать не стоп-заявку, а условную заявку.
и еще функция FRACTALS это плохой индикатор из тех, которые заглядывают в будущее. Т е индикатор -шулер. Значения на график заносятся задним числом. Поэтому вам кажется что можно легко торговать. ---------------- Если вы построите робота на таком индикаторе то на истории этот робот будет давать прибыль а на реале - убыток.
Сергей написал: Приветствую, во втором сообщении код индикатора. Стандартный фрактал на lua. Мне нужно просто поднять/опустить его от графика, потому что он очень близко рисуется, мелкие свечи бывает не видно. Я делаю его в виде жирных точек, вот они сильно низко рисуются. А стандартные треугольники со сделками иногда сливаются.
можно сделать так: ---------------- В setting добавляем два значения вот так: Settings = { Name = "nk_FRACTALS(Fractals)", X1 = 0.0, -- это смещение для максимума X2 = 0.0, -- это смещение для минимума Period = 5, line = {{ Name = "Horizontal line", Type = TYPE_LINE, Color = RGB(140, 140, 140) }, { Name = "FRACTALS - Up", Type = TYPE_TRIANGLE_UP, Color = RGB(0, 206, 0) }, { Name = "FRACTALS - Down", Type = TYPE_TRIANGLE_DOWN, Color = RGB(221, 44, 44) } }, -------------------- далее добавляем вот такую функцию -------------------- local function nk_sm(X,N,m) if N then return X(N)+m end end ----------------- и исправляем две строки в функции ----------------- function OnCalculate(Index) local Out1,Out2 = func(Index, Settings) SetValue(Out1, 2, ConvertValue(Settings,nk_sm(H,Out1,Settings.X1))) SetValue(Out2, 3, ConvertValue(Settings,nk_sm(L,Out2,Settings.X2))) return tonumber(Settings.Horizontal_line),nil,nil end ================= если что не так, пишите, поправлю.