Sergey Kosinsky Personal web site

Функция TradeQuik()

Для вывода сигнала МТС функция TradeQuik() использует возможность Квика периодически просматривать содержимое файла транзакций, читать строки приказов на проведение торговых операций и передавать их в торговую систему. Подобную систему постановки заявок поддерживает и NetInvestor (NiClient). Формат вызова функции TradeQuik приведен ниже:

 

ExtFml( "msx_ksr.TradeQuik", ShortLong[], "Account", "ClientCode", [Limit|L|Market|M], Price[], Quantity[] , Ident);

 

где:

ShortLong[] - индикатор нахождения в длинной, короткой или вне позиции и может принимать значения 1, -1 и 0 соответственно;

"Account" - номер счета Трейдера в Квике, Если параметр задается в файле инициализации, то в формуле он должен быть задан пустой строкой "";

"ClientCode" - код клиента, может не заполняться. Если параметр задается в файле инициализации, то в формуле он должен быть задан пустой строкой ""

[Limit|L|Market|M], - тип приказа лимитированный - Limit или рыночный - Market. Можно использовать только первую букву L или М соответственно;

Price[] - цена исполнения сделки. Для Квика и рыночного Market приказа цена Price на некоторых рынках должна быть равна 0.

Quantity[] - Количество лотов в заявке; При перевороте позиции количество лотов будет удвоено.

Ident - некоторое уникальное число для идентификации торговой стратегии. Ноль блокирует запись сигналов данной ТС в файл транзакций.

Для вывода приказов необходимо к существующей торговой стратегии добавить функцию TradeQuik():

 

{this simplest strategy combines two crosses of two moving averages with different periods for demonstration purpose only} BS1:=If(Mov(C, 3, S) > Mov(C, 10, S), 1, -1);
BS2:=If(Mov(C, 5, S) > Mov(C, 30, S), 1, -1);

{Variable ShortLong should be equal to 1 for long position , -1 forshort position and 0 for out of market}
ShortLong:=(BS1+BS2)/2;

{ExtFml( "msx_ksr.TradeQuik", ShortLong[], "Account", "Client_Code", [Limit|L|Market|M], Price[], Quantity[]); } Ident:=Input("MTS Ident",0,1000,0);
FakeVar:=ExtFml( "msx_ksr.TradeQuik",ShortLong, "", "", L, Close, 4, Ident);

{this is an example for market order suitable with QUIK and shares market at MICEX only.
FakeVar:=ExtFml( "msx_ksr.TradeQuik",ShortLong, "", "", M, 0, 4, Ident); }

{It is useful to draw a plot with the current open position. Always place the formula at a separate inner window}

ShortLong;

 

В файл инициализации msx_ksr.ini должны быть включены дополнительные секции, необходимые для правильного работы функции.Cекции файла msx_ksr.ini, относящиеся к функции TradeQuik

 

[TradeQuik]
File=D:\trade\quik\trans.tri
Account=001
ClientCode=007
TransId=104
Template = TRANS_ID=%N; ACCOUNT=%A; CLIENT_CODE=%C; TYPE=%T; CLASSCODE=%M;
SECCODE=%S; ACTION=NEW_ORDER; OPERATION=%O; PRICE=%P; QUANTITY=%Q;

[D:\Quote\MICEX\EESR.MICEX(D)]
File=D:\trade\quik\trans2.tri
ClassCode=EQBR
SecCode=RU0008943394
Account=NL0058900055
ClientCode=001
DateTime_NL0058900055_655_1_5=20030402,0
DateTime_NL0058900043_467_1_5=20030402,0
DateTime_NL0058900043_467_2_5=20030402,0

[D:\Quote\MICEX\EESR.MICEX(10)]
ClassCode=EQBR
SecCode=RU0008943394
Account=001
DateTime_001_007_5=20030402,1840000

 

В секции [TradeQuik] определен общий номер счета и общий код клиента и шаблон строки заявки, которые будут использованы по умолчанию для любой транзакции, а также полный путь к файлу, в который будут записываться приказы для Квика. Эти параметры можно переопределить для каждого базового ряда котировок.

Параметр TransId автоматически увеличивается каждый раз на единицу при постановке очередной заявки и служит уникальным номером ее идентификации.

Для каждой акции или другого актива, по которому предполагается проведение автоматизированной подачи заявок в msx_ksr.ini файле должна быть определена секция (она создается автоматически при первом вызове функции TradeQuik() ) имеющая вид:

 

