QUIKSharp icon indicating copy to clipboard operation
QUIKSharp copied to clipboard

AddLabel, DelLabel и индикаторы в QUIK

Open Pr0phet1c opened this issue 5 years ago • 13 comments

спасибо за ответы. принял информацию.

pdf + chm нашел/скачал.

позвольте еще вопрос. если ветка не та подскажите куда можно задавать вопросы.

из chm/pdf AddLabel - добавляет метку с заданными параметрами, DelLabel - удаляет метку с заданными параметрами, эти методы есть в ServiceFunction.cs

а как на график добавить несколько горизонтальных индикаторов? из chm SetRangeValue - устанавливает указанное значение на выбранной линии для определенного интервала индексов свечей индикатора.

из pdf 7.2.8 SetRangeValue Функция предназначена для установки указанного значения на выбранной линии для определенного интервала индексов свечей индикатора: BOOLEAN SetRangeValue(NUMBER line_number, NUMBER start_index, NUMBER end_index, NUMBER value) Параметры: • line_number – номер линии; • start_index – индекс начальной свечи интервала; • end_index – индекс конечной свечи интервала; • value – устанавливаемое значение. Функция устанавливает значение value для линии line_number от индекса start_index до индекса end_index включительно.


в коде такого не нашел... подскажите где взять и как использовать? (ну или куда копать)

Originally posted by @iflash5 in https://github.com/finsight/QUIKSharp/issues/205#issuecomment-527456234

Pr0phet1c avatar Sep 03 '19 13:09 Pr0phet1c

С помощью данной библиотеки (а точнее команд AddLabel и DelLabel) нельзя рисовать индикаторы в терминале QUIK. Сам с метками плотно не работал, но на сколько помню эти команды нужны, чтобы ставить именно одиночные метки на графике. Причем. для того, чтобы это работало, нужно еще и в самом терминале идентификаторы графикам назначать, что не очень хорошо совместимо с идеей выноса программного кода за пределы терминала. Все пользовательские индикаторы для квика пишутся исключительно на QLua. В справку к терминалу есть соответствующий раздел, посвященный этой теме.

Pr0phet1c avatar Sep 03 '19 14:09 Pr0phet1c

С помощью данной библиотеки (а точнее команд AddLabel и DelLabel) нельзя рисовать индикаторы в терминале QUIK. Сам с метками плотно не работал, но на сколько помню эти команды нужны, чтобы ставить именно одиночные метки на графике. Причем. для того, чтобы это работало, нужно еще и в самом терминале идентификаторы графикам назначать, что не очень хорошо совместимо с идеей выноса программного кода за пределы терминала. Все пользовательские индикаторы для квика пишутся исключительно на QLua. В справку к терминалу есть соответствующий раздел, посвященный этой теме.

правильно ли понимаю что с помощью этой библиотеки нельзя от начала до конца реализовать алгоритм следующего робота?

А именно:

  1. подключиться к квик и к графику
  2. получить данные за произвольный период + еще какие-то данные
  3. сделать выводы (запустить алгоритм)
  4. добавить на график визуальную часть которая показывает алгоритм принятия решений(для контроля)
  5. сделать заявки, стопы и пр
  6. повеситься на события и ждать результата, подсчитывать промежуточные значения
  7. переход к пункту 2 ну и все это исключительно из c# без Lua.

Ну и главный вопрос: если все-таки очень захочется из c# сделать визуальную часть на график, то как это сделать? куда копать?

и правильно ли я понимаю что нужно будет добавить функцию в Lua скрипт и сделать обертку на c# или нужно будет еще ковырять библиотеку на c++? (очень надеюсь что есть решение без этого...)

если есть функции в c# которые могут что-то рисовать, пожалуйста скажите как они называются.

п.с. прямо сейчас пишу тестового робота сделал 1,2,3 пункты и отладил. 4 не знаю как сделать и он очень нужен. 5,6 - сделал заготовку.

п.п.с это то что нашел в тестах

   [Test]
    public void addLabel()
    {
        var res = _q.Service.AddLabel(61000, "20170105", "100000", "1", "C:\\ClassesC\\Labels\\buy.bmp", "si", "BOTTOM", 0);
        Console.WriteLine("AddLabel: "
                + String.Join(",", Convert.ToString(res.Result)));
    }

iflash5 avatar Sep 03 '19 14:09 iflash5

