<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[QUIK -> DDE &mdash; trans2quik API]]></title>
	<link rel="self" href="https://quik2dde.ru/extern.php?action=feed&amp;fid=8&amp;type=atom" />
	<updated>2020-09-14T15:30:14Z</updated>
	<generator>PunBB</generator>
	<id>https://quik2dde.ru/index.php</id>
		<entry>
			<title type="html"><![CDATA[Переход на 19-тизначный номер заявки]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?id=326&amp;action=new" />
			<summary type="html"><![CDATA[<p>В связи с переходом на 19-тизначный номер заявки возникло 2 проблемы: 1)передача данных по ODBC и 2)передача заявки через Trans2QuikAPI_1.3_x64. <br />База на FB сервере, система Win7, программа на Delphi7.<br />1. База на FB не передает 19-тизначные числа. На какую базу можно перейти (кроме MSSQL)? Например, подойдет ли Oracle 8?<br />2. При переходе с Trans2QuikAPI_1.2 на Trans2QuikAPI_1.3_x64 возникает большая проблема с файлом Quik.pas на Delphi. Поскольку я не программист, сколько не бился, так и не смог его написать. Проходила информация, что он у кого-то есть, если не жалко, поделитесь, буду очень признателен.</p>]]></summary>
			<author>
				<name><![CDATA[Balug]]></name>
				<uri>https://quik2dde.ru/profile.php?id=159</uri>
			</author>
			<updated>2020-09-14T15:30:14Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?id=326&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[формат файлов в каталоге archive]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?id=308&amp;action=new" />
			<summary type="html"><![CDATA[<p>вот такой:<br /></p><div class="codebox"><pre><code>{$APPTYPE CONSOLE}
uses  windows, sysutils;

function readint(fh: THandle): longint;
begin if FileRead(fh, result, sizeof(result)) &lt;&gt; sizeof(result) then result:= -1; end;

function readstr(fh: THandle; maxlen: longint): ansistring;
var tmpc : ansichar;
    i    : longint;
begin
  i:= 0;
  setlength(result, maxlen);
  while (FileRead(fh, tmpc, sizeof(tmpc)) = sizeof(tmpc)) and (tmpc &lt;&gt; #0) do
    if (i &lt; maxlen) then begin
      inc(i);
      result[i]:= tmpc;
    end;
  setlength(result, i);
end;

function convertdatetime(adate, atime: longint): tDateTime;
var y, m, d  : integer;
    h, mi, s : integer;
begin
  d:= adate mod 100; adate:= adate div 100;
  m:= adate mod 100; adate:= adate div 100;
  y:= adate;
  s:= atime mod 100; atime:= atime div 100;
  mi:= atime mod 100; atime:= atime div 100;
  h:= atime;
  result:= encodedate(y, m , d) + encodetime(h, mi, s, 0);
end;

type tCandle = packed record
       o, h, l, c, v : double;
       d, t          : longint;
     end;
var  fname : ansistring;
     fh    : THandle;
     cndl  : tCandle;
     len   : longint;

begin
  fname:= paramstr(1);
  if fileexists(fname) then begin
    fh:= FileOpen(fname, fmOpenRead or fmShareDenyNone);
    try
      writeln(&#039;ver: &#039;, readint(fh));
      writeln(&#039;ID: &#039;, readstr(fh, 4096));
      repeat
        len:= FileRead(fh, cndl, sizeof(cndl));
        if len = sizeof(cndl) then
          with cndl do
            writeln(format(&#039;o: %.5f h: %.5f l: %.5f c: %.5f v: %.5f ts: %s&#039;,
                           [o, h, l, c, v, formatdatetime(&#039;DD-MM-YYYY HH:NN:SS&#039;, convertdatetime(d, t))]));
      until len &lt;&gt; sizeof(cndl);
    finally FileClose(fh); end;
  end else writeln(&#039;File &#039;, fname, &#039; not found!&#039;);
end.</code></pre></div>]]></summary>
			<author>
				<name><![CDATA[toxa]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3172</uri>
			</author>
			<updated>2019-12-10T09:12:56Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?id=308&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Получение данных из quik через "экспорт в системы тех.анализа..."]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?id=301&amp;action=new" />
			<summary type="html"><![CDATA[<p>Это довольно прикольная фича, она позволяет получать &quot;свечные&quot; данные из квика. Экспорт идет через named pipes, обеспечивает приемлемую скорость и довольно прост. Что-то я не разобрался, можно ли тут аттачить архивы, но вот исходники двух примеров - один из них мониторит появляющиеся в системе квиковые пайпы, другой - дампит данные в консоль. Чтобы нужные пайпы появились, в квике нужно выбрать &quot;экспорт в системы тех.анализа...&quot;, далее добавить вывод нужной бумаги с нужным таймфреймом в велслаб, потом запустить экспорт.</p><p>Оба проекта собираются fpc и работают, только для первого нужно взять модуль masks из дельфи или лазаруса, так как в дистрибутив fpc он не входит.</p><p>Монитор:<br /></p><div class="codebox"><pre><code>{$APPTYPE CONSOLE}
uses Windows, Classes, SysUtils, Masks;

const pipes_prefix = &#039;\\.\pipe\&#039;;

type  tPipeList = class(tStringList)
      private
        FNotify : THandle;
        FMask   : string;
      public
        constructor Create;
        destructor  Destroy; override;
        procedure   RefreshDirectoryList;
        function    WaitForChanges(aTimeOut: longint): boolean;
        procedure   AfterAddObject(const aobject: string); virtual;
        procedure   BeforeDeleteObject(const aobject: string); virtual;
        property    Mask: string read FMask write FMask;
      end;

var   FPipes  : tPipeList;
      FExit   : boolean = false;

function CtrlHandler(CtrlType: Longint): bool; stdcall;
begin FExit:= true; result:= true; end;

{ tPipeList }

constructor tPipeList.Create;
begin
  inherited Create;
  Sorted:= true;
  FNotify:= FindFirstChangeNotification(pipes_prefix, false, FILE_NOTIFY_CHANGE_FILE_NAME);
end;

destructor tPipeList.Destroy;
begin
  if (FNotify &lt;&gt; INVALID_HANDLE_VALUE) then FindCloseChangeNotification(FNotify);
  inherited destroy;
end;

procedure tPipeList.RefreshDirectoryList;
const seq : longint = 0;
var   idx : longint;
      sr  : tSearchRec;
begin
  inc(seq);
  try
    if findfirst(format(&#039;%s*&#039;, [pipes_prefix]), faAnyFile, sr) = 0 then
      repeat
        if MatchesMask(sr.name, FMask) then begin
          idx:= IndexOf(sr.name);
          if (idx &lt; 0) then begin
            AddObject(sr.name, pointer(seq));
            AfterAddObject(sr.name);
          end else Objects[idx]:= pointer(seq);
        end;
      until (findnext(sr) &lt;&gt; 0);
  finally findclose(sr); end;
  for idx:= count - 1 downto 0 do
    if (Objects[idx] &lt;&gt; pointer(seq)) then begin
      BeforeDeleteObject(Strings[idx]);
      delete(idx);
    end;
end;

function tPipeList.WaitForChanges(aTimeOut: longint): boolean;
begin
  result:= (FNotify &lt;&gt; INVALID_HANDLE_VALUE) and (WaitForSingleObject(FNotify, aTimeOut) = WAIT_OBJECT_0);
  if result then FindNextChangeNotification(FNotify);
end;

procedure tPipeList.AfterAddObject(const aobject: string);
begin
  writeln(formatdatetime(&#039;HH:NN:SS.ZZZ&#039;, now), &#039; ADD: &#039;, aobject);
end;

procedure tPipeList.BeforeDeleteObject(const aobject: string);
begin
  writeln(formatdatetime(&#039;HH:NN:SS.ZZZ&#039;, now), &#039; DEL: &#039;, aobject);
end;


begin
  SetConsoleCtrlHandler(@CtrlHandler, true);
  
  writeln(&#039;Start export to wealthlab from QUIK or press Ctrl-C to exit...&#039;);

  FPipes:= tPipeList.Create;
  FPipes.Mask:= &#039;QUIK_*&#039;;
  FPipes.RefreshDirectoryList;

  while not FExit do begin
    if FPipes.WaitForChanges(1000) then begin
      FPipes.RefreshDirectoryList;
    end;
  end;

  FreeAndNil(FPipes);
  readln;
end.</code></pre></div><p>Дампер:<br /></p><div class="codebox"><pre><code>{$APPTYPE CONSOLE}
uses Windows, SysUtils;

var   fh      : longint;
      buf     : array[0..1024] of ansichar;

function SafeReadPipe(fh: longint; buf: pAnsiChar; toread: longint): boolean;
var idx  : longint;
    read : DWORD;
begin
  idx:= 0;
  if assigned(buf) then
    while (toread &gt; 0) and ReadFile(fh, buf[idx], toread, read, nil) do begin
      dec(toread, read);
      inc(idx, read);
    end;
  result:= (toread = 0);
end;

function SafeReadHeader(fh: longint; var id: word): boolean;
var tmp: word;
begin
  if SafeReadPipe(fh, @tmp, 2) and (tmp = 1) then result:= SafeReadPipe(fh, @id, 2) else result:= false;
end;

var id, tmp : word;
    tmp_i   : longint;
    tmp_d   : double;
    tmp_i64 : int64;
    strbuf  : ansistring;
    st      : TSystemTime;
begin
  fillchar(buf, sizeof(buf), 0);

  strbuf:= format(&#039;\\.\pipe\QUIK_%s_%s&#039;, [paramstr(1), paramstr(2)]);

  if not fileexists(strbuf) then begin
    writeln(&#039;WARNING (pipe not found): &#039;, strbuf);
    writeln(&#039;usage: logpipedata.exe &lt;TICKER&gt; &lt;TIMEFRAME&gt;&#039;#$0d#$0a&#039;example: logpipedata.exe LKOH TICKS&#039;#$0d#$0a);
  end;

  WaitNamedPipe(PAnsiChar(strbuf), 1000);

  fh:= longint(CreateFile(PAnsiChar(strbuf),
                          GENERIC_READ,
                          FILE_SHARE_READ,
                          nil,
                          OPEN_EXISTING,
                          0,
                          0));

  if (fh &lt;&gt; -1) then begin

    while SafeReadPipe(fh, @id, 2) do begin
      case id of
        1       : SafeReadPipe(fh, @tmp, 2);
        2       : if SafeReadPipe(fh, @tmp, 2) then begin
                    setlength(strbuf, tmp);
                    SafeReadPipe(fh, @strbuf[1], tmp);
                    writeln(&#039;instrument: &#039;, strbuf);
                  end;
        6, 7, 9 : SafeReadPipe(fh, @tmp_i, 4);
        8       : begin
                    SafeReadPipe(fh, @tmp_i64, 8);
                    FileTimeToSystemTime(tFileTime(tmp_i64), st);
                    write(formatdatetime(&#039;DD-MM-YYYY HH:NN:SS &#039;, SystemTimeToDateTime(st)));
                    // open
                    SafeReadPipe(fh, @tmp_d, 8);
                    write(tmp_d:10:6, &#039; &#039;);
                    // high
                    SafeReadPipe(fh, @tmp_d, 8);
                    write(tmp_d:10:6, &#039; &#039;);
                    // low
                    SafeReadPipe(fh, @tmp_d, 8);
                    write(tmp_d:10:6, &#039; &#039;);
                    // close
                    SafeReadPipe(fh, @tmp_d, 8);
                    write(tmp_d:10:6, &#039; &#039;);
                    // volume
                    SafeReadPipe(fh, @tmp_d, 8);
                    writeln(tmp_d:10:6, &#039; &#039;);
                  end;
      end;
    end;

    CloseHandle(fh);
  end else writeln(&#039;ERROR Opening: &#039;, strbuf, &#039; error: &#039;, GetLastError);
end.</code></pre></div>]]></summary>
			<author>
				<name><![CDATA[toxa]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3172</uri>
			</author>
			<updated>2019-11-01T09:51:23Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?id=301&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Помогите научиться пользоваться API]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?id=279&amp;action=new" />
			<summary type="html"><![CDATA[<p>Программирование только начал осваивать, уже третий год торгую руками.<br />Решил наконец автоматизировать немного эту деятельность.<br />Разобрался с импортом в Квик транзакций с помощью .tri&nbsp; файлов. Все работает.</p><p>То есть,&nbsp; использую этот вариант , записывая скриптом Питона в файл параметры для заявки, и потом считываю Квиком этот файл.</p><p>Попытался разобраться с АПИ, чтоб прикрутить прямо в скрипт питона, копаю и гуглю уже несколько дней, вообще не сдвинулся с мертвой точки.<br />Для всех это видимо настолько элементарно, что даже нет никакого FAQ.</p><p>Не понимаю простейших вещей.<br />вот строка из описания API <br />long __stdcall TRANS2QUIK_CONNECT(LPCSTR lpcstrConnectionParamsString, long* pnExtendedErrorCode, LPSTR lpstrErrorMessage, DWORD dwErrorMessageSize)</p><p>я в питоне сначала импортирую модуль<br />import ctypes</p><p>потом импортирую библиотеку<br />mydll = cdll.LoadLibrary(&quot;./trans2quik.dll&quot;)</p><p>файл .dll лежит в том же каталоге</p><p>дальше что делать, не понятно.</p><p>Вроде должно быть что то типа</p><p>result = mydll.TRANS2QUIK_CONNECT (&quot;C:\QUIK_VTB24&quot;, long* pnExtendedErrorCode, LPSTR lpstrErrorMessage, DWORD dwErrorMessageSize)</p><p>где в result должен записаться результат выполнения - произошло соединение или нет.</p><p>но не понятно как прописать атрибуты long* pnExtendedErrorCode, LPSTR lpstrErrorMessage, DWORD dwErrorMessageSize</p><p>так же не понятно что значит long __stdcall в описании.</p><p>помогите пожалуйста разобраться</p>]]></summary>
			<author>
				<name><![CDATA[dkostiunin]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3119</uri>
			</author>
			<updated>2019-01-19T22:15:19Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?id=279&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[trans2quik и Java]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?id=175&amp;action=new" />
			<summary type="html"><![CDATA[<p>Попалась готовая обёртка для Java.<br />Кто использует этот язык - будет, думаю, полезно.</p><p>[url=http://smart-lab.ru/blog/255255.php]Вот что пишет автор <strong>Enfernuz</strong>[/url]:<br />Давненько уже написал JNA-обёртку для модуля управлением транзакций QUIK (Trans2Quik.dll). Использую её для отправки транзакций в терминал.</p><p>Решил поделиться: [url=https://github.com/Enfernuz/JavaTrans2Quik]github.com/Enfernuz/JavaTrans2Quik[/url]</p><p>Получение информации из терминала сделано на базе проекта другого посетителя Смарт-Лаба — товарища ПВМ (ссылка на пост: smart-lab.ru/blog/216370.php).</p><p>Кто-то спросит, «зачем Java, когда проще пользоваться нативной библиотекой через C++»?<br />Я писал в своё время на C++, но вот никаких крупных библиотек кроме Boost и std не использовал. Т.к. я работаю Java-разработчиком, то для написания несложных алгоритмических стратегий мне проще оставаться в экосистеме джавы.</p>]]></summary>
			<author>
				<name><![CDATA[swerg]]></name>
				<uri>https://quik2dde.ru/profile.php?id=78</uri>
			</author>
			<updated>2015-11-01T19:00:07Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?id=175&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[trans2quik для x64]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?id=173&amp;action=new" />
			<summary type="html"><![CDATA[<p>Пишут, что вышла давно ожидаемая версия trans2quik.dll для x64 платформы в виде API версии 1.3:</p><div class="quotebox"><blockquote><p><strong>Vitaly Skorobogatov</strong>:<br />Добрый день!<br />От ARQA есть такие комментарии.<br />Ответ: обещали во втором полугодии и обещание сдержали. Trans2QUIK x64 доступен тут — arqatech.com/upload/iblock/80a/Trans2QuikAPI_1.3_x64.zip<br />Работает с QUIK версии 7.0 и выше.</p><p>Для x32 <em>[приложений]</em> нужно использовать старую версию 1.2, она совместима с QUIK 7.0</p></blockquote></div><p>Ссылка для скачивания: [url=http://arqatech.com/upload/iblock/80a/Trans2QuikAPI_1.3_x64.zip]скачать Trans2Quik для x64[/url].</p><p>В архиве только одна версия для x64 платформы.<br />Там же обновлённые примеры для C++ и C#.</p><p>Замечу, речь идёт о платформе для приложения, которое собственно использует Trans2Quik.dll. При этом сам терминал QUIK остаётся 32-х разрядным.</p>]]></summary>
			<author>
				<name><![CDATA[swerg]]></name>
				<uri>https://quik2dde.ru/profile.php?id=78</uri>
			</author>
			<updated>2015-10-27T18:58:20Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?id=173&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Вывод данных из Quik в Deplhi]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?id=109&amp;action=new" />
			<summary type="html"><![CDATA[<p>Добрый день.<br />Просьба помочь, если кто знает. Программирую на qlua, но понадобился Delphi для более широкого функционала. Сам Deplhi знаю плохо, но есть друг который в этом профи. В связи с этим вопрос: как вывести из Quik скажем стакан или ТТП, чтобы в Delphi эти данные обрабатывать? Я так понимаю что единственный нормальный метод это вывод через DDE. Можно объяснить на &quot;пальцах&quot; и минимальный пример, скажем вывод цены стакана bid или ask и запись в переменную Deplhi.</p>]]></summary>
			<author>
				<name><![CDATA[axel]]></name>
				<uri>https://quik2dde.ru/profile.php?id=187</uri>
			</author>
			<updated>2014-10-24T12:19:09Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?id=109&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[trans2quik API - описание]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?id=50&amp;action=new" />
			<summary type="html"><![CDATA[<p><strong>trans2quik</strong> – это официальное документированное API для взаимодействия внешних приложений с торговым терминалом QUIK. Оно позволяет из внешних программ выполнять различные операции, в основном это отсылка транзакций, получение информации о заявках и сделках. Рыночная информация через это API не доступна. На данный момент доступна версия 1.2.</p><p>Технически данное API устроено следующим образом: разработчиками QUIK поставляется DLL-библиотека, которую внешнее приложение загружает и вызывает из нее доступные интерфейсные функции.</p><p><span class="postimg"><img src="https://quik2dde.ru/static-img/new/pic1.png" alt="https://quik2dde.ru/static-img/new/pic1.png" /></span></p><p>Сама библиотека в это время подключается к запущенному на этой же машине терминалу QUIK по внутреннему протоколу и передает в него команды, получает на них ответы. С сайта разработчиков можно [url=http://www.quik.ru/depot/Trans2QuikAPI_1.2.rar]скачать архив[/url], который содержит саму библиотеку и примеры ее использования на C++, C# и даже MS Excel(!). Интерфейс библиотеки устроен таким образом, что позволяет подключать ее к программам, выполненным в любой среде программирования, где возможно подключение внешних DLL.</p><p>(Эту ветку закрываю, т.к. планирую в ней более подробный рассказ; есть темы для отсуждения – не стесняйтесь, создавайте ветки)</p>]]></summary>
			<author>
				<name><![CDATA[admin]]></name>
				<uri>https://quik2dde.ru/profile.php?id=2</uri>
			</author>
			<updated>2013-05-01T13:07:09Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?id=50&amp;action=new</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Trans2quik.dll и Delphi]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?id=48&amp;action=new" />
			<summary type="html"><![CDATA[<p>К сожалению, в поставку архива с Trans2Quik API перестали включать примеры на Delphi. Хотелось бы этой веткой восполнить сей пробел.</p><p>1) Интерфейсный файл <strong>trans2quik_api.pas</strong> - сконвертированный заголовочный файл trans2quik_api.h. Дополнил его всеми функциями, которые имеются в версии <strong>1.2</strong>.</p><p>2)&nbsp; Выложенный когда-то на форуме ARQA пример работа с trans2quik.dll на Delphi, включая класс-обертку. Для работы откимпилированного приложения не забыть подложить TRANS2QUIK.dll.</p><p>[url=https://quik2dde.ru/static-img/48/trans2quik_api.pas.zip]Скачать trans2quik_api для Delphi[/url]</p><p>[url=https://quik2dde.ru/static-img/48/SAMPLE_Delphi.zip]Скачать пример для Delphi[/url]</p>]]></summary>
			<author>
				<name><![CDATA[admin]]></name>
				<uri>https://quik2dde.ru/profile.php?id=2</uri>
			</author>
			<updated>2013-04-20T18:02:43Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?id=48&amp;action=new</id>
		</entry>
</feed>
