Борьба со свопами - 2.

Борьба со свопами - 2.

8 сентября 2023, 23:31
fxsaber
0
242

Форекс-скальперы на свопах несут существенные издержки. Ниже на их примере представлен простой подход, позволяющий наглядно проанализировать любую историю торговли.


Фильтр торговой истории.

В качестве фильтра использую скрипт 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 соответствующим образом обновленной торговой истории.

Ссылка на блог автора.

Файлы:
CalcSwaps2.ex5  164 kb
Поделитесь с друзьями: