На
главную страницу
Описание
'Cash' и 'mmddCash' заявок:
Cash-заявка реализует вывод указанного
портфеля в кэш, НАЧИНАЯ с заданного (ЧЧММ)
времени. Для этого надо в параметрах функции
MoveMICE_SHR (или MoveFORTS) задать параметр 'ВидЗаявки'
равным 'Cash' и ввести нужные значения
часов ЧЧ и минут ММ серверного времени. Часы
задаются целым числом в параметре Stop%, а минуты
- в параметре Add%Stop. Хотя здесь
используются параметры обычно задаваемые для
стопов, но Cash-заявка не создает никаких
стопов, а указанные параметры используются
только для указания серверного времени
АД-терминала, после достижения которого
сработает процедура поиска и закрытия всех
имеющихся в портфеле позиций, как Long,
так и Short. После наступления
времени срабатывания процедуры вывода портфеля
в кэш CASH-заявка остается активной ДО КОНЦА ДНЯ
пока не будет завершен вывод в кэш!
(пример Cash-заявки, которая заявка
выводит в 18:35 весь портфель '1234-000' на рынке ММВБ в
кэш:
FAlert:=False OR Cum(1)=LastValue(Cum(1)); {здесь добавлено
условие, чтобы заявка срабатывала только при
каждом обновлении данных на последнем баре
графика}
FNull:=If(FAlert, ExtFml("Borisoff.MoveMICEX_SHR","1234-000",0,0.5,Cash,18,Simple,35,False,1),
False);
^
^
^ ^
|
|
|
|
портфель %прос -
часы минуты
кальзы-
вания от Close-цены для заявок на закрытие
позиций в портфеле);
Поскольку разовое срабатывание в нужное
время функции MoveMICEX_SHR или MoveFORTS с Cash-заявкой
вызовет вывод в кэш всего портфеля, то
задавать несколько Сash-заявок для одного и того
же портфеля в разных советниках смысла нет. Лучше
строку с вызовом Cash-заявки записать в отдельный
индикатор, или в отдельную строку на Symbols-вкладке
Советника, как показано на рисунке ниже, можно с
несколькими cash-заявками, как в вышеприведенном
примере для разных портфелей, и прикрепить этот
индикатор, например, к графику какой-нибудь
бумаги. Этот индикатор можно назвать например
'Cash_MICEX_1234-000' и в нем после строки с вызовом
Cash-функции прописать время, например в виде числа
'16.30;' тогда на графике появится линия со
значением времени, т.е на графике сразу будет
видно для какого портфеля и на какое время
установлена Cash-заявка. И при достижении
серверным временем АД-терминала заданного
значения времени, сработают процедуры вывода в
кэш сразу для всех портфелей, которые будут
указаны в этом индикаторе или советнике. Но можно
также и просто вставить вышеуказанную строку с
нужными параметрами в какой-либо Buy- или Sell-приказ
в каком-нибудь советнике. Подчеркну, что
Cash-заявка проверяет наступление заданного
времени именно с серверным временем в
АД-терминале, а не с временем графика в Метастоке
и не с временем на локальном компьютере.
Замечу, что время начала и окончания торгов
на ММВБ и на ФОРТС обычно отличается, поэтому,
когда авто-торговля ведется сразу на двух рынках,
важно помещать индикатор вывода в кэш на график,
соответствующий рынку. Иначе возможна ситуация,
когда, к примеру, вы зададите для портфеля на
ФОРТС вывод в кэш в конце торгов, а индикатор
вывода в кэш поместите на график
ММВБ-инструмента. В этом случае у вас вывод в кэш
на ФОРТС не произойдет(!) из-за того что торги на
ММВБ завершатся раньше. А поскольку обновление
данных в Метастоке по бумагам с ММВБ уже
закончится, то индикатор для инструментов
торгуемых на ФОРТС уже не сработает в заданное
время. Эта реальная ситуация однажды случилась
со мной :))
Если в одном портфеле используются
инструменты, торгуемые на разных рынках,
например на ММВБ и на РТС-стандарт, то кэш-заявки
надо создавать для обоих этих рынков и помещать
их рядом в одном индикаторе)
Пример, как реализован вывод в кэш в моей ТС:
т.е. в Советнике для авто-трейдинга создана
дополнительная строка со следующими формулами:
FLast:=LastValue(Cum(1))=Cum(1);
{условие, чтобы заявка на срабатывание
проверялась при каждом обновлении данных только
на последнем баре}
FDate:=Month()*100 + DayOfMonth(); {задаем дату}
CashHour:=18; {задаем часы}
CashMinute:=35; {задаем минуты}
{далее задаем условие для проверки, наступило ли
время вывода в кэш}
FCash:=If((Hour()*100 + Minute())>=(CashHour*100 + CashMinute)
AND FDate=LastValue(FDate), True, False)
AND FLast;
FNull:=If(FCash, ExtFml("Borisoff.MoveFORTS","12345-000",0,0.5,Cash,CashHour,Simple,CashMinute,FCash,0),False);
{если при очередном обновлении данных на графике
условие стало истинно, то подаем заявку на вывод
портфеля в кэш на соответствующем рынке}
FNull1:=If(FCash, ExtFml("Borisoff.MoveRTS_STANDARD","12345-000",0,0.5,Cash,CashHour,Simple,CashMinute,FCash,0),False);
{если при очередном обновлении данных на графике
условие стало истинно, то подаем заявку на вывод
портфеля в кэш на соответствующем рынке}
FCash; {рисуем на графике кэш-сигнал}
Еще один вид заявки, 'mmddCash'-заявка,
функционально аналогична 'Cash' заявке,
только выводит портфель в кэш в заданную дату
и время дня. Дата задается значениями месяца и
дня, а время задается числом минут,
рассчитываемых по формуле: (часы*60 + минуты). Т.е.
для времени 17 часов 35 минут и даты 30 июня заявка
будет выглядеть так:
(пример mmddCash-заявки, которая выводит
весь портфель '1234-000' на рынке ФОРТС в кэш 30-го июня
в 17:35 часов:
FNull:=False OR ExtFml("Borisoff.MoveFORTS","1234-000",0,1.5,mmddCash,6,Simple,30,False,1055);
^
^
^ ^
^
|
|
|
|
|
портфель %прос-
месяц
день время дня в минутах по формуле:
часы*60+минуты
кальзы-
вания от Close-цены для заявок на
закрытие позиций в портфеле);
По умолчанию, после наступления времени
срабатывания процедуры вывода портфеля в кэш
CASH-заявка остается активной ДО КОНЦА ДНЯ пока не
сработает. При выводе портфеля в кэш модуль
считывает имеющиеся в портфеле позиции и
формирует заявки на закрытие этих позиций по
текущей Close-цене, увеличенной/уменьшенной на
размер заданного в параметре Add%ToClose проскальзывания
для Buy и Sell заявок соответственно.
Ведется контроль исполнения каждой заявки,
поданной для закрытия какой-либо позиции в
портфеле. Время контроля по умолчанию составляет
52 сек (это значение можно изменить в
конфигурационном cfg-файле). Кроме того, при выводе
портфеля в кэш удаляются и все активные заявки,
для выводимого в кэш рынка, портфеля и
инструмента, если они будут находится в очереди
заявок АД-терминала.
После вывода портфеля в кэш, производится
отключение авто-трейдинга, чтобы после вывода в
кэш не начали формироваться новые позиции по
сигналам из Метастока. Отключение делается при
завершении процедуры вывода в кэш,
автоматическим созданием LOCK-файла, блокирующего
в дальнейшем работу с выведенным в кэш портфелем,
до тех пор пока этот LOCK-файл не будет вручную
удален или перемещен в архив
НЕ ЗАБЫВАЙТЕ удалять LOCK-файл на
следующий день, чтобы после вывода в кэш
возобновить авто-трейдинг в следующую торговую
сессию!!!
Кстати, LOCK-файлом удобно пользоваться для
временной приостановки или отключения
авто-трейдинга, например, изменением в названии
этого файла одного символа можно лишить этот
файл его блокирующего действия, а восстановление
в прежнем виде имени файла снова включает
блокировку авто-трейдинга для портфеля, который
записан в названии этого файла.
Выход в кэш можно организовать и по другому,
например так, как вначале это было описано в ТС
Альфа-тренд в разделе 21, то есть указать
время выхода в кэш и после этого времени задавать
в заявке, соответствующей текущей позиции в
портфеле (т.е. в Buy-заявке для лонговой
позиции и в Sell-заявке для шортовой позиции),
торгуемую долю в портфеле равной нулю и
после наступления времени выхода в кэш позиция
будет уменьшена до нуля. Например, можно
использовать
формулы:
NumBarRight := 1;
FCashTime:=If( (Hour()*100 + Minute()) > 1830, True, False );
{проверяем текущий бар на время наступления
выхода в кэш}
FPos:=-20; {размер позиции в лотах для примера}
FPos:=If( CashTime, 0, FPos ); {если наступило время
выхода в кэш, то зануляем размер позиции}
{для лонг-позиции в портфеле}
FBuyOrder:=FBuy AND FCashTime=False; {проверяем текущий
бар на время наступления выхода в кэш};
FNull:=if( FBuyOrder
OR FCashTime, ExtFml("Borisoff.MoveFORTS","1234-000",FPos,0.5,B,0,Simple,0,FBuyOrder OR FCashTime,NumBarRight),
False);
{выводим бумагу в кеш или исполняем очередную
Buy-заявку};
{для шорт-позиции в
портфеле}
FSellOrder:=FSell AND FCashTime=False;
{проверяем текущий бар на время наступления
выхода в кэш};
FNull1:=if( FSellOrder OR FCashTime,
ExtFml("Borisoff.MoveFORTS","1234-000",FPos,0.5,S,0,Simple,0,FSellOrder OR FCashTime,NumBarRight),
False);
{выводим бумагу в кеш или исполняем заявку
очередную Sell-заявку}