<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[QUIK -> DDE &mdash; Пример: спредовый робот на QLua]]></title>
	<link rel="self" href="https://quik2dde.ru/extern.php?action=feed&amp;tid=22&amp;type=atom" />
	<updated>2015-09-26T03:09:57Z</updated>
	<generator>PunBB</generator>
	<id>https://quik2dde.ru/viewtopic.php?id=22</id>
		<entry>
			<title type="html"><![CDATA[Re: Пример: спредовый робот на QLua]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1631#p1631" />
			<content type="html"><![CDATA[<p>-</p>]]></content>
			<author>
				<name><![CDATA[sam063rus]]></name>
				<uri>https://quik2dde.ru/profile.php?id=228</uri>
			</author>
			<updated>2015-09-26T03:09:57Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1631#p1631</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Пример: спредовый робот на QLua]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1627#p1627" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[Dr. Robotnik]]></name>
				<uri>https://quik2dde.ru/profile.php?id=163</uri>
			</author>
			<updated>2015-09-24T08:50:10Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1627#p1627</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Пример: спредовый робот на QLua]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1532#p1532" />
			<content type="html"><![CDATA[<p>-</p>]]></content>
			<author>
				<name><![CDATA[sam063rus]]></name>
				<uri>https://quik2dde.ru/profile.php?id=228</uri>
			</author>
			<updated>2015-07-29T04:55:02Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1532#p1532</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Пример: спредовый робот на QLua]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1401#p1401" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[kalikazandr]]></name>
				<uri>https://quik2dde.ru/profile.php?id=208</uri>
			</author>
			<updated>2015-06-18T13:37:38Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1401#p1401</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Пример: спредовый робот на QLua]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1400#p1400" />
			<content type="html"><![CDATA[<p>Что касается места формирования цены - критика справедливая, здесь безусловно согласен.</p><p>Можно подробнее по поводу &quot;вы неправильно используете колбеки&quot;? какие именно?<br />Или речь именно и только про расчеты в колбеках?<br />Тогда подскажите, куда следует перенести эти расчеты и, главное, как именно?</p>]]></content>
			<author>
				<name><![CDATA[admin]]></name>
				<uri>https://quik2dde.ru/profile.php?id=2</uri>
			</author>
			<updated>2015-06-18T12:08:23Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1400#p1400</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Пример: спредовый робот на QLua]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1399#p1399" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[kalikazandr]]></name>
				<uri>https://quik2dde.ru/profile.php?id=208</uri>
			</author>
			<updated>2015-06-18T10:30:19Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1399#p1399</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Пример: спредовый робот на QLua]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1398#p1398" />
			<content type="html"><![CDATA[<p>Дело не в обидах.<br />У вас есть прибыльный алгоритм - поделитесь им (алгоритмом!), будет интересно сделать реализацию.</p><p>Цель данного топика, которую лично я перед собой ставил - вовсе не осчастливить кого-либо халявным прибыльным роботом, а показать как на этом QLua можно вообще что-то реализовать.<br />Т.е. главное, на что хотелось бы надеяться мне - это то, что на момент нажатия Delete человек, который до этого не знал как вообще к QLua подступиться, будет уже знать как запрограммировать свой собственный (прибыльный, разумеется) алгоритм. Если это так - то я буду рад, мои усилия не пропали даром.<br />Если это не так - с интересом выслушаю чего не хватает в написанном, чтобы это таковым стало.</p><p>Разумеется, с не меньшим интересом реализую другие алгоритмы, если они будут описаны.</p>]]></content>
			<author>
				<name><![CDATA[admin]]></name>
				<uri>https://quik2dde.ru/profile.php?id=2</uri>
			</author>
			<updated>2015-06-18T07:18:47Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1398#p1398</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Пример: спредовый робот на QLua]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1397#p1397" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>admin пишет:</cite><blockquote><p>Робот работает по описанному алгоритму.<br />Если вы ожидали, что лично вам он будет приносить прибыль без усилий - посмотритесь в зеркало.</p></blockquote></div><p>Значит, обидел. Если вы еще раз перечитаете свой работающий алгоритм или посмотритесь в зеркало и перечитаете, то поймете, что алгоритм - шляпа полная.<br />Данный пример спредового робота, наглядно показывает, как не надо строить торговый алгоритм. Арковцы (и не только) специально выкладывают алгоритмы такого формата, что бы не опытных программистов ввести в заблуждение.<br />Пользователь данного алгоритма сможет эффективно повысить прибыль биржи и брокера за счет оборота, потратит несколько месяцев на &quot;доводку&quot; алгоритма и в конечном итоге сделает единственно правильные усилия применительно к данному алгоритму - нажать на кнопку &quot;Delete&quot; и очистить корзину ))</p>]]></content>
			<author>
				<name><![CDATA[kalikazandr]]></name>
				<uri>https://quik2dde.ru/profile.php?id=208</uri>
			</author>
			<updated>2015-06-18T06:00:04Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1397#p1397</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Пример: спредовый робот на QLua]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1396#p1396" />
			<content type="html"><![CDATA[<p>Робот работает по описанному алгоритму.<br />Если вы ожидали, что лично вам он будет приносить прибыль без усилий - посмотритесь в зеркало.</p>]]></content>
			<author>
				<name><![CDATA[admin]]></name>
				<uri>https://quik2dde.ru/profile.php?id=2</uri>
			</author>
			<updated>2015-06-18T04:51:06Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1396#p1396</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Пример: спредовый робот на QLua]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1395#p1395" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[kalikazandr]]></name>
				<uri>https://quik2dde.ru/profile.php?id=208</uri>
			</author>
			<updated>2015-06-17T21:03:29Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1395#p1395</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Пример: спредовый робот на QLua]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1247#p1247" />
			<content type="html"><![CDATA[<p>Залил свою версию на github [url]https://github.com/AndSemenoff/spread_bot_quik[/url]<br />В ближайшее время сделаю более подробное описание.<br />Основной минус бота -&nbsp; много бесполезных транзакций. Т.е. если банально запустить двух таких роботов<br />с разных счетов по одному инструменту, то они будут бороться друг с другом делая кучу бесполезных транзакций.<br />Также данный бот вначале делает куплю, а затем продажу.<br />Из оригинала я не использую генерацию цены с десятичной точкой, т.к. работаю с такими активами, кот. имеют минимальный шаг цены 1.<br />Предложения и комментарии приветствуются.</p>]]></content>
			<author>
				<name><![CDATA[Absolem]]></name>
				<uri>https://quik2dde.ru/profile.php?id=263</uri>
			</author>
			<updated>2015-04-13T16:19:50Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1247#p1247</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Пример: спредовый робот на QLua]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1236#p1236" />
			<content type="html"><![CDATA[<p>Спасибо. Робот реально работает. Начал сам писать с нуля, но пока буквально полностью не повторил структуру данного робота - ничего не работало. Странно, что нет интереса к данному роботу и данной ветке форума. Может это связано с тарифами за транзакции, т.к. на высоколиквидном рынке данный бот делает много неэффективных транзакций?</p>]]></content>
			<author>
				<name><![CDATA[Absolem]]></name>
				<uri>https://quik2dde.ru/profile.php?id=263</uri>
			</author>
			<updated>2015-04-09T13:26:10Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1236#p1236</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Пример: спредовый робот на QLua]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=676#p676" />
			<content type="html"><![CDATA[<p>только начал изучать Lua....</p><p>--шаг цены<br />--точность задания цены инструмента</p><p>разве никак нельзя эту информацию от квика получить?</p><p>оО... уже даже что-то нашёл getSecurityInfo()</p><p>разберусь до конца, отредактирую...</p>]]></content>
			<author>
				<name><![CDATA[jobber]]></name>
				<uri>https://quik2dde.ru/profile.php?id=213</uri>
			</author>
			<updated>2014-10-11T18:18:22Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=676#p676</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Пример: спредовый робот на QLua]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=74#p74" />
			<content type="html"><![CDATA[<p>Спасибо на добром слове, приятно.<br />К сожалению, никак не дойдут руки доделать толком описание, столько других интересных дел! <img src="https://quik2dde.ru/img/smilies/wink.png" width="15" height="15" alt="wink" /></p>]]></content>
			<author>
				<name><![CDATA[admin]]></name>
				<uri>https://quik2dde.ru/profile.php?id=2</uri>
			</author>
			<updated>2013-01-14T19:04:03Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=74#p74</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Пример: спредовый робот на QLua]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=73#p73" />
			<content type="html"><![CDATA[<p>Спасибо за реализацию этого робота!<br />Потихоньку шпилит )))<br />По итогам торговли слабый плюс, зато ни одного убыточного дня <img src="https://quik2dde.ru/img/smilies/smile.png" width="15" height="15" alt="smile" /></p>]]></content>
			<author>
				<name><![CDATA[Kosmonavt]]></name>
				<uri>https://quik2dde.ru/profile.php?id=79</uri>
			</author>
			<updated>2013-01-14T18:57:36Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=73#p73</id>
		</entry>
</feed>
