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

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

Страницы: 1 2 След.
Реквоты., Ошибка создания заявки, цена сделки вне лимита №32
 
Цитата
s_mike@rambler.ru написал:
нужно правильно написать робота, чтобы он перед выставлен тем заявки проверял, что желаемое цена находится в допустимых для текущей сессии границах для нужного инструмента. Например, для фьючерсов это pricemin и pricemax
Какие границы посоветуете для спот-рынка?
EXECUTION_CONDITION и стоп-заявка
 
Хочу выставить стоп-заявку, при срабатывании которой выставлялась бы лим.заявка с EXECUTION_CONDITION ="KILL_BALANCE".
Есть ли такая возможность?
Пытался прописать в Transaction={} для стоп-заявки. Стоп выставляется, но остаток лим.заявки не удаляется.
MACD, Получение значения индикатора MACD в робот.
 

MACD - 0
signal line - 1

Код
    IsRun = true;
 tag = "macd26";
 
 function main()
  while IsRun do
   nl = getLinesCount(tag); --кол-во линий в индикаторе
   nc = getNumCandles(tag); --кол-во получаемых свечек, начина¤ с 0-ой
    first_candle = nc - 3; --получаем три последнюю
    count = 3; --заказываем три последнюю
     t, n, l = getCandlesByIndex (tag, 0, first_candle, count); --получаем таблицу с инфо по MACD
--     t, n, l = getCandlesByIndex (tag, 1, first_candle, count); --получаем таблицу с инфо по signal line     
...
...
...
  sleep(100);  
  end;
 end;
 function OnStop()
        IsRun = false;
    end; 

индикатор Price Channel, не могу получить корректные данные., верхняя линия - "upper", нижняя "lower"?
 
Цитата
DPC_t,DPC_n,DPC_i=getCandlesByIndex(indic_graph_id, 0, DPC-3, 2)
Для данного индикатора второй параметр ф-ции getCandlesByIndex -0. Это для верхней границы.
Для нижней он равен 2.
Идентификация экземпляра индикатора
 
Страховался от случайного изменения или удаления индикатора.
Задачи похожи.

Присвоить индикатору идентификатор и получать данные через

local t, n, l = getCandlesByIndex (tag, tagline, first_candle, count);

далее

if not t[0] or not t[1] or not t[2] then --если удалили индикатор
сохраняешь данные именно этого индикатора
.....
end;
onConnected() OnCleanUp()
 
В дополнение в посту выше.
В первом посту я не обозначил, что в случае, если данные с индикаторов- нил, у меня стоит задержка 30сек.(на возможную дозагрузку).
Изменил задержку на 60сек. Результат -данные обновляются и скрипт не вылетает.
Думаю, что эта проблема у меня из-за того, что в настройках соединения снята галочка с «При восстановлении использовать только параметры последнего соединения» . Т.е. восстановление соединения происходит к следующему серверу. В 7-ом это происходило быстрее.
Думаю причину я нашел.
Спасибо.

 
onConnected() OnCleanUp()
 
На случай разрыва связи по разным причинам в скрипте есть флаги flag_Connected и flag_CleanUp
Код
function OnConnected(fl)
 flag_Connected = true;
 message("OnConnected");
end;
function OnCleanUp()
 flag_CleanUp = true;
 message("OnCleanUp");
end;

Если ИСТИНА, то запускаю проверку и обновление данных графика и индикаторов .
Сегодня на 7-ом и 8-ом квике запускал один и тот же скрипт с искуственным обрывом связи.
На 7-ом все нормально.(как и было до этого).
На 8-ом не видит, что эти флаги - Истина. Соответственно, не обновляет данные. Как результат, данные с индикаторов нил.

И реакция разная.
На 7-ом  - Connected
На 8-ом  - CleanUp  CleanUp

Может кто столкнулся?
QUIK 8.0
 
Цитата
Для получения компилированного lua скрипта (*.luac) нужно скачать x64 luaс.exe, соответственно Вам нужно пройти по ссылке https://sourceforge.net/projects/luabinaries/files/5.1.5/Tools%20Executables/ и скачать lua-5.1.5_Win64_bin.zip.
Спасибо. Работает.
QUIK 8.0
 
