Снова возник вопрос, связанный с переходом на lua 5.3. В комбинации функций, удаляющих заявку, номер заявки (order_num) из таблицы заявок (функция getNumberOf("orders")) отображается в виде 1.4898984Е (цифры другие, как пример) и не идентифицируется как номер заявки. Версия Квика последняя. При этом полностью аналогичная комбинация функций, удаляющих стоп-заявку, работает; номер стоп-заявки (order_num) робот видит корректно.
Прошу вашей поддержки. В чём ошибка?
Код
function DeleteZayByNumber(class,emit,keyNumber)
transaction={
["CLASSCODE"] = class,
["SECCODE"] = emit,
["ACTION"] = "KILL_ORDER",
["TRANS_ID"] = "333",
["ORDER_KEY"] = tostring(keyNumber),
}
transaction.CLIENT_CODE = "РОБОТ"
local res = sendTransaction(transaction)
message(res)
end
function DeleteAllZaySell(acc,emit,class)
local NumOfCandlesM1 = getNumCandles (graphic_id)
local t, n, _ = getCandlesByIndex(graphic_id, 0, NumOfCandlesM1-3, 3)
local N = getNumberOf("orders")
local deleteCount = 0
for i = 0,N-1 do
local row = getItem("orders",i)
if(row.account==acc and row.sec_code==emit and row.class_code==class) then
if(bit.band(row.flags,1)>0) and
(bit.band(row.flags,4)>0) then
local keyNumber = math.floor(row.order_num)
DeleteZayByNumber(class,emit,keyNumber)
deleteCount = deleteCount + 1
end
end
end
return deleteCount
end
Если число 5 выглядит как целое, но его тип math.type может быть float. Поэтому tostring добавит в представление точку и ноль. Квик такое не принимает в качестве параметра транзакций, где предполагается целое.
Писал робота для Квика версии 7 на lua 5.1. При использовании на демо-версии Квика 7 версии робот работает; при использовании на реальной версии 8.12.0.41 - не выставляет отложку в соответствии с кодом. Вопрос: каким образом нужно изменить код, чтобы робот заработал на новой версии Квика? Возможно, есть какое-то руководство или отдельная тема на форуме, посвящённая изменениям в коде при переходе с lua 5.1 на lua 5.3?
Неработающая на новой версии Квика часть кода:
Код
function NewOtlLong(acc,emit,class)
local NumOfCandlesM1 = getNumCandles (graphic_id)
local t, n, _ = getCandlesByIndex(graphic_id, 0, NumOfCandlesM1-3, 3)
transaction={
["ACCOUNT"] = acc,
["CLASSCODE"] = class,
["SECCODE"] = emit,
["ACTION"] = "NEW_STOP_ORDER",
["TRANS_ID"] = "001",
["OPERATION"] = "B",
["QUANTITY"] = "1",
["STOPPRICE"] = tostring((t[1].low)+60),
["PRICE"] = tostring((t[1].low)+60),
["EXPIRY_DATE"] = "GTC"
}
transaction.CLIENT_CODE = "РОБОТ"
local res = sendTransaction(transaction)
return 1
end
Пишу простой код на Lua. Задача: при выполнении определённых условий высвечивать на экране сообщение "Возможна сделка в бай, ...". Столкнулся с проблемой: окно сообщения появляется на экране каждые 5 секунд (и то только благодаря тому, что добавлена в код строка "sleep (5000)"). Вопрос: как прописать код, чтобы сообщение появлялось либо раз в N минут (но тогда именно сразу после открытия новой свечи), либо просто появлялось всего один раз на каждое условие, а не зацикливалось по кругу?
Фрагмент кода привожу ниже:
function Body()
Problem = ""
sleep (20000)
local TransCount = 0 local PosNow = PosNowFunc(Emit,MyAccount) local Signal = SignalCheck() local OtlPos = OtlPosFunc (Emit,MyAccount)
local NumOfCandlesM1 = getNumCandles (graphic_id) local t, n, _ = getCandlesByIndex(graphic_id, 0, NumOfCandlesM1-3, 3)
if (Signal==1) and (OtlPos==0) and (PosNow==0) and (t[1].high-t[1].low)>=60 then message ("Возможна сделка в бай") end
--M1 local N1=getNumCandles(graphic_id) local t1,n1,l1=getCandlesByIndex(graphic_id, 0, N1-2, 2) end
Пишу робота, который входит в сделку по определённой свечной формации. Всё отлично работает, но стоит задача привязать робота к индикатору Аллигатор. А как только добавляю индикатор на график, робот перестаёт работать и реагировать на какие-либо сигналы. Методом проб вычислил, что так же робот ведёт себя при добавлении индикатора Ichimoku, - предполагаю, что дело в сдвиге линий индикатора и сдвиг линий сбивает процесс считывания информации...
В чём может быть причина и как мне сонастроить Аллигатора с роботом?
Открыта сделка (допустим, в бай), и выставлен стоп-ордер (стоп-лосс) в селл. Условие выставления стоп-ордера по роботу - "если PosNow>0 и нет стоп-ордеров, то выставляется стоп-ордер по определённой цене". Столкнулся с проблемой: когда цена доходит до стопа, между моментом отправки приказа на сервер и моментом закрытия сделки в бай проходит какое-то время, т.е. есть момент, когда стоп-ордера уже нет, а сделка ещё открыта. И в этот момент робот выставляет новый стоп-ордер, и сразу же его открывает, т.е. вместо одного стоп-ордера срабатывают два, и получается разворот позиции. А нужно - просто закрыть сделку в бай. Подскажите, как этот вопрос решить? Поможет ли, если я заменю стоп-ордер на обычную заявку (то есть, при открытой сделке стоп-лосс не будет выставляться, а просто будет открываться заявка в противоположную сторону, если цена доходит до определённого уровня)? Период сна sleep -1000 мс.
Здравствуйте. Возник вопрос с приведением типов: из типа DOUBLE (цена, в формате 113300.000000) требуется привести в строковый формат без нулей после точки (113300), чтобы использовать в таблице транзакции (стоп-ордера). Пробовал использовать mathfloor; по декоде выглядит, как будто нули убрались, на деле - по-прежнему выводит ошибку. Подскажите, каким образом выполнить эту задачу? Цена в формате DOUBLE у меня в виде переменной
Задача - из метки, созданной при помощи робота (AddLabel), вернуть параметр YVALUE (т.е. цену, на уровне которой находится метка), чтобы затем использовать эту цену как переменную. Пробую сделать это при помощи функции GetLabelParams, ошибка - Декода выдаёт GetLabelParams=nil.
Вот часть кода:
Код
local StopPointBuy = GetLabelParams(graphic_id,label_id)
Переменные graphic_id и label_id определяются. В чём ошибка? Или есть более простой способ вывести из таблицы метки значение параметра?
Неправильно скопировал код... Вот так будет более понятно, без лишних строк:
Код
MyAccount="SPBFUT00OI9" -- сюда вбить свой код клиента; или вбить в настройки индикатора в квике
class_code="SPBFUT"
Emit="RIZ8"
is_run=true
function main()
while is_run do
Body()
end
end
function OnStop(stop_flag)
is_run=false
stop_flag=1
end
function Body()
function PosNowFunc(emit,account) --??? откуда здесь такие локальные переменные??? находим позицию по инструменту на фортс
local nSize = getNumberOf("futures_client_holding") --количество строк в таблице "Ограничения по клиентским счетам"
if (nSize~=nil)then
for i = 0, nSize-1 do
local row = getItem("futures_client_holding",i)
if(row~=nil and row.sec_code == emit and row.trdaccid == account) then --больше одной строки не должно быть для каждого инструмента
return tonumber(row.totalnet) --значение позиции на фортс
end
end
end
return 0
end
local PosNow = PosNowFunc(Emit,MyAccount)
if PosNow>0 then
message("Работает!")
end
end
Только начинаю программировать, нужна ваша поддержка.
Пишу программу, чтобы робот выводил сообщение, когда открывается позиция. Пока вот такой код. Сообщения не выдаёт, ошибки тоже не показывает. Что здесь не верно?... Идентификатор в графике прописан.
Код
MyAccount="---" -- сюда вбить свой код клиента; или вбить в настройки индикатора в квике
class_code="SPBFUT"
Emit="RIZ8"
loss=100
loss_prosk=0
profit=110 -- количество пунктов от места входа в сделку до тейк профита; или вбить в настройки индикатора в квике
profit_otstup=0 -- отступ от максимума (параметр тейк-профита); или вбить в настройки индикатора в квике
profit_prosk=10 -- защитный спред (параметр тейк-профита); или вбить в настройки индикатора в квике
is_run=true
function main()
while is_run do
Body()
end
end
function OnStop(stop_flag)
is_run=false
stop_flag=1
end
function Body()
function PosNowFunc(emit,account)
local nSize = getNumberOf("futures_client_holding") --количество строк в таблице "Ограничения по клиентским счетам"
if (nSize~=nil)then
for i = 0, nSize-1 do
local row = getItem("futures_client_holding",i)
if(row~=nil and row.sec_code == emit and row.trdaccid == account) then --больше одной строки не должно быть для каждого инструмента
return tonumber(row.totalnet) --значение позиции на фортс
end
end
end
return 0
end
local PosNow = PosNowFunc(Emit,MyAccount)
local N=getNumCandles("M1")
t,n,l=getCandlesByIndex("M1", 0, N-6, 6) --возвращает информацию о 5 последних свечах на графике с определённым идентификатором.
if PosNow>0 then
if t[5].low<t[4].low
and t[5].low<t[3].low
and t[5].low<t[2].low
and t[5].low<t[1].low
and t[5].low<t[0].low
then low_high=(t[5].low)-10
message("Стоп-лосс будет установлен по цене ".. tostring ((t[5].low)-10).."!")
elseif t[4].low<t[5].low
and t[4].low<t[3].low
and t[4].low<t[2].low
and t[4].low<t[1].low
and t[4].low<t[0].low
then low_high=(t[4].low)-10
message("Стоп-лосс будет установлен по цене ".. tostring ((t[4].low)-10).."!")
elseif t[3].low<t[5].low
and t[3].low<t[4].low
and t[3].low<t[2].low
and t[3].low<t[1].low
and t[3].low<t[0].low
then low_high=(t[3].low)-10
message("Стоп-лосс будет установлен по цене ".. tostring ((t[3].low)-10).."!")
elseif t[2].low<t[5].low
and t[2].low<t[4].low
and t[2].low<t[3].low
and t[2].low<t[1].low
and t[2].low<t[0].low
then low_high=(t[2].low)-10
message("Стоп-лосс будет установлен по цене ".. tostring ((t[2].low)-10).."!")
elseif t[1].low<t[5].low
and t[1].low<t[4].low
and t[1].low<t[3].low
and t[1].low<t[2].low
and t[1].low<t[0].low
then -- then low_high=(t[1].low)-10
message("Стоп-лосс будет установлен по цене ".. tostring ((t[1].low)-10).."!")
elseif t[0].low<t[5].low
and t[0].low<t[4].low
and t[0].low<t[3].low
and t[0].low<t[2].low
and t[0].low<t[1].low
then low_high=(t[0].low)-10
message("Стоп-лосс будет установлен по цене ".. tostring ((t[0].low)-10).."!")
end
end
if PosNow<0 then
message("Работает!")
end
end