MO
pivot points indicator modification help
19 Nov 2014, 11:37
hello
anyone cam mod this pivot point indicator to display the (X) last days of pivots points lines to the current day ... to explain i want to display (extend) the last 3 days of pivot point lines with the current day pivot lines..
thanks
using System;
using cAlgo.API;
namespace cAlgo.Indicators
{
[Indicator(AutoRescale = false, IsOverlay = true)]
public class PivotPoints : Indicator
{
private enum Timeframe
{
m1,
m2,
m3,
m4,
m5,
m10,
m15,
m30,
h1,
h4,
h12,
D1,
W1,
M1,
na
}
private double _close;
private double _high;
private double _low;
private bool _showDailyPivots;
private bool _showWeeklyPivots;
private bool _showMonthlyPivots;
private Timeframe _currentTimeFrame = Timeframe.na;
#region Output
[Output("Pivot", LineStyle = LineStyle.Lines)]
public IndicatorDataSeries Pivot { get; set; }
[Output("R1", LineStyle = LineStyle.Lines, Color = Colors.Blue)]
public IndicatorDataSeries R1 { get; set; }
[Output("R2", LineStyle = LineStyle.Lines, Color = Colors.Blue)]
public IndicatorDataSeries R2 { get; set; }
[Output("R3", LineStyle = LineStyle.Lines, Color = Colors.Blue)]
public IndicatorDataSeries R3 { get; set; }
[Output("S1", LineStyle = LineStyle.Lines, Color = Colors.Red)]
public IndicatorDataSeries S1 { get; set; }
[Output("S2", LineStyle = LineStyle.Lines, Color = Colors.Red)]
public IndicatorDataSeries S2 { get; set; }
[Output("S3", PlotType = PlotType.Line, LineStyle = LineStyle.Lines, Color = Colors.Red)]
public IndicatorDataSeries S3 { get; set; }
#endregion
#region Input Parameters
[Parameter("Number of Pivots", DefaultValue = 3, MinValue = 1, MaxValue = 3)]
public int NoPiv { get; set; }
[Parameter("Daily", DefaultValue = 1, MinValue = 0, MaxValue = 1)]
public int DailyPivots { get; set; }
[Parameter("Weekly", DefaultValue = 0, MinValue = 0, MaxValue = 1)]
public int WeeklyPivots { get; set; }
[Parameter("Monthly", DefaultValue = 0, MinValue = 0, MaxValue = 1)]
public int MonthlyPivots { get; set; }
#endregion
protected override void Initialize()
{
_showDailyPivots = DailyPivots == 1 && WeeklyPivots == 0 && MonthlyPivots == 0;
_showWeeklyPivots = DailyPivots == 0 && WeeklyPivots == 1 && MonthlyPivots == 0;
_showMonthlyPivots = DailyPivots == 0 && WeeklyPivots == 0 && MonthlyPivots == 1;
}
public override void Calculate(int index)
{
if (index <= 1)
{
Pivot[index] = 0;
return;
}
if (_currentTimeFrame == Timeframe.na)
_currentTimeFrame = GetTimeFrame(index);
if (_currentTimeFrame == Timeframe.na)
{
Pivot[index] = 0;
return;
}
bool daily = _currentTimeFrame < Timeframe.D1 && _showDailyPivots;
bool weekly = _currentTimeFrame < Timeframe.W1 && _showWeeklyPivots;
bool monthly = _currentTimeFrame < Timeframe.M1 && _showMonthlyPivots;
if (!(daily || weekly || monthly))
{
ChartObjects.DrawText("msg", "Incorrect Timeframe selection", StaticPosition.TopLeft, Colors.Red);
return;
}
ChartObjects.RemoveAllObjects();
int currentDay = MarketSeries.OpenTime[index].Day;
int previousDay = MarketSeries.OpenTime[index - 1].Day;
DayOfWeek currentDayWk = MarketSeries.OpenTime[index].DayOfWeek;
bool sameDay = currentDay == previousDay;
bool calculateValues = Pivot[index - 1] == Pivot[index - 2] && !sameDay && (daily && currentDayWk != DayOfWeek.Saturday || weekly && currentDayWk == DayOfWeek.Monday || monthly && currentDay == 1);
if (!calculateValues)
{
// Same values for the day
Pivot[index] = Pivot[index - 1];
R1[index] = R1[index - 1];
S1[index] = S1[index - 1];
// Display additional pivots according to user input
if (NoPiv >= 2)
{
R2[index] = R2[index - 1];
S2[index] = S2[index - 1];
}
if (NoPiv >= 3)
{
R3[index] = R3[index - 1];
S3[index] = S3[index - 1];
}
// Set high & low for next cycle
if (MarketSeries.High[index] > _high)
_high = MarketSeries.High[index];
if (MarketSeries.Low[index] < _low)
_low = MarketSeries.Low[index];
}
//if (calculateValues)
else
{
_close = MarketSeries.Close[index - 1];
CalculatePivots(index);
// reset high & low
_high = double.MinValue;
_low = double.MaxValue;
}
}
private void CalculatePivots(int index)
{
// Calculate output
Pivot[index] = (_high + _low + _close) / 3;
R1[index] = 2 * Pivot[index] - _low;
S1[index] = 2 * Pivot[index] - _high;
// Display additional pivots according to input
if (NoPiv >= 2)
{
R2[index] = Pivot[index] + (_high - _low);
S2[index] = Pivot[index] - (_high - _low);
}
if (NoPiv >= 3)
{
R3[index] = _high + 2 * (Pivot[index] - _low);
S3[index] = _low - 2 * (_high - Pivot[index]);
}
}
/// <summary>
/// Get the current Timeframe
/// </summary>
/// <param name="index"> </param>
/// <returns></returns>
private Timeframe GetTimeFrame(int index)
{
DateTime currentOpenTime = MarketSeries.OpenTime[index];
DateTime previousOpenTime = MarketSeries.OpenTime[index - 1];
if (currentOpenTime.Day == 1 && previousOpenTime.Day == 1 && currentOpenTime.Month != previousOpenTime.Month)
return Timeframe.M1;
if (currentOpenTime.DayOfWeek == DayOfWeek.Monday && previousOpenTime.DayOfWeek != DayOfWeek.Monday)
{
currentOpenTime = previousOpenTime;
previousOpenTime = MarketSeries.OpenTime[index - 2];
}
TimeSpan barTimeDiff = currentOpenTime - previousOpenTime;
var totalMin = (int)barTimeDiff.TotalMinutes;
switch (totalMin)
{
case 1:
return Timeframe.m1;
case 2:
return Timeframe.m2;
case 3:
return Timeframe.m3;
case 4:
return Timeframe.m4;
case 5:
return Timeframe.m5;
case 10:
return Timeframe.m10;
case 15:
return Timeframe.m15;
case 30:
return Timeframe.m30;
case 60:
return Timeframe.h1;
case 240:
return Timeframe.h4;
case 720:
return Timeframe.h12;
case 1440:
return Timeframe.D1;
case 10080:
return Timeframe.W1;
default:
return Timeframe.na;
}
}
}
}
