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

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

Страницы: Пред. 1 2 3 След.
Enter Trade 0.1 - Торговый привод для терминала Quik с открытым исходным кодом
 
Опубликовал сегодня первую версию торгового привода Enter Trade 0.1 для терминала Quik на Smart-Lab.

Привод умеет: открывать длинную позицию, открывать короткую позицию с заданным объемом, закрывать позицию частично либо полностью, автоматически выставлять защитные стоп-ордера (тип стоп и тейк №9).

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

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

Комментарии и замечания по исходному коду приветствуются.

Больше информации на Smart-Lab.ru - https://smart-lab.ru/blog/624023.php


Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Вопрос про демо-счета Quik
 
Просмотрел практически все демо-счета которые есть у брокеров для Quik для срочного рынка и не могу понять почему они так сильно отличаются от реала? а именно по времени сессии. Есть ли демо приближенное к реальным торгам?  
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Звук Lua в фоновом режиме
 
Цитата
swerg написал:
Вот проигрывание в фоновом режиме
https://quik2dde.ru/viewtopic.php?id=79

Всё подробно написано как устанавливать. Надеюсь, у вас не 8.5 версия (где Lua версию изменили)
Пока решил остаться на Quik 7 - поэтому библиотека w32.dll оказалась очень кстати.
Единственный нюакнс который заметил - как полагаю на время запуска звука приостанавливает работу скрипта. Может ошибаюсь - но все же это доли секунд.
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Функция getCandlesByIndex() и закрытие свечки
 
Цитата
Andrey Bezrukov написал:
Здравствуйте, Иван.

Не вполне понятно, как связаны между собой вопрос о факте закрытия текущей свечи и проверка "простого условия" с пересечением графика МА и графика цены.

Первая задача решается проверкой времени - Вы знаете интервал, время начала/окончания торгов. На основании этих данных знаете какая свеча когда открывается и закрывается. Далее сравниваете текущее время - попадает ли оно в диапазон времени расчёта текущей свечи, или вышла за него.
Касательно проверки "простого условия" - количество выполнения блока программы при выполнении определённого условия зависит от реализации самого условия и программы в целом - надо предусмотреть и/или пересмотреть механизмы от многочисленных малоинформативных срабатываний.

В текущей формулировке Вашей задачи едва ли можем предложить более содержательный ответ. Просьба уточнить суть Вашей задачи, которую пытаетесь решить.
Уже решил. Что бы не срабатывало по много раз когда идет одно и тоже событие, оно просто записывается в общую переменную и как итог срабатываем как и должно 1 раз.
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Журнал сделок и расчет результата сделок
 
