Гремляцкая Виктория - Скрипты помощники
В этой статье мы поговорим о скриптах, выполняющих открытие и закрытие сделки по времени. Не смотря на то, что автоматическая торговля быстро набирает обороты, редкий трейдер может доверить свой депозит в стопроцентное управление программе, следовательно, ручная торговля не теряет своей актуальности. Правильный подбор скриптов для ручной торговли, существенно облегчает задачу трейдера.
Скрипты используются для выполнения одноразовой задачи, следовательно, при запуске скрипта, тело программы выполняется только один раз (а не на каждом тике, как в советниках).
Рассмотрим подробно: открытие сделки по времени и закрытие сделки по времени.
Открытие сделки по времени «OpenOrderAtTime»
Данный инструмент является отличным помощником, в случае, если вы спланировали сделку, но в нужное время не можете присутствовать возле компьютера, или если вам необходимо открыть одновременно несколько сделок.
Внешние параметры:
extern datetime OpenTime;//Дата и время открытия, в виде 2009.02.27 00:00
extern string OpenOrderType; //Тип ордера: buy, sell
extern int StopLoss = 0; //Стоп лосс
extern int TakeProfit = 0; //Тейк профит
extern double OpenLot = 0.1; //Объем
extern int Slippage = 1; //Максимальное отклонение от запрошенной цен Алгоритм:
1) В функции init() проверяем корректность значений внешних переменных.
a. Значение переменной OpenTime должно быть больше текущей даты и времени.
b. Значение переменной OpenOrderType должно быть установлено в buy или в sell.
При невыполнении этих условий, выдаем сообщение об ошибке и выходим из скрипта.
2) В функции start().
a. Запускаем бесконечный цикл flag = true; while(flag){}. В конце цикла желательно поставить задержку Sleep(1000) (1000 = 1сек), для запуска цикла раз в секунду.
Далее в цикле while(flag).
Устанавливаем параметры для открытия сделки:
if ( OpenOrderType == "buy" )
{
iOpenOrderType = OP_BUY;
PriceOpen = Ask;
SL = PriceOpen - StopLoss * Point;
TP = PriceOpen + spread + TakeProfit*Point;
}
аналогично для «sell».
i. Переменной CurrTime, с типом datetime, присваеваем текущее время:
CurrTime = TimeCurrent();
ii. Проверяем условие:
if (CurrTime >= OpenTime && CurrTime - 120 < OpenTime)
//Условие отвечает за открытие сделки в течении 120 секунд, т.е. 2 мин. Если в течении этого времени сделка не откроется в силу каких-либо причин связанных с отсутствием связи и т.д., то скрипт не отработает. В данном случае можно выводить сообщение и завершать работу скрипта.
Если условие истинно, то открываем сделку (при этом желательно учитывать возможные реквоты) и переменную flag устанавливаем в false, в результате чего выходим из цикла while, скрипт завершает свою работу.
Закрытие сделки по времени «CloseOrderAtTime»
При запуске данного скрипта, пользователю необходимо установить значения тикета и время закрытия сделки. Если указанный тикет соответствует отложенному ордеру, то ордер удаляется, если ордер в рынке (buy, sell) - закрывается.
Внешние параметры:
extern int ticket = 0; //Тикет ордера
extern datetime CloseTime;//Дата и время закрытия ордера
Алгоритм:
1) В функции init() проверяем корректность значений внешних переменных.
a. Значение переменной CloseTime должно быть больше текущей даты и времени.
b. Тикет должен быть больше нуля.
При невыполнении этих условий, выдаем сообщение об ошибке и выходим из скрипта
2) В функции start().
b. Аналогично предыдущему скрипту запускаем бесконечный цикл flag = true; while(flag){}. В конце цикла желательно поставить задержку Sleep(1000) (1000 = 1сек), для запуска цикла раз в секунду.
Далее в цикле while(flag).
i. Переменной CurrTime, с типом datetime, присваеваем текущее время:
CurrTime = TimeCurrent();
ii. Проверяем условие:
if ( CurrTime >= OpenTime && CurrTime - 120 < OpenTime )
// Условие отвечает за открытие сделки в течение 120 секунд, т.е. 2 мин. Если в течении этого времени сделка не откроется в силу каких-либо
причин связанных с отсутствием связи и т.д., то скрипт не отработает. В данном случае можно выводить сообщение и завершать работу скрипта.
Если условие истинно, то вызываем функцию DeleteOrder(int iTicket) и переменную flag устанавливаем в false, в результате чего выходим из цикла while, и скрипт завершает свою работу.
Кратко о функции DeleteOrder(int iTicket)
Данная функция закрывает и удаляет ордера в зависимости от их типа. Рассмотрим особенности.
При условии if (OrderSelect(iTicket, SELECT_BY_TICKET)):
1) Проверка на то, что ордер с указанным тикетом закрыт или удален:
if (OrderCloseTimeO != 0)
{ Рп^СОрдер ", iTicket, " уже удалён");
return; }
Удаление отложенных ордеров: if (OrderType() > OP_SELL)
{ iOrd = OrderDelete(iTicket); if (iOrd == 0)
{ Printer удалось удалить ордер ", iTicket);
continue; }
Print("Ордер ", iTicket, " успешно удалён"); return;}
Далее следуют простые операции закрытия ордеров OP_BUY и OP_SELL.
Вопросы по данному материалу можно задать на форуме ...
В следующем выпуске мы рассмотрим скрипты для закрытия сделок с учетом различных условий:
- закрытие всех прибыльных сделок;
- закрытие всех убыточных сделок;
- закрытие сделок при достижении заданного уровня прибыли.
Файлы для скачивания:
•- скрипт открытия сделок в назначенное время;
•- скрипт закрытия сделок в назначенное время.
Содержание раздела