VPM написал: Прислушался к автору, "Таблицы в Lua — это не одна из структур данных, — это единственная структура данных.", перевожу все переменные в формат таблицы луа, не знаю поможет?
Я думаю, что автор будет впечатлён.
Не понимаю к чему этот сарказм?
Да какой сарказм-то... Я реально думаю, что автор будет впечатлён тем, что его фраза "Таблицы в Lua —... — это единственная структура данных" способна вызвать действие "перевожу все переменные в формат таблицы луа". Что это такое "перевожу все переменные в формат таблицы луа", как и зачем?
VPM написал: Прислушался к автору, "Таблицы в Lua — это не одна из структур данных, — это единственная структура данных.", перевожу все переменные в формат таблицы луа, не знаю поможет?
Вы разделите проблему на части, а то непонятно, что у вас не получается. В теме написано, что пытаетесь метку вывести. Так создайте простую метку, попробуйте её вывести, если выводится, то с остальными проблемами разбирайтесь
Сергей написал: Может быть найдутся другие пути, чтобы передвинуть график в окне, например инициировать событие нажатия на стрелочку, которой передвигается график.
Не та задача для настолько сложных подходов. Колхозный метод получения данных свечи такой: Ставите метку на график на оси той свечи, которая нужна (в вашем случае правая крайняя). Ставите её таким образом, чтобы она была по итогу вне границ графика (например, под осью времени внизу). Это чтобы метка не маячила и вы её случайно не задели. Снимаете с неё галки "Перемещать со шкалой времени" и "Перемещать со шкалой цены". Дальше определяете её идентификатор простым скриптом. Если график новый, то идентификатор равен 1. Дальше в цикле эпизодически будете эту метку опрашивать и она будет отдавать вам реальные координаты времени, по которым будете брать данные с уже текущей свечи графика, которая будет с этой меткой на одной вертикальной оси. Если будете удалять все метки на графике, то удаляйте через скрипт, который не будет трогать вашу поставленную метку (её сделайте с каким-либо редким шрифтом, чтобы по нему идентифицировать). Это всё работает на данный момент.
Сергей написал: Хотел написать программу, которая бы при просмотре свечей в одном окне (допустим на М5), сама пододвигала график в окнах других ТФ
"Данные последней видимой в окне свечи (у правого края экрана)" получить можно, но колхозным способом. Для решения вашей задачи это не поможет, так как средствами Qlua нельзя двигать графиками.
Kolossi написал: Как всегда, хороший вопрос перевели в срач. В продолжение темы: насколько реально когда-нибудь объем свечи ds:V(n) получать в виде V(n).maker+V(n).taker?
Так это и 10 лет назад можно было, ещё на Qpile такое писали. Пишете скрипт, который ТОС обрабатывает, и выводите результат в таблицу или метками на график.
Владимир написал: Во-вторых, эти данные нафиг не нужны: при подаче заявке мы не можем гарантировать, будет ли сделка тейкерной или мейкерной, а после того, как сделка состоялась, это и тем более никому не интересно.
Можем. Для этого всё и делалось. Мейкерная заявка с условием "Только пассивная" (скриптом или руками) поданная по рынку будет отклонена биржей. Обсуждали уже здесь.
Glukator написал: А вопрос-то правильный, интересный и нужный. И хорошо бы узнать, что скажут об этом разработчики. Поскольку внятного ответа так и не было, подниму тему вновь. Вопросов здесь, на самом деле, два: 1. Какой параметр в таблице сделок (или в данных, получаемых от прерывания OnTrade) позволяет определить, была ли сделка "тейкерной" или "мейкерной" в том смысле, что заложен в комиссионные тарифы Мосбиржи? 2. Зависит ли передача этого параметра в терминал пользователя от настроек на стороне брокера?
Нет там проблем никаких. Просто nshch спутал Сделки с Заявками и выкатил сюда описание битовых флагов для Заявок. В описании флагов для Сделок всё есть: бит 5 (0x20) Пассивная сделка («Состояние» — «П») бит 6 (0x40) Активная сделка («Состояние» — «А»)
Игорь М написал: Причем здесь какой-то мой алгоритм? Подняли тему и я написал,что TRADINGSTATUS криво работал раньше, написал что проверю снова. Вот проверил, ничего не поменялось. Написал сюда, чтобы люди, которые будут потом читать, не тестировали заново. Резюмируя: TRADINGSTATUS - бесполезная мура, 10-15 секунд это перебор для любых систем. За эксклюзивную информацию о том, что "система торговли Квик - это не тот инструмент, что стоит использовать" для "мгновенной реакции", низкий поклон, конечно. ::
Вы же говорите, что задержка в 15 секунд для Вас критическая. Я пока не видел с этим проблем, для любых торговых систем. Совершенно разные мнения.
Я такого не писал. Она для меня не критическая, я TRADINGSTATUS не использую. Я имел в виду, что если такая простая опция, как определение статуса сессии, имеет задержку в 10-15 секунд, то этим не следует пользоваться в любых системах. Она просто тупо неправильно работает. Не может быть в современных реалиях такой задержки. Возможно, когда-то она работала правильно, но потом что-то поменялось, а её не исправили. Она стабильно выдает нереальную задержку - это баг.
Игорь М написал: Для информации: проверил снова за эти два дня, как были раньше неадекватные задержки, так и остались. Значения писались в лог при их изменении (SiU3): 140514.690: status: 1
Вчера статус на 11-ой секунде после возобновления торгов поменялся, а сегодня на 15-й.
Если Ваш алгоритм требует мгновенной реакции, то, видимо, стоит задуматься, что система торговли Квик - это не тот инструмент, что стоит использовать. Хотя, конечно, можно дополнить получение статуса косвенными методами. Получите статус по тому, какой сработает быстрее.
Причем здесь какой-то мой алгоритм? Подняли тему и я написал,что TRADINGSTATUS криво работал раньше, написал что проверю снова. Вот проверил, ничего не поменялось. Написал сюда, чтобы люди, которые будут потом читать, не тестировали заново. Резюмируя: TRADINGSTATUS - бесполезная мура, 10-15 секунд это перебор для любых систем. За эксклюзивную информацию о том, что "система торговли Квик - это не тот инструмент, что стоит использовать" для "мгновенной реакции", низкий поклон, конечно.
Для информации: проверил снова за эти два дня, как были раньше неадекватные задержки, так и остались. Значения писались в лог при их изменении (SiU3): 134806.371: status: 1 134806.372: phase: 2 134806.372: session: 0 140008.938: status: 0 140008.938: phase: 1 140511.145: phase: 2 140514.690: status: 1
Вчера статус на 11-ой секунде после возобновления торгов поменялся, а сегодня на 15-й.
По поводу TRADINGSTATUS: Я когда-то тестировал его и, если не ошибаюсь, он криво работал. Он в 14:05:10 показывал 0, хотя торги уже 10 секунд шли, и лишь на 11-ой секунде он стал 1. Такая же история и с вечерней сессией. Надо в понедельник проверить снова.
Николай написал: С одной стороны грустно, что нет такой информации. С другой стороны хорошо, что я не зря писал такую функцию, которая по коду фьючерса выдает его наименование. Если кому-то нужно - то пользуйтесь. :-)
Правда, функция обрабатывает только те фьючерсы, которые были доступны у моего брокера (ВТБ).
Я вам код подкорректировал. Лучше это через таблицу сделать. Не благодарите.
Код
local t_full_name_fut = {
RI = "Фьючерсный контракт на Индекс РТС",
Si = "Фьючерсный контракт на курс доллар США - российский рубль",
-- ......
KZ = "Фьючерсный контракт на курс казахстанский тенге – российский рубль"
}
local function getFullSecCode (sec_code)
if type(sec_code) == "string" then
return t_full_name_fut[string.sub(sec_code, 1, 2)]
else
return nil -- или что-то другое
end
end
message ("Код инструмента: " .. tostring(getFullSecCode("RIU3"))) -- --> Фьючерсный контракт на Индекс РТС
message ("Код инструмента: " .. tostring(getFullSecCode("abcdef"))) -- --> nil
message ("Код инструмента: " .. tostring(getFullSecCode(nil))) -- --> nil
Кое что нашел:
true - флаг установлен
false - флаг не установлен
-- Функция проверяет установлен бит, или нет (возвращает true, или false)
-------
где:
х – значение;
n – номер бита. Нумерация битов начинается с « 0 ».
Всем спасибо, кое что понял!
На это невозможно смотреть. У вас есть руководство пользователя "Интерпретатор языка Lua" ? Там в п. 6 описаны все функции для работы с битовыми масками. Зачем вам эта гроздь elseif-ов или test? test для теста. Пример:
Код
local order = getItem("orders", i) -- получение таблицы данных из i-ой строки ТЗ
if order and order.flags & 5 == act_direction and order.sec_code == SEC_CODE then -- если есть активная заявка рабочего инструмента заданного направления
Вы здесь за один удар определяете и то, что у вас заявка активная и то, что она купля/продажа (5: 00000101). Если act_direction = 1, то это активная на покупку, если act_direction = 5, то это активная на продажу. Сразу, не выясняя по отдельности биты флагов. Еще пример:
Код
if order.flags & 1 == 1 then -- соответствующая заявка активна (исполнена частично)
-- бла бла
elseif order.flags & 2 == 0 then -- соответствующая заявка исполнена полностью
if order.qty > trades_qty_order[order.order_num] then -- количество контрактов в заявке больше суммарного количества контрактов всех сделок, соответствующих этой заявке
-- бла бла
else -- заявка полностью исполнена (все соответствующие данной заявке сделки появились в ТС и были обработаны)
-- бла бла
end
else -- соответствующая заявка исполнена частично и снята
if order.qty - order.balance > trades_qty_order[order.order_num] then -- исполненная часть заявки больше суммарного кол-ва контрактов всех сделок, соответствующих этой заявке
-- бла бла
else -- все сделки, которые соответствуют исполненной части заявки, появились в ТС и были обработаны
-- бла бла
end
end
VPM написал: nikolz, Я про надежность какой вариант надежней? Или все безопасно?
В фрейморке HackTrade так было написано не из-за надежности, а из-за отсутствия побитовых операций в Lua52 на тот момент, они только в 2015 году появились в Lua53.
Alexander написал: Да, действительно не надо его постоянно удалять и заново загружать. А я вот так тупил всё это время. Я просто начинал с QPILE и там постоянно надо было скрипт загружать локально.
Я некоторое время на Qpile еще и каждый раз заново таблицу создавал без надобности.
Alexander написал: Я хочу более простого подхода. Зачем мне все эти лишние телодвижения? Я и так уже написал программу на C++, которая сам запускает квик, ждёт появление окна логина, вводит логин и пароль, запускает программу DebugView, получает ID процесса квика, настраивает фильтр в DebugView по этому ID, сама отвечает на вопрос диалогового окна не обновлять инструменты и нажимает в окне на OK. Всё это упрощает мои действия, которые мне приходилось бы делать руками. Вот и тут я не хочу руками постоянно сохранять скрипт, в квике удалять старый скрипт, загружать новый, опять его запускать, иногда можно запариться и не удалить старый и запустить, или внести изменения в скрипт и забыть по запарке сохранить и в квике загрузить тот же самый предыдущий скрипт. Конечно это уже делается на автомате и практически без таких ошибок, но иногда по запарке можно и накосячить на голом месте. А зачем всё это надо? Есть же нормальные простые решения для этого.
Зачем вы удаляете в Квике старый скрипт и загружаете новый? Вы каждый раз сохраняете его под новым названием? Вы в этой теме потратили на написание текста времени больше, чем сэкономите за ближайшие 2 года, реализовав вот это вот всё, а может и не сэкономите. У вас какая-то автоматизация ради автоматизации. Вот вы в блокноте отредактировали скрипт, допустим у вас там сообщения контрольные вставлены или запись в лог файл, сохранили вы его и кнопку запуска скрипта в Квике нажали. Всё. Что вы тут сэкономите? Да, бывает не нажал Ctrl S, но это редкость, в том же Notepad подсветка меняется и * в панели задач на несохраненном видна. Ради этого редкого события?
Вы писали, что используете OnTrade и обрабатываете в мэйне, хотя у вас в OnTrade аж 250 мс обработка, ну это ладно. Наверху большим количеством текста спорили с TGB , что лучше. Я кратко описал возможные варианты, даже не для вас, а для тех кто читает. В том варианте, что используете вы (только с одной функцией обратного вызова OnTrade), разницы между OnTrade и getNumberOf ('trades') с вашей скоростью опроса нет. Кому, что нравится, то он и делает.
Владимир написал: Игорь М, Ну, я обрабатываю в мейне, на флаг изменения состояния OnTrade мне насрать - я даже не знаю, что это такое. OnTrade лишь записывает данные в стек, код я приводил.
В коде у вас изменение размера стека. Это и есть флаг изменения состояния OnTrade.
По поводу getNumberOf ('trades') vs OnTrade: Всё зависит от того, где вы обрабатываете. Если из мэйна флаг изменения состояния OnTrade в цикле опрашивать, чтобы потом всё в мэйне обработать, то особой разницы между опросом в цикле изменения количества сделок getNumberOf ('trades') и этого флага в OnTrade практически нет, без OnTrade тогда проще. А если 2+2 непосредственно в OnTrade складываете и в мэйне обработки нет, то тогда не нужно с getNumberOf ('trades') заморачиваться. Всё зависит от трудоемкости обработки сделки, у каждого свой случай.
Сюда дополню по этой проблеме. Там подставляются по умолчанию кривые координаты с противоположным знаком по оси Y. Если их исправлять при постановке метки, то она выставляется.
Дмитрий написал: function mark_Fail (zap, mark) - моя функция записи в файл FileWrite = io.open('D:\\QLUA\\fails\\mark.txt', zap) FileWrite:write(mark) FileWrite:close() end а другой скрипт читает этот файл.
Вы бы написали ещё как читаете. У меня записываются данные в файл одним скриптом и читаются другим в 10 раз чаще и не было подобных проблем. Не знаю как вы читаете, могу предположить, что открываете и закрываете файл при каждом чтении. В этом нет необходимости, открывайте файл на чтение в начале работы читающего скрипта и закрывайте файл в конце работы непосредственно перед остановкой. Попробуйте.
Продолжаю увлекательное тестирование свежих версий. На 10.2 визуально отметил тормоза в отрисовке графики и тормоза в выставлении заявок, о чем здесь писали. Ну, это четко ещё не проверил. Теперь о том, что проверил: Метки в 10 версии отрисовываются в 4-5 раз медленнее. Не поленился и проверил много версий и установил, что фиаско случилось в самом начале: с версии 10.0.1. А в версии 9.7 все замечательно, даже лучше процентов на 20, чем в предыдущих. Возможно, эта заторможенность носит какой-то общий характер, а не касается исключительно меток. Вот скрипт для теста:
Код
local CHART_TAG_PRICE = "Test_speed_lab"
local function sysTime ()
local t_time = os.sysdate()
return 10000 * t_time.hour + 100 * t_time.min + t_time.sec + 0.001 * t_time.ms
end
function main ()
local label = {
IMAGE_PATH = "C:\\Quik_Pic\\Lines\\500_1_red.bmp",
--[[ -- закомментированно: рисунок, раскомментированно: текст
TEXT = "________________________",
IMAGE_PATH = "",
TRANSPARENT_BACKGROUND = 1,
--]]
ALIGNMENT = "TOP",
YVALUE = 84.00,
DATE = 20230615,
TIME = 130000,
R = 0,
G = 160,
B = 0,
FONT_HEIGHT = 12
}
local sys_time = sysTime()
for i = 1, 1000 do
label.YVALUE = label.YVALUE + 0.001
AddLabel(CHART_TAG_PRICE, label)
end
sys_time = sysTime() - sys_time
message("sys_time: " .. tostring (sys_time))
sleep(2000)
DelAllLabels(CHART_TAG_PRICE)
end
График USDRUB_TOM, дату/время текущие поставите, путь для картинки свой пропишите. Картинка здесь эта простая линия, можно взять любой рисунок. На тексте разницы почти нет, на картинке замедление в 4-5 раза. Рисуется прямоугольник снизу вверх.
Да, начиная с версии Рабочего места QUIK 9.1 так реализовано. В данном случае можем предложить зарегистрировать пожелание на доработку функционала. Уточните, пожалуйста, регистрируем?
Да, зарегистрируйте, пожалуйста. Чтобы метки не пропадали и их можно было выставить, когда график, к которому эти метки привязаны, не находится в области видимости. Чтобы было как раньше.
Игорь М написал: Уважаемые разработчики, спасибо, что вернули MS Sans Serif в шрифты!
Разве вернули? Или это сарказм?
Не сарказм, вернули. Я тут стал новые версии смотреть, поставил 10.1.2.2 - и там, о чудо, многие шрифты, включая этот, присутствуют. Я все эти годы так решал: ставил в терминале шрифт тоже на 13 символов (Comic Sans MS), сохранял файл настроек (.wnd) и затем в файле настроек уже менял Comic Sans MS на MS Sans Serif и всё работало. Но теперь всё стало нормально, можно без этих огородов обойтись.
Игорь, уточните, что Вас смущает в данной формулировке?
Егор, она очень странная. Какие инструменты в лотах? В пункте "4.5 Заявки" у вас нормально написано: "qty NUMBER Количество в лотах". Также и в сделках должно быть.
Да, с версии Рабочего места QUIK 9.1 метки привязываются к графикам. Такое поведение было реализовано для того, чтобы метки можно было оставлять на графике при смене инструмента по аналогии с трендовыми линиями, фигурами.
Цитата
Если теперь поставить шкалу на графике в ручном режиме от 100 до 200, к примеру, а максимум графика цены будет ниже 100, то метку не будет видно.
Приложите, пожалуйста, скриншоты как именно отображаются метки у Вас на графике сейчас и как по Вашему мнению должно было бы быть.
Я понимаю, что не просто так это нововведение сделали. Но в результате, если график выходит за видимую область в окне, то метка пропадает. До версии 9.1 такого не было, метка оставалась. Хотелось бы, чтобы метка оставалась на месте, даже если графика на данный момент нет в области видимости. Например, метка (картинка из файла), которая используется в качестве уровня экстремума цены, благополучно пропадает, если вы сдвинули график таким образом, что в нем график цены на этот момент не виден.
К сожалению, мы не можем заставить брокера использовать или, наоборот, не использовать тот или иной функционал. Каждый брокер самостоятельно принимает решение.
Понятно, что вы не можете "заставить брокера использовать или, наоборот, не использовать тот или иной функционал". Идея была в том, чтобы вы попытались донести до них мысль о более цивилизованном решении трансляции рекламы.
nikolz написал: Прикольно, но вставка рекламного банера - это фишка разработчиков QUIK. --------------------- Ау, Разработчики объясните начинающим Вашу фишку с этим банером. ----------------------- Можно убить этот банер хуком. Class: ShowBannerWindow.
Разработчики уже отвечали когда-то, что эта возможность была сделана по просьбе брокеров, от них деньги-то идут. Это паровозик был самостоятельной фишкой разработчиков
Как я понял в версии 9.1 изменили функционал меток на графике и теперь "Привязка меток теперь осуществляется не к шкале, а к графику...". Если теперь поставить шкалу на графике в ручном режиме от 100 до 200, к примеру, а максимум графика цены будет ниже 100, то метку не будет видно. Что скриптом ставить по координатам, что руками тоже по координатам. Это неудобно, обрезает некоторые возможности, до этой версии всё нормально работало, куда хочешь метку поставить - туда и ставишь. Зачем это сделали? Есть какие-то настройки, чтобы можно было сделать, как в 8-х версиях?
Эта тема неоднократно поднималась. Это какой-то лютый колхоз иметь на рабочем пространстве слепящий рекламный баннер... Жаль, что не бегущая строка со звуковым сопровождением. Еще можно сделать, чтобы он мигал апериодически.
Уважаемые разработчики, обратитесь, пожалуйста, к брокерам и донесите до них простую мысль, что рекламу, тем более не часто меняющуюся, можно слать на почту или, на худой конец, показывать при загрузке Квика. Еще вариант, показывать её в течение первой минуты после подключения к серверу. Много существует грамотных и удобных для всех решений.
Дмитрий написал: Так все реализовано уже - https://forum.quik.ru/forum12/topic7774/ Ошибка создания заявки. [GW][82] "Заявка Book-or-Cancel не может быть выставлена/переставлена, т.к. она приводит к немедленному исполнению.".
nikolz написал: Возможно я не совсем точно выразился. Я уверен, что теряете Вы не на комиссии , а на убытках при движении рынка против вашей позиции. И эти потери гораздо больше . Но экономия на комиссии - это не способ получить прибыль на рынке, тем более на фьючерсе. Фьючерс - это торговля с плечом. Посчитайте величину комиссии от стоимости актива и сравните это с убытком при движении актива против вашей позиции хотя бы на 1%. -------------------- Если экономить на комиссии, то лучше вообще не ставить заявки. Экономия максимальная.
Я и на комиссии теряю и на убытках при движении рынка против позиции, которые больше. Это да. С удовольствием лупил бы по рынку и платил комиссию, если бы рынок был активный, живой, волатильный, а на дохлом умирающем я сэкономлю и на комиссии и на отклонении цены от средневзвешенной текущей. И да, я полностью согласен, что "экономия на комиссии - это не способ получить прибыль на рынке", но пока я тут ещё торгую обсуждаемая опция поможет сэкономить.
Игорь М написал: Антон, убедительная просьба с этим не затягивать. Эта опция актуальна и реально поможет деньги сэкономить.
на самом деле это не так реально это не поможет экономить деньги.
Поможет.
Цитата
Так как комиссия брокера остается, а она всегда существенно больше биржевой.
На примере RI. Комиссия МБ: 9.14 руб за контракт (тейкер), брокер 0.45 руб. Открыть и закрыть 1 контракт по рынку это 18.28 руб бирже и 0.9 руб брокеру. В 20 раз у МБ комиссия больше получается.
Цитата
Если заявка не пассивная, то она просто отклоняется и правило это лишь к лимитированным заявкам.
При движении рынка в момент отправки заявки "Поставить в очередь" заявка может стать рыночной и я как тейкер заплачу комиссию, хотя мне нужно было просто поставить лимитный ордер близко к рыночной цене. Такое "счастье" мне не нужно, пусть уж лучше заявка будет отклонена. На МБ для этого эту опцию и ввели. Вы же сами цитировали выше: "В рамках действующей тарификация признак BoС гарантирует нулевую комиссию по сделкам". (цитата МБ)
На самом деле это не так Есть два формата транзакций, первый тот что описан в документации и там действительно нет признака "Только пассивная" И второй, тот который в документации не описан, но тем не менее допустим. Для понимания о чем речь, откройте Карман транзакций, положите в него необходимую транзакцию, и сохраните от туда в tri файл. Открыв файл блокнотом Вы увидите транзакцию во втором формате. Этот формат допустимо использовать во всех способах подачи транзакций, включая sendTransaction В этом формате, есть признак "только пассивная" и его можно использовать в sendTransaction. Вообще, в этом формате можно использовать любые параметры любых транзакций, без каких либо доработок. Ограничения такие, в русском терминале допустимо использовать только русские параметры, в английском только английские. Перемешивать параметры от разных форматов нельзя.
Сергей, спасибо за информацию. Такая ситуация: при попытке загрузить транзакцию из tri-файла пишет: Неправильно указано значение для поля "Условие исполнения": "Только пассивная". При отправке с помощью sendTransaction тоже. В обоих случаях все нормально , если поле "Условие исполнения": "Поставить в очередь". Версия терминала имеет значение или какие-то ещё есть моменты?
Anton Belonogov написал: Герман, дополнительных действий с Вашей стороны не потребуется. Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
Антон, убедительная просьба с этим не затягивать. Эта опция актуальна и реально поможет деньги сэкономить.
Мы зарегистрировали пожелание на доработку. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
Алексей, пользуясь случаем оставлю здесь ещё пожелание: Добавьте ещё один параметр в таблице метки, типа user_id или user_hint, используя который пользователь смог бы идентифицировать метку. Kolossi выше написал, что он сохраняет UID метки в файл и затем удаляет при повторном запуске. Я тоже в подобных случаях удаляю старые при повторном запуске терминала. Не знаю, что за UID Kolossi сохраняет, но label_id для этих целей не годятся, и поэтому приходится выдумывать разное экзотическое для идентификации: где-то использую время, где-то цвета, а где-то редкий шрифт, и потом при запуске удаляю все метки с определенным шрифтом, например. Существование дополнительного параметра в таблице существенно бы облегчило данную задачу.
shtur2005 написал: Добрый день, уважаемые языковеды! Прошу не кидать в меня тапками, я только начал изучать язык. Помогите пожалуйста с созданием бесконечного цикла функции. Двое суток читал и пробовал, ничего не вышло.
Я вам пример набросал: скрипт в цикле выводит сообщения со значениями даты/времени и high/low последних 5 свечей (CNT_CANDLES = 5). Работает.
Код
local CHART_TAG_PRICE = "SRH15MIN" -- идентификатор графика цены
local CNT_CANDLES = 5 -- значение количества свечей для обработки
local is_run = true
local processed -- количество обработанных свечей графика
local function timeCandle (hour, min) -- функция формирования времени свечи (number)
return 10000 * hour + 100 * min
end
local function dateCandle (year, month, day) -- функция формирования даты свечи (number)
return 10000 * year + 100 * month + day
end
local function singleCandleProcessing (t) -- функция обработки одиночной свечи
local time = timeCandle(t.datetime.hour, t.datetime.min) -- вызов функции формирования времени свечи
local date = dateCandle(t.datetime.year, t.datetime.month, t.datetime.day) -- вызов функции формирования даты свечи
message(tostring(date) .. " " .. tostring(time) .. ". High: " .. tostring(t.high) .. ", low: " .. tostring(t.low))
end
local function candlesProcessing () -- функция обработки последней свечи/свечей
local number = getNumCandles(CHART_TAG_PRICE) -- количество свечей графика
if number > processed then
local t = getCandlesByIndex(CHART_TAG_PRICE, 0, processed, number - processed) -- получение таблицы последней свечи/свечей
if t then
for i = 0, number - processed - 1 do
if t[i] then
singleCandleProcessing(t[i]) -- вызов функции обработки одиночной свечи
end
end
processed = number
end
end
end
function main ()
processed = getNumCandles(CHART_TAG_PRICE) - CNT_CANDLES
while is_run do
candlesProcessing () -- вызов функции обработки последней свечи/свечей
sleep (30000)
end
end
function OnStop ()
is_run = false
return 2000
end
Мне приходится решать эту задачку так:
Table_ getFuturesLimit = {} -- создается переменная таблица для получения значения, возвращаемого функцией getFuturesLimit
Table_ getFuturesLimit = getFuturesLimit ( "SPBFUT" , "SPBFUT * * * * * " , 0 , "SUR" ) -- результат работы функции getFuturesLimit помещается в созданную таблицу
if Table_ getFuturesLimit and next(Table_ getFuturesLimit ) then -- если результат работы функции не nil и не пустая таблица, то можно обратиться к соответствующему полю.
FutLimit = Table_ getFuturesLimit .cbplimit -- получается значение интересующего поля
end -- end if
Прокомментирую: Первая строка не нужна, Table_getFuturesLimit лучше залокалить, а next(Table_getFuturesLimit) заменить на проверку Table_getFuturesLimit.cbplimit. Если таблица пустая, то Table_getFuturesLimit.cbplimit будет nil без ошибки и условие не выполнится, но может быть так: Table_getFuturesLimit.cbplimit = nil, а next(Table_getFuturesLimit) будет true (другие поля существуют) - условие выполнится и вы присвоите переменной FutLimit этот nil.
Вася написал: Владимир, потому что я, начинающий программист, выполняю заказ клиента. Таково его желание. Ему нужно выводить в эксель те данные, которые он сам выберет в ТТТ. И он, естественно, не сможет залезть в код и добавить новую колонку когда решит это сделать. Он сможет только добавить новую колонку в ТТТ и она должна быть выведена. Сложность в том, что выводить данные нужно не только из ТТТ, а еще из одной самодельной таблицы. Вот я и хотел объединить их сперва как-то, а потом сборную таблицу вывести.
Пусть ваш клиент работает с вашей пользовательской таблицей напрямую, а не с ТТТ. Сделайте в этой таблице возможность добавлять новые колонки, а все данные будете получать через getParamEx.
Еще решил написать, мало ли кто не в курсе, что работает целочисленное деление "//": "Целочисленное деление ('//') всегда преобразует свои операнды в integer и дает в результате integer. Преобразование происходит посредством округления операндов в меньшую сторону, как это делает функция math.floor".
Кто-то из поддержки вроде писал, что удалить метки не получится, так как графика уже нет, то есть при завершении работы терминала вы их не удалите, поэтому удаляйте старые метки при запуске.
Владимир написал: Да, она пока что "охватывает далеко не все случаи" - новая версия должна охватить всё недостающее.
Не охватит. Вы забываете, что народ занимается не только реализацией роботов, но и разработкой разных полуавтоматов с риск- мани-менеджментом, решений для проп-трейдинга, поддержкой групп клиентов и т.д. Вы же не собираетесь все это в свой скрипт запихивать.