Цитата
Anton написал:
Цитата
Иван написал:
Но не могу найти внятного пояснения как оно рассчитывается в плане формулы?
Представления не имею, как в экселе формулы устроены. По логике средневзвешенного вот так
Код
-- Функция рассчета средневзвешенного
-- Средневзвешенное значение = (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: https://github.com/iv-litovchenko/Quik-Enter-Trade
OnTrade и стоп-заявка
 
Цитата
swerg написал:
Стоп-заявки - сущность сервера QUIK, не биржи. Так что "отклоняет" их - сервер QUIK,
При отклонении стоп-заявки сервер всегда присылает причину (текстом). Например, "недостаточно средств", т.к. иногда под стоп-заявку требуются средства.
Если бы вы озвучили этот текст причины - была бы возможность ответить более предметно.

И было бы здорово, если бы вы уточнили: как связана тема и содержание вопроса??
У меня в OnTrade выставляется стоп-заявка (купилось 3 контракта - отправиться 3 стоп-заявки по 1 контракту). На длительном промежутке времени иногда возникает такая ситуация, что нет нескольких высталенных стопов.

К примеру бала сделка 10 контрактов. Она исполнилась по 2,3,5 контрактов. Соответственно должно быть выставлено 10 стопов. А по факту получается выставлено только 7. Это не всегда, но бывают единичные случаи. Вот и хотел бы понять с чем может быть связано не доставление 3 стоп-заявок.
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
OnTrade и стоп-заявка
 
Есть ли объективные причины почему сервер, биржа могут отклонить правильно оформленную стоп-заявку? В каких случаях это может произойти?
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Жизнеспособность идеи - 100 контрактов = 100 стоп-ордеров по 1 контракту каждый
 
Как оказалось жизнеспособно - 10, 20, 30 контрактов. И нет нужны заморачиваться на ORDER_MODIFY().
На очень большое кол-во контрактов пока не тестировал.
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Очередность срабатывания OnTransReply, OnOrder, OnTrade
 
Цитата
Цитата
По логике последовательность вызовов должна быть жесткой:  OnTransReply --> OnOrder --> OnTrade (***).
Да, верно. Однако могут приходить  в любом порядке. Заранее нельзя быть уверенным в порядке срабатывания.
Сообщение старое - актуально ли данное по сегодняшний день в плане хаотичности очередности функций OnTransReply (), OnOrder (), OnTrade ()? Или были какие-то исправления в плане жесткой фиксации последовательности, т.к. в моем понимании она должна быть такой как пишет автор? Были ли изменения?
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Неправильное значение Totalnet в функции onTrade()
 
Цитата
swerg написал:
Цитата
Иван написал:
Последовательность событий OnTrancReply(), OnOrder(), OnTrade(), имеют всегда жесткую последовательность исполнения, или же могут в разном порядке сработать?
Нет. Фиксированной последовательности нет. Скрипт следует писать так, чтобы он корректно работал при абсолютно любой последовательности вызова этих событий.
Более того, OnOrder() и OnTrade() могут быть вызваны по несколько раз для одной и той же заявки и сделки.

Чисто теоретически OnTrancReply() вовсе может не быть вызван (например, терминал потерял связь после отправки транзакции), но будем считать, что это слишком экзотический случай, хотя и вполне реальный, такие сообщения на форуме были.
Вот допустим прошла сделка, но Total еще не обновился.
Можно ли как-то понять что после сделки и значение Total тоже актуализировалось. У меня бывают такие случаи что сделка прошла, а тотал еще не обновлен, а я уже использую его значение... Как быть?
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Журнал сделок и расчет результата сделок
 
Цитата
Anton написал:
Цитата
Иван написал:
пример нескольких строк из таблицы
С этим-то какие сложности
Код
  {
  { direction  =   'B' , value  =   33000.0  },
  { direction  =   'S' , value  =   32000.0  },
}
  
Нашел способ посчитать через средневсзвешенное.
В Excel это формула =СУММПРОИЗВ(E1:E10;F1:F10)/СУММ(F1:F10).
Но не могу найти внятного пояснения как оно рассчитывается в плане формулы?
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Функция getCandlesByIndex() и закрытие свечки
 
Цитата
Sergey Gorokhov написал:
Иван,
Для этого нужно понять что сделок больше не будет.
А этого никто не может знать, т.к. в будущее никто смотреть не умеет.

Нужно либо ждать появления новой свечи, либо проверять текущее время.
Либо использовать оба варианта сразу.
А как тогда делать проверку - написал простое условие - если цена пересекла MA - то вылазит сообщение. Но проблема в том сообщение будет вылазить не 1 раз, а бесконечно...
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Вопрос про Сallback-и и их потерю
 
Фух, а то думал это и правда.
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Вопрос про Сallback-и и их потерю
 
Сегодня наткнулся на интересный пост на смарт-лабе:
Цитата
https://smart-lab.ru/blog/472380.php
1. Впервые слышу про то, что колбэки в очередь встают. На сколько мне
известно — такого никогда не было. Если Вы выполняете вычисления
непосредственно внутри функции OnTrade, и не успели их завершить до
прихода следующего колбэка, то пришедший колбэк теряется.
Неужели это действительно так?
Что не успел отработать коллбэк и вернуть результат, тут приходит новый и затирает собой предыдущий?
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Несколько Lua-роботов на 1 инструменте
 
Цитата
Константин Рейм написал:
ров
Судя по ответам прихожу к выводу что проблематично это нескольких роботов запускать на 1 инструмент в рамках 1 счета.

Но

Если у Вас робот имеет свой внутренний алгортим и не опирается например на то:
- сколько сделок было сегодня
- сколько убыточных сделок было
- интервал между сделками
- кол-во открытых контрактов
- и другие общие данные,

то да наверное это возможно
Пока отказался от этой идеи.
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Несколько Lua-роботов на 1 инструменте
 
Цитата
Константин Рейм написал:
Цитата
Иван написал:
идентификатор в поле комментарий при открытии/закрытии позиций
На одном инструменте хоть сто роботов могут торговать и каждый по свой логике. Фильтр по комментарию как раз дает такую возможность - новый бот - новый уникальный комент. У меня имя робота - это комментарий к заявке - если имена ботов разные - торгуем хоть миллиард стратегий на одном инструменте.
Получается Вам что бы понять сколько у Вас открыл контрактов или закрыл нужно постоянно анализировать таблицу сделок?
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Функция getCandlesByIndex() и закрытие свечки
 
Как при использовании функции t, n, l = getCandlesByIndex(tag, line, first_candle, getNumCandles(tag)); понять что последняя свеча уже закрылась или последнее значение индикатора уже рассчитано?  
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Несколько Lua-роботов на 1 инструменте
 
На данном форуме вычитал что многие дают роботу идентификатор в поле комментарий при открытии/закрытии позиций.
Не совсем понимаю как несколько роботов могут торговать на 1 инструменте?
Ведь все равно сколько бы роботов не было - они будут опираться на общие данные а не анализ своих операций.
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Журнал сделок и расчет результата сделок
 
Цитата
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: https://github.com/iv-litovchenko/Quik-Enter-Trade
Журнал сделок и расчет результата сделок
 
Цитата
Anton написал:
Сделка это один пункт из вашего списка, у нее результат "купились/продались икс контрактов по цене игрек". А результат серии сделок посчитать так: завести переменную, равную 0. Каждый раз, когда что-то купилось, уменьшать переменную на объем покупки. Каждый раз, когда что-то продалось, увеличивать ее на объем продажи. Когда закрылось все, в переменной останется чистая разница по всем проведенным сделкам. Считать можно как в реалтайме, так и задним числом по списку сделок.
Не совсем понял как посчитать - можно пожалуйста пример.
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Журнал сделок и расчет результата сделок
 
К примеру было куплено 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: https://github.com/iv-litovchenko/Quik-Enter-Trade
Идентификатор для метки
 
Цитата
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: https://github.com/iv-litovchenko/Quik-Enter-Trade
Идентификатор для метки
 
Цитата
Sergey Gorokhov написал:
Цитата
Иван написал:
Возможно ли для добавленной метки задать идентификатор?

Здравствуйте,
Идентификатор задается НЕ на метке, а на графике на котором надо эту метку нарисовать.
задать программно идентификатор к сожалению нельзя
Имею в виду немного другое.
Я бы хотел поставить метку на графике, нарисовать линию, или фигуру и ей задать индетификатор как графику цены например. Это возможно?
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Идентификатор для метки
 
Возможно ли для добавленной метки задать идентификатор?
Либо сделать такой индикатор 2 линии которого можно будет двигать на графике? Просто двигать как передвигается стоп-лосс мышкой.
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Индикатор с уровнями для 3 таймфреймов
 
Цитата
Andrey Bezrukov написал:
Иван,

Нет, такой возможности нет - MA привязан к текущему интервалу графика, который может быть только один для одного окна графика.

Наиболее вероятно, Вашу задачу можно решить пользовательским индикатором на LUA. Необходимую информацию и примеры для написания собственных индикаторов Вы можете найти по следующей  ссылке .
Вопрос немного в другом.
1) Можно ли на принципах индикатора нарисовать линию и после двигать ее мышкой на графике.
2) Можно ли запомнить ее ID что бы не отрисовывать дважды?
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Индикатор с уровнями для 3 таймфреймов
 