@iflash5 Всё, что можно сделать из QLua API, можно сделать и через эту библиотеку, но ее нужно будет дописать. Никто этого не делал, потому что:

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

Можете реализовать этот функционал и прислать pull request.

buybackoff avatar Sep 03 '19 15:09 buybackoff

Ну, даже если каким-то макаром получится устроить рисование индикаторов на графиках в квике, то это будет "костыль" работающий ооочень медленно и неэффективно. Повторюсь, изначально разработчики терминала вынесли написание скриптов для рисования индикаторов в совершенно самостоятельный процесс, и написанные на QLua индикаторы представляют из себя отдельный файл для каждого индикатора, копируемый в специальный каталог терминала (LuaIndicators). Рисовать что-то на графике можно, но я бы не рекомендовал использовать эту возможность больше чем на рисование мест и времени совершения сделок (возможно, с комментариями). На всякий случай сразу предупреждаю, каждую нарисованную на графике метку придется так же по отдельности и стирать. Я как-то давно попробовал и почти сразу "забил" на это дело. Слишком нерациональная трата ресурсов получается (imho). Я с индикаторами поступаю так:

  1. пишу индикатор на QLua, отлаживаю его в терминале, чтобы он работал так как я задумал.
  2. пишу такой же индикатор на c# (просто выполняю расчет в таблицу данных).
  3. Проверяю, что расчетные данные в c# совпадают с визуальными графиками в терминале.
  4. Использую в роботе результаты расчетного графика из c#.

Идентификаторы графиков не использую принципиально, чтобы никак не зависеть от настроек окон в терминале. Визуализацию сделок на графике тоже не выполняю (хотя иногда было бы удобно, наверное). Все сделки логирую и обрабатываю отдельной программой по чтению логов. Если считать каждое сочетание "алгоритм" + "инструмент (или связка инструментов)" отдельным роботом, то только в одном терминале у меня одновременно крутится около 60-ти роботов. Какая к чертям визуализация на графиках??? Терминал и так подыхает после дисконнектов.

Pr0phet1c avatar Sep 03 '19 16:09 Pr0phet1c

Я имел в виду, что повторить API QLua из C# довольно просто, но потом пользоваться этим непонятно как и сложно, согласен с @Pr0phet1c.

Вот эти: image

Индикаторы совсем отдельная история, я бы даже не пытался.

buybackoff avatar Sep 03 '19 17:09 buybackoff

для понимания обрисую картину: с терминалом и lua я знаком 12 часов... c#.net от начала создания. поэтому если буду задавать глупые вопросы прошу прощения заранее ибо стараюсь обучиться быстро. да пролистал кучу документации в т.ч. с оф сайтов всего околотемного. если в чем-то ошибся буду признателен на исправления. на текущий момент пытаюсь понять как делать "графику на lua" и как ее использовать из c#.

Весь этот ммм комплекс для меня работает так: мы запускаем терминал внутри терминала запускаем скрипт на lua который ожидает внешнего вызова вызов приходит мы его отрабатываем. Не помню по исходникам как точно это происходит, но что-то типа название функции и параметры все в строке. Отсуда вывод новые функции добавляются на lua на стороне терминала и их можно будет вызывать. с c# прямого соединения нет используем библиотеку c++ и к ней обертку на c#. (для меня это место кажется странным потому что исходников библиотеки с++ не нашел и оценить насколько она стабильна не могу, но выделять время на ее замену пока не вижу смысла для себя) Возникали такие вопросы: как вообще на lua можно понять что вы запущены под тем или иным приложением? Нашел chm где сказано вызовите такую-то функцию получите то-то.. на мой взгляд рабочее решение, но под сомнением не секьюрное.

Далее меня смущает то что если правильно понимаю, то данные можно получать только из текущего открытого окна где график нарисован... не понимаю почему. Если объясните было бы здорово.

Почему нельзя полностью управлять клиентом? Без открытия окон произвольно получать данные за ну не знаю за 1970й год с шагом 1 час или день..? почему нельзя открыть окно через lua? Туда же вопрос выставив шаг 1 день уже в c# в свечах время всегда 00-00-00.... а мне например хочется вызвать AddLabel, а она принимает время... я понимаю что формально получаю за день, но почему именно на это время и непонятно за какой период получаю? только за тот что вижу в окне? а как увеличить?

