
Форекс-скальперы на свопах несут существенные издержки. Ниже на их примере представлен простой подход, позволяющий наглядно проанализировать любую историю торговли.
В качестве фильтра использую скрипт 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 соответствующим образом обновленной торговой истории.
Это что за скальперы такие чУдные, которые переносят позы через ролловер ???
Т.е. медианная длительность жизни позиции несколько минут.