Если мы нанесем на график индикатор MA то при переключении между таймфреймами м5, ч1, и д1 он каждый раз перересуетс в зависимости от таймфрейма. Возможно ли сделать так что бы индикатор рисовал различные уровни для трех таймфреймов?
Желтые для м5, синие для ч1, и красные для д1. Т.е. на каком бы таймфрейме мы не были из этих трех все равно бы нарисовались три типа уровней...?
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Создание таблицы в Lua
 
Цитата
Sergey Gorokhov написал:
Иван,
Ну вкладки есть, с этим никто не спорит.
А вот функционала работы с ними в QLUA нету.
Т.е. QLUA не умеет заранее определять на какой вкладке ему рисовать окно, поэтому рисует его на всех.
Вот теперь понятно.
Прихожу к выводу тогда что каждый раз надо перезапускать скрипт.
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Реализация скользящего стопа
 
Цитата
s_mike@rambler.ru написал:
Цитата
Иван написал:
Пересмотрел все виды стопов в Quik и не совсем понимаю как реализуется скользящий стоп на Lua?
Это простое и банальное удаление и перевыставление стопа на Lua?
Смотрите условную заявку Тейк+Стоп. С ее помощью трейлинг стоп с фиксированным (неизменным) отступом от экстремума цены делается на раз.
Почему то трейлинг стоп всегда думал что это нечто другое.
А по факту получается что стоп в БУ и трейлинг стоп это одно и тоже (разница в том что БУ переносится 1 раз).
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Список всех идентификаторов графиков на текущий момент в Quik
 