Далее я могу неправильно использовать терминологию для меня индикаторы, label и картинки - это все графика как WinForms-Canvas нарисовать кружочки, квадратики и пр... Есть подозрение что индикаторы сложнее типа это некая формула по которой строится график например y=5, x=7, y=8*x и т.д. но опять же хорошо... как хотя бы нанести текст рядом с конкретной свечей? Например текст "привет"?

var candle = alg.Chart.Candles.Last();
var date = $"{candle.Datetime.year:D4}{candle.Datetime.month:D2}{candle.Datetime.day:D2}";
var time = $"{candle.Datetime.hour:D2}{candle.Datetime.min:D2}{candle.Datetime.sec:D2}";

var res = connection.Quik.Service.AddLabel( (double)alg.Data date, time,
                "привет",
                "buy.png", "GZU9", "BOTTOM", 0);

            Common.Logger.Debug("AddLabel: " + string.Join(",", Convert.ToString(res.Result)));

res.Result всегда = 0 и визуально ничего не добавляется.... Сюда же кстати вопрос почему double? ведь decimal всегда точнее, а операции вида

double a = x;  ///некое число
double b = x; // то же самое число
if (a==b){
  // не сработает с отличной он нуля вероятностью. double всегда нужно сравнивать с некой delta и double не применимо для бухгалтерии
}

фигово работают из-за откруглений в отличае от decimal как раз предназначенных для денег. возможно это обусловленно lua?

Ну, даже если каким-то макаром получится устроить рисование индикаторов на графиках в квике, то это будет "костыль" работающий ооочень медленно и неэффективно. Повторюсь, изначально разработчики терминала вынесли написание скриптов для рисования индикаторов в совершенно самостоятельный процесс, и написанные на QLua индикаторы представляют из себя отдельный файл для каждого индикатора, копируемый в специальный каталог терминала (LuaIndicators).

да я видел это и подгружал сторонние индикаторы. насколько я понимаю lua интерпритируемый и не должен работать быстро. в данной ситуации смущает что мне дважды нужно прописывать алгоритм первый раз в c# для выводов, второй раз в lua чтобы нарисовать что-то... спрашивается зачем тогда c#? зачем делать двойную работу? пока для меня это непонятно и я стремлюсь свести к минимуму использование lua.

Рисовать что-то на графике можно, но я бы не рекомендовал использовать эту возможность больше чем на рисование мест и времени совершения сделок (возможно, с комментариями).

ну мне хотелось нарисовать 5-7 горизонталей, 3-5 вертикатей, 5 стрелок, 2-3 угловых графика, 10 надписей и может еще 3-4 прямоугольника - это максимум.

Более того хотелось бы так же написать полностью отказоустойчивого клиента, а именно автоматическое переподключение к quik клиенту в случае обрыва в т.ч. убивание процесса клиента и перезапуск программы и тоже самое со стороны quik клиента + sms, звонки и пр. ну т.е. не игрушку, а продакш систему.

На всякий случай сразу предупреждаю, каждую нарисованную на графике метку придется так же по отдельности и стирать. Я как-то давно попробовал и почти сразу "забил" на это дело. Слишком нерациональная трата ресурсов получается (imho). Я с индикаторами поступаю так: 1. пишу индикатор на QLua, отлаживаю его в терминале, чтобы он работал так как я задумал. 2. пишу такой же индикатор на c# (просто выполняю расчет в таблицу данных). 3. Проверяю, что расчетные данные в c# совпадают с визуальными графиками в терминале. 4. Использую в роботе результаты расчетного графика из c#.

вот об этом и говорил двойная работа... в чем смысл...?

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

т.е. по сути.. используете свой "рисовальщик"... вам клиент quik нужен только для получения данных и выполнения операций отрисовку делаете в своем приложении.. к слову ... нафиг тогда нужен клиент? нельзя ли как-то по прямой подключиться к брокеру(или как оно называется)?? ведь клиент в данном случае костыль...

Если считать каждое сочетание "алгоритм" + "инструмент (или связка инструментов)" отдельным роботом, то только в одном терминале у меня одновременно крутится около 60-ти роботов. Какая к чертям визуализация на графиках??? Терминал и так подыхает после дисконнектов.

