Код работает, но при выключении скрипта Quik подвисает. Честно говоря, многое не понимаю в этом коде. START_TIME объявлена, как строковая переменная, но в строке:
Код
START_TIME=FixTime(START_TIME)
ей даётся значение из функции FixTime(), которая возвращает таблицу Out !!! сравнение:
Код
os.time()<os.time(START_TIME)
тоже не понимаю, получается сравнивается таблица START_TIME и число от функции os.time() т.к. эта функция, если не передавать ей таблицу возвращает число! В общем больше вопросов, чем ответов :) )
Ну зато подарили идею. Я воспользуюсь конструкцией: Out.hour,Out.min, чтобы получить из них число вида XXYY и уже сравнивать с временем, которое тоже нужно будет переводить в вид числа XXYY
Как исполнить такую проверку? Или, наоборот, торговать в первую секунду (минуту, в зависимости от выбранного фрейма) из Квика нет никакой возможности, как сделать выгоднее выставить условие на проверку времени?
Дело в том, что очень много параметров в help'e несут как бы время, но они разные, какие-то из них строковые, а есть вообще таблица! От такого разбега я легка растерялся.
Николай Бехтерев пишет: Вводить третью промежуточную таблицу?
Смотря чего Вы хотите добиться. Сейчас, в событии OnTransReply, Вы присваиваете значение table_order из переменной order, которая не существует. То что она есть в событии OnTrade не значит что ее можно использовать где попало.
Спасибо, эта функция OnTransReply в скрипте просто следствие моей невнимательности
Николай Бехтерев пишет: Ох, а у вас там разный регистр для каждой позиции получается или можно всё мелкими буквами оформить?
Вы неверно поняли рекомендацию. Вам НЕ нужно все писать маленькими буквами. Вам нужно писать все именно так как в документации и никак иначе.
Код
stop = 100
table_order = {
["order_num "] = 0,
["class_code"] = "",
["account"] = "",
["sec_code"] = "",
["qty"] = "",
["price"] = 0,
["flags"] = 0,
}
GUN = 0
FIRE = 0
transaction = {
["TRANS_ID"] = "",
["CLASSCODE"] = "",
["ACTION"] = "",
["ACCOUNT"] = "",
["SECCODE"] = "",
["QUANTITY"] = "",
["OPERATION"] = "",
["STOPPRICE"] = "",
["PRICE"] = "",
}
zed_is_dead = 100
is_run = 1
ID = 1
table_order.flags = 1
function OnTrade(order)
table_order = order
end
function OnTransReply()
table_order = order
end
function OnStop()
is_run = 0
end
function main()
while is_run do
if zed_is_dead ~= table_order.order_num then
zed_is_dead = table_order.order_num
transaction.TRANS_ID = tostring(ID)
transaction.CLASSCODE = table_order.class_code
transaction.ACTION = "NEW_STOP_ORDER"
transaction.ACCOUNT = table_order.account
transaction.SECCODE = table_order.sec_code
transaction.QUANTITY = tostring(table_order.qty)
ID = ID + 1
a = tostring(table_order.flags)
message(a,3)
if bit.band(table_order.flags,4) > 0 then
transaction.OPERATION = "B"
GUN = table_order.price + stop
FIRE = table_order.price + stop + stop
transaction.STOPPRICE = tostring(GUN)
transaction.PRICE = tostring(FIRE)
--a = tostring(table_order.flags)
else
GUN = table_order.price - stop
FIRE = table_order.price - stop - stop
transaction.OPERATION = "S"
transaction.STOPPRICE = tostring(GUN)
transaction.PRICE = tostring(FIRE)
end
transaction.TYPE = "M"
transaction.STOP_ORDER_KIND = "SIMPLE_STOP_ORDER"
transaction.EXPIRY_DATE = "GTC"
sendTransaction(transaction)
--message(a,3)
end
sleep(1000)
end
end
Слепил такой вот код на выставление стопов после сделки. На первый раз пролетает нормально, выставляет стоп. На второй круг вылазит ошибка: 45: attempt to index global 'table_order' (a nil value) 45 строка: if zed_is_dead ~= table_order.order_num then Когда это table_order превращается в nil?
Sergey Gorokhov пишет: Николай Бехтерев , Нет, параметры все таки лучше задать, так как если колбека не будет то опять будет ошибка. Только задать правильно, то есть маленькими буквами
Ох, а у вас там разный регистр для каждой позиции получается или можно всё мелкими буквами оформить?
Sergey Gorokhov пишет: Николай Бехтерев , Это уже другая история. Во первых PRICE неправильно писать. Так как Lua регистрозависимый язык. Нужно писать маленькими буквами.
Во вторых, как было сказано работать будет только при новых сделках. То есть если сделки были ДО запуска скрипта, то скрипт их не увидит. Если хотите чтобы отображался номер последней сделки, нужно использовать getItem
Да мне не только номер нужен, просто на номере я решил проверить получил ли я таблицу. При запущенyом скрипте и table_order.price получил всё тот же nill пока не убрал в определении ["PRICE"] = 0. Выходит определять таблицу в топике не надо было?
Sergey Gorokhov пишет: Николай Бехтерев , У Вас для этого уже все написано. Все что нужно удалить строку и все. Далее, согласно коду при появлении новой сделки Вы получите сообщение
table_order = { ["CLASSCODE"]="",
["ACTION"]="",
["ACCOUNT"]="",
["OPERATION"] = "",
["SECCODE"] = "",
["PRICE"] = 0,
["QUANTITY"] = ""
}
function OnTrade(order)
table_order = order
end
function OnStop()
is_run = 0
end
function main()
while is_run do
table_order = OnTrade()
message(tostring(table_order.PRICE),3)
sleep(1000)
end
end
вылазит: trans3.lua:28: attempt to index global 'table_order' (a nil value). откуда nil? сделки в системе уже были...
Не сразу понял эту штуку, пока не включил калькулятор и не увидел, как выглядит в двоичной системе цифра 4! Зачем было вводить эти биты, какая-то экономия на памяти?)))
table_order = {}
zed_is_dead = ""
is_run = 1
function OnTrade(order)
table_order = order
end
function OnStop()
is_run = 0
end
function main()
while is_run do
zed_is_dead = tostring(table_order.trade_num)
message(zed_is_dead,1)
end
end
Что не так с этим скриптом? если убрать 15 и 16 строчки:
Дмитрий пишет: И что значит "переименовал"? Что именно делали?
ну был у меня график: цена, объём, ОИ, естественно, что нет ничего по имени zzz. Я решил, что идентификатор это наименование в свойствах графика, это единственный параметр, который подходил, я и стал всё подряд в zzz переименовывать.
Переименовал всё что только можно в окне с графиком цены, ОИ, ATR, объём в "zzz" как прописано в файле. всё равно выдаёт: Total 0 candles 0 lines И ничего больше.