Компилирую как Александр М выше
Цитата
никаких dll или сторонних библиотек не используется в скриптах. Скрипты скомпилированы через стандартную команду:

luac -s -o "$(FileName).luac" "$(FileNameExt)"

Что надо сделать для работы?
Visual Studio для этого не использую.
Использую LuaForWindows_v5.1.4-46
Могу ли просто заменить скаченные файлы и дирректории в  LuaForWindows?
Если нет, то что можно сделать?
QUIK 8.0
 
Цитата
Еще хотел бы поправить написанное мной выше, версия 5.1.4 это не последняя версия, есть еще патч 5.1.5 (https://sourceforge.net/projects/luabinaries/files/5.1.5/Windows%20Libraries/Static/ ), правильнее будет использовать его.
Там несколько вариантов. Какой надо?
No such file
 
Попробуй прописать полностью путь
Код
dofile(getScriptPath().."\\Myfile.lua");

или с проверкой
Код
Pathdofile = getScriptPath().."\\Myfile.lua";
 Checkdofile(Pathdofile);

function Checkdofile(Pathdofile)
 local Mydofile = io.open(Pathdofile,"r+");
    if Mydofile == nil then 
  message("Не нашел файл ".. Pathdofile);
  error("");
    end;
 Mydofile:close();
end;
Как узнать id поданной заявки?
 
Цитата
Не знаю, что такое уровень рынка. А на что влияет цена заявки?
Уровень рынка - цена совершения сделок по данному инструменту в данный момент.
Цитата
Также, хотел бы спросить, не будет ли убытка в случае операции подачи заявки и практически моментального снятия?
Прибыль/Убыток образуется при открытии и последующем закрытии позиции. Если цена заявки на покупку ниже рынка, вы выставили и сразу сняли - сделок нет, соответственно нет прибыли\убытка. Если цена заявки на покупку по рынку или выше, вы открыли позицию на объем встречного предложения. Сразу снять сможете только неудовлетворенный остаток (если он будет). Т.е. Вы в позиции. Говорить о прибыли/убытке можно после того как Вы закроете позицию, а не после попытки снять выставленную заявку.
Цитата
Но дело в том, что QUIK не позволяет подавать заявки на некоторые инструменты.
Я так понимаю речь идет о 2,3,... эшелонах. Возможно, их нет в листинге биржи. Возможно, стратегия основана на спреде между бумагами и одно плече на бирже не торгуется. Но это не важно. Мне кажется легче выяснить заранее, торгуется ли бумага и не использовать данную стратегию. И не придется совершать телодвижения с подачей и снятием заявок.  
Как узнать id поданной заявки?
 
Цитата
"Также, хотел бы спросить, не будет ли убытка в случае операции подачи заявки и практически моментального снятия?".
Для меня вопрос не понятен. Мало данных. Какой уровень рынка? По какой цене заявка? ...??
Цитата
Я выставляю заявку, но в поле состояние вижу строку "Снята". Почему она уже снята?
- условие сделки «Немедленно или отклонить»
- условия сделки не соответствуют каким-либо требованиям
Цитата
Где можно об этом почитать? О состояниях заявок, какие бывают, что они означают.
Руководство пользователя QLua - Структуры данных - Транзакции

Руководство пользователя QUIK - Таблица заявок
Как узнать id поданной заявки?
 
Номер заявки можно узнать при ее подачи через ф-цию обратного вызова
Код
function OnOrder(order)
 if (order.trans_id == trans_id) then
  order_num = order.order_num; --номер заявки
   flag_OnOder = true;  --именно наша заявка
    return;
 end;
end;
или обратиться к таблице заявок через getItem().
помогите советом - как запрограммировать ожидания снятия стоп заявки?
 
Цитата
local stop_orders_now = getItem("stop_orders",waiting_ordernum_todel[i][2])
Вы уверены, что это waiting_ordernum_todel[i][2] номер строки?
Я бы проверил, что получается в stop_orders_now.

И я бы проверил #waiting_ordernum_todel  

while #waiting_ordernum_todel > 0 do
--
--
--
message("#waiting_ordernum_todel ="..tostring(#waiting_ordernum_todel));
sleep(1000);
end;
CreateDataSource, получение данных свечи
 
Цитата
local High = ds:H(1)
  local Low = ds:L(1)
Нумерация свечки начинается слева. Их загрузится 2-3тыс.
Для получения текущей надо
Код
    Size = ds:Size();
    T = ds:T(Size);
    O = ds:O(Size);
    H = ds:H(Size);
    L = ds:L(Size);
    C = ds:C(Size);
Предустановленный список входных значений в Settings, Код для предустановленного список входных значений в Settings в индикаторе в QUIK
 
Можно взять любой другой объектно-ориентированный язык. Создать форму, в которой можно вносить любые начальные значения, в том числе и в виде выпадающего списка. Сохранить и передать все в qlua  через файл.txt.  
Шаг вперёд в цикле
 
Код
flag="do not";

for i=start_year,cur_year,1 do

       TabSize=........; 

        if flag=="can do" then
                работаем
        end;

        if  (flag=="do not" and TabSize~=0) then
                 flag="can do";        
        end;

end
Оптимизация быстродействия
 
Мне кажется,  проще, построить график цены. К нему построить индикатор (пусть RSI). И через getCandlesByIndex получить то, что Вам нужно.  
 
QLUA, вопросы начинающих.
 
Олег,
Скорее всего у Вас отсутствует кусок, отвечающий за контроль исполнения стопа. После
Цитата
моментом отправки приказа на сервер
необходимо убедиться, что заявка выставлена и исполнена. И только потом все остальное, что у Вас написано в коде.
Этот контроль можно организовать по-разному. (таблица заявок, таблица сделок, соответствующие им функции обратного вызова, флаги ...).
Сколько людей столько и будет алгоритмов. Лучше разобраться и написать самому.
Цитата
Поможет ли, если я заменю стоп-ордер на обычную заявку
Поможет, если проскальзывание будет достаточным для исполнения всех контрактов сразу. Если будет остаток, возникнет та же проблема, но в меньшем объеме. Т.е. опять возвращаемся к блоку скрипта, который контролирует исполнения сделки, о котором я писал выше.
Поиск заявки в стакане
 
Цитата
В зависимости от конкретной задачи, возможно, удобней будет использовать Subscribe_Level_II_Quotes.
Если человеку нужно найти заявку один раз в день, зачем ему напрягать процесор через коллбэк?
Даже, если ему нужна эта информация в течении дня, но по закрытию свечи, все равно лучше сделать без коллбэка.

Если ему все же удобней сделать через OnQuote, то в предложенной выше функции я бы оставил только флаг на срабатывание, а
весь расчет перенес бы в main.
Поиск заявки в стакане
 
В зависимости от конкретной задачи, возможно, удобней будет использовать Subscribe_Level_II_Quotes.
вывод данных метки, Как вывести параметр метки при помощи GetLabelParams?
 
Код
local StopPointBuy = GetLabelParams(graphic_id,label_id)
У меня это работает.  Возможно, ошибка в параметрах.

Выводить можно так

message(StopPointBuy.yvalue);
Работа со строками LUA
 

Попробуй так
Код
line = "Here it is not necessary to remove[it should be removed]this is also not necessary to remove";
 s1 = "(%[)";
 s2 = "(%])";
 
  point1 = string.find(line,s1);
  point2 = string.find(line,s2);
  point3 = string.len(line);
 
  finishline = string.sub(line,1,point1 - 1)..string.sub(line,point2 + 1,point3);

QLUA, вопросы начинающих.
 
Цитата
price = 14.593333333333
Sorry


p = 14.593333333333;
price = tostring(p);
pointplace = string.find(price,". "); --нашли поз. точки (если разделитель - точка)
   if pointplace then
       price = string.sub(price,1,pointplace + 2); -- для двух знаков
  end;
QLUA, вопросы начинающих.
 
Попробуй так

price = 14.593333333333
pointplace = string.find(price,". "); --нашли поз. точки (если разделитель - точка)
   if pointplace then
       price = string.sub(price,1,pointplace + 2); -- для двух знаков
   end;
QLUA, вопросы начинающих.
 
Цитата
но не могу понять зная номер индекса свечи на графике, как из свечи получить время и дату?
..
..
t1 = ds:T(index).day;
t2 = ds:T(index).hour;
t3 = ds:T(index).min;
..
Проблемы с math.random
 
В полный код даже не смотрел.
Сделай так
math.randomseed(os.clock());
 parametr1 = math.random(2,5);
  parametr2 = math.random(2,5);
   parametr3 = math.random(2,5);
   ...
   .....
    parametr... = math.random(2,5);

parametr1 - это то, что ты получаешь.
Если выведешь остальные результаты, то увидишь, что разброс начинается со второго. И чем дальше, тем сильнее.
Я пользуюсь, начиная с третьего.  
Подсобите новичку с getCandlesByIndex, Номера линий в индикаторе
 
0 - средняя
1 - bbandtop
2 - bbandbot
dofile в защищённом режиме
 
Интересно, зачем   dofile ("C:\\1.lua")  вынесли в отдельную функцию. Это связано с локализацией возможной ошибки или совсем другая причина? Я бы оставил в  main  до бесконечного цикла.
pcall(foo)- собственно, какую ошибку пытаетесь поймать? Подключился ли файл  ("C:\\1.lua")? К содержанию  таблицы не имеет отношение.
На сколько я понял Ваш файл - это файл с данными и в нем не происходит никаких операций.  Зачем его подключать через  dofile?
Мне интересен способ обработки ошибки, которая может возникнуть в самом файле, подключенном через dofile или легче это сделать, например, подключившись через require?
 
Вызов getCandlesByIndex
 
tag может быть идентификатором как графика, так и индикатора.
В любом месте графика правой кнопкой мыши - редактировать.
Далее, в открывшемся окне, левой кнопкой мыши по нужному Вам индикатору или
графику(price).
Справа-Дополнительно-Идентификатор(снизу).
Вопросы по LUA
 
Цитата
не работает
if SaveRest == 1 and SaveRest == 1 then  selT = {} and timT = {} end
Последний AND - лишний.
if SaveRest == 1 and SaveRest == 1 then  
   selT = {};
   timT = {};
end;
Вид бумаги в OnTrade, получить вид бумаги, по которой произошел трейд
 
Судя по вопросу, человека интересовали собственные сделки.
Цитата
(""К таблице "Состояние счета" обратиться видимо пока нельзя "")
Соответственно, смотрим таблицу сделок и функцию
getItem("trade",i).class_code
Вид бумаги в OnTrade, получить вид бумаги, по которой произошел трейд
 
Цитата
в других таблицах есть только sec_code.
Есть еще class_code. По нему можно различить рынки.
условия
 
Suntor,
Пока набивал ответ, Вы меня опередили.
Флаг Ваш.
условия
 
Цитата
if b == c or b == c-0.123456789 or b == c+0.123456789 then
  print(bla)
end
if b == c or math.abs(b- c) == 0.123456789 then
  print(bla)
end
QLUA, вопросы начинающих.
 
Да.
Открыта ли сама таблица? Что пишет?
Сортировка и фильтрация таблиц QUIK средствами Lua
 
Удачи
Сортировка и фильтрация таблиц QUIK средствами Lua
 
Если в скобках ложь. "and"  вернет ложь.   "or" будет сравнивать ложь и  stop_order вернет stop_order .
Если в скобках истина . "and"  вернет min_stop_order .   "or" будет сравнивать min_stop_order  и  stop_order. Вернет min_stop_order (т.к.min_stop_order - истина).
Сортировка и фильтрация таблиц QUIK средствами Lua
 
Цитата
т.е. "and" всегда будет возвращать предыдущий min_stop_order, а "or" его подхватывать.
Нет. т.к. в скобках может быть как истина так и ложь.
Сортировка и фильтрация таблиц QUIK средствами Lua
 
Цитата
Цитата
И ещё вопросик по:[TABLE][TR][TH]Цитата[/TH][/TR][TR][TD]Suntor   написал:   [TABLE][TR][TH]Код[/TH][/TR][TR][TD]min_stop_order = min_stop_order or stop_order
min_stop_order = (min_stop_order.condition_price <= stop_order.condition_price) and min_stop_order or stop_order
[/TD][/TR][/TABLE][/TD][/TR][/TABLE]Логическая операция первой строки полностью присутствует во второй. Зачем она, первая строка?
В первой строке "or" вернет min_stop_order , если это истина.
Во второй сначала вычисляется "and", и только потом "результат and" or stop_order. Т.е. первую строку нельзя сравнивать с куском второй.
Сортировка и фильтрация таблиц QUIK средствами Lua
 
Цитата
Вот тут

Код


min_stop_order = min_stop_order or stop_order
min_stop_order = (min_stop_order.condition_price <= stop_order.condition_price) and min_stop_order or stop_order

зациклился мой мозг минут на 15 на первой итерации, а на второй ушел на больничный... Если знак не перепутан (ищем мы минимум), поясните, пожалуйста.

Полезные идиомы Lua с использованием and и or.
Знак не перепутан. Ищем мин. из двух чисел.
Сортировка и фильтрация таблиц QUIK средствами Lua
 
Цитата
Вот тут[TABLE][TR][TH]Код[/TH][/TR][TR][TD]min_stop_order = min_stop_order or stop_order
min_stop_order = (min_stop_order.condition_price <= stop_order.condition_price) and min_stop_order or stop_order[/TD][/TR][/TABLE]зациклился мой мозг минут на 15 на первой итерации, а на второй ушел на больничный... Если знак не перепутан (ищем мы минимум), поясните, пожалуйста.
Полезные идиомы Lua с использованием and и or.
Знак не перепутан. Ищем мин. из двух чисел.  
function OnTrade (trade), почему пропускаются колл беки, или того хуже не приходят?
 
Цитата
В теле складывал value. BUY как есть, Sell наделял "-"  
После делил на количество лотов. И получая среднюю безубыточную цену.

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

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

iterations=20;
k=0;
finish=100;
flag=true;
while flag do
start=k;
step=(finish-start)/iterations;
 for i=start,finish,step do
  if i==finish then
   flag=false;
  end;
           --делаем расчёт.
  if profit>0 then
   k=i-1; --возвращаемся на step назад
   iterations=100; --(шаг становится более мелким)
   break;
  end;
 end;
end
гибкий цикл
 
iterations=20
k=0
finish=100

for j=1,1000000 do
     start=k
     step=(finish-start)/iterations
         for i=start,finish,step do
         --делаем расчёт.
            if profit>0 then
               k=i-1 --возвращаемся на step назад
               iterations=100 --(шаг становится более мелким)
               break
            end
         end
   if i==finish then break
end
Не проверял. Но, возможно, как направление мысли.
goto в qlua не работает?
 
Но самое главное ограничение - мы не в lua, а в Qlua
КВИК виснет процедуре sleep
 
Теперь понятно. Вы делали sleep() в основном потоке .Я Вас не правильно понял. Сори.
А в описании это есть. Использование Луа в Рабочем месте... Взаимодействие потоков и т.д.  
КВИК виснет процедуре sleep
 
Слишком мало информации, что бы что то посоветовать. Если у Вас sleep(1000) в том кусочке , что Вы представили и все виснет, то есть большая вероятность, что ошибка совсем в другом месте. Чему равен sleep  в while-цикле в main() или других функциях и есть ли он вообще? Есть ли условия выхода из цикла и насколько они работоспособны. И еще 100 вопросов ни о чем, пока не увидим тело скрипта.  
КВИК виснет процедуре sleep
 
Надеюсь, внутри "операции" есть условие при котором t=false. До или после него поставьте месседжер и сделайте входящие, при которых точно  t=false. Возможно, sleep ни при чем.
На время отладки сделайте sleep  в 1-5 секунд, что бы не перезагружаться, а просто останавливать скрипт.
Для большего необходимо больше информации.
Страницы: 1 2 След.
Наверх