[Drive:\Folder1\Folder2\...\Symbol(P)],

где:

Drive:\Folder1\Folder2\...\ - полный путь к базе данных Метастока;

Symbol - символическое имя базового ряда котировок;

(P) - периодичность базового ряда котировок: T для тиковой базы, число от 1 до 60 - для внутридневных баров и одна из букв D,W,M,Q,Y для итоговых данных дня, недели, месяца, квартала или года соответственно.

DateTime_XXX_YYY_NNN - день и время последнего обработанного функцией бара базового ряда котировок для клиента YYY по торговому счету XXX с идентификатором торговой стратегии NNN создается автоматически.

 

Торговый счет, код клиента, шаблон строки заявки и путь к файлу могут быть заданы независимо в нескольких местах. Высший приоритет имеет торговый счет и код клиента заданные как параметры "Account", "ClientCode" при вызове функции TradeQuik(). Если параметры заданы пустой строкой, то ищутся соответствующие пары Account=, ClientCode= ,а также File= и Template= в файле инициализации в секции для текущего базового ряда котировок [Drive:\Folder1\Folder2\...\Symbol(P)] и, если и там параметры не определены, то последним проверяется общая секция [TradeQuik].

Также должны быть определены ClassCode= и SecCode= в секции для базового ряда. Если торговый счет или код клиента или путь к файлу нигде не определены, то функция TradeQuik() возвращает ошибку с соответствующим сообщением, как показано на рисунке ниже, и такая заявка не передается в файл транзакций. Вносить изменения в файл инициализации можно только при выгруженном Метастоке.


Template - эта шаблон, по которому будет формироваться строка заявки, записываемая в файл транзакций и имеющая макроопределениями в тех местах, где необходимо подставить фактическое значение параметра. Это необходимо для изменения вида строки при работе с различными типами торговых систем. При форматировании нецелого значения цены в качестве децимального разделителя будет использован символ, определенный в соответствующем разделе операционной системы "Язык и стандарты" на панели управления.

Для Квика нижеприведенный шаблон будет записан в файл инициализации при первом запуске Dll (все в одну строку без пробелов), его можно не редактировать:

 

Template=TRANS_ID=%N; ACCOUNT=%A; CLIENT_CODE=%C; TYPE=%T; CLASSCODE=%M; SECCODE=%S; ACTION=NEW_ORDER; OPERATION=%O; PRICE=%P; QUANTITY=%Q;

 

Для НетИнвестора шаблон надо будет вставить вручную в файл инициализации в секцию [TradeQuik] или в конкретную секцию символа базового ряда в зависимости от рынка,

Для фьючерсов он может выглядеть так:

[TradeQuik]
Template=%N; %A; %S; %O; %Q; %P; %T; 001; PSFU; ; ; ; FutAddOrder

 

Для фондовой секции ММВБ - акции 1-го уровня, например EESR, разрешить исполнение по разным ценам, тип ввода - цена секции могут выглядеть так:

 

[TradeQuik]
Template=%N; ; %O; %T; S; ; P; %M; %S; %P; %Q; %C; ORDER [D:\Quote\MICEX\EESR.MICEX(D)]
File=D:\trade\quik\trans2.tri
ClassCode=EQBR
SecCode=EESR
Account=NL0058900055

 

При этом непосредственно перед выводом строки заявки в файл транзакций DLL будет просматривать шаблон и при нахождении макроопределения заменять его на фактическое значение параметра, переданное в DLL Метастоком или найденное в файле инициализации.

 

Макро Назначение параметра Тип Пример параметра
%N Уникальный номер транзакции целое число, инкрементируется автоматически 127
%A Торговый счет произвольная строка символов SPBFUT00o00
%C Код клиента произвольная строка символов Metastock
%T Тип заявки* символ L или M L
%M Код класса акций/фьючерсов строка символов SPBFUT
%S Код ценной бумаги/фьючерса строка символов EERU-12.03
%O Направление сделки символ B или S S
%P Цена заявки число 7678
%Q Количество в заявке целое число, при перевороте позиции удваивается 2
%% Для сохранения знака процента символ % %


Примечание:для Квика реализация исполнения рыночной заявки на разных рынках отличается. В некоторых случаях ( для акций ММВБ) значение параметра %P для рыночной заявки должно быть равно 0. Это можно сделать в индикаторе передачей в качестве цены значения 0.

 

Пример строки заявки собранной из шаблона для Квика.

 

