Гремляцкая Виктория - Скрипты помощники (часть 2)
Во второй статье, посвященной скриптам, помогающим трейдерам в торговле, рассмотрим приложения, которые совершают очень удобное, и довольно часто нужное однократное действие для всей пачки сделок (особенно если ордеров открыіто большое количество, и все нужно сделать быстро): закрытие всех прибыльных сделок и закрытие всех убыточных сделок.
Закрытие всех прибыльных сделок «CloseAll_Profit_Orders»
Данныйпо всем валютным парам. Особенно он удобен в использовании в случаях, когда сделок много и на их ручное закрытие уходит много времени и внимания, которое так необходимо трейдеру для дальнейшего принятия решений.
Скрипт отрабатывает один раз, т.е. закрывает только те сделки, которые являются прибыльными на момент запуска скрипта, после чего заканчивает свою работу.
Внешние параметры:
extern int Min_Profit = 5; // Минимальный профит в пунктах, при котором закрывается сделка
Алгоритм работы скрипта заключается в следующем:
1. Перебираем все открытые ордера поочередно.
2. Проверяем для каждой сделки условие достижения нужного профита (в пунктах).
3. Если условие срабатывает, т.е. профит по ордеру больше или равен значению внешнего
параметра Min_Profit, то закрываем выбранный ордер.
Для наглядности и простоты реализации программа разбита на функции: GoseANProfitSell() - закрытие прибыльных сделок на продажу, CloseAllProfitBuy() - закрытие прибыльных сделок на покупку, CloseAllProfitOrdersO - закрытие всех прибыльных сделок (данная функция включает в себя две предыдущие).
Итак, рассмотрим основную функцию start().
int start()
{
/* Эта часть кода отвечает за вывод надписи с пометкой о том, что запущен скрипт: "Скрипт: CloseAII_Profit_Orders" */
if (ObjectFind(ScriptName) == -1) {
ObjectCreate( ScriptName, OBJ_LABEL, 0, 0, 0 ); ObjectSet( ScriptName, OBJPROPJXDISTANCE, 5 );
ObjectSet( ScriptName, OBJPROP_YDISTANCE, 20 );
ObjectSet( ScriptName, OBJPROP_COLOR, PaleGreen );
ObjectSetText( ScriptName, "Скрипт: CIoseAII_Profit_Orders", 8, "Arial",
PaleGreen );
}
// Основная функция скрипта CloseAIIProfitOrders();
}
Далее, функция CloseAllProfitOrders(), как уже упоминалось, состоит из CloseAllProfitSellO,CloseAllProfitBuyO:
void CloseAllProfitOrdersQ {
CloseAUProfitB uy(); CloseAIIProfitSell();
Рассмотрим одну из функций закрытия, например, CloseAIIProfitBuy().
void CloseAIIProfitBuy()
{
// переменной orders присваиваем кол-во открытых ордеров int orders = OrdersTotal();
// если кол-во открытых ордеров больше нуля if (orders > 0)
{
// перебираем все ордера
for( i = orders-1; i >= 0; i-) {
/* если можно выбрать ордер, то проверяем его на тип. Если нельзя выбрать ордер, то попадаем в блок else. Случай: «нельзя выбрать ордер» может возникнуть, если ордера уже закрыты руками или другими советниками */
if( OrderSelect(i, SELECT_BY_POS, MODE_TRADES) )
{
/* если тип ордера OP_BUY, т.е. ордер на покупку, то проверяем наше основное условие: прибыль по ордеру больше или равна заданному значению Min_Profit (в пунктах) */
if( OrderType() == OP_BUY)
{
/* Основное условие: прибыль по ордеру больше или равна заданному значению Min_Profit (в пунктах)*/
if ( ( MarketInfo(OrderSymbol(),MODE_BID) -OrderOpenPriceQ )/Point >= Min_Profit)
{
//Если условие выполняется, то закрываем ордер OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(),MODE_BID), Slippage, Yellow); }
}
}
else
{
int error = GetLastError();
Print("Не удалось выбрать открытый ордер:" +
ErrorDescription (error));
}
}
Функция Close.AIIProfitSell() аналогична предыдущей, разница состоит в:
- основном условии
if ( ( OrderOpenPrice() - MarketInfo(OrderSymbol(),MODE_ASK) )/Point >= Min_Profit );
- условии проверки типа ордера if( OrderType() == OP_SELL );
- цене, по которой закрывается ордер (используем цену MODE_ASK, так как все позиции sell закрываются по цене Ask).
И напоследок, придерживаясь культурного стиля программирования, в функции deinit() уберем за собой текстовую метку, которую нарисовали при запуске скрипта: int de in it()
{
ObjectDeiete(ScriptName);
Закрытие всех убыточных сделок «CloseAll_Loss_Orders»
сделок аналогичен предыдущему, за исключением знака прибыльности сделок. Данный инструмент является хорошим помощником в случае, если необходимо закрыть много убыточных сделок или же если у трейдера в данный момент есть более важные задачи.
Скрипт отрабатывает один раз, т.е. закрывает только те сделки, которые являются убыточными на момент запуска скрипта, после чего заканчивает свою работу.
Внешние параметры:
extern int Min_Loss = 5; // Минимальный убыток в пунктах, при котором закрывается сделка
Алгоритм работы скрипта аналогичен предыдущему, поэтому имеет смысл рассмотреть только отличия.
Программа разбита на функции: CloseANLossSellO - закрытие убыточных сделок на продажу, CloseAllLossBuyO - закрытие убыточных сделок на покупку, CloseAllLossOrdersO -закрытие всех убыточных сделок (данная функция включает в себя две предыдущие).
Функция CloseANLossSellO отличается от функции CloseAllProfitSellO основным условием для закрытия: если убыток по выбранной сделке больше или равен значению внешнего параметра Min_Loss.
if( ( MarketInfo(OrderSymboi()
/MODE_ASK)-OrderOpenPrice() /Point >= Min_Loss )
{
OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), Slippage, Yellow);
}
То же условие в функции CloseANLossSellO будет выглядеть так:
if ( ( OrderOpenPrice() - MarketInfo(OrderSymbol(),MODE_BID) /Point >= Min_Loss )
{
OrderClose(OrderTicket(), OrderLotsQ, MarketInfo(OrderSymbol(),MODE_BID), Slippage, Yellow);
}
Остальной код не требует подробного описания, т.к. был рассмотрен выше.
Приведенная информация является учебной, поэтому использование ее на реальных счетах не рекомендуется.
В следующем выпуске мы продолжим рассмотрение скриптов для закрытия сделок с учетом различных условий.
Файлы для скачивания:
•- скрипт для закрытия всех прибыльных сделок по всем валютным парам;
•- скрипт для закрытия всех убыточных сделок по всем валютным парам.
Содержание раздела