Цитата
nikolz написал:
перечень встроенных индикаторов не меняется. поэтому его можно записать в текстовый файл
К сожалению это не универсальное решение, т.к. все равно каждый забьет свой идентификатор по своим правилам.
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Всплывающее окошко Message() - кожно ли убрать?
 
Цитата
swerg написал:
Ответ на вопрос нагуглить несложно так-то

F9 --> Сообщения --> снять галку "показывать окно сообщений"
Т.е. в этом приводе как будто бы фокусровка (focus) снова ставиться не на окошко с №заявки, а на окно привода.
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Создание таблицы в Lua
 
Цитата
Sergey Gorokhov написал:
Здравствуйте,
Всё просто. В QLUA нет функционала работы со вкладками терминала и никогда не было.
Если он Вам требуется можем предложить зарегистрировать пожелание на доработку
Почему вкладки есть. Те которые обычно "Инструмент с графиком такой-то", "депозит", "счет", "сделки" у кого как.
Просто не совсем пойму логику работы "Сервисы > Lua скрипты...".
Получается перед закрытием терминала Quik нужно выключить все скрипты, а когда запускаешь терминал по новому все запускать все скрипты?
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Реализация скользящего стопа
 
Пересмотрел все виды стопов в Quik и не совсем понимаю как реализуется скользящий стоп на Lua?
Это простое и банальное удаление и перевыставление стопа на Lua?
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Всплывающее окошко Message() - кожно ли убрать?
 
Цитата
swerg написал:
Ответ на вопрос нагуглить несложно так-то

F9 --> Сообщения --> снять галку "показывать окно сообщений"
Ничего не отключал в плане "снять галку".
Нашел в сети привод: https://smart-lab.ru/blog/216652.php

Поставил - когда на нем совершаешь сделку, то окошко №заявки не появляется, вернее появляется но как бы в фоне.
Посмотрел код привода - но так и не понял как добиться такого эффекта.
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Создание таблицы в Lua
 
Причем попробовал - это с любыми скриптами из интернета, которые генерируют таблицу.
Quik 7.27.2.1
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Всплывающее окошко Message() - кожно ли убрать?
 
