Олег (Все сообщения пользователя)

Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Перевод робота с lua 5.1 на lua 5.3
 
Цитата
BlaZed написал:
Цитата
Олег написал:
В чём ошибка?
Вот в этой строчке
Код
   local  keyNumber  =   math.floor (row.order_num)  
Зачем тут у вас math.floor()?
Он вам и приводит число к экспоненциальной записи.
Уберите и будет все работать

Добрый день. Попробовал убрать math.floor.
Ошибка остаётся прежней: Неправильно указан номер заявки: "1.9250430826724e+018"
Перевод робота с lua 5.1 на lua 5.3
 
Доброго дня.

Снова возник вопрос, связанный с переходом на 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
 
Цитата
Nikolay написал:
Много раз уже обсуждалось.
Для примера  https://forum.quik.ru/messages/forum10/message49125/topic5841
lua 5.3 при использовании tostring к типу float добаляет ".0 в представление.
tostring(5) ~ "5.0"

Если число 5 выглядит как целое, но его тип math.type может быть float. Поэтому tostring добавит в представление точку и ноль. Квик такое не принимает в качестве параметра транзакций, где предполагается целое.
Благодарю. Добавил math.floor:  tostring(math.floor((t[1].low)+60)), заработало.
Перевод робота с lua 5.1 на lua 5.3
 
Добрый день.

Писал робота для Квика версии 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
Отменить цикличность появления сообщения
 
Благодарю Вас за ответы.
Отменить цикличность появления сообщения
 
Небольшая корректировка: сейчас в коде прописано sleep (20000), то есть сообщение появляется раз в 20 секунд.
Отменить цикличность появления сообщения
 
Добрый день.

Пишу простой код на 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, - предполагаю, что дело в сдвиге линий индикатора и сдвиг линий сбивает процесс считывания информации...

В чём может быть причина и как мне сонастроить Аллигатора с роботом?
QLUA, вопросы начинающих.
 
Подскажите пожалуйста ещё с одним вопросом.

Открыта сделка (допустим, в бай), и выставлен стоп-ордер (стоп-лосс) в селл. Условие выставления стоп-ордера по роботу - "если PosNow>0 и нет стоп-ордеров, то выставляется стоп-ордер по определённой цене". Столкнулся с проблемой: когда цена доходит до стопа, между моментом отправки приказа на сервер и моментом закрытия сделки в бай проходит какое-то время, т.е. есть момент, когда стоп-ордера уже нет, а сделка ещё открыта. И в этот момент робот выставляет новый стоп-ордер, и сразу же его открывает, т.е. вместо одного стоп-ордера срабатывают два, и получается разворот позиции. А нужно - просто закрыть сделку в бай.
Подскажите, как этот вопрос решить?
Поможет ли, если я заменю стоп-ордер на обычную заявку (то есть, при открытой сделке стоп-лосс не будет выставляться, а просто будет открываться заявка в противоположную сторону, если цена доходит до определённого уровня)?
Период сна sleep -1000 мс.
QLUA, вопросы начинающих.
 
Цитата
Sergey Gorokhov написал:
Олег,
Просьба выложить пример кода на котором воспроизводится проблема
Разобрался, благодарю!
Ошибка была теперь уже в коде транзакции; ваш код помог, всё работает.
QLUA, вопросы начинающих.
 
Цитата
Sergey Gorokhov написал:
Например
Код
   string.format ( "%.0f" , StopShort.yvalue)  

Теперь нулей нет (проверяю по декоде и сообщению), но квик выдаёт сообщение с прежней ошибкой:
QLUA, вопросы начинающих.
 
Цитата
Sergey Gorokhov написал:
Олег,
Не понятно чем не устраивает tostring?
Код
  X  =   113300.000000 
 message (tostring(X))
  
Когда беру просто число, как Вы сделали, то tostring работает. Но когда беру свою переменную YVALUE,
Код
local price = tostring(StopShort.yvalue)
нули остаются...
yvalue - это параметр метки "Значение параметра на оси Y, к которому будет привязана метка", формат, судя по справочнику - DOUBLE.
QLUA, вопросы начинающих.
 
Здравствуйте.
Возник вопрос с приведением типов: из типа DOUBLE (цена, в формате 113300.000000) требуется привести в строковый формат без нулей после точки (113300), чтобы использовать в таблице транзакции (стоп-ордера).
Пробовал использовать mathfloor; по декоде выглядит, как будто нули убрались, на деле - по-прежнему выводит ошибку. Подскажите, каким образом выполнить эту задачу?
Цена в формате DOUBLE у меня в виде переменной
Код
StopLong.yvalue
.
вывод данных метки, Как вывести параметр метки при помощи GetLabelParams?
 
Благодарю, разобрался. Дело было в последовательности функций.
вывод данных метки, Как вывести параметр метки при помощи GetLabelParams?
 
Понял, что после скобок нужно указать возвращаемый параметр. ( то есть:
Код
parame = GetLabelParams(graphic_id,label_id).yvalue или parame = GetLabelParams(graphic_id,label_id).YVALUE
Вывожу для проверки в сообщение:
Код
message(tostring (parame))

Квик возвращает ошибку. Никак не пойму, в чём ошибка, прошу помочь.
вывод данных метки, Как вывести параметр метки при помощи GetLabelParams?
 
Добрый день.

Задача - из метки, созданной при помощи робота (AddLabel), вернуть параметр YVALUE (т.е. цену, на уровне которой находится метка), чтобы затем использовать эту цену как переменную.
Пробую сделать это при помощи функции GetLabelParams, ошибка - Декода выдаёт GetLabelParams=nil.

Вот часть кода:
Код
local StopPointBuy = GetLabelParams(graphic_id,label_id)
Переменные graphic_id и label_id определяются. В чём ошибка? Или есть более простой способ вывести из таблицы метки значение параметра?
Сообщение при открытии позиции
 
Цитата
Sergey Gorokhov написал:
Олег,
Тогда проверьте что попадает в PosNow перед if.
message("PosNow="..PosNow)
Не совсем понял...
Строка выглядит
if PosNow>0 then
, между if и PosNow ничего нет..?
Сообщение при открытии позиции
 
Sergey Gorokhov, добавил; проблема осталась, всё равно не показывает сообщение...
Сообщение при открытии позиции
 
Неправильно скопировал код...
Вот так будет более понятно, без лишних строк:
Код
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
Страницы: 1
Наверх