<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[QUIK -> DDE &mdash; Пример: спредовый робот на QLua]]></title>
		<link>https://quik2dde.ru/viewtopic.php?id=22</link>
		<atom:link href="https://quik2dde.ru/extern.php?action=feed&amp;tid=22&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Пример: спредовый робот на QLua».]]></description>
		<lastBuildDate>Sat, 26 Sep 2015 03:09:57 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Пример: спредовый робот на QLua]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1631#p1631</link>
			<description><![CDATA[<p>-</p>]]></description>
			<author><![CDATA[null@example.com (sam063rus)]]></author>
			<pubDate>Sat, 26 Sep 2015 03:09:57 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1631#p1631</guid>
		</item>
		<item>
			<title><![CDATA[Re: Пример: спредовый робот на QLua]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1627#p1627</link>
			<description><![CDATA[<p>admin, хотел поблагодарить за робота. Мне этот пример очень помог быстрее разобраться, как писать на lua для quik . Конечно, улучшать что угодно можно бесконечно, но для начала что-то рабочее - самое то.<br />Из мелких улучшений, чтобы не задавать каждый раз шаг и точность, сделал вот так:<br /></p><div class="codebox"><pre><code>PRICE_STEP = tonumber(getParamEx(CLASS, SEC, &quot;SEC_PRICE_STEP&quot;).param_value)
PRICE_SCALE = tonumber(getParamEx(CLASS, SEC, &quot;SEC_SCALE&quot;).param_value)</code></pre></div><p>,<br />при этом в текущей таблице параметров обязательно должен быть открыт данный инструмент.<br />kalikazandr`у тоже спасибо за примеры, посмотрю, что можно ещё у себя улучшить.</p>]]></description>
			<author><![CDATA[null@example.com (Dr. Robotnik)]]></author>
			<pubDate>Thu, 24 Sep 2015 08:50:10 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1627#p1627</guid>
		</item>
		<item>
			<title><![CDATA[Re: Пример: спредовый робот на QLua]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1532#p1532</link>
			<description><![CDATA[<p>-</p>]]></description>
			<author><![CDATA[null@example.com (sam063rus)]]></author>
			<pubDate>Wed, 29 Jul 2015 04:55:02 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1532#p1532</guid>
		</item>
		<item>
			<title><![CDATA[Re: Пример: спредовый робот на QLua]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1401#p1401</link>
			<description><![CDATA[<div class="quotebox"><cite>admin пишет:</cite><blockquote><p>Что касается места формирования цены - критика справедливая, здесь безусловно согласен.</p><p>Можно подробнее по поводу &quot;вы неправильно используете колбеки&quot;? какие именно?<br />Или речь именно и только про расчеты в колбеках?<br />Тогда подскажите, куда следует перенести эти расчеты и, главное, как именно?</p></blockquote></div><p>Колбек onInit - зачем вы в нем хотите расчитать и попробовать выставить заявку? он для этого не предназначен, почитайте руководство.<br />Ну например вот эти фрагменты кода явно лишние:<br /></p><div class="codebox"><pre><code>function OnQuote(class_code, sec_code)

  -- отслеживаем котировки только по нашему инструменту
  if (class_code ~= CLASS) or (sec_code ~= SEC) then
    return
  end

  message(&quot;OnQuote: CURRENT_STATE=&quot; .. CURRENT_STATE, 1)
...
end</code></pre></div><p>Во первых достаточно изменить сравнение(не единственное место в коде, вернее сплошь и рядом):<br /></p><div class="codebox"><pre><code>if class_code == CLASS and sec_code == SEC then
   --то то и то то - например:
   flag = &quot;посмотри стакан, что-то поменялось, посмотри и не забудь сделать flag = &#039; &#039;, яволь?&quot;
end</code></pre></div><p>а поскольку большинство народу торгует по одному классу инструментов, то и сравнение (class_code == CLASS) не нужно.<br />Во вторых, почти в каждом блоке у вас какое-то сообщение, особенно не приемлемо использовать сообщения в колбеках.<br />В третьих, раз уж вы акцентировали внимание на одном инструменте, значит пытаетесь максимально ускорить расчет и принятие решения роботом(поправьте, если не прав), то ваши функции KillOrder и SendOrder<br />очень громоздки и проще сделать вот так:<br /></p><div class="codebox"><pre><code>local trans_param = {    ACTION = &quot;NEW_ORDER&quot;,
                        TRANS_ID = &quot;1&quot;,
                        ACCOUNT = account,
                        CLIENT_CODE = clientcode,
                        TYPE = &quot;L&quot;,
                        OPERATION = &quot;&quot;,
                        CLASSCODE = ccode,
                        SECCODE = scode,
                        PRICE = &quot;&quot;,
                        QUANTITY = &quot;&quot;    }
-----------------------------------------
local kill_param = {    ACTION = &quot;KILL_ORDER&quot;,
                        TRANS_ID = &quot;666&quot;,
                        CLASSCODE = ccode,
                        SECCODE = scode,
                        ORDER_KEY = &quot;&quot;    }</code></pre></div><p>и соответственно функции:<br /></p><div class="codebox"><pre><code>--отправка транзакции--
local function SendOrder(tp,op,price,qty,t_id,bl)
    --bl - блок, откуда выставлена заявка
    tp.OPERATION = op
    if price == 0 then tp.TYPE = &quot;M&quot; end
    tp.PRICE = price..&quot;&quot;
    tp.QUANTITY = qty..&quot;&quot;
    local res = sendTransaction(tp)
    if res ~= &quot;&quot; then message(&quot;SendOrder : [&quot; .. bl ..&quot;] &quot;.. res, 2) return nil else return t_id end
end
--снятие заявки--
local function KillOrder(kp,bl)
    local res = sendTransaction(kp)
    if res ~= &quot;&quot; then message(&quot;KillOrder : [&quot; .. bl ..&quot;] &quot;.. res, 2) end
end</code></pre></div><p>Когда выставляете заявку, то вам не надо набирать заново параметры константы, мало того в таблице trans_param хранится вся нужная информация о выставленной заявке, а по приходу колбека onOrder (вы не используете в своем коде, странно)&nbsp; вы сможете проверить id транзакции и в случае совпадения сразу сохранить order_num в kill_param.<br />Соответственно вызов:<br /></p><div class="codebox"><pre><code>local id = SendOrder(trans_param,&quot;B&quot;,100,1,10,&quot;строка кода № 654&quot;l)
if id then--если заявка принята, увеличиваю счетчик id
    trans_param.TRANS_ID = (trans_param.TRANS_ID + 1)..&quot;&quot;--для следующей заявки
end</code></pre></div><p>Примерно так. А все расчеты должны происходить в функции main а не в колбеках.<br />Колбек нужен для наискорейшего(одновременно с терминалом) получения данных и передачи оных в майн, не мне вас учить. Если в своих расчетах вы используете колбеки, то при одновременной работе нескольких роботов, использующих одни и те же колбеки стоит задуматься о БД, в которую один робот будет скидывать данные, а другие брать, иначе общее замедление работы терминала и все вытекающие</p>]]></description>
			<author><![CDATA[null@example.com (kalikazandr)]]></author>
			<pubDate>Thu, 18 Jun 2015 13:37:38 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1401#p1401</guid>
		</item>
		<item>
			<title><![CDATA[Re: Пример: спредовый робот на QLua]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1400#p1400</link>
			<description><![CDATA[<p>Что касается места формирования цены - критика справедливая, здесь безусловно согласен.</p><p>Можно подробнее по поводу &quot;вы неправильно используете колбеки&quot;? какие именно?<br />Или речь именно и только про расчеты в колбеках?<br />Тогда подскажите, куда следует перенести эти расчеты и, главное, как именно?</p>]]></description>
			<author><![CDATA[null@example.com (admin)]]></author>
			<pubDate>Thu, 18 Jun 2015 12:08:23 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1400#p1400</guid>
		</item>
		<item>
			<title><![CDATA[Re: Пример: спредовый робот на QLua]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1399#p1399</link>
			<description><![CDATA[<div class="quotebox"><cite>admin пишет:</cite><blockquote><p>У вас есть прибыльный алгоритм - поделитесь им (алгоритмом!), будет интересно сделать реализацию.</p></blockquote></div><p>Есть, делиться не буду.<br /></p><div class="quotebox"><cite>admin пишет:</cite><blockquote><p>Цель данного топика, которую лично я перед собой ставил - вовсе не осчастливить кого-либо халявным прибыльным роботом, а показать как на этом QLua можно вообще что-то реализовать.</p></blockquote></div><p>Вот и нужно показывать как правильно организовывать алгоритм, даже такой как у вас.<br />Ваш алгоритм медленный и вы не правильно используете колбеки, проводите какие-то расчеты в колбеках, вызываете функции. Ладно, если пользователь вашего алгоритма будет торговать по одному инструменту, а если он продублирует вашего робота на 10 + инструментов, что само-собой подразумевает его(алгоритма) почти полную переделку? Терминал будет занят обработкой колбеков и в итоге рухнет. Заявки будут передвигаться уже не по вашему алгоритму, а как попало, с мягко сказать - опозданием.<br /></p><div class="quotebox"><cite>admin пишет:</cite><blockquote><p>Если это не так - с интересом выслушаю чего не хватает в написанном, чтобы это таковым стало.</p></blockquote></div><p>В смысле не хватает?<br />Что за огород, например, вот это???<br /></p><div class="codebox"><pre><code>-- Сформировать цену в строковом представлении с учетом PRICE_SCALE
function MakeStringPrice(price)

  local n,m = math.modf(price)
  n = tostring(n)
  if PRICE_SCALE &gt; 0 then
    m = math.floor(m * 10^PRICE_SCALE + 0.01)
    if m &gt; 0.1 then
      m = string.sub(tostring(m), 1, PRICE_SCALE)
      m = string.rep(&#039;0&#039;, PRICE_SCALE - string.len(m)) .. m
    else
      m = string.rep(&#039;0&#039;, PRICE_SCALE)
    end
    m = &#039;.&#039; .. m
  else
    m = &#039;&#039;
  end
  
  return (n .. m)

end</code></pre></div><p>Вы проверяете работу своих функций на скорость выполнения?<br />Вот так не проще ?<br /></p><div class="codebox"><pre><code>local math_floor = math.floor
--округление до шага цены--
local doStep = function (val, step)
    return math_floor(val/step)*step
end
--округление по правилам математики--
local floor = function (nValue, nScale)
    if not nScale or nScale == 0 then return math_floor(nValue + 0.5)
    else local x=10^nScale return math_floor(nValue * x + 0.5) / x end
end</code></pre></div><p>пример использования функции doStep:<br />local price = 80/3<br />print(price)--&gt;26.666666666667<br />local step = 0.005<br />price = doStep(price,step)<br />print(price) --&gt; 26.665</p><p>приведение цены к строковому значению:<br />price = price..&quot;&quot;<br />print(type(price))--&gt;string</p><p>Как-то так.<br />Не надо давать начинающим программистам заведомую фигню, что бы они не тратили свое время на генерацию, подобных вашему, кривых алгоритмов</p>]]></description>
			<author><![CDATA[null@example.com (kalikazandr)]]></author>
			<pubDate>Thu, 18 Jun 2015 10:30:19 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1399#p1399</guid>
		</item>
		<item>
			<title><![CDATA[Re: Пример: спредовый робот на QLua]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1398#p1398</link>
			<description><![CDATA[<p>Дело не в обидах.<br />У вас есть прибыльный алгоритм - поделитесь им (алгоритмом!), будет интересно сделать реализацию.</p><p>Цель данного топика, которую лично я перед собой ставил - вовсе не осчастливить кого-либо халявным прибыльным роботом, а показать как на этом QLua можно вообще что-то реализовать.<br />Т.е. главное, на что хотелось бы надеяться мне - это то, что на момент нажатия Delete человек, который до этого не знал как вообще к QLua подступиться, будет уже знать как запрограммировать свой собственный (прибыльный, разумеется) алгоритм. Если это так - то я буду рад, мои усилия не пропали даром.<br />Если это не так - с интересом выслушаю чего не хватает в написанном, чтобы это таковым стало.</p><p>Разумеется, с не меньшим интересом реализую другие алгоритмы, если они будут описаны.</p>]]></description>
			<author><![CDATA[null@example.com (admin)]]></author>
			<pubDate>Thu, 18 Jun 2015 07:18:47 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1398#p1398</guid>
		</item>
		<item>
			<title><![CDATA[Re: Пример: спредовый робот на QLua]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1397#p1397</link>
			<description><![CDATA[<div class="quotebox"><cite>admin пишет:</cite><blockquote><p>Робот работает по описанному алгоритму.<br />Если вы ожидали, что лично вам он будет приносить прибыль без усилий - посмотритесь в зеркало.</p></blockquote></div><p>Значит, обидел. Если вы еще раз перечитаете свой работающий алгоритм или посмотритесь в зеркало и перечитаете, то поймете, что алгоритм - шляпа полная.<br />Данный пример спредового робота, наглядно показывает, как не надо строить торговый алгоритм. Арковцы (и не только) специально выкладывают алгоритмы такого формата, что бы не опытных программистов ввести в заблуждение.<br />Пользователь данного алгоритма сможет эффективно повысить прибыль биржи и брокера за счет оборота, потратит несколько месяцев на &quot;доводку&quot; алгоритма и в конечном итоге сделает единственно правильные усилия применительно к данному алгоритму - нажать на кнопку &quot;Delete&quot; и очистить корзину ))</p>]]></description>
			<author><![CDATA[null@example.com (kalikazandr)]]></author>
			<pubDate>Thu, 18 Jun 2015 06:00:04 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1397#p1397</guid>
		</item>
		<item>
			<title><![CDATA[Re: Пример: спредовый робот на QLua]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1396#p1396</link>
			<description><![CDATA[<p>Робот работает по описанному алгоритму.<br />Если вы ожидали, что лично вам он будет приносить прибыль без усилий - посмотритесь в зеркало.</p>]]></description>
			<author><![CDATA[null@example.com (admin)]]></author>
			<pubDate>Thu, 18 Jun 2015 04:51:06 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1396#p1396</guid>
		</item>
		<item>
			<title><![CDATA[Re: Пример: спредовый робот на QLua]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1395#p1395</link>
			<description><![CDATA[<div class="quotebox"><cite>admin пишет:</cite><blockquote><p>Спасибо на добром слове, приятно.<br />К сожалению, никак не дойдут руки доделать толком описание, столько других интересных дел! <img src="https://quik2dde.ru/img/smilies/wink.png" width="15" height="15" alt="wink" /></p></blockquote></div><p>наверное, потому что изложенное вами и ниже - шляпа полная? (извиняюсь, если кого обидел)</p>]]></description>
			<author><![CDATA[null@example.com (kalikazandr)]]></author>
			<pubDate>Wed, 17 Jun 2015 21:03:29 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1395#p1395</guid>
		</item>
		<item>
			<title><![CDATA[Re: Пример: спредовый робот на QLua]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1247#p1247</link>
			<description><![CDATA[<p>Залил свою версию на github [url]https://github.com/AndSemenoff/spread_bot_quik[/url]<br />В ближайшее время сделаю более подробное описание.<br />Основной минус бота -&nbsp; много бесполезных транзакций. Т.е. если банально запустить двух таких роботов<br />с разных счетов по одному инструменту, то они будут бороться друг с другом делая кучу бесполезных транзакций.<br />Также данный бот вначале делает куплю, а затем продажу.<br />Из оригинала я не использую генерацию цены с десятичной точкой, т.к. работаю с такими активами, кот. имеют минимальный шаг цены 1.<br />Предложения и комментарии приветствуются.</p>]]></description>
			<author><![CDATA[null@example.com (Absolem)]]></author>
			<pubDate>Mon, 13 Apr 2015 16:19:50 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1247#p1247</guid>
		</item>
		<item>
			<title><![CDATA[Re: Пример: спредовый робот на QLua]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1236#p1236</link>
			<description><![CDATA[<p>Спасибо. Робот реально работает. Начал сам писать с нуля, но пока буквально полностью не повторил структуру данного робота - ничего не работало. Странно, что нет интереса к данному роботу и данной ветке форума. Может это связано с тарифами за транзакции, т.к. на высоколиквидном рынке данный бот делает много неэффективных транзакций?</p>]]></description>
			<author><![CDATA[null@example.com (Absolem)]]></author>
			<pubDate>Thu, 09 Apr 2015 13:26:10 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1236#p1236</guid>
		</item>
		<item>
			<title><![CDATA[Re: Пример: спредовый робот на QLua]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=676#p676</link>
			<description><![CDATA[<p>только начал изучать Lua....</p><p>--шаг цены<br />--точность задания цены инструмента</p><p>разве никак нельзя эту информацию от квика получить?</p><p>оО... уже даже что-то нашёл getSecurityInfo()</p><p>разберусь до конца, отредактирую...</p>]]></description>
			<author><![CDATA[null@example.com (jobber)]]></author>
			<pubDate>Sat, 11 Oct 2014 18:18:22 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=676#p676</guid>
		</item>
		<item>
			<title><![CDATA[Re: Пример: спредовый робот на QLua]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=74#p74</link>
			<description><![CDATA[<p>Спасибо на добром слове, приятно.<br />К сожалению, никак не дойдут руки доделать толком описание, столько других интересных дел! <img src="https://quik2dde.ru/img/smilies/wink.png" width="15" height="15" alt="wink" /></p>]]></description>
			<author><![CDATA[null@example.com (admin)]]></author>
			<pubDate>Mon, 14 Jan 2013 19:04:03 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=74#p74</guid>
		</item>
		<item>
			<title><![CDATA[Re: Пример: спредовый робот на QLua]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=73#p73</link>
			<description><![CDATA[<p>Спасибо за реализацию этого робота!<br />Потихоньку шпилит )))<br />По итогам торговли слабый плюс, зато ни одного убыточного дня <img src="https://quik2dde.ru/img/smilies/smile.png" width="15" height="15" alt="smile" /></p>]]></description>
			<author><![CDATA[null@example.com (Kosmonavt)]]></author>
			<pubDate>Mon, 14 Jan 2013 18:57:36 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=73#p73</guid>
		</item>
	</channel>
</rss>
