Warning! This section will be deprecated on February 1st 2025. Please move all your Indicators to the cTrader Store catalogue.
Description
This Pivot Points Indicator has Different Calculations i.e (Camarilla and Central Pivot Point)
Aqua and Magenta -> Camarilla Pivot Points
Orange and White (Central Pivot Points. If central pivots are white, a trading range is expected. If is orange, a trend is expected) These colors are based on PivotPoint Range Histogram calculation, (google it for more information)
Original code here: https://ctrader.com/algos/indicators/show/45#:~:text=Pivot%20Points%20free&text=Pivot%20Point%20is%20a%20technical,high%2C%20low%20and%20closing%20prices.
Enjoy :3.
using System;
using cAlgo.API;
using cAlgo.API.Internals;
using cAlgo.API.Indicators;
namespace cAlgo.Indicators
{
[Indicator(IsOverlay = true, TimeZone = TimeZones.EasternStandardTime, AccessRights = AccessRights.None)]
public class PivotPoints : Indicator
{
private DateTime _previousPeriodStartTime;
private int _previousPeriodStartIndex;
private TimeFrame PivotTimeFrame;
private VerticalAlignment vAlignment = VerticalAlignment.Top;
private HorizontalAlignment hAlignment = HorizontalAlignment.Right;
Colors pivotColor = Colors.White;
Colors supportColor = Colors.Red;
Colors resistanceColor = Colors.Green;
[Parameter("Show Labels", DefaultValue = true)]
public bool ShowLabels { get; set; }
[Parameter("Show Pivots", DefaultValue = true)]
public bool ShowPivots { get; set; }
[Parameter("Pivot Color", DefaultValue = "Blue")]
public string PivotColor { get; set; }
[Parameter("Support Color", DefaultValue = "Red")]
public string SupportColor { get; set; }
[Parameter("Resistance Color", DefaultValue = "Green")]
public string ResistanceColor { get; set; }
[Parameter("Multiplier", DefaultValue = 100)]
public double multiplier { get; set; }
protected override void Initialize()
{
if (TimeFrame <= TimeFrame.Hour)
PivotTimeFrame = TimeFrame.Daily;
else if (TimeFrame < TimeFrame.Daily)
{
PivotTimeFrame = TimeFrame.Weekly;
}
else
PivotTimeFrame = TimeFrame.Monthly;
Enum.TryParse(PivotColor, out pivotColor);
Enum.TryParse(SupportColor, out supportColor);
Enum.TryParse(ResistanceColor, out resistanceColor);
}
private DateTime GetStartOfPeriod(DateTime dateTime)
{
return CutToOpenByNewYork(dateTime, PivotTimeFrame);
}
private DateTime GetEndOfPeriod(DateTime dateTime)
{
if (PivotTimeFrame == TimeFrame.Monthly)
{
return new DateTime(dateTime.Year, dateTime.Month, 1).AddMonths(1);
}
return AddPeriod(CutToOpenByNewYork(dateTime, PivotTimeFrame), PivotTimeFrame);
}
public override void Calculate(int index)
{
var currentPeriodStartTime = GetStartOfPeriod(MarketSeries.OpenTime[index]);
if (currentPeriodStartTime == _previousPeriodStartTime)
return;
if (index > 0)
CalculatePivots(_previousPeriodStartTime, _previousPeriodStartIndex, currentPeriodStartTime, index);
_previousPeriodStartTime = currentPeriodStartTime;
_previousPeriodStartIndex = index;
}
private void CalculatePivots(DateTime startTime, int startIndex, DateTime startTimeOfNextPeriod, int index)
{
var high = MarketSeries.High[startIndex];
var low = MarketSeries.Low[startIndex];
var close = MarketSeries.Close[startIndex];
var i = startIndex + 1;
while (GetStartOfPeriod(MarketSeries.OpenTime[i]) == startTime && i < MarketSeries.Close.Count)
{
high = Math.Max(high, MarketSeries.High[i]);
low = Math.Min(low, MarketSeries.Low[i]);
close = MarketSeries.Close[i];
i++;
}
var pivotStartTime = startTimeOfNextPeriod;
var pivotEndTime = GetEndOfPeriod(startTimeOfNextPeriod);
var pivot = (high + low + close) / 3;
var r1 = 2 * pivot - low;
var s1 = 2 * pivot - high;
var r2 = pivot + high - low;
var s2 = pivot - high + low;
var r3 = high + 2 * (pivot - low);
var s3 = low - 2 * (high - pivot);
var h3 = close + (high - low) * 1.1 / 4;
var h4 = close + (high - low) * 1.1 / 2;
var l3 = close - (high - low) * 1.1 / 4;
var l4 = close - (high - low) * 1.1 / 2;
var bc = (high + low) / 2;
var tc = (pivot - bc) + pivot;
var width = Math.Round((Math.Abs((tc - pivot)) / pivot) * 100 * multiplier, 1);
if (width > 50)
{
ChartObjects.DrawLine("pivot " + startIndex, pivotStartTime, pivot, pivotEndTime, pivot, Colors.White, 1, LineStyle.LinesDots);
ChartObjects.DrawLine("bc " + startIndex, pivotStartTime, bc, pivotEndTime, bc, Colors.White, 1, LineStyle.LinesDots);
ChartObjects.DrawLine("tc " + startIndex, pivotStartTime, tc, pivotEndTime, tc, Colors.White, 1, LineStyle.LinesDots);
}
else if (width <= 50)
{
ChartObjects.DrawLine("pivot " + startIndex, pivotStartTime, pivot, pivotEndTime, pivot, Colors.Orange, 1, LineStyle.LinesDots);
ChartObjects.DrawLine("bc " + startIndex, pivotStartTime, bc, pivotEndTime, bc, Colors.Orange, 1, LineStyle.LinesDots);
ChartObjects.DrawLine("tc " + startIndex, pivotStartTime, tc, pivotEndTime, tc, Colors.Orange, 1, LineStyle.LinesDots);
}
if (ShowPivots == true)
{
ChartObjects.DrawLine("r1 " + startIndex, pivotStartTime, r1, pivotEndTime, r1, Colors.Green, 1, LineStyle.LinesDots);
ChartObjects.DrawLine("r2 " + startIndex, pivotStartTime, r2, pivotEndTime, r2, Colors.Green, 1, LineStyle.LinesDots);
ChartObjects.DrawLine("r3 " + startIndex, pivotStartTime, r3, pivotEndTime, r3, Colors.Green, 1, LineStyle.LinesDots);
ChartObjects.DrawLine("s1 " + startIndex, pivotStartTime, s1, pivotEndTime, s1, Colors.Red, 1, LineStyle.LinesDots);
ChartObjects.DrawLine("s2 " + startIndex, pivotStartTime, s2, pivotEndTime, s2, Colors.Red, 1, LineStyle.LinesDots);
ChartObjects.DrawLine("s3 " + startIndex, pivotStartTime, s3, pivotEndTime, s3, Colors.Red, 1, LineStyle.LinesDots);
ChartObjects.DrawLine("h3 " + startIndex, pivotStartTime, h3, pivotEndTime, h3, Colors.Aqua, 1, LineStyle.LinesDots);
ChartObjects.DrawLine("h4 " + startIndex, pivotStartTime, h4, pivotEndTime, h4, Colors.Aqua, 1, LineStyle.LinesDots);
ChartObjects.DrawLine("l3 " + startIndex, pivotStartTime, l3, pivotEndTime, l3, Colors.Magenta, 1, LineStyle.LinesDots);
ChartObjects.DrawLine("l4 " + startIndex, pivotStartTime, l4, pivotEndTime, l4, Colors.Magenta, 1, LineStyle.LinesDots);
}
if (!ShowLabels)
return;
ChartObjects.DrawText("Lpivot " + startIndex, Convert.ToString(width) + "%", index, pivot, vAlignment, hAlignment, Colors.Orange);
ChartObjects.DrawText("Lr1 " + startIndex, "R1", index, r1, vAlignment, hAlignment, resistanceColor);
ChartObjects.DrawText("Lr2 " + startIndex, "R2", index, r2, vAlignment, hAlignment, resistanceColor);
ChartObjects.DrawText("Lr3 " + startIndex, "R3", index, r3, vAlignment, hAlignment, resistanceColor);
ChartObjects.DrawText("Ls1 " + startIndex, "S1", index, s1, vAlignment, hAlignment, supportColor);
ChartObjects.DrawText("Ls2 " + startIndex, "S2", index, s2, vAlignment, hAlignment, supportColor);
ChartObjects.DrawText("Ls3 " + startIndex, "S3", index, s3, vAlignment, hAlignment, supportColor);
}
private static DateTime CutToOpenByNewYork(DateTime date, TimeFrame timeFrame)
{
if (timeFrame == TimeFrame.Daily)
{
var hourShift = (date.Hour + 24 - 17) % 24;
return new DateTime(date.Year, date.Month, date.Day, date.Hour, 0, 0, DateTimeKind.Unspecified).AddHours(-hourShift);
}
if (timeFrame == TimeFrame.Weekly)
return GetStartOfTheWeek(date);
if (timeFrame == TimeFrame.Monthly)
{
return new DateTime(date.Year, date.Month, 1, 0, 0, 0, DateTimeKind.Unspecified);
}
throw new ArgumentException(string.Format("Unknown timeframe: {0}", timeFrame), "timeFrame");
}
private static DateTime GetStartOfTheWeek(DateTime dateTime)
{
return dateTime.Date.AddDays((double)DayOfWeek.Sunday - (double)dateTime.Date.DayOfWeek).AddHours(-7);
}
public DateTime AddPeriod(DateTime dateTime, TimeFrame timeFrame)
{
if (timeFrame == TimeFrame.Daily)
{
return dateTime.AddDays(1);
}
if (timeFrame == TimeFrame.Weekly)
{
return dateTime.AddDays(7);
}
if (timeFrame == TimeFrame.Monthly)
return dateTime.AddMonths(1);
throw new ArgumentException(string.Format("Unknown timeframe: {0}", timeFrame), "timeFrame");
}
}
// static internal class DateTimeExtencions
// {
// }
}
AN
andurei
Joined on 30.09.2020
- Distribution: Free
- Language: C#
- Trading platform: cTrader Automate
- File name: Pivot Points.algo
- Rating: 0
- Installs: 2421
- Modified: 13/10/2021 09:55
Note that publishing copyrighted material is strictly prohibited. If you believe there is copyrighted material in this section, please use the Copyright Infringement Notification form to submit a claim.
Comments
Log in to add a comment.
No comments found.