<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: Предотвращение убыточной продажи по TAKE_PROFIT_AND_STOP_LIMIT_ORDER]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме Предотвращение убыточной продажи по TAKE_PROFIT_AND_STOP_LIMIT_ORDER форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Sun, 03 May 2026 17:54:05 +0300</pubDate>
		<item>
			<title>Предотвращение убыточной продажи по TAKE_PROFIT_AND_STOP_LIMIT_ORDER</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message71106/topic8172/">Предотвращение убыточной продажи по TAKE_PROFIT_AND_STOP_LIMIT_ORDER</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Спасибо! Это как раз и была причина убыточности. Замыленный взгляд упорно не замечал. Но постоянно работающий скрипт, действительно может реализовать необходимую стратегию гораздо точнее. Ещё раз спасибо! Теперь я хотя бы знаю, что ошибка была моя. <br />
			<i>01.08.2023 19:35:14, Дмитрий Ш.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message71106/topic8172/</link>
			<guid>http://forum.quik.ru/messages/forum10/message71106/topic8172/</guid>
			<pubDate>Tue, 01 Aug 2023 19:35:14 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Предотвращение убыточной продажи по TAKE_PROFIT_AND_STOP_LIMIT_ORDER</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message71103/topic8172/">Предотвращение убыточной продажи по TAKE_PROFIT_AND_STOP_LIMIT_ORDER</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_3ZCzg8N0" href="/user/16084/" bx-tooltip-user-id="16084">Дмитрий Ш</a> написал:<br /> &nbsp; &nbsp; &nbsp; &nbsp;OFFSET &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = str_price(tostring(spread)),<br /> &nbsp; &nbsp; &nbsp; &nbsp;OFFSET_UNITS &nbsp; &nbsp; &nbsp; = &quot;PRICE_UNITS&quot;,<br /> &nbsp; &nbsp; &nbsp; &nbsp;SPREAD &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = str_price(tostring(offset)),<br /><br />=============<br />Если не секрет, зачем менять местами отступ и спред? <br />
			<i>01.08.2023 19:16:53, Ziveleos.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message71103/topic8172/</link>
			<guid>http://forum.quik.ru/messages/forum10/message71103/topic8172/</guid>
			<pubDate>Tue, 01 Aug 2023 19:16:53 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Предотвращение убыточной продажи по TAKE_PROFIT_AND_STOP_LIMIT_ORDER</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message70971/topic8172/">Предотвращение убыточной продажи по TAKE_PROFIT_AND_STOP_LIMIT_ORDER</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Хорошо поразмыслив, пришёл к выводу, что проблема не решаема средствами выставления заявок имеющегося типа.<br />Для себя решил проблему написав кастомный тейк-профит в виде постоянно запущенного lua-скрипта, который реализует нужную мне механику отслеживания цены и продажи. <br />
			<i>27.07.2023 12:47:18, Дмитрий Ш.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message70971/topic8172/</link>
			<guid>http://forum.quik.ru/messages/forum10/message70971/topic8172/</guid>
			<pubDate>Thu, 27 Jul 2023 12:47:18 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Предотвращение убыточной продажи по TAKE_PROFIT_AND_STOP_LIMIT_ORDER</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message70936/topic8172/">Предотвращение убыточной продажи по TAKE_PROFIT_AND_STOP_LIMIT_ORDER</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Здравствуйте!<br />Довольно часто сталкиваюсь со следующей ситуацией.<br /><br />Выставляю заявку:<br /> &nbsp; &nbsp;
====code====
<pre>Spread = 6
Offset = 3

-- В целых ценах не будет дробной части.
function str_price(str)
&nbsp;&nbsp;&nbsp;&nbsp;local n = tonumber(str)
&nbsp;&nbsp;&nbsp;&nbsp;local m = math.floor(n)
&nbsp;&nbsp;&nbsp;&nbsp;if n == m then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return tostring(m)
&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return tostring(n)
&nbsp;&nbsp;&nbsp;&nbsp;end
end

function Limit(ticker, quantity, tp_price)
&nbsp;&nbsp;&nbsp;&nbsp;local step = tonumber(getParamEx("TQBR", ticker, "sec_price_step").param_value)
&nbsp;&nbsp;&nbsp;&nbsp;local spread = Spread * step
&nbsp;&nbsp;&nbsp;&nbsp;local offset = Offset * step
&nbsp;&nbsp;&nbsp;&nbsp;local transaction = {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACCOUNT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= Account,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CLIENT_CODE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= ClientCode,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACTION&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = "NEW_STOP_ORDER",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TRANS_ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = tostring(os.time()),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OPERATION&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= "S", -- Продажа.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STOP_ORDER_KIND&nbsp;&nbsp;&nbsp;&nbsp;= "TAKE_PROFIT_AND_STOP_LIMIT_ORDER",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CLASSCODE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= "TQBR",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SECCODE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= ticker,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QUANTITY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = tostring(quantity),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STOPPRICE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= str_price(tostring(tp_price)), -- Take Profit.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EXPIRY_DATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= "GTC",&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;&nbsp;&nbsp;&nbsp;&nbsp;OFFSET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = str_price(tostring(spread)),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OFFSET_UNITS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = "PRICE_UNITS",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPREAD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = str_price(tostring(offset)),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPREAD_UNITS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = "PRICE_UNITS",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MARKET_TAKE_PROFIT = "YES",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STOPPRICE2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = "0", --стоп цена
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MARKET_STOP_LIMIT&nbsp;&nbsp;= "YES"
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;error = sendTransaction(transaction)
&nbsp;&nbsp;&nbsp;&nbsp;if error ~= "" then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msg = "Error on Limit %d %s %.5f (%s)."
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message(msg:format(quantity, ticker, tp_price, error))
&nbsp;&nbsp;&nbsp;&nbsp;end
end

</pre>
=============
При этом tp_price рассчитывается от средней цены покупки buy_price (wa_position_price из таблицы depo_limits) следующим образом:<br />
====code====
<pre>BrokerSpread = 0.0006
tp_price = (buy_price * 1.005) * (1.0 + Percent)
tp_price = tp_price + (buy_price + tp_price) * BrokerSpread</pre>
=============
Проблема в том, что довольно часто в итоге при ожидании &quot;лучшей&quot; цены выставляется продажа по цене меньше, чем buy_price. <br /><br />Может быть кто-то знает, как изменить тело transaction или обработчик какой-то написать, чтобы оперативно снимать (а ещё лучше предотвращать постановку) заявку на продажу.<br /><br />P.S. Во время написания последних строк пришла мысль снимать и переставлять тейк-профит на стадии &quot;расчета&quot;, если цена опустилась ниже buy_price. Но как правильно обработать такую ситуацию и поможет ли это? <br />
			<i>26.07.2023 13:46:31, Дмитрий Ш.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message70936/topic8172/</link>
			<guid>http://forum.quik.ru/messages/forum10/message70936/topic8172/</guid>
			<pubDate>Wed, 26 Jul 2023 13:46:31 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
