<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: переделать индикатор в робота]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме переделать индикатор в робота форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Sun, 03 May 2026 02:41:06 +0300</pubDate>
		<item>
			<title>переделать индикатор в робота</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message34738/topic4065/">переделать индикатор в робота</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_2XpwdkXT" href="/user/12682/" bx-tooltip-user-id="12682">Evgenia</a> написал:<br />Помогите понять, что ещё нужно в коде поменять?<br />=============<br /><br />Надо поменять всю структуру кода. Он составлен абсолютно некорректно.<br />По простому, Вы создали кучу функций внутри функции main() и нигде ни разу эти функции не вызываете.<br />Раз нет вызова функций то и работать они естественно не будут.<br />Во первых, создавать функции внутри main() в данном случае является лишним, вынесите их за пределы main() <br />Во вторых, чтобы функция сработала ее надо вызвать. Исключение только функции колбеков, которые вызывает сам терминал при наступлении соответствующих условий.<br />У Вас сейчас в коде только один колбек OnStop.<br />В третьих, в QUIK срипты индикаторов и для остального, это разные вещи, и то что есть в индикаторах отсутствует в обычных скриптах. в связи с чем пересекать их нельзя.<br />Функция OnCalculate это функция индикаторов, в обычном коде она не будет работать также как в индикаторах.<br /><br />В итоге, чтобы перенести код с одного ПО на другое, надо изучить оба ПО и понимать как в них надо работать.<br />Без этого перенести код не получится. <br />
			<i>08.11.2018 05:20:26, Sergey Gorokhov.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message34738/topic4065/</link>
			<guid>http://forum.quik.ru/messages/forum10/message34738/topic4065/</guid>
			<pubDate>Thu, 08 Nov 2018 05:20:26 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>переделать индикатор в робота</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message34735/topic4065/">переделать индикатор в робота</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Добрый вечер.<br /><br />Делаю робота, который после входа в сделку с руки или по отложке выставлял бы стоп-заявку &quot;стоп-лосс и тейк профит&quot;.<br />Нашёл подходящий код на smart-lab, но там он выполнен в виде индикатора... Пытаюсь разобраться, как его переделать в робота, но пока не выходит; робот просто включается, но не работает.<br /><br />Помогите понять, что ещё нужно в коде поменять?<br />
====code====
<pre>client_code="---"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- сюда вбить свой код клиента; или вбить в настройки индикатора в квике
class_code="SPBFUT"
security="RIZ8"
loss=100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
loss_prosk=0
profit=110&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- количество пунктов от места входа в сделку до тейк профита; или вбить в настройки индикатора в квике
profit_otstup=0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- отступ от максимума (параметр тейк-профита); или вбить в настройки индикатора в квике
profit_prosk=10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- защитный спред (параметр тейк-профита); или вбить в настройки индикатора в квике


Sorder=true
idx_prosl=-1
Zapusk=true

-- переменная для прерывания цикла при срабатывании функции обратного вызова OnStop:

is_run = true 

function main()

ds = CreateDataSource(class_code, security)


while is_run do
sleep (1000)

function get_balance(sec, client_code)
local limit={}
local n=getNumberOf("futures_client_holding")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- получить количество позиций по клиентским счетам (фьючерсы)
for i=0,n-1 do
limit = getItem("futures_client_holding", i)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- получить данные из таблицы "количество позиций по клиентским счетам (фьючерсы)"
if limit~=nil and limit.seccode== sec and limit.trdaccid==client_code then
return tonumber(limit.totalnet)&nbsp;&nbsp;&nbsp;&nbsp; -- текущие чистые позиции
end
end
return 0
end

function get_latestprice(sec, client_code)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- получить последнюю цену
local ord={}
local n=getNumberOf("trades")
for i=n-1,0,-1 do
ord = getItem("trades", i)
if ord~=nil and ord.sec_code==sec and (ord.client_code==client_code or ord.account==client_code) then
return tonumber(ord.price)
end
end
return 0
end

function Init()
return 1
end

function TP_SL(class,security,client_code,direction,volume,stopprice,price,dealprice,offset,defspread,exp_date,comment)
--&#91;&#91;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (class==nil or security==nil or direction==nil or volume==nil or dealprice==nil&nbsp;&nbsp;or offset==nil or defspread==nil) then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return nil, "AUTOMATIK_STOP_FUT: нет одного из параметров стоп-заявки."
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local trans_id = string.format('%d', math.random(2000000000))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local err = sendTransaction(transaction)&#93;&#93;

