Зачем тут у вас math.floor()? Он вам и приводит число к экспоненциальной записи. Уберите и будет все работать
Добрый день. Попробовал убрать math.floor. Ошибка остаётся прежней: Неправильно указан номер заявки: "1.9250430826724e+018"
Перевод робота с lua 5.1 на lua 5.3
Пользователь
Сообщений: Регистрация: 08.11.2018
10.10.2021 14:55:14
Доброго дня.
Снова возник вопрос, связанный с переходом на 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
Перевод робота с lua 5.1 на lua 5.3
Пользователь
Сообщений: Регистрация: 08.11.2018
14.09.2021 12:26:01
Цитата
Nikolay написал: Много раз уже обсуждалось. Для примера lua 5.3 при использовании tostring к типу float добаляет ".0 в представление. tostring(5) ~ "5.0"
Если число 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
Отменить цикличность появления сообщения
Пользователь
Сообщений: Регистрация: 08.11.2018
10.09.2021 13:58:19
Благодарю Вас за ответы.
Отменить цикличность появления сообщения
Пользователь
Сообщений: Регистрация: 08.11.2018
02.09.2021 18:00:11
Небольшая корректировка: сейчас в коде прописано sleep (20000), то есть сообщение появляется раз в 20 секунд.
Отменить цикличность появления сообщения
Пользователь
Сообщений: Регистрация: 08.11.2018
02.09.2021 17:58:49
Добрый день.
Пишу простой код на 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
Робот не работает на графике с Аллигатором
Пользователь
Сообщений: Регистрация: 08.11.2018
02.11.2019 22:38:38
Доброго времени суток.
Пишу робота, который входит в сделку по определённой свечной формации. Всё отлично работает, но стоит задача привязать робота к индикатору Аллигатор. А как только добавляю индикатор на график, робот перестаёт работать и реагировать на какие-либо сигналы. Методом проб вычислил, что так же робот ведёт себя при добавлении индикатора Ichimoku, - предполагаю, что дело в сдвиге линий индикатора и сдвиг линий сбивает процесс считывания информации...
В чём может быть причина и как мне сонастроить Аллигатора с роботом?
QLUA, вопросы начинающих.
Пользователь
Сообщений: Регистрация: 08.11.2018
05.12.2018 09:44:04
Подскажите пожалуйста ещё с одним вопросом.
Открыта сделка (допустим, в бай), и выставлен стоп-ордер (стоп-лосс) в селл. Условие выставления стоп-ордера по роботу - "если PosNow>0 и нет стоп-ордеров, то выставляется стоп-ордер по определённой цене". Столкнулся с проблемой: когда цена доходит до стопа, между моментом отправки приказа на сервер и моментом закрытия сделки в бай проходит какое-то время, т.е. есть момент, когда стоп-ордера уже нет, а сделка ещё открыта. И в этот момент робот выставляет новый стоп-ордер, и сразу же его открывает, т.е. вместо одного стоп-ордера срабатывают два, и получается разворот позиции. А нужно - просто закрыть сделку в бай. Подскажите, как этот вопрос решить? Поможет ли, если я заменю стоп-ордер на обычную заявку (то есть, при открытой сделке стоп-лосс не будет выставляться, а просто будет открываться заявка в противоположную сторону, если цена доходит до определённого уровня)? Период сна sleep -1000 мс.
QLUA, вопросы начинающих.
Пользователь
Сообщений: Регистрация: 08.11.2018
03.12.2018 10:53:08
Цитата
Sergey Gorokhov написал: , Просьба выложить пример кода на котором воспроизводится проблема
Разобрался, благодарю! Ошибка была теперь уже в коде транзакции; ваш код помог, всё работает.
Теперь нулей нет (проверяю по декоде и сообщению), но квик выдаёт сообщение с прежней ошибкой:
QLUA, вопросы начинающих.
Пользователь
Сообщений: Регистрация: 08.11.2018
30.11.2018 12:36:27
Цитата
Sergey Gorokhov написал: , Не понятно чем не устраивает tostring?
Код
X = 113300.000000
message (tostring(X))
Когда беру просто число, как Вы сделали, то tostring работает. Но когда беру свою переменную YVALUE,
Код
local price = tostring(StopShort.yvalue)
нули остаются... yvalue - это параметр метки "Значение параметра на оси Y, к которому будет привязана метка", формат, судя по справочнику - DOUBLE.
QLUA, вопросы начинающих.
Пользователь
Сообщений: Регистрация: 08.11.2018
30.11.2018 10:02:14
Здравствуйте. Возник вопрос с приведением типов: из типа DOUBLE (цена, в формате 113300.000000) требуется привести в строковый формат без нулей после точки (113300), чтобы использовать в таблице транзакции (стоп-ордера). Пробовал использовать mathfloor; по декоде выглядит, как будто нули убрались, на деле - по-прежнему выводит ошибку. Подскажите, каким образом выполнить эту задачу? Цена в формате DOUBLE у меня в виде переменной
Код
StopLong.yvalue
.
вывод данных метки, Как вывести параметр метки при помощи GetLabelParams?
Пользователь
Сообщений: Регистрация: 08.11.2018
27.11.2018 23:28:05
Благодарю, разобрался. Дело было в последовательности функций.
вывод данных метки, Как вывести параметр метки при помощи GetLabelParams?
Пользователь
Сообщений: Регистрация: 08.11.2018
27.11.2018 16:09:11
Понял, что после скобок нужно указать возвращаемый параметр. ( то есть:
Код
parame = GetLabelParams(graphic_id,label_id).yvalue или parame = GetLabelParams(graphic_id,label_id).YVALUE
Вывожу для проверки в сообщение:
Код
message(tostring (parame))
Квик возвращает ошибку. Никак не пойму, в чём ошибка, прошу помочь.
вывод данных метки, Как вывести параметр метки при помощи GetLabelParams?
Пользователь
Сообщений: Регистрация: 08.11.2018
27.11.2018 14:12:46
Добрый день.
Задача - из метки, созданной при помощи робота (AddLabel), вернуть параметр YVALUE (т.е. цену, на уровне которой находится метка), чтобы затем использовать эту цену как переменную. Пробую сделать это при помощи функции GetLabelParams, ошибка - Декода выдаёт GetLabelParams=nil.
Вот часть кода:
Код
local StopPointBuy = GetLabelParams(graphic_id,label_id)
Переменные graphic_id и label_id определяются. В чём ошибка? Или есть более простой способ вывести из таблицы метки значение параметра?
Сообщение при открытии позиции
Пользователь
Сообщений: Регистрация: 08.11.2018
08.11.2018 13:34:01
Цитата
Sergey Gorokhov написал: , Тогда проверьте что попадает в PosNow перед if. message("PosNow="..PosNow)
Не совсем понял... Строка выглядит if PosNow>0 then , между if и PosNow ничего нет..?
Сообщение при открытии позиции
Пользователь
Сообщений: Регистрация: 08.11.2018
08.11.2018 13:10:58
Sergey Gorokhov, добавил; проблема осталась, всё равно не показывает сообщение...
Сообщение при открытии позиции
Пользователь
Сообщений: Регистрация: 08.11.2018
08.11.2018 13:05:07
Неправильно скопировал код... Вот так будет более понятно, без лишних строк:
Код
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
Сообщение при открытии позиции
Пользователь
Сообщений: Регистрация: 08.11.2018
08.11.2018 12:45:35
Добрый день.
Только начинаю программировать, нужна ваша поддержка.
Пишу программу, чтобы робот выводил сообщение, когда открывается позиция. Пока вот такой код. Сообщения не выдаёт, ошибки тоже не показывает. Что здесь не верно?... Идентификатор в графике прописан.
Код
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