Можно ли как-то при совершении операции скрыть окно message()? Что бы сообщения выводились только на панели сверху в "Окно сообщений"?
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Создание таблицы в Lua
 
В 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: https://github.com/iv-litovchenko/Quik-Enter-Trade
Список всех идентификаторов графиков на текущий момент в Quik
 
Цитата
Sergey Gorokhov написал:
Цитата
Иван написал:
Можно пример привести пожалуйста, можно проверить как? через ~= nil?

лучше проверить наличие легенды на графике, а не данные.
Т.к. бывают ситуации когда график есть а данных на нем еще нет.
Легенду можно увидеть через параметр l функции getCandlesByIndex
Если пусто (не nil а именно пустое значение) значит идентификатора нет.
t, n, l = getCandlesByIndex (tag, line, first_candle, count)
if (l~="") then
message("GOOD")
else
message("BAD")
end
Да попробовал, работает.
Спасибо.
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Перезапуск LUA-скрипта из-за ошибок
 
Цитата
Anton написал:
Цитата
Иван написал:
мне приходится закрывать созданную таблицу
Вот для этого и нужно ошибки на границе ловить, чтобы подчистить за скриптом все им созданное. Для этого в луа есть метаметоды __gc, но в квике при ошибке они не работают, баг пока еще не поправили. Поэтому придется извращаться с ловлей ошибок pcall'ом. Что же касается автоматического перезапуска, что-то мне не думается, что это здравая идея. Запустите вы скрипт тестировать одним контрактом и уйдете, он купит контракт - рухнет, перезапустится через секунду, купит еще один - рухнет, и так на все плечи. Лет 15 назад у меня еще из старого велса так скрипт потестировался. Благо в плюс по итогу, а могло бы и не в плюс. Если скрипт упал, то пусть лежит уже до выяснения причины, это не есть один из допустимых сценариев его работы.
Да, пожалуй лучше так.
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Изменение стоп-ордера средствами Lua
 
Цитата
Иван написал:
Цитата
Andrey Bezrukov написал:
Иван ,

Транзакции на снятие/выставление заявок могут быть корректно сформированы и отправлены из рабочего места с точки зрения синтаксиса lua и функции qlua, но в зависимости от указанных параметров транзакции могут быть отклонены сервером в случае неверных данных. Например, неверный номер стоп-заявки, которую хотите снять. Или средств для выставления стоп-заявки с новыми параметрами может оказаться недостаточно в условиях текущих настроек ведения Ваших позиций брокером.

Если исключить эти моменты - то при штатной работе сервера QUIK транзакции будут корректно обрабатываться сервером и снимать/выставлять стоп-заявки. В противном случае - после/перед снятием/выставлением стоп-заявок рекомендуется выполнять проверки - была ли указанная стоп-заявка действительно снята / выставлена.
Проверить статус какой-либо заявки и, соответственно, выполнение транзакции на снятие/выставление - можно с использованием функций "getItem", "getNumberOf", "SearchItems", и функций обратного вызова "OnOrder", "OnStopOrder".
Понял, спасибо.
И еще появился вопрос про sendTransaction() про TRANS_ID.
По большому счету генерация значения "TRANS_ID" на что-то влияет или нет.
Можно например всем "TRANS_ID" ставить всегда = 1 и для ордеров, и для стоп-ордеров, и для отмены стоп-ордеров.  
Вопрос по прежнему актуален про TRANS_ID.
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Перезапуск LUA-скрипта из-за ошибок
 
Цитата
Anton написал:
Вы защитили только непосредственно тело включаемого скрипта, если он создаст какие-то функции и вы их потом вызовете из мейна например и будет ошибка в этой функции, она точно так же пролетит до квика. Заворачивать в pcall надо мейн и все колбеки, то есть ловить ошибки на границе с квиком. Ошибка при загрузке скрипта (типа синтаксической ошибки или не загрузилась длл) лучше вообще не ловить, пусть рушится, на этом этапе еще безопасно.
Поясню что мне не очень удобно.
Когда скрипт падает - речь про весь скрипт, а не про те куски кода что обернул в dofile() - мне приходится закрывать созданную таблицу, снова открывать сервис, запускать скрипт, он создает таблицу, выравнивать ее, перемещать. Хотелось бы что бы исправил ошибку в файле Lua и он продолжил работу скажем через секунду.
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Перезапуск 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: https://github.com/iv-litovchenko/Quik-Enter-Trade
Перезапуск 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;
Но как это сделать для всего скрипта в целом?
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Список всех идентификаторов графиков на текущий момент в Quik
 