transaction={
&nbsp;&nbsp;&nbsp;&nbsp;&#91;"TRANS_ID"&#93;=trans_id,
&nbsp;&nbsp;&nbsp;&nbsp;&#91;"ACTION"&#93;='NEW_STOP_ORDER',
&nbsp;&nbsp;&nbsp;&nbsp;&#91;"STOP_ORDER_KIND"&#93;='TAKE_PROFIT_AND_STOP_LIMIT_ORDER',
&nbsp;&nbsp;&nbsp;&nbsp;&#91;"CLASSCODE"&#93;=class,
&nbsp;&nbsp;&nbsp;&nbsp;&#91;"SECCODE"&#93;=security,
&nbsp;&nbsp;&nbsp;&nbsp;&#91;"ACCOUNT"&#93;=client_code,
&nbsp;&nbsp;&nbsp;&nbsp;&#91;"CLIENT_CODE"&#93;=client_code,
&nbsp;&nbsp;&nbsp;&nbsp;&#91;"OPERATION"&#93;=direction,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- переделать?
&nbsp;&nbsp;&nbsp;&nbsp;&#91;"QUANTITY"&#93;=tostring(volume),&nbsp;&nbsp;-- переделать?
&nbsp;&nbsp;&nbsp;&nbsp;&#91;"PRICE"&#93;=tostring(price),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- переделать?
&nbsp;&nbsp;&nbsp;&nbsp;&#91;"EXPIRY_DATE"&#93;='GTC',
&nbsp;&nbsp;&nbsp;&nbsp;&#91;"MARKET_STOP_LIMIT"&#93;='NO',
&nbsp;&nbsp;&nbsp;&nbsp;&#91;"MARKET_TAKE_PROFIT"&#93;='NO',
&nbsp;&nbsp;&nbsp;&nbsp;&#91;"IS_ACTIVE_IN_TIME"&#93;='NO',
&nbsp;&nbsp;&nbsp;&nbsp;&#91;"OFFSET"&#93;=tostring(offset),
&nbsp;&nbsp;&nbsp;&nbsp;&#91;"OFFSET_UNITS"&#93;='PRICE_UNITS',
&nbsp;&nbsp;&nbsp;&nbsp;&#91;"STOPPRICE"&#93;=tostring(dealprice),
&nbsp;&nbsp;&nbsp;&nbsp;&#91;"STOPPRICE2"&#93;=tostring(stopprice), 
&nbsp;&nbsp;&nbsp;&nbsp;&#91;"SPREAD"&#93;=tostring(defspread),
&nbsp;&nbsp;&nbsp;&nbsp;&#91;"SPREAD_UNITS"&#93;='PRICE_UNITS',
&nbsp;&nbsp;&nbsp;&nbsp;&#91;"COMMENT"&#93;='TP_SL'
&nbsp;&nbsp;}
result = sendTransaction(transaction)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if err~="" then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return nil, "AUTOMATIK_STOP_FUT результат: "..err
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return trans_id, ""
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
end

function OnCalculate(idx)
if Zapusk then
class=class_code&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- код класса; можно посмотреть в таблице "текущие торги"
sec=security&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- код бумаги; можно посмотреть в таблице "текущие торги", надо менять при переходе на новый контракт
old_balance=get_balance(sec, client_code)
Zapusk=false
end
if idx_prosl==idx then
balance=get_balance(sec, client_code)
if balance&#62;0 and old_balance&#60;balance then
Sorder=false
if old_balance&#60;0 then
spr_balance=balance
else
spr_balance=balance-old_balance
end
end
if balance&#60;0 and old_balance&#62;balance then
Sorder=false
if old_balance&#62;0 then
spr_balance=0-balance
else
spr_balance=old_balance-balance
end
end
if balance~=0 and not Sorder then
Open_Price=get_latestprice(sec, client_code)
if balance&#62;0 and Open_Price~=0 then
dealprice=Open_Price+profit&nbsp;&nbsp;-- тейк-профит
stopprice=Open_Price-loss&nbsp;&nbsp;-- стоп цена
price=stopprice-loss_prosk&nbsp;&nbsp; --стоп с запасом
offset=profit_otstup -- отступ от максимума
defspread=profit_prosk&nbsp;&nbsp;-- защитный спред
Tr_Id,STR=TP_SL(class,sec,"S",spr_balance,stopprice,price,dealprice,offset,defspread,nil,nil)
Sorder=true
if Tr_Id==nil then
message(" "..STR,1)
end
end
if balance&#60;0 and Open_Price~=0 then
dealprice=Open_Price-profit&nbsp;&nbsp;-- тейк-профит
stopprice=Open_Price+loss&nbsp;&nbsp;-- стоп цена
price=stopprice+loss_prosk&nbsp;&nbsp; --стоп с запасом
offset=profit_otstup -- отступ от максимума
defspread=profit_prosk&nbsp;&nbsp;-- защитный спред
Tr_Id,STR=TP_SL(class,sec,"B",spr_balance,stopprice,price,dealprice,offset,defspread,nil,nil)
Sorder=true
if Tr_Id==nil then
message(" "..STR,1)
end
end
end
old_balance=get_balance(sec, client_code)
end
idx_prosl=idx
return nil
end
end
end 

function OnStop(stop_flag)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp; is_run=false
&nbsp;&nbsp;&nbsp;&nbsp; stop_flag=1
end 
</pre>
============= <br />
			<i>07.11.2018 20:45:19, Evgenia.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message34735/topic4065/</link>
			<guid>http://forum.quik.ru/messages/forum10/message34735/topic4065/</guid>
			<pubDate>Wed, 07 Nov 2018 20:45:19 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
