Enter Trade 0.1 - Торговый привод для терминала Quik с открытым исходным кодом
Пользователь
Сообщений: Регистрация: 08.05.2020
27.05.2020 13:54:15
Опубликовал сегодня первую версию торгового привода Enter Trade 0.1 для терминала Quik на Smart-Lab.
Привод умеет: открывать длинную позицию, открывать короткую позицию с заданным объемом, закрывать позицию частично либо полностью, автоматически выставлять защитные стоп-ордера (тип стоп и тейк №9).
Дополнительно умеет: генерировать журнал сделок, рассчитывать максимальный объем контрактов для входа в позицию, максимально допустимый размер стоп-лосса при заданных параметрах риск-менеджмента, также имеется возможность создавать оповещения с звуковым сигналом по различным событиям.
В рабочем окне привода отображается основная повседневная информация для трейдера о текущих открытых позициях, о количестве стоп-заявок по инструменту, о текущем состоянии счета, об изменении счета за день, о текущем состоянии сессии.
Комментарии и замечания по исходному коду приветствуются.
Больше информации на Smart-Lab.ru -
Торговый привод на Lua:
Вопрос про демо-счета Quik
Пользователь
Сообщений: Регистрация: 08.05.2020
26.05.2020 19:07:46
Просмотрел практически все демо-счета которые есть у брокеров для Quik для срочного рынка и не могу понять почему они так сильно отличаются от реала? а именно по времени сессии. Есть ли демо приближенное к реальным торгам?
Всё подробно написано как устанавливать. Надеюсь, у вас не 8.5 версия (где Lua версию изменили)
Пока решил остаться на Quik 7 - поэтому библиотека w32.dll оказалась очень кстати. Единственный нюакнс который заметил - как полагаю на время запуска звука приостанавливает работу скрипта. Может ошибаюсь - но все же это доли секунд.
Не вполне понятно, как связаны между собой вопрос о факте закрытия текущей свечи и проверка "простого условия" с пересечением графика МА и графика цены.
Первая задача решается проверкой времени - Вы знаете интервал, время начала/окончания торгов. На основании этих данных знаете какая свеча когда открывается и закрывается. Далее сравниваете текущее время - попадает ли оно в диапазон времени расчёта текущей свечи, или вышла за него. Касательно проверки "простого условия" - количество выполнения блока программы при выполнении определённого условия зависит от реализации самого условия и программы в целом - надо предусмотреть и/или пересмотреть механизмы от многочисленных малоинформативных срабатываний.
В текущей формулировке Вашей задачи едва ли можем предложить более содержательный ответ. Просьба уточнить суть Вашей задачи, которую пытаетесь решить.
Уже решил. Что бы не срабатывало по много раз когда идет одно и тоже событие, оно просто записывается в общую переменную и как итог срабатываем как и должно 1 раз.
написал: Но не могу найти внятного пояснения как оно рассчитывается в плане формулы?
Представления не имею, как в экселе формулы устроены. По логике средневзвешенного вот так
Код
-- Функция рассчета средневзвешенного
-- Средневзвешенное значение = (x1*w1 + x2*w2 + x3*w3) / (w1+w2+w3)
-- x1,x2,x3 - это значение (например цена)
-- w1,w2,w3 - вес каждого
-- $a = [10,20,30];
-- $b = [5,6,7];
-- $ar = array_map(function($e1,$e2){ return $e1*e2; }, $a, $b);
-- $result = array_sum($ar)/array_sum($b);
-- }
function _QuikUtilityWeightedAverage(ar1,ar2)
local ar1_map = {};
for i=1, #ar1 do
ar1_map[#ar1_map+1] = ar1[i] * ar2[i];
end;
local sumAr1 = 0;
for i=1, #ar1_map do
sumAr1 = sumAr1 + ar1_map[i];
end;
local sumAr2 = 0;
for i=1, #ar2 do
sumAr2 = sumAr2 + ar2[i];
end;
return tonumber(sumAr1/sumAr2);
end;
Торговый привод на Lua:
OnTrade и стоп-заявка
Пользователь
Сообщений: Регистрация: 08.05.2020
23.05.2020 11:09:33
Цитата
swerg написал: Стоп-заявки - сущность сервера QUIK, не биржи. Так что "отклоняет" их - сервер QUIK, При отклонении стоп-заявки сервер всегда присылает причину (текстом). Например, "недостаточно средств", т.к. иногда под стоп-заявку требуются средства. Если бы вы озвучили этот текст причины - была бы возможность ответить более предметно.
И было бы здорово, если бы вы уточнили: как связана тема и содержание вопроса??
У меня в OnTrade выставляется стоп-заявка (купилось 3 контракта - отправиться 3 стоп-заявки по 1 контракту). На длительном промежутке времени иногда возникает такая ситуация, что нет нескольких высталенных стопов.
К примеру бала сделка 10 контрактов. Она исполнилась по 2,3,5 контрактов. Соответственно должно быть выставлено 10 стопов. А по факту получается выставлено только 7. Это не всегда, но бывают единичные случаи. Вот и хотел бы понять с чем может быть связано не доставление 3 стоп-заявок.
Торговый привод на Lua:
OnTrade и стоп-заявка
Пользователь
Сообщений: Регистрация: 08.05.2020
22.05.2020 13:29:47
Есть ли объективные причины почему сервер, биржа могут отклонить правильно оформленную стоп-заявку? В каких случаях это может произойти?
Торговый привод на Lua:
Жизнеспособность идеи - 100 контрактов = 100 стоп-ордеров по 1 контракту каждый
Пользователь
Сообщений: Регистрация: 08.05.2020
22.05.2020 13:28:09
Как оказалось жизнеспособно - 10, 20, 30 контрактов. И нет нужны заморачиваться на ORDER_MODIFY(). На очень большое кол-во контрактов пока не тестировал.
По логике последовательность вызовов должна быть жесткой: OnTransReply --> OnOrder --> OnTrade (***).
Да, верно. Однако могут приходить в любом порядке. Заранее нельзя быть уверенным в порядке срабатывания.
Сообщение старое - актуально ли данное по сегодняшний день в плане хаотичности очередности функций OnTransReply (), OnOrder (), OnTrade ()? Или были какие-то исправления в плане жесткой фиксации последовательности, т.к. в моем понимании она должна быть такой как пишет автор? Были ли изменения?
Торговый привод на Lua:
Неправильное значение Totalnet в функции onTrade()
написал: Последовательность событий OnTrancReply(), OnOrder(), OnTrade(), имеют всегда жесткую последовательность исполнения, или же могут в разном порядке сработать?
Нет. Фиксированной последовательности нет. Скрипт следует писать так, чтобы он корректно работал при абсолютно любой последовательности вызова этих событий. Более того, OnOrder() и OnTrade() могут быть вызваны по несколько раз для одной и той же заявки и сделки.
Чисто теоретически OnTrancReply() вовсе может не быть вызван (например, терминал потерял связь после отправки транзакции), но будем считать, что это слишком экзотический случай, хотя и вполне реальный, такие сообщения на форуме были.
Вот допустим прошла сделка, но Total еще не обновился. Можно ли как-то понять что после сделки и значение Total тоже актуализировалось. У меня бывают такие случаи что сделка прошла, а тотал еще не обновлен, а я уже использую его значение... Как быть?
{
{ direction = 'B' , value = 33000.0 },
{ direction = 'S' , value = 32000.0 },
}
Нашел способ посчитать через средневсзвешенное. В Excel это формула =СУММПРОИЗВ(E1:E10;F1:F10)/СУММ(F1:F10). Но не могу найти внятного пояснения как оно рассчитывается в плане формулы?
Торговый привод на Lua:
Функция getCandlesByIndex() и закрытие свечки
Пользователь
Сообщений: Регистрация: 08.05.2020
22.05.2020 13:13:01
Цитата
Sergey Gorokhov написал: , Для этого нужно понять что сделок больше не будет. А этого никто не может знать, т.к. в будущее никто смотреть не умеет.
Нужно либо ждать появления новой свечи, либо проверять текущее время. Либо использовать оба варианта сразу.
А как тогда делать проверку - написал простое условие - если цена пересекла MA - то вылазит сообщение. Но проблема в том сообщение будет вылазить не 1 раз, а бесконечно...
Торговый привод на Lua:
Вопрос про Сallback-и и их потерю
Пользователь
Сообщений: Регистрация: 08.05.2020
22.05.2020 13:11:42
Фух, а то думал это и правда.
Торговый привод на Lua:
Вопрос про Сallback-и и их потерю
Пользователь
Сообщений: Регистрация: 08.05.2020
22.05.2020 12:53:18
Сегодня наткнулся на интересный пост на смарт-лабе:
Цитата
1. Впервые слышу про то, что колбэки в очередь встают. На сколько мне известно — такого никогда не было. Если Вы выполняете вычисления непосредственно внутри функции OnTrade, и не успели их завершить до прихода следующего колбэка, то пришедший колбэк теряется.
Неужели это действительно так? Что не успел отработать коллбэк и вернуть результат, тут приходит новый и затирает собой предыдущий?
Судя по ответам прихожу к выводу что проблематично это нескольких роботов запускать на 1 инструмент в рамках 1 счета.
Но
Если у Вас робот имеет свой внутренний алгортим и не опирается например на то: - сколько сделок было сегодня - сколько убыточных сделок было - интервал между сделками - кол-во открытых контрактов - и другие общие данные,
то да наверное это возможно Пока отказался от этой идеи.
написал: идентификатор в поле комментарий при открытии/закрытии позиций
На одном инструменте хоть сто роботов могут торговать и каждый по свой логике. Фильтр по комментарию как раз дает такую возможность - новый бот - новый уникальный комент. У меня имя робота - это комментарий к заявке - если имена ботов разные - торгуем хоть миллиард стратегий на одном инструменте.
Получается Вам что бы понять сколько у Вас открыл контрактов или закрыл нужно постоянно анализировать таблицу сделок?
Торговый привод на Lua:
Функция getCandlesByIndex() и закрытие свечки
Пользователь
Сообщений: Регистрация: 08.05.2020
21.05.2020 09:54:09
Как при использовании функции t, n, l = getCandlesByIndex(tag, line, first_candle, getNumCandles(tag)); понять что последняя свеча уже закрылась или последнее значение индикатора уже рассчитано?
Торговый привод на Lua:
Несколько Lua-роботов на 1 инструменте
Пользователь
Сообщений: Регистрация: 08.05.2020
21.05.2020 09:52:25
На данном форуме вычитал что многие дают роботу идентификатор в поле комментарий при открытии/закрытии позиций. Не совсем понимаю как несколько роботов могут торговать на 1 инструменте? Ведь все равно сколько бы роботов не было - они будут опираться на общие данные а не анализ своих операций.
Торговый привод на Lua:
Журнал сделок и расчет результата сделок
Пользователь
Сообщений: Регистрация: 08.05.2020
21.05.2020 09:48:32
Цитата
Anton написал: Пусть у нас есть табличка луа в виде массива со сделками, у каждой сделки есть как минимум поля direction = { 'B' | 'S' } и value (объем в деньгах).
Код
function calc_result (tradelist)
local result = 0
for i,t in ipairs(tradelist) do
if t.direction = = 'B' then
result = result - t.value
elseif t.direction = = 'S' then
result = result + t.value
else
error( 'WTF' )
end
end
return result
end
Можно пожалуйста пример нескольких строк из таблицы привести.
Торговый привод на Lua:
Журнал сделок и расчет результата сделок
Пользователь
Сообщений: Регистрация: 08.05.2020
20.05.2020 23:04:50
Цитата
Anton написал: Сделка это один пункт из вашего списка, у нее результат "купились/продались икс контрактов по цене игрек". А результат серии сделок посчитать так: завести переменную, равную 0. Каждый раз, когда что-то купилось, уменьшать переменную на объем покупки. Каждый раз, когда что-то продалось, увеличивать ее на объем продажи. Когда закрылось все, в переменной останется чистая разница по всем проведенным сделкам. Считать можно как в реалтайме, так и задним числом по списку сделок.
Не совсем понял как посчитать - можно пожалуйста пример.
Торговый привод на Lua:
Журнал сделок и расчет результата сделок
Пользователь
Сообщений: Регистрация: 08.05.2020
20.05.2020 21:29:25
К примеру было куплено 10 контрактов.
5 купились по цене 103100 3 купились по цене 103101 2 купились по цене 103102
Проходит время мы сделали докупку на 5 контрактов. 4 купились по цене 103250 1 купился по цене 103251
Проходит время мы решили закрыть часть позиций (а именно 10 контрактов). 5 было закрыто по цене 103500 5 было закрыто по цене 103501
Проходит еще время и мы решили закрыть все. 1 был закрыт по цене 103602 1 был закрыт по цене 103603 1 был закрыт по цене 103604 1 был закрыт по цене 103605 1 был закрыт по цене 103606
Как посчитать результат сделки?
Если бы это был открыт 1 контракт, либо было открыто 10 контрактов по одной и той же цене, и аналогично если бы было закрыто все по 1 цене - здесь вопросов нет...
Торговый привод на Lua:
Идентификатор для метки
Пользователь
Сообщений: Регистрация: 08.05.2020
20.05.2020 12:22:20
Цитата
Sergey Gorokhov написал: , Зачем? у метки есть ID по которому Вы можете делать с ней что угодно
1) Создаю 2 метки из Lua-скрипта с помощью
Код
-- label_params = {
-- TEXT = "----------------=ТЕСТ=----------------",
--DATE = 20200430,
--TIME = 221000,
--YVALUE = 110900,
-- R = 200,
-- G = 200,
-- B = 200,
-- -- HINT = "-----------------------"
-- };
-- label_id = AddLabel("priceTest", label_params);
Как понял из документации можно создать только метку, нельзя добавить горизонтальную линию к пример...? Получается я создал этим скриптом две метки. Когда я закрываю квик и скрипт по новому запускается - то у меня опять создаются уже еще две новые метки. Как отследить и как их не дублировать?
2) - можно ли в созданном индикаторе добавить две линии на график с возможностью их перетаскивания вверх/вниз как стоп-лосс?,
написал: Возможно ли для добавленной метки задать идентификатор?
Здравствуйте, Идентификатор задается НЕ на метке, а на графике на котором надо эту метку нарисовать. задать программно идентификатор к сожалению нельзя
Имею в виду немного другое. Я бы хотел поставить метку на графике, нарисовать линию, или фигуру и ей задать индетификатор как графику цены например. Это возможно?
Торговый привод на Lua:
Идентификатор для метки
Пользователь
Сообщений: Регистрация: 08.05.2020
20.05.2020 11:13:59
Возможно ли для добавленной метки задать идентификатор? Либо сделать такой индикатор 2 линии которого можно будет двигать на графике? Просто двигать как передвигается стоп-лосс мышкой.
Нет, такой возможности нет - MA привязан к текущему интервалу графика, который может быть только один для одного окна графика.
Наиболее вероятно, Вашу задачу можно решить пользовательским индикатором на LUA. Необходимую информацию и примеры для написания собственных индикаторов Вы можете найти по следующей .
Вопрос немного в другом. 1) Можно ли на принципах индикатора нарисовать линию и после двигать ее мышкой на графике. 2) Можно ли запомнить ее ID что бы не отрисовывать дважды?
Торговый привод на Lua:
Индикатор с уровнями для 3 таймфреймов
Пользователь
Сообщений: Регистрация: 08.05.2020
14.05.2020 23:40:24
Если мы нанесем на график индикатор MA то при переключении между таймфреймами м5, ч1, и д1 он каждый раз перересуетс в зависимости от таймфрейма. Возможно ли сделать так что бы индикатор рисовал различные уровни для трех таймфреймов? Желтые для м5, синие для ч1, и красные для д1. Т.е. на каком бы таймфрейме мы не были из этих трех все равно бы нарисовались три типа уровней...?
Торговый привод на Lua:
Создание таблицы в Lua
Пользователь
Сообщений: Регистрация: 08.05.2020
14.05.2020 13:04:02
Цитата
Sergey Gorokhov написал: , Ну вкладки есть, с этим никто не спорит. А вот функционала работы с ними в QLUA нету. Т.е. QLUA не умеет заранее определять на какой вкладке ему рисовать окно, поэтому рисует его на всех.
Вот теперь понятно. Прихожу к выводу тогда что каждый раз надо перезапускать скрипт.
Торговый привод на Lua:
Реализация скользящего стопа
Пользователь
Сообщений: Регистрация: 08.05.2020
13.05.2020 14:53:45
Цитата
написал:
Цитата
написал: Пересмотрел все виды стопов в Quik и не совсем понимаю как реализуется скользящий стоп на Lua? Это простое и банальное удаление и перевыставление стопа на Lua?
Смотрите условную заявку Тейк+Стоп. С ее помощью трейлинг стоп с фиксированным (неизменным) отступом от экстремума цены делается на раз.
Почему то трейлинг стоп всегда думал что это нечто другое. А по факту получается что стоп в БУ и трейлинг стоп это одно и тоже (разница в том что БУ переносится 1 раз).
Торговый привод на Lua:
Список всех идентификаторов графиков на текущий момент в Quik
Пользователь
Сообщений: Регистрация: 08.05.2020
13.05.2020 12:18:37
Цитата
nikolz написал: перечень встроенных индикаторов не меняется. поэтому его можно записать в текстовый файл
К сожалению это не универсальное решение, т.к. все равно каждый забьет свой идентификатор по своим правилам.
Торговый привод на Lua:
Всплывающее окошко Message() - кожно ли убрать?
Пользователь
Сообщений: Регистрация: 08.05.2020
13.05.2020 11:26:39
Цитата
swerg написал: Ответ на вопрос нагуглить несложно так-то
F9 --> Сообщения --> снять галку "показывать окно сообщений"
Т.е. в этом приводе как будто бы фокусровка (focus) снова ставиться не на окошко с №заявки, а на окно привода.
Торговый привод на Lua:
Создание таблицы в Lua
Пользователь
Сообщений: Регистрация: 08.05.2020
13.05.2020 10:48:57
Цитата
Sergey Gorokhov написал: Здравствуйте, Всё просто. В QLUA нет функционала работы со вкладками терминала и никогда не было. Если он Вам требуется можем предложить зарегистрировать пожелание на доработку
Почему вкладки есть. Те которые обычно "Инструмент с графиком такой-то", "депозит", "счет", "сделки" у кого как. Просто не совсем пойму логику работы "Сервисы > Lua скрипты...". Получается перед закрытием терминала Quik нужно выключить все скрипты, а когда запускаешь терминал по новому все запускать все скрипты?
Торговый привод на Lua:
Реализация скользящего стопа
Пользователь
Сообщений: Регистрация: 08.05.2020
13.05.2020 10:45:29
Пересмотрел все виды стопов в Quik и не совсем понимаю как реализуется скользящий стоп на Lua? Это простое и банальное удаление и перевыставление стопа на Lua?
Торговый привод на Lua:
Всплывающее окошко Message() - кожно ли убрать?
Пользователь
Сообщений: Регистрация: 08.05.2020
13.05.2020 10:12:14
Цитата
swerg написал: Ответ на вопрос нагуглить несложно так-то
F9 --> Сообщения --> снять галку "показывать окно сообщений"
Ничего не отключал в плане "снять галку". Нашел в сети привод:
Поставил - когда на нем совершаешь сделку, то окошко №заявки не появляется, вернее появляется но как бы в фоне. Посмотрел код привода - но так и не понял как добиться такого эффекта.
Торговый привод на Lua:
Создание таблицы в Lua
Пользователь
Сообщений: Регистрация: 08.05.2020
12.05.2020 22:53:54
Причем попробовал - это с любыми скриптами из интернета, которые генерируют таблицу. Quik 7.27.2.1
Торговый привод на Lua:
Всплывающее окошко Message() - кожно ли убрать?
Пользователь
Сообщений: Регистрация: 08.05.2020
12.05.2020 22:51:33
Можно ли как-то при совершении операции скрыть окно message()? Что бы сообщения выводились только на панели сверху в "Окно сообщений"?
Торговый привод на Lua:
Создание таблицы в Lua
Пользователь
Сообщений: Регистрация: 08.05.2020
12.05.2020 22:48:17
В function OnInit() создаю таблицу:
Код
-- Функция создает таблицу
function CreateTable()
-- Получает доступный id для создания
t_id = AllocTable();
-- Создаем колонки
AddColumn(t_id, 0, "", true, QTABLE_STRING_TYPE, 5);
AddColumn(t_id, 1, "", true, QTABLE_STRING_TYPE, 20);
AddColumn(t_id, 2, "", true, QTABLE_STRING_TYPE, 5);
AddColumn(t_id, 3, "", true, QTABLE_STRING_TYPE, 5);
t = CreateWindow(t_id);-- Создает таблицу
SetWindowCaption(t_id, "Enter trade 0.1"); -- Устанавливает заголовок
SetWindowPos(t_id, 100, 100, 252, 532); -- Задает положение и размеры окна таблицы
-- Дальше пошли строки и колонки...
end;
Оставляю окошко таблицы скрипта работающим - закрываю Quik. После запускаю Quik и вижу что это созданное окошко-таблицы почему-то становиться сквозным при переключении между вкладками. Что может быть не так сделано?
Хотелось бы понимать возможно ли запустить несколько экземпляров скрипта по 1 на каждой вкладке.
Торговый привод на Lua:
Список всех идентификаторов графиков на текущий момент в Quik
написал: Можно пример привести пожалуйста, можно проверить как? через ~= nil?
лучше проверить наличие легенды на графике, а не данные. Т.к. бывают ситуации когда график есть а данных на нем еще нет. Легенду можно увидеть через параметр l функции getCandlesByIndex Если пусто (не nil а именно пустое значение) значит идентификатора нет. t, n, l = getCandlesByIndex (tag, line, first_candle, count) if (l~="") then message("GOOD") else message("BAD") end
написал: мне приходится закрывать созданную таблицу
Вот для этого и нужно ошибки на границе ловить, чтобы подчистить за скриптом все им созданное. Для этого в луа есть метаметоды __gc, но в квике при ошибке они не работают, баг пока еще не поправили. Поэтому придется извращаться с ловлей ошибок pcall'ом. Что же касается автоматического перезапуска, что-то мне не думается, что это здравая идея. Запустите вы скрипт тестировать одним контрактом и уйдете, он купит контракт - рухнет, перезапустится через секунду, купит еще один - рухнет, и так на все плечи. Лет 15 назад у меня еще из старого велса так скрипт потестировался. Благо в плюс по итогу, а могло бы и не в плюс. Если скрипт упал, то пусть лежит уже до выяснения причины, это не есть один из допустимых сценариев его работы.
Транзакции на снятие/выставление заявок могут быть корректно сформированы и отправлены из рабочего места с точки зрения синтаксиса lua и функции qlua, но в зависимости от указанных параметров транзакции могут быть отклонены сервером в случае неверных данных. Например, неверный номер стоп-заявки, которую хотите снять. Или средств для выставления стоп-заявки с новыми параметрами может оказаться недостаточно в условиях текущих настроек ведения Ваших позиций брокером.
Если исключить эти моменты - то при штатной работе сервера QUIK транзакции будут корректно обрабатываться сервером и снимать/выставлять стоп-заявки. В противном случае - после/перед снятием/выставлением стоп-заявок рекомендуется выполнять проверки - была ли указанная стоп-заявка действительно снята / выставлена. Проверить статус какой-либо заявки и, соответственно, выполнение транзакции на снятие/выставление - можно с использованием функций "getItem", "getNumberOf", "SearchItems", и функций обратного вызова "OnOrder", "OnStopOrder".
Понял, спасибо. И еще появился вопрос про sendTransaction() про TRANS_ID. По большому счету генерация значения "TRANS_ID" на что-то влияет или нет. Можно например всем "TRANS_ID" ставить всегда = 1 и для ордеров, и для стоп-ордеров, и для отмены стоп-ордеров.
Вопрос по прежнему актуален про TRANS_ID.
Торговый привод на Lua:
Перезапуск LUA-скрипта из-за ошибок
Пользователь
Сообщений: Регистрация: 08.05.2020
12.05.2020 11:58:46
Цитата
Anton написал: Вы защитили только непосредственно тело включаемого скрипта, если он создаст какие-то функции и вы их потом вызовете из мейна например и будет ошибка в этой функции, она точно так же пролетит до квика. Заворачивать в pcall надо мейн и все колбеки, то есть ловить ошибки на границе с квиком. Ошибка при загрузке скрипта (типа синтаксической ошибки или не загрузилась длл) лучше вообще не ловить, пусть рушится, на этом этапе еще безопасно.
Поясню что мне не очень удобно. Когда скрипт падает - речь про весь скрипт, а не про те куски кода что обернул в dofile() - мне приходится закрывать созданную таблицу, снова открывать сервис, запускать скрипт, он создает таблицу, выравнивать ее, перемещать. Хотелось бы что бы исправил ошибку в файле Lua и он продолжил работу скажем через секунду.
s_mike@rambler.ru написал: Что мешает написать такой скрипт самому? Все средства для этого есть.
У меня получилось это сделать только для включаемых фаллов - пример:
Код
-- Alert
local callResult, result = pcall(dofile, getScriptPath () .. "\\Script.lua")
if callResult then
-- все в порядке, result это то, что вернула функция dofile
else
-- result это сообщение об ошибке
message (tostring(result));
sleep ( 5000 );
end ;
Но как это сделать для всего скрипта в целом?
Причем это включение идет в цикле while()
Торговый привод на Lua:
Перезапуск LUA-скрипта из-за ошибок
Пользователь
Сообщений: Регистрация: 08.05.2020
12.05.2020 11:24:04
Цитата
написал: Что мешает написать такой скрипт самому? Все средства для этого есть.
У меня получилось это сделать только для включаемых фаллов - пример:
Код
-- Alert
local callResult, result = pcall(dofile, getScriptPath().."\\Script.lua")
if callResult then
-- все в порядке, result это то, что вернула функция dofile
else
-- result это сообщение об ошибке
message(tostring(result));
sleep(5000);
end;
Но как это сделать для всего скрипта в целом?
Торговый привод на Lua:
Список всех идентификаторов графиков на текущий момент в Quik
написал: А можно как-то проверить существует такой идентификатор или нет?
Попробовать получить данные, если получилось значит есть.
Можно пример привести пожалуйста, можно проверить как? через ~= nil?
Торговый привод на Lua:
Перезапуск LUA-скрипта из-за ошибок
Пользователь
Сообщений: Регистрация: 08.05.2020
12.05.2020 10:52:32
Каждый раз когда в скрипте случается ошибка, приходится останавливать скрипт через сервисы, и по новому его запускать. Возможно ли как-то сделать так, что бы выпала ошибка - обычно ее смотрю в окне "Доступные скрипты", отредактировал скрипт и он перезапустился или продолжил работу дальше?
Торговый привод на Lua:
Список всех идентификаторов графиков на текущий момент в Quik
Пользователь
Сообщений: Регистрация: 08.05.2020
12.05.2020 10:42:38
Цитата
Sergey Gorokhov написал: Здравствуйте, Такой возможности не предусмотрено.
А можно как-то проверить существует такой идентификатор или нет?
Торговый привод на Lua:
Неправильное значение Totalnet в функции onTrade()
С этим не надо бороться, это нормальное поведение для event-driven архитектуры, с этим надо работать. Вы отправляете транзакцию (без немедленной ошибки) и уходите заниматься другими делами, а потом происходит что-то из: - явное подтверждение статуса транзакции (OnTransReply) - неявное подтверждение статуса транзакции (OnOrder, OnTrade, ...) - потеря соединения (OnDisconnected) - таймаут (т.е. никакого ответа вообще не получено за заданное время; это ваша задача, завести таймер) - крах скрипта (если ошибки ловите и обрабатываете, тут самое развеселье начнется) Все это может произойти в любом порядке и не один раз, к этому надо быть готовым и все. Заводите объект "транзакция номер id", по колбекам меняете его состояние. Когда состояние стало "консистентным" (все выполнено или все отклонено) - убиваете объект. Возможные дальнейшие события с этим id вас уже не волнуют, игнорируете их. В свою очередь объект "транзакция" может порождать или убивать объект "заявка", у того своя жизнь и свои события. В свою очередь объект "заявка" может влиять на объекты "сделка" и "позиция". Тут уже ближе к верхнему уровню, в конечном итоге все затевалось, чтобы изменить "позицию".
Что бы не обрабатывать №одной и той же заявки нашел такое решение.
Код
function OnTrade (trade)
-- Функция OnTrade() может высываться несколько раз...
if check_last_trade_num < trade_num then
check_last_trade_num = trade_num; -- Запомним номер последнего трейда
Сделал проверку в трех функциях: CheckLastNumOnTrade = 0; CheckLastNumOnOrder = 0; CheckLastNumOnStopOrder = 0;
Торговый привод на Lua:
Неправильное значение Totalnet в функции onTrade()
С этим не надо бороться, это нормальное поведение для event-driven архитектуры, с этим надо работать. Вы отправляете транзакцию (без немедленной ошибки) и уходите заниматься другими делами, а потом происходит что-то из: - явное подтверждение статуса транзакции (OnTransReply) - неявное подтверждение статуса транзакции (OnOrder, OnTrade, ...) - потеря соединения (OnDisconnected) - таймаут (т.е. никакого ответа вообще не получено за заданное время; это ваша задача, завести таймер) - крах скрипта (если ошибки ловите и обрабатываете, тут самое развеселье начнется) Все это может произойти в любом порядке и не один раз, к этому надо быть готовым и все. Заводите объект "транзакция номер id", по колбекам меняете его состояние. Когда состояние стало "консистентным" (все выполнено или все отклонено) - убиваете объект. Возможные дальнейшие события с этим id вас уже не волнуют, игнорируете их. В свою очередь объект "транзакция" может порождать или убивать объект "заявка", у того своя жизнь и свои события. В свою очередь объект "заявка" может влиять на объекты "сделка" и "позиция". Тут уже ближе к верхнему уровню, в конечном итоге все затевалось, чтобы изменить "позицию".
Что бы не обрабатывать №одной и той же заявки нашел такое решение.
Код
function OnTrade(trade)
-- Функция OnTrade() может высываться несколько раз...
if check_last_trade_num < trade_num then
check_last_trade_num = trade_num; -- Запомним номер последнего трейда
Транзакции на снятие/выставление заявок могут быть корректно сформированы и отправлены из рабочего места с точки зрения синтаксиса lua и функции qlua, но в зависимости от указанных параметров транзакции могут быть отклонены сервером в случае неверных данных. Например, неверный номер стоп-заявки, которую хотите снять. Или средств для выставления стоп-заявки с новыми параметрами может оказаться недостаточно в условиях текущих настроек ведения Ваших позиций брокером.
Если исключить эти моменты - то при штатной работе сервера QUIK транзакции будут корректно обрабатываться сервером и снимать/выставлять стоп-заявки. В противном случае - после/перед снятием/выставлением стоп-заявок рекомендуется выполнять проверки - была ли указанная стоп-заявка действительно снята / выставлена. Проверить статус какой-либо заявки и, соответственно, выполнение транзакции на снятие/выставление - можно с использованием функций "getItem", "getNumberOf", "SearchItems", и функций обратного вызова "OnOrder", "OnStopOrder".
Понял, спасибо. И еще появился вопрос про sendTransaction() про TRANS_ID. По большому счету генерация значения "TRANS_ID" на что-то влияет или нет. Можно например всем "TRANS_ID" ставить всегда = 1 и для ордеров, и для стоп-ордеров, и для отмены стоп-ордеров.
Торговый привод на Lua:
Неправильное значение Totalnet в функции onTrade()
Более того, OnOrder() и OnTrade() могут быть вызваны по несколько раз для одной и той же заявки и сделки.
А как с этим бороться? Полагаю данные приходят одни и те же по несколько раз?
Торговый привод на Lua:
Список всех идентификаторов графиков на текущий момент в Quik
Пользователь
Сообщений: Регистрация: 08.05.2020
12.05.2020 09:28:56
Возможно ли средствами LUA получить список всех зарегистрированных идентификаторов графиков, индикаторов, которые есть на данный момент. Просто список.