Форекс-скальперы на свопах несут существенные издержки. Ниже на их примере представлен простой подход, позволяющий наглядно проанализировать любую историю торговли.
Фильтр торговой истории.
В качестве фильтра использую скрипт CustomReport (MetaTrader 5), который создает нужный срез торговой истории и визуализирует его в виде HTML.
Один из параметров его позволяет сохранить срез истории в формате библиотеки виртуального окружения, что открывает большие возможности по дальнейшей работе с этими данными.
Анализ отказа от свопов.
В полученном срезе мы попробуем отказаться от перехода через ролловер, чтобы не платить своп. Для этого будем принудительно закрывать позиции в заданное время. Поскольку в MetaTrader 5 доступна реальная тиковая история, то довольно точно сможем определить цену закрытия.
Весь исходник скрипта.
#property script_show_inputs input string inFileName = "Report.htm.virt"; input int inTradeClose = -600; // How many seconds before midnight should orders be closed? #include <fxsaber\Virtual\Virtual.mqh> // https://www.mql5.com/ru/code/22577 #define REPORT_BROWSER // Создание отчета с запуском браузера - требует разрешения DLL. #include <Report.mqh> // https://www.mql5.com/ru/code/18801 #define DAY (24 * 3600) MqlTick GetTick( const datetime Time ) { MqlTick Tick[1]; CopyTicks(OrderSymbol(), Tick, COPY_TICKS_INFO, Time * 1000, 1); return(Tick[0]); } void OnStart() { if (inTradeClose < 0) { const VIRTUAL_POINTER VirtualPointerIn = VIRTUAL::Create(inFileName); if (!VirtualPointerIn.IsNull()) { const VIRTUAL_POINTER VirtualPointerOut = VIRTUAL::Create(0.0); _VSP(VirtualPointerIn) const int Total = OrdersHistoryTotal(); for (int i = 0; i < Total; i++) if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderType() <= OP_SELL)) { ORDER_BASE Order = VIRTUAL::GetOrder(); const datetime CloseTime = (OrderOpenTime() / DAY + 1) * DAY + inTradeClose; if ((OrderOpenTime() < CloseTime) && OrderProfit()) { if ((OrderCloseTime() > CloseTime) && (StringFind(OrderComment(), "CloseBy_") || OrderSwap())) { Comment((string)i + "/" + (string)Total); const MqlTick Tick = GetTick(CloseTime); const double PriceClose = OrderType() ? Tick.ask : Tick.bid; Order.Set(OrderTicket(), (ENUM_ORDER_TYPE)OrderType(), OrderLots(), OrderSymbol(), OrderComment(), OrderOpenPrice(), OrderOpenTimeMsc(), OrderStopLoss(), OrderTakeProfit(), PriceClose, Tick.time_msc, OrderMagicNumber(), OrderProfit() * (PriceClose - OrderOpenPrice()) / (OrderClosePrice() - OrderOpenPrice()), OrderCommission(), 0, OrderOpenReason(), DEAL_REASON_CLIENT, OrderOpenPriceRequest(), PriceClose); } _VP(VirtualPointerOut, VIRTUAL::AddOrder(Order)); } } _VP(VirtualPointerOut, VIRTUAL::SetID("Without Swaps - " + __FILE__)); _VP(VirtualPointerOut, REPORT::ToFile()); } } }
Выделенные три строки - принудительное закрытие позиций до ролловера с пересчетом прибыли. В общем, скомпилированный файл приложен, каждый может попробовать свою историю со свопами и распространить данный подход анализа торговли на другие темы.
На выходе будет подробный HTML-statement соответствующим образом обновленной торговой истории.
Ссылка на блог автора.