<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[QUIK -> DDE &mdash; Пользовательские таблицы]]></title>
	<link rel="self" href="https://quik2dde.ru/extern.php?action=feed&amp;tid=393&amp;type=atom" />
	<updated>2022-09-30T08:50:13Z</updated>
	<generator>PunBB</generator>
	<id>https://quik2dde.ru/viewtopic.php?id=393</id>
		<entry>
			<title type="html"><![CDATA[Re: Пользовательские таблицы]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3691#p3691" />
			<content type="html"><![CDATA[<p>Для создания окна скрипта на нужной вкладке QUIK можно воспользоваться описанным в этой теме приёмом<br />[url]https://quik2dde.ru/viewtopic.php?id=329[/url]</p>]]></content>
			<author>
				<name><![CDATA[swerg]]></name>
				<uri>https://quik2dde.ru/profile.php?id=78</uri>
			</author>
			<updated>2022-09-30T08:50:13Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3691#p3691</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Пользовательские таблицы]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3690#p3690" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>swerg пишет:</cite><blockquote><p>А то, что при создании таблиц нельзя штатно указать определенную вкладку - это отдельная история еще.</p></blockquote></div><p> Это бы решило проблему хотя бы частично. Хотя как я вижу решение, это дать возможность получить идентификатор вкладки, на которой открыт диалог &quot;доступные скрипты&quot;. И уже на основании этого в скрипте создавать таблицы только в этой вкладке.</p>]]></content>
			<author>
				<name><![CDATA[dark184]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3309</uri>
			</author>
			<updated>2022-09-30T08:09:34Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3690#p3690</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Пользовательские таблицы]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3689#p3689" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>dark184 пишет:</cite><blockquote><p>Что то подозреваю, что дело все таки в самом терминале. Хотя с другой стороны, откуда ему знать в какой вкладке создавать таблицу</p></blockquote></div><p>Разумеется.<br />И основная проблема - в том, что окно, созданное скриптом, отображается в нескольких вкладках (в описанном здесь вами сценарии). Это прям совсем проблема.<br />А то, что при создании таблиц нельзя штатно указать определенную вкладку - это отдельная история еще.</p>]]></content>
			<author>
				<name><![CDATA[swerg]]></name>
				<uri>https://quik2dde.ru/profile.php?id=78</uri>
			</author>
			<updated>2022-09-30T08:03:02Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3689#p3689</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Пользовательские таблицы]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3688#p3688" />
			<content type="html"><![CDATA[<p>Спасибо. Век бы не докумекал перенести <img src="https://quik2dde.ru/img/smilies/smile.png" width="15" height="15" alt="smile" /><br />Сейчас поэкспериментировал немного и выяснил следующее:<br />1. У меня работают 7 роботов, у 5 из них код абсолютно одинаковый, у 2 код похожий, но другая стратегия. Если присутствует хоть один робот с созданием таблицы в OnInit(), таблицы создаются вообще в рандомных вкладках, причем не во всех. Раскидываются по 3-4 вкладкам, всего их у меня 11. Причем закономерность не уловил, кроме того, что те, у которых таблица создается в OnInit() всегда отдельно от тех, у которых в main().<br />2. Если все роботы создают таблицу в main(), то все таблицы создаются именно в той вкладке, которая была активна перед закрытием квика.</p><p>Что то подозреваю, что дело все таки в самом терминале. Хотя с другой стороны, откуда ему знать в какой вкладке создавать таблицу <img src="https://quik2dde.ru/img/smilies/smile.png" width="15" height="15" alt="smile" /></p>]]></content>
			<author>
				<name><![CDATA[dark184]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3309</uri>
			</author>
			<updated>2022-09-30T07:59:26Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3688#p3688</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Пользовательские таблицы]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3685#p3685" />
			<content type="html"><![CDATA[<p>Дошли руки проверить ваш пример.<br />Да, проблема проявляется такая же как у вас: после перезапуска QUIK с не остановленным скриптом таблица скрипта создается на всех вкладках.<br />Причем это именно вновь созданная таблица, а не &quot;сохраненная в конфигурации QUIK&quot;, как я ошибочно предположил. Проверил так: перед повторным запуском QUIK я поправил указанный&nbsp; заголовок окна в скрипте - и после запуска QUIK создалось окно (на всех вкладках) уже с новым заголовком.</p><p>Проверял на версиях 8.7 и 9.1 - проблема одинаковая.</p><p>Причем это на самом деле создается всего одно окно из скрипта, просто ошибочно отображается на всех вкладках. Проверил так: изменил ширину колонок - и видно, что на всех вкладках ширина тоже измененная, а значит это точно всего одно окно, просто отображаемое на любой вкладке.</p><p>Обнаружил, что если перенести строку<br /></p><div class="codebox"><pre><code>    t_id = Table_init(Column_Table)                            -- Создаем таблицу и добавляем колонки.</code></pre></div><p>из <strong>OnInit</strong>() в самое начало <strong>main</strong>(), то проблема исчезает.</p><p>Т.е. беда в том, что таблица создается прямо в OnInit(), с этим какая-то проблема у терминала в случае, если скрипт автостартует при запуске терминала. Если же скрипт просто стартануть из диалога, то проблем с созданием пользовательской таблицы в OnInit() не возникает.</p><p>Надо зарепортить проблему разработчикам, может когда и поправят.</p>]]></content>
			<author>
				<name><![CDATA[swerg]]></name>
				<uri>https://quik2dde.ru/profile.php?id=78</uri>
			</author>
			<updated>2022-09-30T06:52:26Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3685#p3685</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Пользовательские таблицы]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3679#p3679" />
			<content type="html"><![CDATA[<p>Вот по быстрому подчистил, оставил только рабочую базу. Честно говоря подозреваю что собака порылась в самом коде. У меня сейчас ситуация такая. Подключаю квик к бирже, запускаю робота(он создает единственную таблицу во вкладке из которой запущен, на остальных этой таблицы нет), закрываю квик с запущенным роботом, снова запускаю квик, подключаюсь, робот запущен, но одна и таже таблица создается сразу во всех вкладках квика. Причем судя по всему с одинаковым ID, т.к. останавливаю скрипт из диалога управления «Доступные скрипты», дестроятся таблицы сразу во всех вкладках. Снова запускаю скрипт, таблица в единственной вкладке из которой запущен скрипт.<br />Не разобрался как прикрепить файл, поэтому пришлось сделать так <img src="https://quik2dde.ru/img/smilies/hmm.png" width="15" height="15" alt="hmm" /> Свои TRADE_ACC и CLIENT_CODE светить на форуме не стал, но и без них скрипт работает, ибо заявки убраны.<br /></p><div class="spoilerbox" style="padding: 0px;"><div onclick="var e,d,c=this.parentNode,a=c.getElementsByTagName('div')[1],b=this.getElementsByTagName('span')[0];if(a.style.display!=''){while(c.parentNode&&(!d||!e||d==e)){e=d;d=(window.getComputedStyle?getComputedStyle(c, null):c.currentStyle)['backgroundColor'];if(d=='transparent'||d=='rgba(0, 0, 0, 0)')d=e;c=c.parentNode;}a.style.display='';a.style.backgroundColor=d;b.innerHTML='[-]';}else{a.style.display='none';b.innerHTML='[+]';}" style="cursor: pointer;"><span style="padding: 0 5px;">[+]</span>Spoiler</div><div style="padding: 6px; margin: 0; display: none;"><div class="codebox"><pre><code>-- Настроечные параметры скрипта

TRADE_ACC        = &quot;123&quot;                       -- торговый счет
CLIENT_CODE        = &quot;321&quot;                        -- код клиента
SEC                = &quot;PIKK&quot;                    -- Код инструмента
CLASS            = &quot;TQBR&quot;                    -- Код класса

percent            = 1                            -- Желаемый процент профита
portfolio        = 1                            -- Количество лотов для покупки
uniq_trans_id     = 0x18000                    -- Уникальный идентификатор транзакции.

Block_sell_Case    = 1                            -- Если в портфеле есть акции, то
                                            -- 1 - Запрещаем роботу их продавать при запуске
                                            -- 0 - Робот выставляет все, что еще не в продаже в заявки при старте. Цена расчитывается с учетом percent

-- Конец настроечных параметров скрипта
-- Переменные в скрипте
security_info = getSecurityInfo(CLASS, SEC)

NAME = security_info.short_name                -- Инструмент
PRICE_STEP    = security_info.min_price_step    -- шаг цены по инструменту
PRICE_SCALE    = security_info.scale            -- точность задания цены инструмента
LOT_SIZE    = security_info.lot_size        -- Размер лота
Open        = 0                                -- Цена окрытия свечи
High        = 0                                -- Максимум свечи
Low            = 0                                -- Минимум свечи
Close        = 0                                -- Цена закрытия свечи
Volume        = 0                                -- Объем свечи
Order        = 0                                -- Заявка
Case        = 0                                -- Текущее количество в портфеле
buy_price    = 0                                -- Цена покупки
sell_price    = 0                                -- Цена продажи
Total        = 0                                -- Итого, руб.
Date_Time    = 0
Total_perc    = 0                                -- Итого, %

average_price    = 0                            -- средняя цена покупки.
block_sell        = 0                            -- Стоят на продаже.

stopped = false                                -- Признак работы или остановки скрипта.
cur_state = &quot;&quot;                                -- Текущее состояние робота.
                                            -- &quot;&quot;                ничего не куплено, не продано, не ожидаем.
                                            -- &quot;e_buy&quot;            ждем подтверждения, заявка выставлена
                                            -- &quot;e_sell&quot;            ждем подтверждения, заявка выставлена
                                            -- &quot;confirm_buy&quot;    ждем покупки по подтвержденной заявке
                                            -- &quot;confirm_sell&quot;    ждем продажи по подтвержденной заявке
                                            -- &quot;buy&quot;            купили
                                            -- &quot;sell&quot;            продали
                                            -- &quot;buy_kill&quot;        отмена заявки на покупку
                                            -- &quot;sell_kill&quot;        отмена заявки на продажу
t_id        = 0
cur_order    = 1
-- Работаем с битовыми флагами.
order_stat    = 0                                -- Статус заявки.
mask_bits    = 7                                -- Выделяем нужные биты из всех
                                            -- 0 - Заявка исполнена
                                            -- 1 - Заявка активна, иначе - не активна.
                                            -- 2 - Заявка снята.
                                            -- 3 - 
                                            -- 4 -

function OnStop(s)
    stopped = true                            -- Скрипт остановлен закрытием таблицы или нажатием кнопки &quot;Остановить&quot;
    DestroyTable(t_id)                        -- Закрываем таблицу
    message(&quot;Скрипт остановлен пользователем, робот отключен&quot;)
end

function OnInit()

    local NO = getNumberOf(&quot;orders&quot;)
    
    Column_Table =    {                                        -- Создаем список колонок таблицы.function() return  end
                    {&quot;Инструмент&quot;,QTABLE_STRING_TYPE,15,function() return NAME end},
                    {&quot;Шаг цены&quot;,QTABLE_DOUBLE_TYPE, 12,function() return tostring(PRICE_STEP) end},
                    {&quot;Точность&quot;,QTABLE_INT_TYPE, 12,function() return tostring (PRICE_SCALE) end},
                    {&quot;Заявка&quot;, QTABLE_STRING_TYPE, 10,function() return tostring(Order) end},
                    {&quot;Портфель&quot;, QTABLE_INT_TYPE, 10,function() return tostring(Case) end},
                    {&quot;Цена покупки&quot;, QTABLE_DOUBLE_TYPE, 15,function() return tostring(buy_price * LOT_SIZE) end},
                    {&quot;Цена продажи&quot;, QTABLE_DOUBLE_TYPE, 15,function() return tostring(sell_price * LOT_SIZE) end},
                    {&quot;Итого&quot;, QTABLE_DOUBLE_TYPE, 15,function() return tostring(Total) end},
                    {&quot;Дата время&quot;, QTABLE_DOUBLE_TYPE, 15,function() return tostring(Date_Time) end},
                    {&quot;Статус&quot;, QTABLE_STRING_TYPE, 10,function() return tostring(cur_state) end},
    }
    t_id = Table_init(Column_Table)                            -- Создаем таблицу и добавляем колонки.
        
--    File_Write()
end;

function main()
        
    while not stopped do 
        
        if IsWindowClosed(t_id) then                                            -- Если пользователь закрыл таблицу
            stopped = true                                                        -- Стопим скрипт
            message(&quot;Таблица закрыта пользователем, робот остановлен&quot;, 1)
        end
        
        
        Table_row(cur_order)
        sleep(500)
    end
    
end

function File_Write()

    f = io.open(getScriptPath()..&quot;\\Robot\\log\\&quot; .. SEC .. &quot;.lua&quot;,&quot;r+&quot;);        -- Пытается открыть файл в режиме &quot;чтения/записи&quot;
    message(&quot;Пытаюсь открыть файл \\Robot\\log\\&quot; .. SEC .. &quot;.lua&quot;)
    if f == nil then                                                            -- Если файл не существует
        message(&quot;Файл не существует!&quot;)
        f = io.open(getScriptPath()..&quot;\\Robot\\log\\&quot; .. SEC .. &quot;.lua&quot;,&quot;w&quot;);    -- Создает файл в режиме &quot;записи&quot;
        f:close();                                                                -- Закрывает файл
        f = io.open(getScriptPath()..&quot;\\Robot\\log\\&quot; .. SEC .. &quot;.lua&quot;,&quot;r+&quot;);    -- Открывает уже существующий файл в режиме &quot;чтения/записи&quot;
        message(&quot;Файл создан!&quot;)
        local i = 0
        for i=1,#Column_Table,1 do                                                -- Если файл не существует, то заполняем заголовок таблицы.
            f:write(Column_Table[i][1])
            f:write(string.rep(&quot; &quot;, Column_Table[i][3] - string.len(Column_Table[i][1]) - 2) .. &quot;|&quot; .. &quot; &quot;)
            --f:write(&quot;\t&quot;)
        end
        f:write(&quot;\n&quot;)
    end;
                                                                                -- Встает в начало файла 
                                                                                -- 1-ым параметром задается относительно чего будет смещение: 
                                                                                -- &quot;set&quot; - начало, &quot;cur&quot; - текущая позиция, &quot;end&quot; - конец файла
                                                                                -- 2-ым параметром задается смещение
    f:seek(&quot;end&quot;,0);
    for i=1,#Column_Table,1 do                                                    -- Если файл не существует, то заполняем заголовок таблицы.
        f:write(Column_Table[i][4]())
        f:write(string.rep(&quot; &quot;, Column_Table[i][3] - string.len(Column_Table[i][4]()) - 2) .. &quot;|&quot; .. &quot; &quot;)
    end
    f:write(&quot;\n&quot;)
    f:flush()                                                                    -- Сохраняет изменения в файле
    f:close()                                                                    -- Закрывает файл
--    f:write(&quot;Line1\nLine2&quot;);                                                    -- Записывает в файл 2 строки, &quot;\n&quot; признак конца строки
--    for line in f:lines() do message(tostring(line));end                        -- Перебирает строки файла, выводит их содержимое в сообщениях
    
end

-- Инициализация таблицы
function Table_init(t)

-- Создаем таблицу и присваиваем имена столбцов из переданного массива t.
    local i = 0
    local Table = AllocTable()
        for i=1,#t,1 do            -- Перебираем массив по строкам от первой до последней. Количество строк массива получаем #t
            AddColumn(Table, i, t[i][1], true, t[i][2], t[i][3])
        end

    CreateWindow(Table)
    SetWindowCaption(Table, &quot;Рабочая таблица робота &quot; .. NAME)
--    SetWindowPos(Table, 0, 10, 2500, 200)
    InsertRow(Table, -1)
    
return Table
end

-- Заполнение строки таблицы
function Table_row(row, color)

    local i = 0
    for i=1,#Column_Table,1 do
        SetCell(t_id,row,i,Column_Table[i][4]())
    end
    
end

function Add_row()

    InsertRow(t_id, cur_order)

end</code></pre></div></div></div>]]></content>
			<author>
				<name><![CDATA[dark184]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3309</uri>
			</author>
			<updated>2022-09-29T06:51:15Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3679#p3679</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Пользовательские таблицы]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3677#p3677" />
			<content type="html"><![CDATA[<p>Выложите полный тестовый скрипт для пробы, смогу сказать.</p>]]></content>
			<author>
				<name><![CDATA[swerg]]></name>
				<uri>https://quik2dde.ru/profile.php?id=78</uri>
			</author>
			<updated>2022-09-29T06:03:08Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3677#p3677</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Пользовательские таблицы]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3675#p3675" />
			<content type="html"><![CDATA[<p>А у вас этого не наблюдается?</p>]]></content>
			<author>
				<name><![CDATA[dark184]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3309</uri>
			</author>
			<updated>2022-09-29T05:55:39Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3675#p3675</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Пользовательские таблицы]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3674#p3674" />
			<content type="html"><![CDATA[<p>Тогда это какой-то глюк квика, что он в таком случае так вот странно таблицы пересоздает при старте.</p>]]></content>
			<author>
				<name><![CDATA[swerg]]></name>
				<uri>https://quik2dde.ru/profile.php?id=78</uri>
			</author>
			<updated>2022-09-29T05:50:48Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3674#p3674</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Пользовательские таблицы]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3673#p3673" />
			<content type="html"><![CDATA[<p>У меня сделано так, если я закрываю таблицу скрипта, то и скрипт автоматом останавливается. Если скрипт останавливаю из из диалога управления «Доступные скрипты», то таблица автоматом закрывается...<br />Код, если закрываю таблицу крестиком<br /></p><div class="codebox"><pre><code>function main()
   while not stopped do 
        if IsWindowClosed(t_id) then                                            -- Если пользователь закрыл таблицу
            stopped = true                                                        -- Стопим скрипт
            message(&quot;Таблица закрыта пользователем, робот остановлен&quot;, 1)
        end
   end
end</code></pre></div><p>Код, если торможу скрипт из диалога<br /></p><div class="codebox"><pre><code>function OnStop(s)
    stopped = true                            -- Скрипт остановлен закрытием таблицы или нажатием кнопки &quot;Остановить&quot;
    DestroyTable(t_id)                        -- Закрываем таблицу
    message(&quot;Скрипт остановлен пользователем, робот отключен&quot;)
end</code></pre></div><p>Все это прекрасно работает, исключение только автоматический запуск скриптов.<br />Если запустить скрипт вручную, то таблица создается только в той вкладке, откуда был запуск из диалога управления, больше нигде не создается. При этом если скрипты не тормозить и закрыть квик, то при следующем запуске скрипты создают свои таблицы одновременно на двух вкладках(одна правильная, вторая рандомная или псевдорандомная) и судя по всему с одинаковыми ID, ибо при закрытии любой копии таблицы скрипт 100% останавливается.</p>]]></content>
			<author>
				<name><![CDATA[dark184]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3309</uri>
			</author>
			<updated>2022-09-29T05:47:38Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3673#p3673</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Пользовательские таблицы]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3670#p3670" />
			<content type="html"><![CDATA[<p>Если всё так, как вы описываете, то предполагаю, что при закрытии QUIK сохраняет &quot;конфигурацию окон&quot; и потом их восстанавливает. &quot;На случайной вкладке&quot; - это очень странно. Может это новые окна скриптом не на ой вкладке создаются?</p><p>А если остановить скрипт перед закрытием терминала, но не закрывать окно скрипта - после запуска терминала (без запуска скрипта) окно скрипта появится или нет? т.е проверить, что это именно сохраняется конфигурация окон.</p><p>Предлагаю попробовать удалять окно, созданное скриптом, при остановке скрипта в <strong>OnStop</strong>:</p><p>OnStop(NUMBER flag)<br />- flag передаётся равным 1 при остановке или удалении работающего скрипта Lua из диалога управления «Доступные скрипты»<br />- flag передаётся равным 2 при закрытии терминала QUIK</p><p>Значение 2 как раз нас интересует, в этом случае удалять окно скрипта.</p>]]></content>
			<author>
				<name><![CDATA[swerg]]></name>
				<uri>https://quik2dde.ru/profile.php?id=78</uri>
			</author>
			<updated>2022-09-29T05:20:54Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3670#p3670</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Пользовательские таблицы]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3669#p3669" />
			<content type="html"><![CDATA[<p>Всем доброго времени суток. Есть одна проблема с QUIK. Использую роботов на скриптах Lua. При этом каждый робот создает собственную рабочую таблицу.&nbsp; Теперь если закрыть Квик, не останавливая роботов, то при следующем запуске самого QUIK он автоматически запустит роботов. Это очень удобно, НО! Роботы запускаю в специально созданной закладке Квик, там же создаются и рабочие таблицы роботов(таблицы создаются исключительно роботами/скриптами). И вот проблема, при каждом запуске Квика, именно эти таблицы создаются в специально выделенной закладке, именно так и должно быть... НО! эти же таблицы дублируются в других закладках, причем только в одной и выбирается она толи рандомно, толи на той, которая была открыта перед закрытием квика. Это очень мешает, ибо там другая важная информация. Как с этим бороться?</p>]]></content>
			<author>
				<name><![CDATA[dark184]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3309</uri>
			</author>
			<updated>2022-09-29T04:59:27Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3669#p3669</id>
		</entry>
</feed>