TRANS_ID=107; ACCOUNT=SPBFUT00o00; CLIENT_CODE=Metastock; TYPE=L; CLASSCODE=SPBFUT; SECCODE=EERU-12.03; ACTION=NEW_ORDER; OPERATION=S; PRICE=7674; QUANTITY=2;

 

Тоже самое, но для NetInvestor (NiClient) для рынка фьючерсов:

 

107; SPBFUT00o00; EERU-12.03; S; 2; 7674; L; 001; PSFU; ; ; ; FutAddOrder

 

Шаблон можно упростить, оставив минимально необходимые макроопределения и заменив удаленные поля на постоянные значения прямо в шаблоне.

Таким образом для клиента, работающего самостоятельно с одним счетом, одним клиентским кодом и одной торговой системой, достаточно определить эти пары Account= и Client_Code=, File= и Template= в общей секции [TradeQuik]. Брокеру, создающему разные МТС для разных клиентов на нескольких счетах необходимо задавать и счет и клиентский код как параметры формулы. На одном графике могут быть сразу несколько формул, транслирующих приказы в Квик и если эти формулы отличаются хотя бы одним из параметров: счета и/или кода клиента и/или идентификатора МТС - они будут торговаться отдельно.

Для работы в разных торговых системах необходимо определять свой путь к файлу транзакций File= в секции для базового ряда котировок.Запись строки заявки в файл транзакций производится только если параметр Ident имеет значение больше нуля.


В результате применения формулы TradeQuik к данным на приведенном выше графике в файл транзакций будут записываться следующие строки:

 

1.При использовании шаблона для Quik:

 

TRANS_ID=90; ACCOUNT=001; CLIENT_CODE=007; TYPE=M; CLASSCODE=EQBR;
SECCODE=RU0008943394; ACTION=NEW_ORDER; OPERATION=S; PRICE=6,677; QUANTITY=4;
TRANS_ID=91; ACCOUNT=001; CLIENT_CODE=007; TYPE=M; CLASSCODE=EQBR;
SECCODE=RU0008943394; ACTION=NEW_ORDER; OPERATION=B; PRICE=6,699; QUANTITY=4;
TRANS_ID=92; ACCOUNT=001; CLIENT_CODE=007; TYPE=M; CLASSCODE=EQBR;
SECCODE=RU0008943394; ACTION=NEW_ORDER; OPERATION=S; PRICE=6,664; QUANTITY=4;
TRANS_ID=93; ACCOUNT=001; CLIENT_CODE=007; TYPE=M; CLASSCODE=EQBR;
SECCODE=RU0008943394; ACTION=NEW_ORDER; OPERATION=B; PRICE=6,665; QUANTITY=4;
TRANS_ID=94; ACCOUNT=001; CLIENT_CODE=007; TYPE=M; CLASSCODE=EQBR;
SECCODE=RU0008943394; ACTION=NEW_ORDER; OPERATION=B; PRICE=6,673; QUANTITY=4;
TRANS_ID=95; ACCOUNT=001; CLIENT_CODE=007; TYPE=M; CLASSCODE=EQBR;
SECCODE=RU0008943394; ACTION=NEW_ORDER; OPERATION=S; PRICE=6,652; QUANTITY=8;
TRANS_ID=96; ACCOUNT=001; CLIENT_CODE=007; TYPE=M; CLASSCODE=EQBR;
SECCODE=RU0008943394; ACTION=NEW_ORDER; OPERATION=B; PRICE=6,702; QUANTITY=8;
TRANS_ID=97; ACCOUNT=001; CLIENT_CODE=007; TYPE=M; CLASSCODE=EQBR;
SECCODE=RU0008943394; ACTION=NEW_ORDER; OPERATION=S; PRICE=6,655; QUANTITY=4;
TRANS_ID=98; ACCOUNT=001; CLIENT_CODE=007; TYPE=M; CLASSCODE=EQBR;
SECCODE=RU0008943394; ACTION=NEW_ORDER; OPERATION=S; PRICE=6,623; QUANTITY=4;
TRANS_ID=99; ACCOUNT=001; CLIENT_CODE=007; TYPE=M; CLASSCODE=EQBR;
SECCODE=RU0008943394; ACTION=NEW_ORDER; OPERATION=B; PRICE=6,623; QUANTITY=4;
TRANS_ID=100; ACCOUNT=001; CLIENT_CODE=007; TYPE=M; CLASSCODE=EQBR;
SECCODE=RU0008943394; ACTION=NEW_ORDER; OPERATION=B; PRICE=6,93; QUANTITY=4;
TRANS_ID=101; ACCOUNT=001; CLIENT_CODE=007; TYPE=M; CLASSCODE=EQBR;
SECCODE=RU0008943394; ACTION=NEW_ORDER; OPERATION=S; PRICE=6,894; QUANTITY=4;
TRANS_ID=102; ACCOUNT=001; CLIENT_CODE=007; TYPE=M; CLASSCODE=EQBR;
SECCODE=RU0008943394; ACTION=NEW_ORDER; OPERATION=B; PRICE=6,919; QUANTITY=4;
TRANS_ID=103; ACCOUNT=001; CLIENT_CODE=007; TYPE=M; CLASSCODE=EQBR;
SECCODE=RU0008943394; ACTION=NEW_ORDER; OPERATION=S; PRICE=7,73; QUANTITY=4;
TRANS_ID=104; ACCOUNT=001; CLIENT_CODE=007; TYPE=M; CLASSCODE=EQBR;
SECCODE=RU0008943394; ACTION=NEW_ORDER; OPERATION=S; PRICE=7,73; QUANTITY=4;

 

