Блог им. Bondiator
local SecCode = «LKU0»
local Quantity=1
function main()
while stopped == false do
local Quotes = getQuoteLevel2(«SPBFUT», SecCode)
local Offer_Price = tonumber(Quotes.offer[1].price)
local Offer_Vol = tonumber(Quotes.offer[1].quantity)
--отправка формы заявки
local LimitOrderBuy = { ххххх}
--условие входа в лонг
if Offer_Vol>10 then
message(Order)
local Order = sendTransaction(LimitOrderBuy)
end
sleep (200)
end
Смысл его такой: если количество лукойла в первой строке стакана больше 10, то покупается 1 бумага и работа скрипта завершается.
Так как скрипт срабатывает при определенном условии, то для перезапуска используется while stopped == false do и sleep (200).
Прикол в том, что при наступлении условия, скрипт начинает бомбить заявки по 1 шт пока не кончаются деньги (виртуальные).
while (stopped == false) and (buyed==false)
не знаю по правилам луа нужны там скобки или нет?
а при покупке ставишь buyed=true
if Offer_Vol>10 then
buyed=true
message(Order)
local Order = sendTransaction(LimitOrderBuy)
end
p.s. на луа ничего ни разу не писал )))
по приведенному тексту не видно, чтобы работа завершалась.
Возможно, в теле условия имеет смысл написать типа
stopped = true
Например, я не вижу как и где Вы присвоили первое значение переменной stopped.
Если не присвоили нигде, то будет работать, так как по умолчанию она будет nil, который по умолчанию в логических конструкциях определяется как false.
Допускаю, что Вы в условии написали local stopped = true (просто судя по количеству local по тексту). Тоже не будет работать, если требуется могу пояснить почему.
Общий принцип Вам уже изложили и он работает.
Использовать return тоже вариант, но, рано или поздно это решение исчерпает себя.
А есть варианты что-то вроде: если в портфеле есть 1 бумага, то работа заканчивается?
Надо в самом начале программы поставить is_run=false
Потом все что написано выше в
function main()
while is_run do
...
покупка
is_run=false
...
end
end
function OnTrade(trd)
if trd[«account»] and trd[«account»] == account and trd[«trade_num»] > untrade and trd[«sec_code»] == sec then
if bit.band(tonumber(trd[«flags»]), 4) > 0 then — bit.band(tonumber(trd[«flags»]), 4) > 0 флаг 4 больше нуля — продажа
Position = Position — tonumber(trd[«qty»]) — продажа
else
Position = Position + tonumber(trd[«qty»]) — покупка
end
if Position ~= 0 then
elseif Position == 0 then
end
untrade = trd[«trade_num»]
end
end
break — выход из цикла
То есть, по логике «покупается бумага и работа скрипта завершается» необходимо
if Offer_Vol>10 then
message(Order)
local Order = sendTransaction(LimitOrderBuy)
return
end
while stopped == false
Сравнение булевой переменной с булевым значением для того только, чтобы получить булево значение, абсолютно избыточно. К тому же, переменная stopped вообще нигде не инициализируется, то есть равно null
Работать будет и
while not stopped
но читать удобнее второе.
Более того, раз нам нужно впасть в бесконечный цикл, вполне достаточно будет
while true
Тут вообще никаких переменных нет и сразу видно, что это бесконечный цикл
function OnInit()
is_run = true
end
function main()
CurrentPos() — проверка начального остатка
local StarttNetPos = TotalNetPos — запоминание остатка
while is_run do
— ваше условие выставление ордера
CurrentPos() — проверка остатка по бумажке
if TotalNetPos ~= StarttNetPos then is_run = false end — если изменился, то сделка исполнена — ОСТАНОВКА СКРИПТА
end
end
function CurrentPos()
for i = 0, getNumberOf(«FUTURES_CLIENT_HOLDING») — 1 do
if getItem(«FUTURES_CLIENT_HOLDING»,i).sec_code == p_SECCODE and getItem(«FUTURES_CLIENT_HOLDING»,i).totalnet ~= 0 then
TotalNetPos = getItem(«FUTURES_CLIENT_HOLDING»,i).totalnet
end
end
end
Вот так будет работать
function OnInit()
SecCode = «LKU0»
Quantity=1
is_run = true
end
function main()
CurrentPos() — проверка начального остатка
local StarttNetPos = TotalNetPos — запоминание остатка
while is_run do
local Quotes = getQuoteLevel2(«SPBFUT», SecCode)
local Offer_Price = tonumber(Quotes.offer[1].price)
local Offer_Vol = tonumber(Quotes.offer[1].quantity)
--отправка формы заявки
local LimitOrderBuy = {xxx}
--условие входа в лонг
if Offer_Vol>10 then
message(Order)
local Order = sendTransaction(LimitOrderBuy)
end
sleep (200)
CurrentPos() — проверка остатка по бумажке
if TotalNetPos ~= StarttNetPos then is_run = false end — если изменился, то сделка исполнена — ОСТАНОВКА СКРИПТА
end
end
function CurrentPos()
for i = 0, getNumberOf(«ACCOUNT_BALANCE») — 1 do
if getItem(«ACCOUNT_BALANCE»,i).sec_code == SecCode and getItem(«ACCOUNT_BALANCE»,i).currentpos ~= 0 then
TotalNetPos = getItem(«ACCOUNT_BALANCE»,i).currentpos
else
TotalNetPos = 0
end
end
end
Вот так будет точнее