Description
using
cAlgo.API;<font></font>
using
cAlgo.API.Indicators;<font></font>
using
cAlgo.API.Internals;<font></font>
using
cAlgo.Indicators;<font></font>
using
System;<font></font>
using
System.Collections.Generic;<font></font>
using
System.Linq;<font></font>
using
System.Windows.Forms;<font></font>
using
System.Runtime.InteropServices;<font></font>
using
System.Diagnostics;<font></font>
using
cT_MedianRenkoEngine;<font></font>
<font></font>
namespace
cAlgo<font></font>
{<font></font>
[Indicator(
"MedianRenko"
, IsOverlay =
true
, AutoRescale =
true
, TimeZone = TimeZones.UTC, AccessRights = AccessRights.FullAccess)]<font></font>
public
class
MedianRenko : Indicator<font></font>
{<font></font>
[Parameter(
"Bar Size (Pips)"
, DefaultValue = 10, MinValue = 0.1, Step = 1)]<font></font>
public
double
BarSizePips {
get
;
set
; }<font></font>
<font></font>
[Parameter(
"Retracement factor (0.01 - 1.00)"
, DefaultValue = 0.5, MinValue = 0.01, MaxValue = 1.0, Step = 0.01)]<font></font>
public
double
Retracement {
get
;
set
; }<font></font>
<font></font>
[Parameter(
"Maximum Bars"
, DefaultValue = 300, MinValue = 1)]<font></font>
public
int
BricksToShow {
get
;
set
; }<font></font>
<font></font>
[Parameter(
"Symmetrical Reversals"
, DefaultValue =
true
)]<font></font>
public
bool
SymmetricalReversals {
get
;
set
; }<font></font>
<font></font>
[Parameter(
"Reset Open on new trading day"
, DefaultValue =
false
)]<font></font>
public
bool
ResetOpenOnNewTradingDay {
get
;
set
; }<font></font>
<font></font>
[Parameter(
"Apply offset to first renko bar"
, DefaultValue =
false
)]<font></font>
public
bool
ApplyOffsetToFirstBar {
get
;
set
; }<font></font>
<font></font>
[Parameter(
"Tick offset value"
, DefaultValue = 0, MinValue = 0)]<font></font>
public
int
OffsetValue {
get
;
set
; }<font></font>
<font></font>
[Parameter(
"Bullish Bar Color"
, DefaultValue =
"SeaGreen"
)]<font></font>
public
string
ColorBull {
get
;
set
; }<font></font>
<font></font>
[Parameter(
"Bearish Bar Color"
, DefaultValue =
"Tomato"
)]<font></font>
public
string
ColorBear {
get
;
set
; }<font></font>
<font></font>
[Output(
"Open"
, Color = Colors.DimGray, Thickness = 0, PlotType = PlotType.Points)]<font></font>
public
IndicatorDataSeries Open {
get
;
set
; }<font></font>
<font></font>
[Output(
"High"
, Color = Colors.DimGray, Thickness = 1, PlotType = PlotType.Points)]<font></font>
public
IndicatorDataSeries High {
get
;
set
; }<font></font>
<font></font>
[Output(
"Low"
, Color = Colors.DimGray, Thickness = 0, PlotType = PlotType.Points)]<font></font>
public
IndicatorDataSeries Low {
get
;
set
; }<font></font>
<font></font>
[Output(
"Close"
, Color = Colors.DimGray, Thickness = 0, PlotType = PlotType.Points)]<font></font>
public
IndicatorDataSeries Close {
get
;
set
; }<font></font>
<font></font>
private
MedianRenkoCore core =
null
;<font></font>
private
bool
coreOK =
true
;<font></font>
<font></font>
private
DateTime lastTime;<font></font>
<font></font>
private
bool
appliedOffset =
false
;<font></font>
<font></font>
private
T_OLHCV pOLHCV;<font></font>
private
T_OLHCV OLHCV;<font></font>
private
T_OLHCV mOLHCV;<font></font>
private
T_OLHCV cOLHCV;<font></font>
private
T_OLHCV memRates;<font></font>
private
T_OLHCV lastBar;<font></font>
<font></font>
private
List<T_OLHCV> bars =
new
List<T_OLHCV>();<font></font>
private
double
barSize;<font></font>
private
Colors colorBull, colorBear;<font></font>
<font></font>
protected
override
void
Initialize()<font></font>
{<font></font>
core =
new
MedianRenkoCore();<font></font>
coreOK = core.StatusCheck();<font></font>
<font></font>
barSize = BarSizePips * Symbol.PipSize;<font></font>
<font></font>
lastTime =
new
DateTime();<font></font>
lastTime = MarketSeries.OpenTime[MarketSeries.Close.Count - 1];<font></font>
<font></font>
lastBar =
new
T_OLHCV();<font></font>
pOLHCV =
new
T_OLHCV();<font></font>
OLHCV =
new
T_OLHCV();<font></font>
mOLHCV =
new
T_OLHCV();<font></font>
cOLHCV =
new
T_OLHCV();<font></font>
memRates =
new
T_OLHCV();<font></font>
<font></font>
if
(!Enum.TryParse<Colors>(ColorBull,
out
colorBull))<font></font>
{<font></font>
colorBull = Colors.SeaGreen;<font></font>
}<font></font>
if
(!Enum.TryParse<Colors>(ColorBear,
out
colorBear))<font></font>
{<font></font>
colorBear = Colors.Tomato;<font></font>
}<font></font>
<font></font>
appliedOffset =
false
;<font></font>
}<font></font>
<font></font>
private
bool
NewBar(
int
index)<font></font>
{<font></font>
if
(lastTime != MarketSeries.OpenTime[index])<font></font>
{<font></font>
lastTime = MarketSeries.OpenTime[index];<font></font>
return
true
;<font></font>
}<font></font>
<font></font>
return
false
;<font></font>
}<font></font>
<font></font>
private
static
int
cc = 0;<font></font>
private
void
pushBars(T_OLHCV bar,
bool
display)<font></font>
{<font></font>
int
count = bars.Count();<font></font>
<font></font>
var newBar =
new
T_OLHCV();<font></font>
newBar.Copy(bar);<font></font>
newBar.Index = cc++;<font></font>
<font></font>
bars.Insert(0, newBar);<font></font>
count++;<font></font>
<font></font>
if
(display)<font></font>
{<font></font>
shiftBars(0);<font></font>
}<font></font>
<font></font>
if
(count > BricksToShow)<font></font>
{<font></font>
if
(display)<font></font>
{<font></font>
for
(
int
i = BricksToShow - 1; i < count; i++)<font></font>
{<font></font>
ChartObjects.RemoveObject(
"mr_Wick_"
+ bars[i].Index);<font></font>
ChartObjects.RemoveObject(
"mr_Bar_"
+ bars[i].Index);<font></font>
}<font></font>
}<font></font>
<font></font>
bars.RemoveRange(BricksToShow, count - BricksToShow);<font></font>
<font></font>
Open[count - BricksToShow] =
double
.NaN;<font></font>
High[count - BricksToShow] =
double
.NaN;<font></font>
Low[count - BricksToShow] =
double
.NaN;<font></font>
Close[count - BricksToShow] =
double
.NaN;<font></font>
}<font></font>
<font></font>
}<font></font>
<font></font>
private
void
shiftBars(
int
shift)<font></font>
{<font></font>
int
count = bars.Count;<font></font>
int
ix = MarketSeries.Close.Count - 2;<font></font>
<font></font>
for
(
int
i = 0; i < count && i < BricksToShow; i++)<font></font>
{<font></font>
var candleColor = (bars[i].Close > bars[i].Open) ? colorBull : colorBear;<font></font>
<font></font>
ChartObjects.DrawLine(
"mr_Wick_"
+ bars[i].Index, ix, bars[i].High, ix, bars[i].Low, candleColor, 1, LineStyle.Solid);<font></font>
ChartObjects.DrawLine(
"mr_Bar_"
+ bars[i].Index, ix, bars[i].Close, ix, bars[i].Open, candleColor, 5, LineStyle.Solid);<font></font>
<font></font>
Open[ix] = bars[i].Open;<font></font>
High[ix] = bars[i].High;<font></font>
Low[ix] = bars[i].Low;<font></font>
Close[ix] = bars[i].Close;<font></font>
<font></font>
ix--;<font></font>
}<font></font>
}<font></font>
<font></font>
private
void
UpdateLastBar(
int
ix)<font></font>
{<font></font>
var candleColor = (memRates.Close > memRates.Open) ? colorBull : colorBear;<font></font>
<font></font>
ChartObjects.DrawLine(
"mr_Wick_Live"
, ix, memRates.High, ix, memRates.Low, candleColor, 1, LineStyle.Solid);<font></font>
ChartObjects.DrawLine(
"mr_Bar_Live"
, ix, memRates.Close, ix, memRates.Open, candleColor, 5, LineStyle.Solid);<font></font>
<font></font>
Open[ix] = memRates.Open;<font></font>
High[ix] = memRates.High;<font></font>
Low[ix] = memRates.Low;<font></font>
Close[ix] = memRates.Close;<font></font>
<font></font>
}<font></font>
<font></font>
public
override
void
Calculate(
int
index)<font></font>
{<font></font>
if
(ResetOpenOnNewTradingDay)<font></font>
{<font></font>
if
(IsNewSession(MarketSeries.OpenTime[(index > 0) ? (index - 1) : index], MarketSeries.OpenTime[index]))<font></font>
{<font></font>
cOLHCV.Clear();<font></font>
mOLHCV.Clear();<font></font>
pOLHCV.Clear();<font></font>
memRates.Copy(mOLHCV);<font></font>
}<font></font>
}<font></font>
<font></font>
if
(IsRealTime)<font></font>
{<font></font>
if
(!coreOK)<font></font>
{<font></font>
ChartObjects.DrawText(
"TrialOverMsg"
,
"MedianRenko Indicator - Trial period ended. Please purchase a license file at www.az-invest.eu"
, StaticPosition.Center, Colors.White);<font></font>
return
;<font></font>
}<font></font>
<font></font>
if
(NewBar(index))<font></font>
{<font></font>
shiftBars(0);<font></font>
<font></font>
Open[index - BricksToShow - 1] =
double
.NaN;<font></font>
High[index - BricksToShow - 1] =
double
.NaN;<font></font>
Low[index - BricksToShow - 1] =
double
.NaN;<font></font>
Close[index - BricksToShow - 1] =
double
.NaN;<font></font>
}<font></font>
<font></font>
OLHCV.Open = MarketSeries.Close[index];<font></font>
OLHCV.Low = MarketSeries.Close[index];<font></font>
OLHCV.High = MarketSeries.Close[index];<font></font>
OLHCV.Close = MarketSeries.Close[index];<font></font>
OLHCV.OpenTime = MarketSeries.OpenTime[index];<font></font>
OLHCV.TickVolume = 1;<font></font>
<font></font>
<font></font>
ProcessMarketData(OLHCV);<font></font>
UpdateLastBar(index);<font></font>
}<font></font>
else
<font></font>
{<font></font>
OLHCV.Open = MarketSeries.Open[index];<font></font>
OLHCV.Low = MarketSeries.Low[index];<font></font>
OLHCV.High = MarketSeries.High[index];<font></font>
OLHCV.Close = MarketSeries.Close[index];<font></font>
OLHCV.OpenTime = MarketSeries.OpenTime[index];<font></font>
OLHCV.TickVolume = MarketSeries.TickVolume[index];<font></font>
<font></font>
if
(ApplyOffsetToFirstBar && !appliedOffset)<font></font>
{<font></font>
OLHCV.Open = OffsetValue * Symbol.TickSize + Math.Floor(OLHCV.Open / barSize) * barSize;<font></font>
appliedOffset =
true
;<font></font>
}<font></font>
<font></font>
ProcessMarketData(OLHCV);<font></font>
<font></font>
if
(IsLastBar)<font></font>
UpdateLastBar(index);<font></font>
}<font></font>
}<font></font>
<font></font>
private
void
ProcessMarketData(T_OLHCV ___OLHCV)<font></font>
{<font></font>
int
rb_return = core.ProcessMedianRenko(barSize, Retracement, SymmetricalReversals, ___OLHCV,
ref
pOLHCV,
ref
mOLHCV,
ref
cOLHCV, 1);<font></font>
while
(
true
)<font></font>
{<font></font>
if
((rb_return >= 1) && (rb_return <= 4))<font></font>
{<font></font>
pushBars(cOLHCV, IsRealTime);<font></font>
memRates.Copy(mOLHCV);<font></font>
OLHCV.Copy(memRates);<font></font>
<font></font>
cOLHCV.Clear();<font></font>
mOLHCV.Clear();<font></font>
<font></font>
rb_return = core.ProcessMedianRenko(barSize, Retracement, SymmetricalReversals, ___OLHCV,
ref
pOLHCV,
ref
mOLHCV,
ref
cOLHCV, 0);<font></font>
continue
;<font></font>
<font></font>
}<font></font>
else
if
(rb_return == 10)<font></font>
{<font></font>
memRates.Copy(mOLHCV);<font></font>
break
;<font></font>
}<font></font>
else
if
(rb_return == -1)<font></font>
{<font></font>
return
;<font></font>
}<font></font>
else
<font></font>
{<font></font>
throw
new
Exception(
"Unhandled return value = "
+ rb_return);<font></font>
}<font></font>
}<font></font>
<font></font>
if
(IsLastBar && !IsRealTime)<font></font>
{<font></font>
shiftBars(0);<font></font>
}<font></font>
}<font></font>
<font></font>
private
bool
IsNewSession(DateTime prevTime, DateTime currTime)<font></font>
{<font></font>
if
(prevTime.DayOfWeek != currTime.DayOfWeek)<font></font>
return
true
;<font></font>
else
<font></font>
return
false
;<font></font>
}<font></font>
<font></font>
<font></font>
}<font></font>
}<font></font>
<font></font>
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using cAlgo.Indicators;
using System;
using System.Collections.Generic;
using System.Linq;
namespace cAlgo
{
[Indicator("Renko", IsOverlay = true, AutoRescale = true, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
public class Renko : Indicator
{
[Parameter("Renko (Pips)", DefaultValue = 10, MinValue = 0.1, Step = 1)]
public double RenkoPips { get; set; }
[Parameter("Bricks To Show", DefaultValue = 100, MinValue = 1)]
public int BricksToShow { get; set; }
[Parameter("Zoom Level", DefaultValue = 3, MinValue = 0, MaxValue = 5, Step = 1)]
public double ZoomLevel { get; set; }
[Parameter("Bullish Color", DefaultValue = "SeaGreen")]
public string ColorBull { get; set; }
[Parameter("Bearish Color", DefaultValue = "Tomato")]
public string ColorBear { get; set; }
[Output("Open", Color = Colors.DimGray, Thickness = 1, PlotType = PlotType.Points)]
public IndicatorDataSeries Open { get; set; }
[Output("High", Color = Colors.DimGray, Thickness = 1, PlotType = PlotType.Points)]
public IndicatorDataSeries High { get; set; }
[Output("Low", Color = Colors.DimGray, Thickness = 1, PlotType = PlotType.Points)]
public IndicatorDataSeries Low { get; set; }
[Output("Close", Color = Colors.DimGray, Thickness = 1, PlotType = PlotType.Points)]
public IndicatorDataSeries Close { get; set; }
public class Brick
{
public double Open { get; set; }
public double Close { get; set; }
}
private List<Brick> renkos = new List<Brick>();
private double closeLastValue, thickness, renkoPips, renkoLastValue;
private Colors colorBull, colorBear;
private bool colorError;
private int lastCount;
protected override void Initialize()
{
if (!Enum.TryParse<Colors>(ColorBull, out colorBull) || !Enum.TryParse<Colors>(ColorBear, out colorBear))
colorError = true;
renkoPips = RenkoPips * Symbol.PipSize;
thickness = Math.Pow(2, ZoomLevel) - (ZoomLevel > 0 ? 1 : 0);
renkoLastValue = 0;
}
public override void Calculate(int index)
{
if (colorError)
{
ChartObjects.DrawText("Error0", "{o,o}\n/)_)\n \" \"\nOops! Incorrect colors.", StaticPosition.TopCenter, Colors.Gray);
return;
}
if (renkoLastValue == 0)
{
var open = MarketSeries.Open.LastValue;
renkoLastValue = open - (open % renkoPips) + renkoPips / 2;
}
closeLastValue = MarketSeries.Close.LastValue;
while (closeLastValue >= renkoLastValue + renkoPips * 1.5)
{
renkoLastValue += renkoPips;
renkos.Insert(0, new Brick
{
Open = renkoLastValue - renkoPips / 2,
Close = renkoLastValue + renkoPips / 2
});
if (renkos.Count() > BricksToShow)
renkos.RemoveRange(BricksToShow, renkos.Count() - BricksToShow);
if (IsLastBar)
UpdateHistory(index);
}
while (closeLastValue <= renkoLastValue - renkoPips * 1.5)
{
renkoLastValue -= renkoPips;
renkos.Insert(0, new Brick
{
Open = renkoLastValue + renkoPips / 2,
Close = renkoLastValue - renkoPips / 2
});
if (renkos.Count() > BricksToShow)
renkos.RemoveRange(BricksToShow, renkos.Count() - BricksToShow);
if (IsLastBar)
UpdateHistory(index);
}
bool isNewBar = MarketSeries.Close.Count > lastCount;
if (IsLastBar && isNewBar)
{
UpdateHistory(index);
Open[index - BricksToShow] = double.NaN;
High[index - BricksToShow] = double.NaN;
Low[index - BricksToShow] = double.NaN;
Close[index - BricksToShow] = double.NaN;
lastCount = MarketSeries.Close.Count;
}
if (IsRealTime)
UpdateLive(index);
}
private void UpdateHistory(int index)
{
for (int i = 0; i < BricksToShow - 1 && i < renkos.Count() - 1; i++)
{
var color = renkos[i].Open < renkos[i].Close ? colorBull : colorBear;
ChartObjects.DrawLine(string.Format("renko.Last({0})", i + 1), index - i - 1, renkos[i].Open, index - i - 1, renkos[i].Close, color, thickness, LineStyle.Solid);
Open[index - i - 1] = renkos[i].Open;
High[index - i - 1] = Math.Max(renkos[i].Open, renkos[i].Close);
Low[index - i - 1] = Math.Min(renkos[i].Open, renkos[i].Close);
Close[index - i - 1] = renkos[i].Close;
}
}
private void UpdateLive(int index)
{
double y1, y2;
var top = Math.Max(renkos[0].Open, renkos[0].Close);
var bottom = Math.Min(renkos[0].Open, renkos[0].Close);
if (closeLastValue > top)
y1 = top;
else if (closeLastValue < bottom)
y1 = bottom;
else
y1 = closeLastValue;
y2 = closeLastValue;
var colorLive = y1 < y2 ? colorBull : colorBear;
ChartObjects.DrawLine("renko.Live", index, y1, index, y2, colorLive, thickness, LineStyle.Solid);
Open[index] = y1;
High[index] = y1 > y2 ? y1 : y2;
Low[index] = y1 < y2 ? y1 : y2;
Close[index] = y2;
}
}
}
mrhung.tvt
Joined on 10.01.2022
- Distribution: Free
- Language: C#
- Trading platform: cTrader Automate
- File name: Renko.algo
- Rating: 0
- Installs: 555
- Modified: 11/12/2022 03:14
Comments
Thank you very much. exhibit of sorrows This information is really useful for me and I want to tell you that the article is great
The code initializes the indicator by checking if the Median Renko core is working properly and setting the bar size based on the input parameter. It also initializes variables for storing the previous and current OHLCV (Open, High, Low, Close, and Volume) values and the list of bars. tunnel rush