возникают вопросы к терминалу ((( он похоже реально костыль и очень криво написан раз не может отрисовать тривиальную графику в сотней другой окон адекватно быстро.

не знаю если далеко вперед смотреть 60 роботов кажется мелочью .. мысль доходить до нескольких сотен.

В любом случае спасиб за ответ.

iflash5 avatar Sep 03 '19 19:09 iflash5

Вот эти: image

как заставить их работать? тесты в исходниках проходятся, но там 2017 год и визуально ничего не рисуется.

var candle = alg.Chart.Candles.Last();
var date = $"{candle.Datetime.year:D4}{candle.Datetime.month:D2}{candle.Datetime.day:D2}";
var time = $"{candle.Datetime.hour:D2}{candle.Datetime.min:D2}{candle.Datetime.sec:D2}";

var res = connection.Quik.Service.AddLabel( (double)alg.Data date, time,
                "привет",
                "buy.png", "GZU9", "BOTTOM", 0);

            Common.Logger.Debug("AddLabel: " + string.Join(",", Convert.ToString(res.Result)));

пробовал так res.result = 0 визуально ничего нет.

iflash5 avatar Sep 03 '19 19:09 iflash5

@iflash5 Вы уже явно вышли в зону личной консультации. Так много написанного я даже читать времени не найду сейчас. Пожалуйста, используйте issues для сообщения о багах или предложения новых фич. Или вопросы по конкретным строчкам кода, а не Вашей личной задаче. Если у Вас есть время столько написать, то найдите, пожалуйста, время разобраться с библиотекой самостоятельно.

buybackoff avatar Sep 03 '19 19:09 buybackoff

@iflash5, позволю себе дать один совет: Если у Вас не получается сделать что-то в QUIKSharp, сделайте это сначала на QLua. Для этого есть справка в терминале и дополнительная информация в интернете, на соответствующих ресурсах. Как только у Вас получится выполнить соответствующий кусочек кода на QLua, то и в QUIKSharp`е проблема решится с вероятностью 99%.

Pr0phet1c avatar Sep 04 '19 07:09 Pr0phet1c

@Pr0phet1c

@iflash5, позволю себе дать один совет: Если у Вас не получается сделать что-то в QUIKSharp, сделайте это сначала на QLua. Для этого есть справка в терминале и дополнительная информация в интернете, на соответствующих ресурсах. Как только у Вас получится выполнить соответствующий кусочек кода на QLua, то и в QUIKSharp`е проблема решится с вероятностью 99%.

спасибо)

iflash5 avatar Sep 04 '19 08:09 iflash5

@Pr0phet1c

вы написали выше о тормозах в клиенте квик, а пробовали очередь потоков через стек как описано в книге(использование lua на рабочем месте) чтобы разгрузить основной процесс? помогает-не помогает?

и еще вопрос - можно ли здесь это обсуждать ну что-то про Lua или нужно использовать отдельный форум? если знаете толковый - подскажите.

iflash5 avatar Sep 04 '19 14:09 iflash5

  1. Я даже не понимаю, о чем Вы говорите (это я про стек, и какую-то книгу). Впервые, я столкнулся с тормозами самого квика, когда мне потребовалось запускать одновременно около 20-ти роботов, написанных на Lua. Именно тогда я пришел к выводу о необходимости выноса всей расчетной логики роботов за пределы процесса quik. QUIKSharp меня спас. Сейчас проблема не в тормозах квика, там иные проблемы, которые нет смысла обсуждать в рамках данной темы.
  2. Здесь не стоит обсуждать Lua. Тут мы обсуждаем проблемы/баги/доработки библиотеки. Вот Вам ссылка на профильный ресурс (когда-то он мне сильно помог): https://quik2dde.ru/index.php

Pr0phet1c avatar Sep 05 '19 07:09 Pr0phet1c

Похоже что формат рисования метки поменялся. Мне тоже не удается поставить метку на графике ` private void Button_Click(object sender, RoutedEventArgs e) { DateTime date = DateTime.Now; double price = 112500; string curDate = date.ToString("yyyyMMdd"); string curTime = date.ToString("HHmmss"); string hint = "Текст всплывающей подсказки "; string path= @"‪C:\Users\Papa\Pictures\sell.bmp"; string tag="graf_RI"; string alignment = "LEFT"; double backgnd=0;

       _quik.Service.AddLabel(price, curDate, curTime, hint, path, tag, alignment, backgnd);
    }`

график метка есть и файл sell.bmp тоже есть. Формат стал другой вродебы http://luaq.ru/AddLabel.html

Задача отразить точки входа и выхода на графике при работе с виртуальным счетом и тестирование робота. По другому не нашел как это делать.

Prival1 avatar Apr 29 '20 13:04 Prival1