<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[QUIK -> DDE]]></title>
	<link rel="self" href="https://quik2dde.ru/extern.php?action=feed&amp;type=atom" />
	<updated>2024-12-22T13:04:47Z</updated>
	<generator>PunBB</generator>
	<id>https://quik2dde.ru/index.php</id>
		<entry>
			<title type="html"><![CDATA[Готовый робот для QUIK]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?id=455&amp;action=new" />
			<summary type="html"><![CDATA[<p>Приветствую. Завалялся старый рабочий робот. Со следующими настраиваемыми параметрами.<br /><span class="postimg"><img src="https://i.ibb.co/QCNgKQ0/image.png" alt="https://i.ibb.co/QCNgKQ0/image.png" /></span></p><p>Логика достаточно простая. При запуске робота на инструмент, он делает покупку по рыночной цене с выставлением стопа. Если цена ударяется об стоп, позиция переворачивается. <br />На резких движениях - идеалити) На боковиках - можно на комиссии разориться)</p><p>Это всё к чему.<br />Нужен робот-скрипт для анализа инструментов по квику с выводом в тек.таблицу торгов<br />Наверняка у кого нибудь уже есть что то подобное - можем поменяться)<br />Готов рассмотреть вариант разработки - в адекватную стоимость</p><p>З.ы. свой скрипт за 10т.р. отдам)<br />Видео работы робота доступно по запросу</p>]]></summary>
			<author>
				<name><![CDATA[work-servis]]></name>
				<uri>https://quik2dde.ru/profile.php?id=4551</uri>
			</author>
			<updated>2024-12-22T13:04:47Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?id=455&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Обмен данными между стеками разных LuaState.]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?id=454&amp;action=new" />
			<summary type="html"><![CDATA[<p>Никак не могу понять, почем не присвоить ключ и значение, переданных из другого стека, таблице в стеке другого состояния.<br />В L2 находится всё, что надо, но код не идёт. </p><div class="codebox"><pre><code>#include &lt;windows.h&gt;
#include &lt;string&gt;

#include &lt;lua.hpp&gt;


BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
    return TRUE;
}

std::string CheckStack(lua_State* L, std::string message = &quot;&quot;) {
    std::string str = &quot;&quot;;
    int top = lua_gettop(L);

    for (int i = -1; i &gt;= 0 - top; i--) {
        std::string type_name = luaL_typename(L, i);
        std::string s = &quot;&quot;, ls = &quot;&quot;, t = &quot;&quot;;

        switch (lua_type(L, i)) {
        case LUA_TNONE: t = &quot;LUA_TNONE&quot;; break;
        case LUA_TNIL: t = &quot;LUA_TNIL &quot;; break;
        case LUA_TBOOLEAN:
            s = lua_toboolean(L, i) ? &quot;true&quot; : &quot;false&quot;;
            t = &quot;LUA_TBOOLEAN &quot;;
            break;
        case LUA_TLIGHTUSERDATA: t = &quot;LUA_TLIGHTUSERDATA &quot;; break;
        case LUA_TNUMBER:
            s = std::to_string(lua_tonumber(L, i));
            t = &quot;LUA_TNUMBER &quot;;
            break;
        case LUA_TSTRING:
            ls = lua_tostring(L, i);
            s = &quot;\&quot;&quot; + ls + &quot;\&quot;&quot;;
            t = &quot;LUA_TSTRING &quot;;
            break;
        case LUA_TTABLE: t = &quot;LUA_TTABLE &quot;; break;
        case LUA_TFUNCTION: t = &quot;LUA_TFUNCTION &quot;; break;
        case LUA_TUSERDATA: t = &quot;LUA_TUSERDATA &quot;; break;
        case LUA_TTHREAD: t = &quot;LUA_TTHREAD &quot;; break;
        }

        str += &quot;|&quot; + std::to_string(i) + &quot;; &quot; + std::to_string(top + i + 1) + &quot;| &quot;
            + t + type_name + &quot; &quot; + s + &quot;\n&quot;;
    }

#ifdef UNICODE
    MessageBoxW(NULL, str.c_str(), message.c_str(), MB_OK);
#else
    MessageBoxA(NULL, str.c_str(), message.c_str(), MB_OK);
#endif
    return str;
}

void F() {
    lua_State* L1 = luaL_newstate();
    lua_State* L2 = luaL_newstate();
    lua_newtable(L1);
    lua_newtable(L2);
    // заполняем таблицу:
    lua_pushstring(L1, &quot;QW&quot;);
        CheckStack(L1, &quot;1 L1&quot;);
    lua_pushnumber(L1, 11);
        CheckStack(L1, &quot;2 L1&quot;);
    lua_settable(L1, -3);
        CheckStack(L1, &quot;3 L1&quot;);
    // возвращаем из таблицы значение:
    lua_pushstring(L1, &quot;QW&quot;);
        CheckStack(L1, &quot;4 L1&quot;);
    lua_gettable(L1, -2);
        CheckStack(L1, &quot;5 L1&quot;);
    // вводим ключ:
    lua_pushstring(L1, &quot;QW&quot;);
        CheckStack(L1, &quot;6 L1&quot;);
    // меняем ключ изначение местами:
    lua_insert(L1, -2);
        CheckStack(L1, &quot;7 L1&quot;);
    // переносим ключ и значение из L1 в L2:
    lua_xmove(L1, L2, 2);
        CheckStack(L1, &quot;8 L1&quot;);
        // на стеке L2 ключ и значение в нужном порядке!
        CheckStack(L2, &quot;1 L2&quot;);
    // вводим ключ и значение в таблицу в L2:
    lua_settable(L2, -3);
        CheckStack(L2, &quot;2 L2&quot;);
    // вводим ключ:
    lua_pushstring(L2, &quot;QW&quot;);
        CheckStack(L2, &quot;3 L2&quot;);
    // возвращаем значение:
    lua_gettable(L2, -2);
    // и - ничего не получили!
        CheckStack(L2, &quot;4 L2&quot;);

    lua_close(L1);
    lua_close(L2);
    //==================================================
     
    // А этод код работает!
    lua_State* L3 = luaL_newstate();
    lua_State* L4 = luaL_newstate();
    lua_newtable(L3);
    lua_newtable(L4);
    // заполняем таблицу:
    lua_pushstring(L3, &quot;QW&quot;);
    lua_pushnumber(L3, 11);
    lua_settable(L3, -3);
    // возвращаем из таблицы значение:
    lua_pushstring(L3, &quot;QW&quot;); 
        CheckStack(L3, &quot;1 L3&quot;);
    // возвращаем из таблицы значение:
    lua_gettable(L3, -2);
        CheckStack(L3, &quot;2 L3&quot;);

    // вводим ключ в L4:
    lua_pushstring(L4, &quot;QW&quot;);
        CheckStack(L4, &quot;1 L4&quot;);
    // переносим значение из L3 в L4:
    lua_xmove(L3, L4, 1);
        CheckStack(L4, &quot;2 L4&quot;);
    // заполняем таблицу:
    lua_settable(L4, -3);
        CheckStack(L4, &quot;3 L4&quot;);
    // вводим ключ:
    lua_pushstring(L4, &quot;QW&quot;);
        CheckStack(L4, &quot;4 L4&quot;);
    // возвращаем значение:
    lua_gettable(L4, -2);
    // всё в порядке!
        CheckStack(L4, &quot;5 L4&quot;);

    lua_close(L3);
    lua_close(L4);
}

int Start(lua_State* L) { F(); return 0; }

static struct luaL_Reg ls_lib[] = {{ &quot;Start&quot;, Start },{NULL, NULL}};

extern &quot;C&quot; __declspec(dllexport) int luaopen_LuaSt(lua_State* L) {
    luaL_newlib(L, ls_lib);
    return 1;
}</code></pre></div><p>Прошу помощи!<br />Если можно объяснить подробно (для &quot;особо одарённых&quot;). <br />Заранее благодарю!</p>]]></summary>
			<author>
				<name><![CDATA[Yuriy]]></name>
				<uri>https://quik2dde.ru/profile.php?id=4233</uri>
			</author>
			<updated>2024-11-02T09:00:12Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?id=454&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Проблема с обновлением данных в таблице созданной из Lua (Решено)]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?id=453&amp;action=new" />
			<summary type="html"><![CDATA[<p>Уже 3 часа пытаюсь понять в чем причина. Не обновляются данные в таблице, пока не проведу по ней мышью.</p><p>Код уж совсем простой и тут какие-то у меня не понятки вышли. Может кто сталкивался с такой проблемой. Данные через message() идут нормально, а вот в таблице не обновляются пока окно таблицы не получит какое-либо сообщение</p><p>Сам код:</p><div class="codebox"><pre><code>-- Переменны для замены на данные хранящиеся в настройках скрипта
local secCode = &quot;MMZ4&quot;

local atrID = &quot;MXI_ATR&quot;
local priceID = &quot;MXI_PRICE&quot;

--Переменные для замены на данные получаемые из терминала
local digit = 2

--Переменные глобальных таблиц и окон
local tableMain = nil
local hwndMain = nil

local isRun = true
function main()
    message(&quot;Hello. This is MambaBot&quot;,1)
    while isRun do
        if tableMain ~= nil then
            if IsWindowClosed(tableMain) then
                isRun = false
            end            
        end
        sleep(1000)
    end
    message(&quot;MambaBot has stopped&quot;)
end

function OnParam(class, sec)
    if(class==&quot;SPBFUT&quot; and sec==secCode) then
        if tableMain ~= nil then
            --Обновляем данные в ячеках главной таблицы
            SetCell(tableMain, 2, 1, getInfoParam(&quot;SERVERTIME&quot;), 0)
            --message(getInfoParam(&quot;SERVERTIME&quot;))
            local atrVal, count, legend
            atrVal, count, legend = getCandlesByIndex(atrID, 0, getNumCandles(atrID) - 1, 1)
            SetCell(tableMain, 7, 1, string.format(&quot;%.&quot; .. digit .. &quot;f&quot;, atrVal[0].close), atrVal[0].close)

            local priceCandleVal
            priceCandleVal, count, legend = getCandlesByIndex(priceID, 0, getNumCandles(priceID) - 1, 1)
            print(count)
            SetCell(tableMain, 3, 1, string.format(&quot;%.&quot; .. digit .. &quot;f&quot;, priceCandleVal[0].open), priceCandleVal[0].open)
            SetCell(tableMain, 4, 1, string.format(&quot;%.&quot; .. digit .. &quot;f&quot;, priceCandleVal[0].high), priceCandleVal[0].high)
            SetCell(tableMain, 5, 1, string.format(&quot;%.&quot; .. digit .. &quot;f&quot;, priceCandleVal[0].low), priceCandleVal[0].low)
            SetCell(tableMain, 6, 1, string.format(&quot;%.&quot; .. digit .. &quot;f&quot;, priceCandleVal[0].close),
                priceCandleVal[0].close)
            message(string.format(&quot;%.&quot; .. digit .. &quot;f&quot;, priceCandleVal[0].close))
        end
    end
end

function OnInit(script_path)

    tableMain = AllocTable()
    AddColumn(tableMain,0,&quot;param&quot;,true,QTABLE_STRING_TYPE,12)
    AddColumn(tableMain,1,&quot;value&quot;,true,QTABLE_STRING_TYPE,12)

    hwndMain = CreateWindow(tableMain)
    SetWindowCaption(tableMain,&quot;MambaBot Main&quot;)
    local rowNum = 1

    InsertRow(tableMain,-1)
    SetCell(tableMain,rowNum,0,&quot;Sec code&quot;,0)
    SetCell(tableMain,rowNum,1,secCode,0)
    rowNum = rowNum+1

    InsertRow(tableMain,-1)
    SetCell(tableMain,rowNum,0,&quot;Time&quot;,0)
    SetCell(tableMain,rowNum,1,&quot;00:00:00&quot;,0)
    rowNum = rowNum+1

    InsertRow(tableMain,-1)
    SetCell(tableMain,rowNum,0,&quot;Open&quot;,0)
    SetCell(tableMain,rowNum,1,&quot;0.0&quot;,0.0)
    rowNum = rowNum+1

    InsertRow(tableMain,-1)
    SetCell(tableMain,rowNum,0,&quot;High&quot;,0)
    SetCell(tableMain,rowNum,1,&quot;0.0&quot;,0.0)
    rowNum = rowNum+1

    InsertRow(tableMain,-1)
    SetCell(tableMain,rowNum,0,&quot;Low&quot;,0)
    SetCell(tableMain,rowNum,1,&quot;0.0&quot;,0.0)
    rowNum = rowNum+1

    InsertRow(tableMain,-1)
    SetCell(tableMain,rowNum,0,&quot;Close&quot;,0)
    SetCell(tableMain,rowNum,1,&quot;0.0&quot;,0.0)
    rowNum = rowNum+1

    InsertRow(tableMain,-1)
    SetCell(tableMain,rowNum,0,&quot;ATR value&quot;,0)
    SetCell(tableMain,rowNum,1,&quot;0.0&quot;,0.0)
    rowNum = rowNum+1
end

function OnStop(flag)
    if tableMain ~=nil then
        DestroyTable(tableMain)
    end
    isRun = false
    return 100
end</code></pre></div><p>Это всего лишь набросок будущего робота, просто на скоряк кодил, вспоминал как работать с таблицами и получением данных</p>]]></summary>
			<author>
				<name><![CDATA[AgentSmit]]></name>
				<uri>https://quik2dde.ru/profile.php?id=221</uri>
			</author>
			<updated>2024-10-14T17:43:04Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?id=453&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Данные по бумагам в портфеле скриптом lua]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?id=452&amp;action=new" />
			<summary type="html"><![CDATA[<p>Пытаюсь получить данные по бумагам в портфеле скриптом. Выдает то ошибки, то nill<br />неделю ковыряюсь, не понимаю в чем ошибка(( <br />в портфеле одна акция Роснефти, нужно что бы при запуске скрипта вывел месседж что в портфеле 1 акция Роснефти. </p><div class="codebox"><pre><code>  sec_code = &quot;SIBN&quot;
  Firm_ID = &quot;MC00025000XX&quot;
  Kod_klienta = &quot;4XXXN&quot;
 ACCOUNT = &quot;L01-00000F00&quot;
 limit_kind = &quot;1&quot;
  res = getDepo(Kod_klienta, Firm_ID, sec_code, ACCOUNT)
local lots = (&quot;depo_current_balance&quot;) 
message(&quot;Текущий остаток=&quot; ..lots)</code></pre></div><p>или </p><div class="codebox"><pre><code>sec_code = &quot;SIBN&quot;
Firm_ID = &quot;MC00025000XX&quot;
Kod_klienta = &quot;4XXXN&quot;
ACCOUNT = &quot;L01-00000F00&quot;

function LB()
  n = getNumberOf(&quot;depo_limits&quot;)
  value = 0
  res = nil
  for y = 0, n-1 do
    trade = getItem(&quot;depo_limits&quot;, y)
    if (trade[&quot;client_code&quot;] == Kod_klienta) and
      (trade[&quot;firmid&quot;] == Firm_ID) and
      (trade[&quot;sec_code&quot;] == sec_code) and
      (trade[&quot;trdaccid&quot;] == ACCOUNT) and
      (trade[&quot;limit_kind&quot;] == 2) then
        res = trade[&quot;currentbal&quot;]
        break
      end
  end
  return res
end

message(tostring(LB()), 0)</code></pre></div><p>Выдают nill</p>]]></summary>
			<author>
				<name><![CDATA[Alexey89]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3408</uri>
			</author>
			<updated>2024-07-26T06:19:17Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?id=452&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Помощь в разборе кода типового индикатора MACD]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?id=451&amp;action=new" />
			<summary type="html"><![CDATA[<p>Всем привет<br />Прошу помочь разобраться в коде типового индикатора MACD.<br />Я скачал архив индикаторов, открыл первый знакомый мне и несколько не понял его кода.<br />1. </p><div class="codebox"><pre><code>function Init()
    func = MACD()
    return #Settings.line
end</code></pre></div><p>В функции инициализации есть непонятная строчка func = MACD(). Я её интерпритирую так - есть какая-то глобальная переменная func, которую инициализируют функцией. Мне не понятно откуда взялась эта переменная и как используется. В документации от arqatech никаких примеров и упоминяний нет. Если есть возможность пояснить или направить - буду благодарен. Ну и в целом интересует наличие каких-то не документированных объектов.</p>]]></summary>
			<author>
				<name><![CDATA[mikhge]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3444</uri>
			</author>
			<updated>2024-06-05T21:17:00Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?id=451&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[LuaSQL Postgres]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?id=450&amp;action=new" />
			<summary type="html"><![CDATA[<p>Всем привет!<br />Нужна помощь, потому что решения не нашел.<br />Нужна библиотека для связи скрипта на lua из quick с базой на postgres.<br />Оговорюсь сразу, лично мне нужна именно Postgres, потому что на одном SQL-сервере взаимодействуют несколько сервисов и разделять сервиси на разные СУБД пока что не удобно и не правильно, по моему мнению. <br />Я знаю что есть luarocks, luasql и что нужно скомпилировать саму библиотеку.<br />Уже несколько дней бьюсь (неделю точно) над попытками компиляции, но всё без успешно.<br />Текущие составляющие:<br />- Windows 10 (x64)<br />- Quick - версия 11.1.1.11<br />- Postgres (x64) - версия 15.3-1.1C<br />- MinGW (x32) - mingw32-gcc (MinGW.org GCC-6.3.0-1) 6.3.0<br />- lua - 5.4.2 (x64)<br />- luarocks -&nbsp; 3.11.1</p><p>В общем, сначала пошел обычным путем и через команду luarocks install luasql-postgres PGSQL_DIR=&quot;Путь до PostgreSQL&quot; - в результате библиотека сформировалась. НО - при попытке теста подключения выдается сообщение:</p><div class="quotebox"><blockquote><p>error loading module &#039;luasql.postgres&#039; from file &#039;C:\QUIK\luasql\postgres.dll&#039;:<br />&nbsp; &nbsp; %1 не является приложением Win32.</p></blockquote></div><p>Из этой ошибки я делаю несколько выводов:<br />1. файл он нашел и загрузить попытался<br />2. при попытке подключить сама библиотека не соответствует представлениям Quick<br />Сначала подумал, что нет синхрона по разрядности всех комплектующих и скачал и переставил все (PostgreSQL, lua) на 32 разряда. <br />Все пути к bin в path прописал, компьютер перегрузил и снова попробовал предыдущей командой скомпилить - всё собралось, но при подключении в квике опять выпадает сообщение.<br />Я подумал и попробовал зарегить библиотеку через regsvr32 - мне выпало сообщение, что возможно модуль не совместим с версией Windows на компьютере. <br />Очевидно, что при в коде или в компиляции не корректно и библиотека собирается, но не для Windows 10 x64</p><p>Далее я пытался собрать библиотеку через Visual Studio 2015, но результата это опять же не дало. Я даже подключал ChatGPT и мы с ним сутки, наверно, разбирали все ошибки и вероятности - всё без успешно. </p><p>В общем, я несколько устал <img src="https://quik2dde.ru/img/smilies/smile.png" width="15" height="15" alt="smile" /><br />Если у кого-то есть готовая рабочая сборка - буду очень благодарен за помощь.<br />Если есть рекомендации как собрать самому, тоже буду благодарен.</p>]]></summary>
			<author>
				<name><![CDATA[mikhge]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3444</uri>
			</author>
			<updated>2024-06-02T11:24:20Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?id=450&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Как менять инструмент на графике из скрипта Lua?]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?id=448&amp;action=new" />
			<summary type="html"><![CDATA[<p>Хочу из таблицы, созданной lua скриптом через CreateTable(), при нажатии на строку, менять инструмент на графике. Такой себе аналог стандартной возможности квика с якорем и связанными графиками. Понимаю, что на прямую из луа таблицы такое не реализовано, но хочу подойти к вопросу через w32 модуль. </p><p>Вижу это таким образом: <br />1. Создаю &quot;таблицу текущих торгов&quot; с нужными инструментами <br />2. &quot;Швартую&quot; к ней &quot;якорем&quot; нужные графики<br />3. Через w32 нахожу &quot;таблицу текущих торгов&quot;<br />4. Выбираю инструмент, переданный из луа скрипта по коду инструмента.</p><p>До 3го шага дошёл и добираюсь до дескриптора MultiList класса &quot;Таблицы текущих торгов&quot;.<br /></p><div class="codebox"><pre><code>        
  hWnd = w32.FindWindow(&#039;InfoClass&#039;, &#039;&#039;)
  hWnd = w32.FindWindowEx(hWnd, 0, &#039;MDIClient&#039;, &#039;&#039;)
  hWnd = w32.FindWindowEx(hWnd, 0, &#039;&#039;, &#039;Tickers&#039;)
  hWnd = w32.FindWindowEx(hWnd, 0, &#039;&#039;, &#039;Tickers&#039;)
  hWnd = w32.FindWindowEx(hWnd, 0, &#039;MultiList&#039;, &#039;&#039;)</code></pre></div><p>Как кодом выбрать элемент в этом списке идей нет <img src="https://quik2dde.ru/img/smilies/sad.png" width="15" height="15" alt="sad" /></p><p>Но, вроде, если руками задать фокус на окне &quot;таблицы текущих торгов&quot;, нажать Ctrl+F, ввести код инструмента и нажать поиск, то в списке выберется нужная строка и поменяется таблица.</p><p>Можно как-то реализовать это через код?<br />Может как-то проще можно добиться реализации моей хотелки?</p>]]></summary>
			<author>
				<name><![CDATA[ossipov]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3426</uri>
			</author>
			<updated>2023-12-13T15:39:17Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?id=448&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Как выставить стоп-ордер на Lua в QUIK ?]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?id=447&amp;action=new" />
			<summary type="html"><![CDATA[<p>Привет всем! Не могу выставить стоп-ордер. Чего не хватает?<br />Нужно выставить стоп-заявку выше текущей цены на продажу с условием PRICE ниже STOPPRICE .<br />Данный код не выставляет ни чего.</p><div class="codebox"><pre><code>stop_or = {
     ACTION          = &quot;NEW_STOP_ORDER&quot;, 
     STOP_ORDER_KIND = &quot;TAKE_PROFIT_STOP_ORDER&quot;,
     OPERATION       = &quot;S&quot;,
     ACCOUNT         = n_depo,
     CLIENT_CODE     = n_client_code,
     CLASSCODE       = n_classcode,
     SECCODE         = n_seccode,
     STOPPRICE       = tostring(a+0.1),
     PRICE           = tostring(a),
     QUANTITY        = tostring(lot),
     TRANS_ID        = tostring(n_id)
    }
result = sendTransaction(stop_or)</code></pre></div>]]></summary>
			<author>
				<name><![CDATA[Серёга]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3423</uri>
			</author>
			<updated>2023-12-08T20:34:50Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?id=447&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[SetUpdateCallback и обнуление стека Lua]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?id=446&amp;action=new" />
			<summary type="html"><![CDATA[<p>Здравствуйте,</p><p>Раньше все работало, сейчас, как будто бы перестало.</p><p>Естественно использую LUA C API - для вызова SetUpdateCallback, вот такой просто С++ код:&nbsp; да понимаю, что вероятность, что кто-то будет смтреть код стремится к нулю, поэтому срезюмирую поведение кода:</p><p>С помощью QLua C API:</p><p>-1:Я вызываю CreteDataSorce: вызов происходит успешно, мне возвращается таблица и нулевая ошибка.<br />-2:Я подтверждаю это проверкой стека Lua: на вершине стека находится таблица и нулевая ошибка.</p><br /><p>-3:Затем я вызываю SetUpdateCallback и передаю вв него саму колбек функцию, которая будет вызыватся при каждой совершенной сделке.&nbsp; Так же дополнительно я связываю по типу лямбды любое значение, чтбы предать для последующего ивзлечения его в самом колбеке.</p><p>-4:Вызыва SetUpdateCallback, убеждаюсь, что вызов SetUpdateCallback прошел успешно и опять проверяю стек на наличие ранее заказанной таблицы CreateDataSource - ОНИ НА МЕСТЕ!<br />.<br />-5: И наконец на рынке совершается сделка по заказанному инстурменту и вызывается колбек &quot;my_callback__for__SetUpdateCallback&quot;. Все что я делаю в данном примере в этом колбеке это проверяю наличие моей таблицы CrateDataSourc в стеке Lua. ИИИИИИ ее там нет!!!! Весь стека кромер первого элемента был &quot;кем-то&quot; очищен!</p><p>ВОПРОС: КТО И ЗАЧЕМ очитстил стек ?? КАК видно из кода, между вызовов SetUpdateCallback и вызовом самой колбек-функции нет ни одной строчки кода, которая бы редактировала стек. Так что происходит тогда ?</p><br /><br /><br /><div class="codebox"><pre><code>lua_State* L_global;
int static nummer_table_from_stack;</code></pre></div><br /><br /><br /><div class="codebox"><pre><code>void SetUpdateCallcak_wrapper(lua_State* L)
{

    L_global = L;
    std::cout &lt;&lt; &quot;L_global_adress:&quot; &lt;&lt; &amp;L_global &lt;&lt; std::endl;


    //-----------------------------------------------------------------1-Вызовем функцию CreateDataSource:Начало--------------------------------------------
    lua_getglobal(L, &quot;CreateDataSource&quot;);                 

    lua_pushstring(L, &quot;TQBR&quot;);       //Добавим первый параметр функции CreateDataSource на вершину стека
    lua_pushstring(L, &quot;SBER&quot;);          //Добавим второй параметр функции CreateDataSource на вершину стека
    lua_pushnumber(L, 1);            //Добавим третий параметр функции CreateDataSource на вершину стека

    int status_lua_pcall = lua_pcall(L, 3, 2, 0);    //Так как все необходимые параметры добавлены в стек, то вызываем функцию lua_pcall - которая использя доабвенные параметры в правильном порядке - реализует вызов функции CreateDataSource: 2-ой параметр - это число аргументов, которые мы добаили в стек и которая принимает функция CreateDataSource; 2-ой: параметр - это число параметров, которое возвращает функция CreateDataSource. После успешного выполнения lua_pcall удаляет и значение функции и переданные аргменты со стека в кол-во указанном во втором параметре(не велючая функцию) и доабвляеи результат на стек в кол-во указанном во втором параметре.
    //-----------------------------------------------------------------1-Вызовем функцию CreateDataSource:Конец--------------------------------------------



    //-------------------------------------------------------------------5-Проверка на ошибку lua_pcall:Начало---------------------------------------------------------------------
    if (status_lua_pcall != 0)
    {
        //Ошибка произошла при вызове функции lua_pcall при вызове CreateDataSource:
        std::cout &lt;&lt; &quot;ERROR CreateDataSource&quot; &lt;&lt; std::endl;
        return;
    }
    //-------------------------------------------------------------------5-Проверка на ошибку lua_pcall:Конец---------------------------------------------------------------------
    else
    {

         nummer_table_from_stack = lua_gettop(L) - 1;   //Это номер элемента в стеке L - в котором теперь размещается полученная от CreateDataSource таблица. &quot;-1&quot; - потому что CreateDataSource поместила на вершину стека две перменные: таблицу и переменную об ошибке. То есть таблица находить на предпоследнем месте с вершины стека.

         my_call_SetUpdateCallback(L);     //Вызываем SetUpdateCallback wrapper
    }

}</code></pre></div><br /><br /><div class="codebox"><pre><code>l
static void ckeck_Lua_Stack(lua_State* L)
{

    std::cout &lt;&lt; &quot;----------------------------------------&quot; &lt;&lt; std::endl;

    int top = lua_gettop(L);
    std::cout &lt;&lt; &quot;Total element is stack:&quot;&lt;&lt; top &lt;&lt; std::endl;

    for (int i = 1; i &lt;= top; i++) 
    {
        int type = lua_type(L, i);

        const char* type_name = lua_typename(L, type);

        std::cout &lt;&lt; &quot;type:&quot; &lt;&lt; type_name &lt;&lt; &quot;:&quot;;


        if (type == LUA_TSTRING || type == LUA_TNUMBER) 
        {
            std::cout &lt;&lt; lua_tostring(L, i) &lt;&lt; std::endl;
        }
        else
        {
            std::cout &lt;&lt; std::endl;
        }
    }
    std::cout &lt;&lt; &quot;----------------------------------------&quot; &lt;&lt; std::endl &lt;&lt; std::endl;


    //std::this_thread::sleep_for(std::chrono::milliseconds(100000));

}</code></pre></div><br /><br /><div class="codebox"><pre><code>static int my_callback__for__SetUpdateCallback(lua_State* L)
{

//Значит произошла сделка!

    std::cout &lt;&lt; &quot;Number_candle:&quot;&lt;&lt; lua_tonumber(L, -1) &lt;&lt; std::endl;

    ckeck_Lua_Stack(L_global);         //Проверяем стек Lua!!! И теперь в нем находится сдедующее:

----------------------------------------
Total element is stack:1                          //Куда черт возьми делать моя ранее заказанная таблица CreateDataSource ?????
type:number:1
----------------------------------------


    return 0;

}</code></pre></div><br /><br /><br /><div class="codebox"><pre><code>static void my_call_SetUpdateCallback(lua_State* L)
{

    
    //--------------------------------------------------------
    lua_getfield(L_global, nummer_table_from_stack, &quot;SetUpdateCallback&quot;);                       //&quot;Извлекаем&quot; из &quot;таблицы&quot; функцию SetUpdateCallback.
     
    lua_pushvalue(L_global, nummer_table_from_stack);                                                       //Помещаем копию обьекта таблицы CreateDataSource на вершину стека.
    //--------------------------------------------------------


    lua_pushnumber(L_global, 555);  //Просто для примера связываю какое то любое значение для передачи в колбек. 

    lua_pushcclosure(L_global, my_callback__for__SetUpdateCallback, 1);       //Захватываем.


    //--------------------------------------------------------
    int status_lua_pcall = lua_pcall(L_global, 2, 0, 0);                  //Реализауем вызов функции SetUpdateCallback с аргументом таблицы, которую поместили на вершину стека 
    //--------------------------------------------------------
    

    if (status_lua_pcall != 0)
    {
        std::cout &lt;&lt; &quot;lua_pcall__ERROR&quot; &lt;&lt; std::endl;
        return; 
    }
    else
    {
        std::cout &lt;&lt; &quot;SetUpdateCallback Success Call&quot; &lt;&lt; std::endl;
        
        ckeck_Lua_Stack(L_global);       //Проверяю что находится на данный момент в стеке Lua.

       //Находится следующее:

 ----------------------------------------
Total element is stack:3
type:string:1     //Таблица глобьальный функций
type:table:        //Это как раз запрошенная таблица CreateDataSource
type:nil:            //Ошибка при запросе таблицы CreateDataSource - то есть nil - ошибки нет.
----------------------------------------

        return;
    }


}</code></pre></div>]]></summary>
			<author>
				<name><![CDATA[Serg_]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3371</uri>
			</author>
			<updated>2023-12-07T08:04:48Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?id=446&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA["Балансовая цена" для фьючерсов - что показывает после клиринга?]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?id=445&amp;action=new" />
			<summary type="html"><![CDATA[<p>Всем привет. Можете пояснить мне один нюанс? Потихоньку разбираюсь с фьючерсами, и произошел затык со средней ценой позиции(Таблица &quot;состояние счета&quot; поле &quot;балансовая цена&quot;). Проблема в том, что после клиринга она меняется, а до клиринга соответствует средней цене. То есть если я взял один лот по 100, а затем еще один по 300, то в этом поле будет отображаться 200. После клиринга эта цифра изменится в какую либо сторону. Полагаю это будет зависеть от вариационной маржи. С маржой вроде понятно, по сути это разница цен. И вот тут начинается, пишут что во время клиринга списывают или начисляют на СЧЕТ(правда я так точно и не понял что именно списывают или начисляют, но похоже как раз эту самую маржу или я не прав?). Тогда при чем здесь вообще средняя цена и почему она меняется? <br />Т.е. по сути я сейчас пытаюсь разобраться с тем, могу ли я использовать среднюю цену уже после клиринга или даже не одного для выставления заявок с фиксированной прибылью? Т.е. я например хочу 5% (жирно да <img src="https://quik2dde.ru/img/smilies/smile.png" width="15" height="15" alt="smile" /> но пусть будет так), а также есть у меня два лота один за 100 и второй за 300, т.е. 5% это 5 и 15, в сумме 20. если взять среднюю цену 200, то на 2 лота придется теже 20. НО! после клиринга балансовая цена изменится, например до 190. Будут ли в этом случае результат корректным?</p>]]></summary>
			<author>
				<name><![CDATA[dark184]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3309</uri>
			</author>
			<updated>2023-11-28T14:23:09Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?id=445&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Помогите найти цену последнего стоп ордера]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?id=444&amp;action=new" />
			<summary type="html"><![CDATA[<p>помогите найти цену нужного ордера<br />данная функция не находит нужный ордер и находится в постоянном поиске</p><div class="codebox"><pre><code>function last_order()
  local last_order = {}
  local n = getNumberOf(&quot;orders&quot;)

  while n &gt; 0 do
    local order = getItem(&quot;orders&quot;, n-1)
    if order.sec_code == n_seccode
         and order.trans_id == n_id 
    then
       last_order = order
       break
       n = n - 1
    end

  end

  return last_order
end</code></pre></div>]]></summary>
			<author>
				<name><![CDATA[Серёга]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3423</uri>
			</author>
			<updated>2023-11-17T09:14:50Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?id=444&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Получить sec_code из метки индикатора]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?id=443&amp;action=new" />
			<summary type="html"><![CDATA[<p>Есть индикатор&nbsp; </p><p>Settings = {<br />&nbsp; &nbsp;Name = &quot;goodmode1&quot;<br />}</p><p>function Init()<br />&nbsp; &nbsp;return 1<br />end</p><p>function OnCalculate(Index)<br />&nbsp; &nbsp;if Index == 1 then<br />&nbsp; &nbsp; &nbsp; &nbsp;local info = getDataSourceInfo()<br />&nbsp; &nbsp; &nbsp; &nbsp;--message(info.sec_code)<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;-- Создаем метку с информацией sec_code<br />&nbsp; &nbsp; &nbsp; &nbsp;local labelSize = 100 -- размер метки<br />&nbsp; &nbsp; &nbsp; &nbsp;local labelX = 10 -- координата X метки (посередине графика)<br />&nbsp; &nbsp; &nbsp; &nbsp;local labelY = 10 -- координата Y метки (посередине графика)<br />&nbsp; &nbsp; &nbsp; &nbsp;local secCodeLabel = tostring(info.sec_code)<br />&nbsp; &nbsp; &nbsp; &nbsp;AddLabel(labelX, labelY, secCodeLabel, RGB(255, 255, 0), labelSize)<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;-- Выводим значение метки в сообщении<br />&nbsp; &nbsp; &nbsp; &nbsp;message(&quot;Значение метки: &quot; .. secCodeLabel)<br />&nbsp; &nbsp;end<br />&nbsp; &nbsp;<br />&nbsp; &nbsp;return 0<br />end</p><br /><p>График заякорен к ТТТ и при выборе инструмента в ТТТ выдает его название, вроде это название так же записывается в метку на графике ( метку кстати ни разу не получилось увидеть, надеюсь она есть)</p><p>Делаю скрипт что-бы при запуске скрипта, значение метки выводилось сообщением.</p><p>function OnInit()<br />&nbsp; &nbsp;local labelValue = GetLabelParams(&quot;goodmode1&quot;, &quot;Метка&quot;)<br />&nbsp; &nbsp;message(&quot;Значение метки: &quot; .. tostring(labelValue))<br />end</p><p>Такой скрипт отображает nill.&nbsp; Код вроде правильный, что не так?&nbsp; Как проверить есть ли метка?</p>]]></summary>
			<author>
				<name><![CDATA[Alexey89]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3408</uri>
			</author>
			<updated>2023-10-23T17:26:26Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?id=443&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Получить sec_code при выборе бумаги в ТТТ.]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?id=442&amp;action=new" />
			<summary type="html"><![CDATA[<p>Код даже не выдает ошибок. Никакой реакции. Почему?&nbsp; Есть ли какой-нибудь вариант привязать getDataSourceInfo() к конкретному индикатору, что бы получать sec_code при выборе бумаги в ТТТ?&nbsp; </p><p>function OnCalculate(Index)<br />&nbsp; &nbsp;if Index == 1 then<br />&nbsp; &nbsp;local info = getDataSourceInfo();<br />&nbsp; &nbsp;message( info.sec_code )<br />&nbsp; &nbsp;end<br />&nbsp; &nbsp;return 0<br />end</p>]]></summary>
			<author>
				<name><![CDATA[Alexey89]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3408</uri>
			</author>
			<updated>2023-10-19T11:30:24Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?id=442&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Как вытащить запущенный скрипт? Ворует ли брокер скрипт?]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?id=441&amp;action=new" />
			<summary type="html"><![CDATA[<p>У меня в квике запущен скрипт. А сохраненный на диске случайно удалён. То есть скрипт загружается Quik&#039;ом на внешний сервер и продолжает работать. На диске на компе этот скрипт в других папках не находится.</p><p>Брокер может украсть код скрипта с внешнего сервера?<br />Как вытащить код запущенного скрипта?</p>]]></summary>
			<author>
				<name><![CDATA[ecoreon]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3323</uri>
			</author>
			<updated>2023-10-05T07:23:36Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?id=441&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Как получить sec_code по идентификатору графика?]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?id=440&amp;action=new" />
			<summary type="html"><![CDATA[<p>Присвоил графику идентификатор WWWbond.<br />Код работает. Выдает число свечек.</p><p>x = getNumCandles(&#039;WWWbond&#039;)<br />message(&#039;x= &#039; ..x)</p><p>Пытаюсь разными способами получить по этому идентификатору WWWbond sec_code. Никак не получается, такая возможность вообще есть?</p><p>Код не работает.</p><p>graphic_id = &#039;WWWbond&#039;<br />sec_code = getSecurityInfo(graphic_id)<br />message(&quot;График &quot; .. sec_code)</p>]]></summary>
			<author>
				<name><![CDATA[Alexey89]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3408</uri>
			</author>
			<updated>2023-09-05T06:44:17Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?id=440&amp;action=new</id>
		</entry>
</feed>