Цитата
Sergey Gorokhov написал:
Цитата
Иван написал:
А можно как-то проверить существует такой идентификатор или нет?
Попробовать получить данные, если получилось значит есть.
Можно пример привести пожалуйста, можно проверить как? через ~= nil?
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Перезапуск LUA-скрипта из-за ошибок
 
Каждый раз когда в скрипте случается ошибка, приходится останавливать скрипт через сервисы, и по новому его запускать.
Возможно ли  как-то сделать так, что бы выпала ошибка - обычно ее смотрю в окне "Доступные скрипты", отредактировал скрипт и он перезапустился или продолжил работу дальше?
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Список всех идентификаторов графиков на текущий момент в Quik
 
Цитата
Sergey Gorokhov написал:
Здравствуйте,
Такой возможности не предусмотрено.
А можно как-то проверить существует такой идентификатор или нет?
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Неправильное значение Totalnet в функции onTrade()
 
Цитата
Иван написал:
Цитата
Anton написал:
 
Цитата
Иван  написал:
А как с этим бороться?
 С этим не надо бороться, это нормальное поведение для 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: https://github.com/iv-litovchenko/Quik-Enter-Trade
Неправильное значение Totalnet в функции onTrade()
 
Цитата
Anton написал:
Цитата
Иван написал:
А как с этим бороться?
С этим не надо бороться, это нормальное поведение для 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: https://github.com/iv-litovchenko/Quik-Enter-Trade
Изменение стоп-ордера средствами Lua
 
Цитата
Andrey Bezrukov написал:
Иван,

Транзакции на снятие/выставление заявок могут быть корректно сформированы и отправлены из рабочего места с точки зрения синтаксиса lua и функции qlua, но в зависимости от указанных параметров транзакции могут быть отклонены сервером в случае неверных данных. Например, неверный номер стоп-заявки, которую хотите снять. Или средств для выставления стоп-заявки с новыми параметрами может оказаться недостаточно в условиях текущих настроек ведения Ваших позиций брокером.

Если исключить эти моменты - то при штатной работе сервера QUIK транзакции будут корректно обрабатываться сервером и снимать/выставлять стоп-заявки. В противном случае - после/перед снятием/выставлением стоп-заявок рекомендуется выполнять проверки - была ли указанная стоп-заявка действительно снята / выставлена.
Проверить статус какой-либо заявки и, соответственно, выполнение транзакции на снятие/выставление - можно с использованием функций "getItem", "getNumberOf", "SearchItems", и функций обратного вызова "OnOrder", "OnStopOrder".
Понял, спасибо.
И еще появился вопрос про sendTransaction() про TRANS_ID.
По большому счету генерация значения "TRANS_ID" на что-то влияет или нет.
Можно например всем "TRANS_ID" ставить всегда = 1 и для ордеров, и для стоп-ордеров, и для отмены стоп-ордеров.  
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Неправильное значение Totalnet в функции onTrade()
 
Цитата
swerg написал:
Цитата
Более того, OnOrder() и OnTrade() могут быть вызваны по несколько раз для одной и той же заявки и сделки.
А как с этим бороться? Полагаю данные приходят одни и те же по несколько раз?
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Список всех идентификаторов графиков на текущий момент в Quik
 
Возможно ли средствами LUA получить список всех зарегистрированных идентификаторов графиков, индикаторов, которые есть на данный момент. Просто список.
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
Страницы: Пред. 1 2 3 След.
Наверх