Day of Week Exit by Popov
42576 downloads / 5206 views / Created: 01.09.2013 Average Rating: 0
Indicator Description
Indicator author: Krog
Original Request -- indicator to specify closing day, to be more flexible than Week Closing (last day only)
Feature: can specify day-time range for exiting positions
Notes: use filters so you don't enter a position during the exit time. Or else, equity curve goes down quickly because it will open and close positions on each bar.
Please verify it works for you on a demo account before using on real account. If any bugs or unexpected behavior, please advise.
Forum link: Day of Week Exit
Original Request -- indicator to specify closing day, to be more flexible than Week Closing (last day only)
Feature: can specify day-time range for exiting positions
Notes: use filters so you don't enter a position during the exit time. Or else, equity curve goes down quickly because it will open and close positions on each bar.
Please verify it works for you on a demo account before using on real account. If any bugs or unexpected behavior, please advise.
Forum link: Day of Week Exit
Comments
//==============================================================
// Forex Strategy Builder
// Copyright © Miroslav Popov. All rights reserved.
//==============================================================
// THIS CODE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
// EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE.
//==============================================================
using System;
using System.Drawing;
using ForexStrategyBuilder.Infrastructure.Entities;
using ForexStrategyBuilder.Infrastructure.Enums;
using ForexStrategyBuilder.Infrastructure.Interfaces;
namespace ForexStrategyBuilder.Indicators.Store
{
///
/// Day of Week Exit Indicator
///
public class DayOfWeekExit : Indicator
{
public DayOfWeekExit()
{
IndicatorName = "Day of Week Exit";
PossibleSlots = SlotTypes.CloseFilter;
IndicatorAuthor = "Krog";
IndicatorVersion = "2.0";
IndicatorDescription = "Custom indicator for FSB / FST.";
}
public override void Initialize(SlotTypes slotType)
{
SlotType = slotType;
IndParam.IndicatorType = TypeOfIndicator.DateTime;
// The ComboBox parameters
IndParam.ListParam[0].Caption = "Logic";
IndParam.ListParam[0].ItemList = new string[]
{
"Exit the market between the specified day at the specified time"
};
IndParam.ListParam[0].Index = 0;
IndParam.ListParam[0].Text = IndParam.ListParam[0].ItemList[IndParam.ListParam[0].Index];
IndParam.ListParam[0].Enabled = true;
IndParam.ListParam[0].ToolTip = "Indicators' logic.";
IndParam.ListParam[1].Caption = "From (incl.)";
IndParam.ListParam[1].ItemList = Enum.GetNames(typeof(DayOfWeek));
IndParam.ListParam[1].Index = (int)DayOfWeek.Friday;
IndParam.ListParam[1].Text = IndParam.ListParam[1].ItemList[IndParam.ListParam[1].Index];
IndParam.ListParam[1].Enabled = true;
IndParam.ListParam[1].ToolTip = "Day of beginning for the exit period.";
IndParam.ListParam[2].Caption = "To (excl.)";
IndParam.ListParam[2].ItemList = Enum.GetNames(typeof(DayOfWeek));
IndParam.ListParam[2].Index = (int)DayOfWeek.Saturday;
IndParam.ListParam[2].Text = IndParam.ListParam[2].ItemList[IndParam.ListParam[2].Index];
IndParam.ListParam[2].Enabled = true;
IndParam.ListParam[2].ToolTip = "End day for the exit period.";
// The NumericUpDown parameters
IndParam.NumParam[0].Caption = "From hour (incl.)";
IndParam.NumParam[0].Value = 0;
IndParam.NumParam[0].Min = 0;
IndParam.NumParam[0].Max = 23;
IndParam.NumParam[0].Enabled = true;
IndParam.NumParam[0].ToolTip = "Beginning of the exit period.";
IndParam.NumParam[1].Caption = "From min (incl.)";
IndParam.NumParam[1].Value = 0;
IndParam.NumParam[1].Min = 0;
IndParam.NumParam[1].Max = 59;
IndParam.NumParam[1].Enabled = true;
IndParam.NumParam[1].ToolTip = "Beginning of the exit period.";
IndParam.NumParam[2].Caption = "Until hour (excl.)";
IndParam.NumParam[2].Value = 24;
IndParam.NumParam[2].Min = 0;
IndParam.NumParam[2].Max = 24;
IndParam.NumParam[2].Enabled = true;
IndParam.NumParam[2].ToolTip = "End of the exit period.";
IndParam.NumParam[3].Caption = "Until min( excl.)";
IndParam.NumParam[3].Value = 0;
IndParam.NumParam[3].Min = 0;
IndParam.NumParam[3].Max = 59;
IndParam.NumParam[3].Enabled = true;
IndParam.NumParam[3].ToolTip = "End of the exit period.";
}
public override void Calculate(IDataSet dataSet)
{
DataSet = dataSet;
// Reading the parameters
int iFromDay = (int)IndParam.ListParam[1].Index;
int iFromHour = (int)IndParam.NumParam[0].Value;
int iFromMin = (int)IndParam.NumParam[1].Value;
int iUntilDay = (int)IndParam.ListParam[2].Index;
int iUntilHour = (int)IndParam.NumParam[2].Value;
int iUntilMin = (int)IndParam.NumParam[3].Value;
TimeSpan tsFromTime = new TimeSpan(iFromDay, iFromHour, iFromMin, 0);
TimeSpan tsUntilTime = new TimeSpan(iUntilDay, iUntilHour, iUntilMin, 0);
// Calculation
int iFirstBar = 1;
double[] adBars = new double[Bars];
// Calculation of the logic
for (int iBar = iFirstBar; iBar < Bars; iBar++)
{
TimeSpan tsBar = new TimeSpan((int)Time[iBar].DayOfWeek, Time[iBar].Hour, Time[iBar].Minute, 0);
adBars[iBar] = tsBar >= tsFromTime && tsBar < tsUntilTime ? 1 : 0;
}
// Saving the components
Component = new IndicatorComp[1];
Component[0] = new IndicatorComp();
Component[0].CompName = "Force close position";
Component[0].DataType = IndComponentType.ForceClose;
Component[0].ChartType = IndChartType.NoChart;
Component[0].ShowInDynInfo = false;
Component[0].FirstBar = iFirstBar;
Component[0].Value = adBars;
}
public override void SetDescription()
{
DayOfWeek dowFromDay = (DayOfWeek)IndParam.ListParam[1].Index;
int iFromHour = (int)IndParam.NumParam[0].Value;
int iFromMin = (int)IndParam.NumParam[1].Value;
string sFromMin = (iFromMin < 10) ? "0" + iFromMin.ToString() : iFromMin.ToString();
DayOfWeek dowUntilDay = (DayOfWeek)IndParam.ListParam[2].Index;
int iUntilHour = (int)IndParam.NumParam[2].Value;
int iUntilMin = (int)IndParam.NumParam[3].Value;
string sUntilMin = (iUntilMin < 10) ? "0" + iUntilMin.ToString() : iUntilMin.ToString();
ExitFilterLongDescription = "between " + dowFromDay + " " + iFromHour.ToString() + ":" + sFromMin + " and " + dowUntilDay + " " + iUntilHour.ToString() + ":" + sUntilMin;
ExitFilterShortDescription = "between " + dowFromDay + " " + iFromHour.ToString() + ":" + sFromMin + " and " + dowUntilDay + " " + iUntilHour.ToString() + ":" + sUntilMin;
}
public override string ToString()
{
DayOfWeek dowFromDay = (DayOfWeek)IndParam.ListParam[1].Index;
int iFromHour = (int)IndParam.NumParam[0].Value;
int iFromMin = (int)IndParam.NumParam[1].Value;
string sFromMin = (iFromMin < 10) ? "0" + iFromMin.ToString() : iFromMin.ToString();
DayOfWeek dowUntilDay = (DayOfWeek)IndParam.ListParam[2].Index;
int iUntilHour = (int)IndParam.NumParam[2].Value;
int iUntilMin = (int)IndParam.NumParam[3].Value;
string sUntilMin = (iUntilMin < 10) ? "0" + iUntilMin.ToString() : iUntilMin.ToString();
string sString = IndicatorName + " (" +
dowFromDay + " " + // Day
iFromHour.ToString() + ":" + // Hour
sFromMin + "-" + // Minute
dowUntilDay + " " + // Day
iUntilHour.ToString() + ":" + // Hour
sUntilMin + ")"; // Minute
return sString;
}
}
}
//+--------------------------------------------------------------------+ //| Copyright: (C) 2016 Forex Software Ltd. | //| Website: http://forexsb.com/ | //| Support: http://forexsb.com/forum/ | //| License: Proprietary under the following circumstances: | //| | //| This code is a part of Forex Strategy Builder. It is free for | //| use as an integral part of Forex Strategy Builder. | //| One can modify it in order to improve the code or to fit it for | //| personal use. This code or any part of it cannot be used in | //| other applications without a permission. | //| The contact information cannot be changed. | //| | //| NO LIABILITY FOR CONSEQUENTIAL DAMAGES | //| | //| In no event shall the author be liable for any damages whatsoever | //| (including, without limitation, incidental, direct, indirect and | //| consequential damages, damages for loss of business profits, | //| business interruption, loss of business information, or other | //| pecuniary loss) arising out of the use or inability to use this | //| product, even if advised of the possibility of such damages. | //+--------------------------------------------------------------------+ #property copyright "Copyright (C) 2016 Forex Software Ltd." #property link "http://forexsb.com" #property version "2.00" #property strict #include <Forexsb.com/Indicator.mqh> #include <Forexsb.com/Enumerations.mqh> //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class DayOfWeekExit : public Indicator { public: DayOfWeekExit(SlotTypes slotType); virtual void Calculate(DataSet &dataSet); }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void DayOfWeekExit::DayOfWeekExit(SlotTypes slotType) { SlotType = slotType; IndicatorName = "Day of Week Exit"; WarningMessage = ""; IsAllowLTF = true; ExecTime = ExecutionTime_DuringTheBar; IsSeparateChart = false; IsDiscreteValues = false; IsDefaultGroupAll = true; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void DayOfWeekExit::Calculate(DataSet &dataSet) { Data=GetPointer(dataSet); int fromHour = (int) NumParam[0].Value; int fromMin = (int) NumParam[1].Value; int untilHour = (int) NumParam[2].Value; int untilMin = (int) NumParam[3].Value; int fromDay = ListParam[1].Index; int untilDay = ListParam[2].Index; const int firstBar=2; double adBars[]; ArrayResize(adBars,Data.Bars);ArrayInitialize(adBars,0); int fromTime = fromHour*3600+fromMin*60; int untilTime = untilHour*3600+untilMin*60; for(int bar=firstBar; bar<Data.Bars; bar++) { MqlDateTime mqlTime; TimeToStruct(Data.Time[bar],mqlTime); int barTime=mqlTime.hour*3600+mqlTime.min*60; int time=mqlTime.day_of_week; adBars[bar]= time>=fromDay && time<untilDay && barTime>=fromTime && barTime<untilTime ? 1 : 0; } ArrayResize(Component[0].Value,Data.Bars); Component[0].CompName = "Force close position"; Component[0].DataType = IndComponentType_ForceClose; Component[0].ShowInDynInfo=false; Component[0].FirstBar=firstBar; ArrayCopy(Component[0].Value,adBars); } //+------------------------------------------------------------------+
Risk warning: Forex, spread bets and CFD are leveraged products. They may not be suitable for you as they carry a high degree of risk to your capital and you can lose more than your initial investment. You should ensure you understand all of the risks.
Copyright © 2006 - 2024, Forex Software Ltd.;
Copyright © 2006 - 2024, Forex Software Ltd.;