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

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

Страницы: 1
помогите советом - как запрограммировать ожидания снятия стоп заявки?
 
Цитата
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 секунд, что бы не перезагружаться, а просто останавливать скрипт.
Для большего необходимо больше информации.
goto в qlua не работает?
 
Для goto есть ограничения, связанные с видимостью метки.
-нельзя выпрыгнуть из функции
-нельзя впрыгнуть в блок
-нельзя впрыгнуть в область видимости локальной переменной.
Возможно, один из вариантов Ваш.
Добрый вечер. Как определить в ЛУА существование файла?
 
filename = "\\MyData2.txt";
Myfile = io.open(getScriptPath()..filename,"r+");
   -- Если файл не существует
   if Myfile == nil then
 message("Нету таких");
 OnStop();
   end;
Как продать заявку на продажу по заданным инструментам?, Рыночная заявка.
 
Цитата
Андрей написал:
А как сейчас мне закрыть эти заявки? Какой общепринятый механизм закрытия заявки, в коде я конечно могу поменять одну строку, что бы заявка закрылась
Не много не понятен термин "закрыть заявку".
Можно закрыть позицию или сделку. Т.е. заявка удовлетворена - перешла в сделку(см. таблица сделок). Что б ее закрыть необходимо совершить противоположную сделку. Т.е. подать заявку не только противоположного направления, но и, возможно, изменить цену.
Если Вы имеете ввиду снять заявку, которая еще не удовлетворена(см. таблица заявок), необходимо ACTION    = "KILL_ORDER" и указать номер заявки ORDER_KEY
Цитата
Андрей написал:
Но сперва наверно нужно как-то убедиться, что заявка на покупку - перешла в сделку на исполнение, как это сделать? Что бы в заданный момент времени отправить противоположную заявку.
Я делаю через таблицу заявок. По номеру заявки через getItem(). Далее по флагу (активна/не активна).
Кто-то делает через таблицу сделок.
Создает ли CreateDataSource источник данных если его запустить во внерабочее время ?
 
Так никто и не ответил?
ПАСХА.
Проверил сейчас у себя. Все подгружается кроме тиковых графиков.
Но у меня вчера не был открыт график (и заказа через ds не было) с таким интервалом. Возможно, у тебя причина в том же.
Создает ли CreateDataSource источник данных если его запустить во внерабочее время ?
 
OnAllTrade
Функция обратного вызова вызывается терминалом QUIK при получении обезличенной сделки. С CreateDataSource не связана.
В CreateDataSource получают инфо, связанную со свечками O,H,L,C,Size,T + param.  В OnAllTrade получают инфо, связанную со сделками. Часть параметров пересекаются. Поэтому каждый использует кому как удобно.
Создает ли CreateDataSource источник данных если его запустить во внерабочее время ?
 
Один раз ошибся и то же поставил интервал тики. Была та же история. Но быстро нашел свою ошибку, исправил и все вошло в свое русло. Зачем тебе тики, поставь М1.   ds:C(Size) все равно меняется с каждой сделкой. (Хотя допускаю наличие идеи, основанной именно на тиках).
Фильтрация транзакций "своего" робота
 
Цитата
Максим написал:
Если есть доступ к скриптам, то надёжней будет нечто вроде
global_trans_id = trans_id * 10 + robot_id
trans_id = trans_id + 1

Если роботов до 10 включительно - умножаем trans_id на 10, до 100 - на 100 и т.д.

Ну и разбирать обратно это проще простого, пришёл ответ на транзакцию с global_trans_id - берём остаток от деления на 10 (100, 1000, etc) и обрабатываем только если совпадает с текущим robot_id.
Можно сделать так.
Перед формированием номера транзакции (trans_id) проверять его с существующими номерами в таблице заявок через getItem().
При совпадении изменять.  
Фильтрация транзакций "своего" робота
 
Если есть доступ к скрипту.
где-то в самом начале до main() поставить
trans_id      = os.time();

перед выставлением заявки
function MyOpenPosition() -- Выставляет заявку на открытие позиции
     trans_id = trans_id + 1; -- Получает ID для следующей транзакции
     -- Заполняет структуру для отправки транзакции
     local Transaction={
     ACCOUNT   = ACCOUNT_CODE,         -- Код счета
      ------------------------
       -----------------------
     TRANS_ID  = tostring(trans_id)      -- ID транзакции
      };
      local Res = sendTransaction(Transaction); -- Отправляет транзакцию
end;
-- Функция вызывается терминалом, когда приходит новая информация таблицы заявок
function OnOrder(order)
  -- Если пришла информация по нашей транзакции
   if order.trans_id == trans_id then --именно наша заявка
       order_num = order.order_num; --номер заявки
       flag_OnOder = true;  --флаг именно наша заявка
   end;
end;
Как начать читать файл не с первой строки, а со 2й?, исторические данные
 
Цитата
Andrey.R написал:
нет такое не работает ни в каком виде
Код
  f  =   io.open ( "Test.txt" ,"r");
f:seek( "set" , 0 );
 for  line =  3 , f:lines()  do 
       print (line)
     end   
Я тебе предложил не так.
Твой вариант должен быть такой.

Myfile = io.open("Test.txt","r+");
Myfile:seek("set",0);  
i = 0;
 for line in Myfile:lines() do
     i = i + 1;
     if i == 3 then  
------действия
-------
break;
     end;  
 end;
Как начать читать файл не с первой строки, а со 2й?, исторические данные
 
Может я не понял вопроса, но я делаю так.

Myfile:seek("set",0);   "set"-начало файла   "end"-конец "cur"-текущая позиция offset-смещение с начала строки в символах(0-крайнее      левое положение)

 i = 0;
 for line in Myfile:lines() do
     i = i + 1;
     if i == 20 then --находим нужную строку по порядку от начала
     ------действия
    -------
         break;
     end;
 end;
QLUA, вопросы начинающих.
 
Sergey Gorokhov,
Цитата
Sergey Gorokhov написал:
Игорь Б  ,

Проблема не в коде, код работает.
Возможно в терминале у Вас просто отключен вывод сообщений?
Проверьте в таблице сообщений, есть ли там записи
 
Да, действительно.
Спасибо.
QLUA, вопросы начинающих.
 
Попытался написать совсем простой скрипт
IsRun = true;
function main()
    while IsRun do
    message("ok",2);
    sleep(1000);
    end;
end;
function OnStop()
    IsRun = false;
end;
Добавляю скрипт в сервисе quik. Запускаю. Красный квадрат меняется на зеленый треугольник. Ошибок не выдает. Но ничего не происходит.
qlua.dll есть.
message() ставил в разные места скрипта.
Подскажите, в чем может быть дело.
Спасибо.
Подвисает квик при срабатывании оповещения
 
При попытке обновить, пишет, что версия программы на сервере не изменилась.
Подвисает квик при срабатывании оповещения
 
Здравствуйте.
При создании оповещения ставлю галочку на "Оповещение активно до снятия". Для меня это важно.
При срабатывании, оповещение может подать 1-2 звуковых сигнала и виснет. Снять оповещение не дает. Активировать другое окно не дает. Хотя, окно котировок работает, возможно медленнее. Короче, совершить сделку нет возможности. Приходиться закрывать квик через диспетчер задач. Если снять галочку на "Оповещение активно до снятия", срабатывает один раз и все работает. Версия 7.6.1.1
Тех. параметры компа выше требуемых.

Спасибо.
Страницы: 1
Наверх