2. При использовании шаблона для NetInvestor (NiClient, фондовая секция ММВБ (акции 1-го уровня, исполнение по разным ценам, тип ввода - цена, децимальный разделитель - точка):

 

90; 001; S; L; S; ; P; EQBR; EESR; 6.677; 4; 007/; ORDER
91; 001; B; L; S; ; P; EQBR; EESR; 6.699; 4; 007/; ORDER
92; 001; S; L; S; ; P; EQBR; EESR; 6.664; 4; 007/; ORDER

 

Особенности применения формулы TradeQuik, связанные с формированием транзакций:

1. Если индикатор, содержащий функцию TradeQuik() бросается на график первый раз и соответствующая секция не существует, то в файле инициализации будет создана секция базового ряда вида [Drive:\Folder1\Folder2\...\Symbol(P)], а в этой секции - параметр DateTime_XXX_YYY_NNN, а вот параметры ClassCode= и SecCode= надо будет задать вручную.

2. Метасток вызывает функцию из DLL при необходимости обновить график. Такое обновление может быть вызвано как вновь пришедшими данными так и действием пользователя, например изменением размера окна Метастока. В общем виде надо считать, что вызов функции происходит асинхронно, но не реже одного раза за интервал базового ряда данных. Для исключения появления ложных транзакций DLL каждый раз записывает в файл инициализации в параметр DateTime_XXX_YYY_NNN максимальную дату и время, обнаруженные в ряду котировок базового ряда ( время последнего бара), а при следующем запуске игнорирует все торговые сигналы, сгенерированные до этого времени.

3. Транзакции передаются в торговую систему только, если они сформировались на последнем баре и этот бар обрабатывается функцией первый раз. Если по каким-то причинам данные в Метасток поступают пачками сразу из нескольких баров и на этих барах, кроме самого последнего, МТС сформировала торговые сигналы, то они будут полностью игнорированы ввиду невозможности исполнения на момент времени соответствующего бара.

4. Метасток записывает в базу время окончания интервала поэтому в стратегии, вырабатывающей торговые сигналы необходимо использовать только цену открытия, которая будет неизменна даже если включен режим "live bars". Применение других полей текущего бара - High, Low, Close чревато пропуском реального сигнала. Можно использовать Ref(C,-1) которое при внутридневной торговле практически равно текущему Open.

5. Термин "базовый ряд котировок" использован для подчеркивания того факта, что каждый график в Метастоке однозначно привязан к одной из последовательностей котировок в базе, даже, если на этот же график брошены другие ряды котировок на основе которых создана МТС транслирующая сигналы в файл транзакций. Этот базовый ряд определяет минимальное и максимальное значения на оси времени Х.

6. Какого либо внутреннего кумулятивного учета количества лотов в открытой позиции не ведется.

7. Имя символа базового ряда котировок не должно содержать коды символов '[', ']', '\', ';' которые используются в INI-файлах в качестве служебных.

 

Применение функции TradeQuick при создании МТС подробно описано в статье Артема Зверева "Робот на Metastock" журнал Интернет трейдинг #1 февраль 2010г.

 

Замечания и предложения можно оставить на странице обратной связи.

/ksr
Сергей Р. Косинский,
Санкт-Петербург, Россия.
Создано: 5 июня 2003 г.

Обновлено: February 21, 2011

www.000webhost.com