Сергей написал: Подскажите, как найти в стакане заявку с заданным объемом? Предполагаю, что обращение к стакану можно было бы организовать через функцию OnQuote, затем функция getQuoteLevel2. Дальше застрял.
Я хоть и новичок, но постараюсь помочь. Если что, профи поправят. Дальше запускаете цикл перебора строк по бидам и аскам. В нем добавляете условие по нужному вам объему (если речь идет об объеме конечно). Сам делал примерно так:
Код
function OnQuote(class, sec )
if class == CLASSCODE and sec == SECCODE then
tb = getQuoteLevel2(CLASSCODE, SECCODE )
for i=1,tb.bid_count,1 do
if tb.bid[i].quantity > "Здесь ваше условие, например если в строке нужный вам объем" then
--то что нужно сделать
break -- прерываем цикл
end
end
for i=1,tb.offer_count,1 do
if tb.offer[i] > "Здесь ваше условие, например если в строке нужный вам объем" then
--то что нужно сделать
break -- прерываем цикл
end
end
end
end
SDL написал: Да, это является самым корректным способом при сравнении отметок времени. Всё зависит от конкретных условий, можно использовать упрощенный подход или нет. Вот, например, на срочном рынке в текущую сессию включаются сделки за вчерашнюю вечернюю сессию, т.е. перед сделкой сегодня за 10:00:00 в ТВС будет читаться запись за вчера за 23:49:59. Смотрите сами, чтобы не было некорректной работы вашего алгоритма.
Спасибо за отклик. Предложенный Вами вариант взял на вооружение!
SDL написал: Ваш расчет time_sdelki - это путь воина, который Вы сами себе избрали. Можно делать и так, но кто мешает сделать немного по-другому:
Вот ваш ответ мне сразу понятен! Спасибо, но тут дело принципа уже)) Как мое время "10:00:50" в этот формат перевести. Без иронии, сделаю как Вы советовали, просто нужно для себя разобраться.
Sergey Gorokhov написал: Опять не понятно. Ощущение что мы про разные вещи говорим.Что значит с привязкой к дате?Вы боитесь что время 10:00:50 может дать результат не сегодняшней сделки а вчерашней? Или как?Если боитесь, то просто отфильтровывайте все сделки, у которых дата сделки не равна дате торгов (так фильтруются сделки вечерней сессии фортс).Все остальные сделки и так только за текущую сессию, и нет смысла проверять дату.
Давайте попробуем иначе. Вот кусочек кода:
Код
for i = getNumberOf('all_trades') - 1,0,-1 do
local t = getItem("all_trades", i);
if t.sec_code == SECCODE and t.class_code == CLASSCODE then
time_sdelki = os.time(t.datetime)
if time_sdelki > "ЗДЕСЬ ДОЛЖНЫ БЫТЬ МОИ 10:00:50 только в секундах, т.к. к примеру time_sdelki = 1543578360 (это 14:46 текущего дня)" then ……
Путем умножения, как вы предлагали часов на 3600 + минут на 60 + секунды мы не придем к формату time_sdelki. Сергей, Вы профи, а я начинающий поэтому могу не уловить с полуслова.
Sergey Gorokhov написал: Совершенно не понятно зачем это?Будет проще если Вы приведете конкретный пример, и поясните чем не устраивает предложенный вариант.
Если в ленте сделок просто время в секундах без привязки к дате, то этот вариант самый простой и меня устраивает.
Добрый день. Скрипт выставляет заявку типа стоп-лимит и тейк-профит с параметрами для тейк-профита отступ - 0 и спред -0. Исполнение по тейку бывает на 1-2 пункта хуже. Не совсем понимаю почему, т.к при достижении условия выставляется лимитированная заявка с нулевым отступом от условия. Это можно победить? Параметры выставляемой заявки проверял, все выставлено верно.
Sergey Gorokhov написал: Простая математикачасы умножаем на 3600 + минуты умножаем на 60 + секунды
Сергей, мне это понятно, с математикой все хорошо. Просто время в ленте сделок, а сравнивать я буду именно с ним, насколько я понимаю не просто время в секундах, а время в секундах от какой-то древней даты))) Вот я подумал, что нужно переводить мои "10.00.50" в тот формат каким-то образом. Возможно я что-то опять не так понял))
В данный момент делаю так: Из OnAllTrade получаю время последнего трейда. Если оно к примеру больше чем 10.00.50, то сканирую ленту сделок от 10.00.50 до 10.00.00. Далее делаю расчет и т.д. В этом случае мне не нужно ни время сервера ни системное время. Вопрос в том, как стартовое время 10.00.50 текущего дня перевести в формат POSIX.
Добрый день. Есть необходимость создания своего таймфрейма, а точнее сформировать 5 последних 10-секундных свечей. Каждые 10 секунд скрипт будет перебирать ленту сделок и производить расчет максимума, минимума, открытия и закрытия 5 последних свечей. Проблема в том, что не знаю, какое время взять за точку отсчета. Время сервера, время системы или еще что-нибудь.
Вопрос снимается. В соседней теме есть информация о том где можно найти примеры. https://forum.quik.ru/forum10/topic4090/ До создания темы пытался найти самостоятельно, но увы не нашел.
Если не трудно скиньте пример выставления стоп-заявки со связанной лимитированной заявкой. Параметр trans_id лимитированной заявки и стоп-заявки будет одинаковый?
Нет ничего лишнего. Один инструмент и один график. Скрипт тоже один.
Цитата
Sergey Gorokhov написал: Лечится это как уже говорили другие пользователи принудительной перерисовкой окна
Это вариант работает, только окно постоянно активно и соответственно невозможно сделать активными другие окна.
Цитата
Sergey Gorokhov написал: увеличением sleep до значений больше 50
Блин, ставил и 100 и 200 - в моем случае нет результата. В данный момент выделяю 2 строки поочередно и все обновляется каждый тик. Мигание правда достает, а так результат достигнут. Да и забыл сказать стоит в main добавить строку обращения к графику по идентификатору т.е. чуть подгружаем скрипт и все сразу работает. Почему со sleep не прокатывает сам не пойму.
Только что запускал. Не работает. Меня бы устроил это вариант, но что-то не получается. Вы в main или PasteTable() SetWindowCaption добавляли? Хотя разницы как я понимаю никакой.
Sergey Gorokhov написал: Возможно кроме него что то еще запущено?
Нет, ничего. Проблема воспроизводится именно на коде, который я выкладывал выше. Тестировал на 3 разных и чистых квиках у 2 разных брокеров. Один из пользователей (выше найдете) запускал мой код, проблема подтвердилась.
Ну, что вот за поддержка??? Рядовые пользователи дают реальные полезные советы, стараются оказать помощь друг-другу, а тут отписки одни. Выше человеку написали, что проблем нет в ваших квиках все летает и не лагает! Проверено с задержкой 1000 на трех чистых квиках у двух брокеров! Да и не в этом дело даже! Внимательно читайте вопрос.... Как заставить обновлять данные в таблице каждый тик НЕ ТОРМОЗЯ СКРИПТ!!! Если это не возможно - так и напишите, оставлю свое решение - это когда по очереди выделяются две строки.
Sergey Gorokhov написал: Сделайте sleep(100) тогда проблемы не будет.
Проблема будет даже при sleep (1000), проверено до обращения к вам. У меня вопрос не в том, как затормозить скрипт, а как сделать так, чтобы данные в таблице обновлялись с каждым тиком.
Кстати, приятная плюшка от добавления пары строк с SetWindowPos. Теперь окно скрипта всегда поверх всех окон и ему также не страшно случайное перемещение. Окно сразу появится на своем законном месте))))))))))
Nikolay написал: Я плюнул искать причины. Перенес отрисовку части вещей в колбеки, хоть это и не самый лучший вариант.
В строках с SetWindowPos сделал рзброс в 1 пиксель по вертикали. Не раздражает, небольшое мерцание нижней границы таблицы. Один вопрос к поддержке: Неужели это нормальное решение вопроса?)))
BlackBoar написал: Приходит в голову попробовать SetWindowPos
Это ппц))) SetWindowPos работает))))) добавил 2 строки с разными параметрами, теперь моя таблица не только мигает, но и танцует, точнее подпрыгивает)))))
После PasteTable() добавил выделение строк 1 и 2 SetSelectedRow(t_id,1) SetSelectedRow(t_id,2) Все работает, данные обновляются с каждым тиком, точнее с каждой имитацией тыканья мышкой)) правда таблица стала похожа на цветомузыку))) Интересная особенность в том, что при "тыкании", строки нужно чередовать. Если "тыкать" в одну строку данные обновятся 1 раз и больше обновляться не будут. Можно ли иным путем решить вопрос? Не очень мне нравится мой креативный подход)))
BlackBoar написал: Вы уж простите, я невеликий "писатель" на луа, предпочитаю делать все что можно на С++. Я поэтому попросту не знаю правильный ответ для луа. Скорее всего проще дождаться пока завтра поддержка придет, как-то наверняка можно.
Александр написал: добавь задержку. мне помогло при перерисовывании таблицы.
Ваша логика мне ясна, но хочу понять, почему есть команда, которая не выполняется. Есть ошибка в скрипте или в LUA??? Самое интересное, что после оптимизации ранее написанного мною скрипта появились эти лаги. Сутки потратил на поиск ошибки, допущенной при оптимизации. Выкинул все, оставив время сервера - лагает)))) Т.е. пока скрипт был кривой и сильно загружен данные обновлялись исправно. После разгрузки - пока не ткнешь в таблицу данные не обновятся или обновятся с большой задержкой. Принципиально хочу не тормозить скрипт, а сделать так чтобы команда SetCell добавляла данные каждый тик. какие будут предложения?
Добрый день! Неужели некому помочь? С каждым тиком из main вызывается функция PasteTable(), в которой, строка SetCell(t_id, 1, 1, tostring(SERVERTIME) добавляет данные в таблицу. Почему они не добавляются пока не ткнешь в таблицу мышкой??? Ради интереса воткнул в эту функцию строку записи в лог времени сервера to_log(tostring(SERVERTIME)). Все пишется с каждым тиком. т.е. проблем с получением времени сервера нет. Почему в текстовый файл данные пишутся с каждым тиком, а в таблицу нет? Что нужно сделать чтобы таблица обновлялась с каждым тиком?
Suntor написал: Оно и не получится логически. Если удалите индексный элемент, индекс которого время в секундах, то остальные элементы сдвинутся и поменяют свои индексы, а значит и время. Поэтому, последующие обращения по времени вернут данные не для тех свечей... собственно, поэтому, как я и написал в первом сообщении, просто присваивайте nil элементу таблицы с соответствующим индексом.
Suntor написал: Первая ячейка есть только для индексированных таблиц, то-есть для массивов. Для них же работают ф-ции table.insert и table.remove, которые понимают этот индекс, и умеют сдвигать остальные элементы таблицы при вставке и удалении элемента, что занимает время и ресурсы, особенно для больших таблиц. Поэтому сама идея, удалить первый элемент таблицы, а потом ждать, пока вся таблица перестроится, не слишком удачная, где она не является самоцелью... так сказать. Когда же вы присваиваете nil, элементу таблицы, то вне зависимости от того, индексная эта таблица или нет, никакого перестроения таблицы не происходит.
Поскольку в качестве ключа вы используете number возвращаемый ф-цией os.time, то ваша таблица индексная, но начинается не с первого элемента, а с 1,5 млрд.-ого... поэтому, особого смысла удалять 1,5 млрд.-ый элемент через table.remove, чтобы 1,5 млрд.+1 элемент и все остальные сдвинулись на его место нет. Заведите переменные хранящие начало и конец вашего массива, и сдвигайте их вперёд по мере удаления старых через nil сначала таблицы и добавления новых к концу вашей таблицы.
Мысль понятна. Не буду заморачиваться с удалением 1-го элемента. Поскольку данных за торговую сессию будет немного, буду обнулять массив в начале следующего дня. Всем спасибо за советы.
Suntor написал: Присвоить ему значение nil: Array3Min[os.time(t[N-2].datetime)] = nil
Спасибо. А как удалить первое значение? Дело в том, что ключом каждого значения, в моем случае, является время бара в секундах, т.е. данные идут не строго одни за другими (как например Array3Min[1] = KF, потом Array3Min[2] = KF и т.д.).
Поступил следующим образом: При выполнении ряда условий производится расчет который записывается в массив. Ключом является время бара в формате posix. Array3Min[os.time(t[N-2].datetime)] = KF По этому ключу, т.е. по времени бара легко достаю нужный мне, ранее сохраненный расчет. Подскажите каким образом удалять все данные из массива (это я буду делать ежедневно по времени). Как удалить первый элемент? Я так понимаю, что table.remove(Array3Min, 1) здесь не прокатит?
Александр написал: Создать в скрипте таблицу candleInfo = {}, записывать туда время бара и своё расчётное значение table.insert(candleInfo, {currentCandle["datetime"] ,calcValue}), ну а потом сделать функцию для поиска по таблице. Перебирать бары, брать их datetime и через SearchItems искать в таблице candleInfo. зы. На практике не проверял, но вроде как годный алгоритм и без всяких индикаторов
Необходимо при выполнении нескольких условий произвести расчет и присвоить результат конкретной свече так, чтобы потом обращаясь к номеру свечи эту информацию получить. Это можно реализовать в скрипте или обязательно делать через написание индикатора?
Вычитание из числа округленного до сотых числа округленного до сотых, В скрипте две переменных, округленные до сотых. Из одной вычитается другая. Результаты математической операции ниже:
Suntor написал: Вывод:Код0.15 0.14999999999999999Потому что десятичные дроби не раскладываются точно на двоичные по законам математики.
Вас понял. В моем случае все решается самописной функцией, которая округляет результат до сотых по "законам математики". Ссылка на решение выше. Спасибо всем кто откликнулся.