вроде как сделал такой код, теперь нужно интегрировать его в мой код ^_^
Код
local is_run = true -- переменная, контролирующая выполнение основного цикла
function main()
while is_run do
local current_time = os.date("*t") -- получаем текущее время как таблицу
-- проверка, превысили ли секунды значение 58
if current_time.sec > 58 then
message("Секунды превысили значение 58!")
end
sleep(1000) -- пауза в 1 секунду
end
end
function OnStop()
is_run = false
end
Владимир написал: Что за бред? Закрыть позицию в любой удобный для меня момент можно ТОЛЬКО по рыночной цене. В любом другом случае нужно найти того идиота, который станет "соучастником" сделки, и вовсе не факт, что такой идиот найдётся. И при чём тут вообще свечи?
не, типо мне норм по рыночной цене, главное закрыться в нужное для меня время, а то сейчас приходится ждать долбаного тика...
Nikolay написал: Судя по всему Вы в алгоритме используете индекс, как факт прихода нового бара. А он увеличивается не по времени, а при совершении первой сделки в новом временном интервале. Поэтому новый бар может появится когда угодно, может даже не прийти вовсе, если сделок не будет.
Закрытие же бара - это цена последней сделки в временном интервале бара из таблицы обезличенных сделок. Можете отслеживать время сделки из ТОС, можете просто, при факте наступления нового интервала, принимать, что бар закрылся. Т.е. надо переходить на контроль времени, а не появления нового индекса бара.
о великий, прошу озарите меня как сие вообще реализовывается?
Здравствуйте, вопрос в следующем, если торговать руками, то я могу закрыть позицию в любой удобный для меня момент, т.е. даже тогда когда тиков нет. а вот lua почему то так не может, бывает мне нужно закрыться на close свечи, и тупо с 57 до 01 секунды вообще нет тиков, соответственно закрытие происходит на другой свече, подскажите как закрываться тогда когда мне нужно и не быть зависимым от тиков?
Здравствуйте, запускаю скрипт фьюч сбер а он мне выводи Index: 12, O(index-1): 24400.0 ...... wtf? поигрался с настройками приёма данных, пробовал локально и с сервера, перезапускал каждый раз квик, 0 реакций... как пофиксить?
и ещё вопрос, выдаёт ttempt to concatenate a boolean value (local 'res'), не могу найти решение проблемы.
Код
function main()
local res = Subscribe_Level_II_Quotes("QJSIM", "SBER")
if res ~= false then
message("Ошибка при подписке на котировки: " .. res)
end
end
При работе с тиковыми графиками рекомендуем выполнить следующие настройки: В настройках графика отключить автомасштаб («Редактирование настроек графика» - галочки «Авто» в соответствующих областях диаграммы). По возможности ограничить вывод на графике последних свечей («Редактирование настроек графика» - поле «Последние ... интервалов»). Если это не помогает, рекомендации следующие: Выполнить рекомендации по оптимизации трафика, описанные здесь: https://forum.quik.ru/forum1/topic1539/ Открыть пункт меню «Система» / «Настройки» / «Основные настройки» / «Сохранение данных» и поставить точку «Только данные, отражающие текущее состояние». При этом клиентским местом QUIK будут сохраняться только последние значения параметров.
либо не помогло либо я плохо настроил, у вас случайно нет файла настроек при которых сбер m0 работал бы без зависаний всего quik?
Здравствуйте, при переключении активного графика сбера на m0 для просмотра тиков, остальная часть кроме графика перестаёт банально работать так как он сильно загружает сам quik, даже если правой кнопкой по графику нажать всё равно грузится меню мега долго, при всём этом цп загрузка 60%, оперативки ещё туча свободной, подскажите что сделать что бы работало норм?, открытый второй график m1 перестаёт вообще обновляться.
Andrey Bezrukov написал: Можем зарегистрировать пожелание на реализацию функционала, который бы позволил накапливать в рабочем месте историю сделок за предыдущие сессии и отображать их на исторических графиках. Регистрируем?
Здравствуйте, после покупки-продажи, на графике появляются очень удобные отметки где купил и по сколько купил и тд. Вопрос, как и где настроить что бы данные отметки оставались на графике длительное время? т.е. когда конец сесии и в след день я захожу в квик, то отметки исчезают, а я бы хотел что бы они остались.(хотя бы на неделю)
Anton написал: Это рекуррентная формула, т.е. каждое следующее значение рассчитывается на основе предыдущего. Самое первое значение там просто как в SMA, т.е. сумма первых пяти цен (первой - пятой), деленная на 5. Второе - сумма вторых пяти цен (второй - шестой) минус предыдущее значение SMMA плюс последняя в группе (шестая) цена, все деленное на 5. Третье - сумма третьих пяти цен (третьей - шестой) минус предыдущее... и т.д.
я дико извиняюсь, можете расписать как Дыбилу? как sma вычисляется я знаю, суммируем все числа и делим на период. дальнейшие действия я не понял, что за шестое число? у меня всего их 5, или 6 это сумма предыдущих?
Здравствуйте, хочу переписать формулу ссылка на формулу SMMA честно, пытался сам разобрать, но вошел в тупик при последовательности действий SMMAi = (sum(Pi) - SMMAi-1 + Pi) / n, вот числа, должно выйти 123 879 (взял с ) Период 5 { 123900 10:00 123960 10:01 123600 10:02 123730 10:03 123680 10:04 } я бы очень хотел понять последовательность действий, по формуле пишут sum(Pi) / n т.е. 123680 / 5? - 123730 + 123680 / 5 ? или как? Объясните пожалуйста
Здравствуйте, в общем был на Lua 5.1 всё ок, работало, появилась нужда перейти на Quik 8.5.2.11 lua53.dll (lua 5.3) Ну и в общем, при запуске Dll, она тут же: крашит Quik, загружает ЦП 100%, просто выдаёт ошибку. (Critical error ACCESS_VIOLATION in script) Lib файл был собран 5.3.0
Код
static int forLua_TestFunc(lua_State* L)// Возвращает заданный текст
{
//закоментил что бы проверить работу без него MainЕ(); // моя функция
if (check == 1)
{
lua_pushstring(L, "1");
}
if (check == 2)
{
lua_pushstring(L, "2");
}
if (check == 0)
{
lua_pushstring(L, "0");
}
//lua_pushstring(L, "0");
return(1);
}
//=== Регистрация реализованных в dll функций, чтобы они стали "видимы" для Lua ================================//
static struct luaL_Reg ls_lib[] = {
{ "TestFunc", forLua_TestFunc },
{ NULL, NULL }
};
//=== Регистрация названия библиотеки, видимого в скрипте Lua ==================================================//
extern "C" LUALIB_API int luaopen_HydraConnector(lua_State * L) {
lua_newtable(L);
luaL_setfuncs(L, ls_lib, 0);
lua_setglobal(L, "MyConnector");
return 0;
}
Отредачил код, if(tostring(t.day) >= "07") then сделал if(tostring(t.day) >= "7") then но сути не меняет, 200 с чем то сообщений всё равно приходят, т.е. все сегодняшние данные.
Здравствуйте подскажите пожалуйста., использую простой тестовый скрипт, как сделать что бы я получал только текущую информацию после запуска скрипта?
суть, если я пишу в Quik Lua , то эта психованная, загружает мне данные все которые только может, т.е. если у неё есть в истории 350000 записей свечей, то она при запуске этого скрипта мне *иганёт 350000 msg Ухты....
Код
function eventCb( index )
message("Ухты")
end
function main()
local errorStr
ds , errorStr =CreateDataSource(p_classcode, p_seccode, p_timeframe )
if ( ds == nil ) then
end
ds:SetUpdateCallback(eventCb)
— Загрузка информации о позиции
— Цикл таймера
while isRun do
sleep( 10 )
end
end
я думаю что где то в quik нужно что то выключить, галочка стоит, Система -> Настройки -> Программа -> Сохранение данных -> Только данные, отражающие текущее состояние.
вот что странно пытался даже обойти так , О_О всё равно дала мне 2500 О_О
Код
local t = ds:T(index)
if(tostring(t.month) == "5") then
if(tostring(t.day) >= "07") then
message("Ухты")
end
end
do return end
Sergey написал: хоть они и разные и во всех их не могу одного понять! EMA (t) = EMA (t-1) + 2 *(P(t) – EMA (t-1))EM=Price(t)×k+EMA(y×(−k)откуда мне знать чему будет равен EMA (t-1) и
Эти алгоритмы считаются итеративно. E(t-1) - это результат предыдущего расчета, а не предыдущий элемент например массива. На первой (на самом деле нулевой :) ) итерации E(t-1) можно принять равным нулю либо цене расчета. По сути оба варианта равноправны, т.к. пользоваться значением индикатора имеет смысл после того только после (period+1) отсчета.
т.е. EMA (0) = 0 + 2 *(P(0) – 0) или EMA (0) = P(0) + 2 *(P(0) – P(0)). следующая EMA (1) = EMA(0) + 2 *(P(1) – EMA (0)) каждая последующая EMA (t) = EMA (t-1) + 2 *(P(t) – EMA (t-1))
Таким образом, чтобы исключить влияние переходного процесса БИХ-фильтра, значения можно считать корректными, с момента когда через фильтр прошло число отсчетов не менее длины периода расчета фильтра.
Чисто графически имеет смысл начинать с Р(0), так будет лучше выглядеть на графике, хотя сути это не меняет.
Николай подсказывает абсолютно верно: -хорошо бы хотя бы краем глаза взглянуть на теорию :)
Imersio Arrigo, ну вот у меня есть EMA из 3 свечей и он равен 66731; ниже те самые 3 свечи. int candle[3]; candle[0] = 66730; candle[1] = 66719; candle[2] = 66744; опишите алгоритм пожалуйста.
Здравствуйте, подскажите пожалуйста код функции EMA, или подробный алгоритм, в нэте туча подобных алгоритмов EMA (t) = EMA (t-1) + 2 *(P(t) – EMA (t-1))
EM=Price(t)×k+EMA(y×(−k)
хоть они и разные и во всех их не могу одного понять! EMA (t) = EMA (t-1) + 2 *(P(t) – EMA (t-1))
EM=Price(t)×k+EMA(y×(−k)
откуда мне знать чему будет равен EMA (t-1) и тд, если я его только хочу вычислить, просто для меня это звучит так, подходит ко мне человек с потерей памяти и спрашивает меня, сколько ему лет, а я ему говорю, ЛЕТ=(Лет-1) + 1 О_о так он же не знает сколько ему было лет, и сколько есть.
Для этого необходимо установить отступ от цены последней сделки (OFFSET), этот параметр указывает, насколько цена последней сделки должна стать ниже локального максимума цены, чтобы тэйк-профит сработал. Направление условной стоп заявки при этом должно быть "Продажа" (если лимитная выставлена на покупку).
Т.е. если я поставлю t["OFFSET"] = tostring(5) то мною описанной ситуации не будет?
Здравствуйте, в общем столкнулся с проблемой, а звучит так "Long по 16000", как выставить take профит, по цене которой я хочу, или выше "take 16300", но при этом, что бы сквизы меня не убивали, сейчас вот с таким кодом, если цена 16250, затем за секунду сквизанёт на 16301, и вернётся на 16250, то меня закроет по take по цене 16250, А я хочу по моей цене или выше)))
Код
t = {
["CLASSCODE"] = p_classcode,
["SECCODE"] = p_seccode,
["ACTION"] = "NEW_STOP_ORDER",
["ACCOUNT"] = "AKK" ,
["TRANS_ID"] = tostring( p_robot_id )
}
t["OPERATION"] = "S"
t["MARKET_TAKE_PROFIT"] = "YES"
t["MARKET_STOP_LIMIT"] = "YES"
t["PRICE"] = "0" -- Цена, по которой выставится заявка при срабатывании Стоп-Лосса (для рыночной заявки по акциям должна быть 0)
t["STOPPRICE"] = tostring(openprice + 300) -- Цена Тэйк-Профита
t["STOP_ORDER_KIND"] = "TAKE_PROFIT_AND_STOP_LIMIT_ORDER" -- Тип стоп-заявки
t["EXPIRY_DATE"] = "GTC"
t["IS_ACTIVE_IN_TIME"] = "NO"
t["STOPPRICE2"] = tostring(openprice - 150) -- Цена Стоп-Лосса
t["OFFSET"] = tostring(0)
t["QUANTITY"] = "1"
t["OFFSET_UNITS"] = "PRICE_UNITS"
t["SPREAD"] = tostring(0)
t["SPREAD_UNITS"] = "PRICE_UNITS"
local transResult = sendTransaction( t )
-- Проверка на ошибку
if ( transResult and transResult ~= "" ) then
return
end
Здравствуйте, в общем решил протестить одну стратегию, сделал код, всё ок, покупает, выставляет TAKE_PROFIT_AND_STOP_LIMIT_ORDER НО вот в чём трабл, по окончанию дня, я заметил что, что то стопы не так работают, начал приглядываться, и действительно они не срабатывают ПРЯМ вот часто, и я собственно хотел узнать, это дело в том что я на демо(finam) тестирую? или всё же тупят стопы-код?
Sergey написал: так что это не то что нужно =(( мне нужна текущая цена текущей позиции.
Что Вы понимаете под "текущая цена текущей позиции"? биржа транслирует то что Вам нужно, если да в каком параметре? Следует понимать что на срочном рынке (в отличии от фондового и валютного рынков), позиции ведет и транслирует биржа, а не QUIK. Следовательно если биржа не транслирует нужную Вам цифру то и в QUIK ее нет.
Окей тогда я проще опишу) фьюч, я допустим, покупаю по 105, затем через минуту я покупаю по 107, средняя цена у меня будет 106, а перед этим я делал ещё 100 сделок, так вот в чём вопрос, как мне получить цифру 106, моей текущей позиции. смысл в том, что я покупаю по маркету, и сразу же выставляю стоп, ну а стоп мне нужно выставить ОТ цены моей позиции +- прибыль - убыток
Sergey Gorokhov написал: Sergey, Этот параметр считает и транслирует биржа, можете поинтересоваться у нее какая формула расчета. В биржевом потоке это параметр waprice из таблицы position потока FORTS_POS_REPL
И снова я к вам вернулся)) в общем протестил что да как, и вот что выходит перед покупкой с прошлой сделки в "эффект.цена позиции" осталась цена 65212 (позиций нет) short по маркету. в "Таблица заявок" цена 65103 а в "эффект.цена позиции" цена стала 65209(это средняя цена всех предыдущих сделок как я понял), такой цены в стакане в Bid Ask нет. так что это не то что нужно =(( мне нужна текущая цена текущей позиции.
Благодарю вас! так заработало. только я до сих пор не понимаю, почему в "Таблица моих сделок" цена одна купли, а по эффект.цена позиции другая. я уже не понимаю на какую мне смотреть)))
Так на всякий случай спрошу, если я куплю фьюч по рынку, затем через 2 минуты, ещё раз докуплю фьюч, я увижу среднюю цену позиции в эффект.цена.поз? или в другом месте нужно смотреть?
Да, верно, это и есть Средневзвешенная цена открытия.
погуглил что да как вродь всё правильно написал, но пишет nil позиция открыта, в лонг. tas=TABLE getFuturesHolding("SPBFUT","70180ZB", "SiM9",4) message (tostring(tas))
Так на всякий случай спрошу, если я куплю фьюч по рынку, затем через 2 минуты, ещё раз докуплю фьюч, я увижу среднюю цену позиции в эффект.цена.поз? или в другом месте нужно смотреть?
ну вот в разделе quik -> Доступные Скрипты -> Загруженные скрипты Есть 2 lua файла 1.lua основной запускается и работает, нужно через него запустить 2.lua.
И ещё вопросик, почему когда стоит "тэйк-профит, если цена >= 64338" а меня в итоге закрывает по 64325? как это устранить? я хочу что б закрывало больше или равно по цене.
В общем потыкал в гугле) и сделал пока что такую вот рабочую версию, если можно сделать более практичной, буду благодарен за помощь.
Код
local t = ds:T(index)
for i = getNumberOf("stop_orders")-1,0,-1 do
T = getItem("stop_orders",i);
message(bit.test(T.flags,0))
if(bit.test(T.flags,0) == true) then
message('DA')
end
end
Пример для проверки стоп заявки: if bit.test(zalyavka.flags, 0) then message ("заявка активная") end
Я прошу прощения, я недавно с lua работаю, стоп заявкой считается "Тэйк-профит и стоп-лимит"? и что нужно мне знать для работы данной проверки? может быть идентификатор заявки какой то или ещё что то? if bit.test(zalyavka.flags, 0) then message ("заявка активная") end
Здравствуйте, кратко опишу ситуацию, покупаю фьюч, далее выставляю через lua "Тэйк-профит и стоп-лимит", вопрос вот в чём, как мне через lua проверить исполнена заявка или активная? Как сделать что бы скрипт её видел? в виде переменной, типо if(zalyavka == true) then message ("заявка активная) end Большое спасибо