Code: Selecteer alles
{- Filename: Hurst Oscillator -}
(* ORIGINAL CODE
# Hurst_Oscillator
#
# www.trendxplorer.info
# trendxplorer@gmail.com
#
# Build: July 25, 2012
# Rev 2: July 29, 2012: FlowPrice value to better reflect extremes
#
#
# --- script begin ----
#
declare lower;
input price = hl2;
input length = 10;
input InnerValue = 1.6;
input OuterValue = 2.6;
input ExtremeValue = 4.2;
def displacement = (-length / 2) + 1;
def dPrice = price[displacement];
rec CMA = if !IsNaN(dPrice) then Average(dPrice, AbsValue(length)) else CMA[1] + (CMA[1] - CMA[2]);
#Rev 2: July 29, 2012: improved FlowPrice for better extremes
#def OscValue = if close > close[1] then high else if close < close[1] then low else (high + low)/2;
def OscValue =
if high >= high[1] and low <= low[1]
then
if close >= close[1] # high >= high[2]
then high
else low
else
if high > high[1]
then high
else
if low < low[1]
then low
else
if close > close[1]
then high
else
if close < close[1]
then low
else (high + low) / 2;
plot HurstOsc = (100 * OscValue / CMA) - 100;
HurstOsc.SetDefaultColor(GetColor(1));
HurstOsc.SetLineWeight(2);
plot CenterLine = 0;
plot UpperExtremeBand = ExtremeValue;
plot LowerExtremeBand = - ExtremeValue;
plot UpperOuterBand = OuterValue;
plot LowerOuterBand = - OuterValue;
plot UpperInnerBand = InnerValue;
plot LowerInnerBand = - InnerValue;
CenterLine.SetDefaultColor(GetColor(7));
CenterLine.SetLineWeight(1);
UpperExtremeBand.SetDefaultColor(GetColor(4));
UpperExtremeBand.SetLineWeight(1);
LowerExtremeBand.SetDefaultColor(GetColor(4));
LowerExtremeBand.SetLineWeight(1);
UpperExtremeBand.hide();
LowerExtremeBand.hide();
UpperOuterBand.SetDefaultColor(GetColor(5));
UpperOuterBand.SetLineWeight(1);
LowerOuterBand.SetDefaultColor(GetColor(6));
LowerOuterBand.SetLineWeight(1);
UpperInnerBand.SetDefaultColor(GetColor(5));
UpperInnerBand.SetLineWeight(1);
UpperInnerBand.SetStyle(Curve.SHORT_DASH);
LowerInnerBand.SetDefaultColor(GetColor(6));
LowerInnerBand.SetLineWeight(1);
LowerInnerBand.SetStyle(Curve.SHORT_DASH);
# Turn AddClouds off by putting a #-sign at the first position of the lines
AddCloud(UpperOuterBand, UpperInnerBand, color.red);
AddCloud(LowerInnerBand, LowerOuterBand, color.green);
#
# --- script end ----
#
*)
var
Length, Displacement, i, HiddenBars: integer;
InnerValue, OuterValue, ExtremeValue, CMA, CMA_1, OscValue, Trigger: real;
sPrice, sDPrice, sMA, sOsc, nHigh, nLow, nClose, sTrigger: TSeries;
begin
{ Parameters }
Length := CreateParameterInteger('Periode', 1, 999, 80, true);
InnerValue := CreateParameterReal('Inner value', 0, 999, 1.6, true);
OuterValue := CreateParameterReal('Outer value', 0, 999, 2.6, true);
ExtremeValue := CreateParameterReal('Extreme value', 0, 999, 4.2, true);
HiddenBars := CreateParameterInteger('Hide last n bars', 0, 999, 0, true);
Trigger := CreateParameterReal('Signaal waarde', -10, 10, 0, true);
{ Indicator eigenschappen }
with Indicator do
begin
RequiredBars := 2*Length; // Aantal benodigde koersen om eerste indicatorwaarde te berekenen
NewBand := true; // indicator standaard in nieuwe sectie plaatsen
ScaleRange := srAuto; // indicatorschaal automatisch
end;
{ Berekening }
if HiddenBars > 0 then
begin
nHigh := ShiftSeries(High, HiddenBars);
nLow := ShiftSeries(Low, HiddenBars);
nClose := ShiftSeries(Close, HiddenBars);
end else
begin
nHigh := High;
nLow := Low;
nClose := Close;
end;
sPrice := DivideSeriesBy(AddSeries(nHigh, nLow), 2);
//def displacement = (-length / 2) + 1;
Displacement := trunc(-length/2) + 1;
sDPrice := ShiftSeries(sPrice, Displacement);
//def dPrice = price[displacement];
sMA := MA(sDPrice, maSimple, Length);
//rec CMA = if !IsNaN(dPrice) then Average(dPrice, AbsValue(length)) else CMA[1] + (CMA[1] - CMA[2]);
sOsc := CreateSeries(BarCount);
for i:=FirstValidIndex(nHigh)+1 to BarCount-1 do
begin
CMA_1 := CMA;
if IsNaN(sDPrice[i]) then
CMA := CMA + (CMA-CMA_1)
else
CMA := sMA[i];
if (nHigh[i] >= nHigh[i-1]) and (nLow[i] <= nLow[i-1]) then
begin
if (nClose[i] >= nClose[i-1]) then
OscValue := nHigh[i]
else
OscValue := nLow[i];
end else
if (nHigh[i] >= nHigh[i-1]) then
OscValue := nHigh[i]
else
if (nLow[i] <= nLow[i-1]) then
OscValue := nLow[i]
else
if (nClose[i] > nClose[i-1]) then
OscValue := nHigh[i]
else
if (nClose[i] < nClose[i-1]) then
OscValue := nLow[i]
else
OscValue := (nHigh[i]+nLow[i])/2;
sOsc[i] := (100 * OscValue / CMA) - 100;
end;
if HiddenBars > 0 then
begin
sOsc := ShiftSeries(sOsc, -HiddenBars);
end;
{ Signalen }
sTrigger := FilLSeries(CreateSeries(BarCount), Trigger);
Signals := CrossingsToEntrySignals(Crossings(sOsc, sTrigger));
{ Weergave }
with CreateLine(sOsc) do
begin
Name := 'Hurst Oscillator';
Color := RGB(0, 255, 255);
LineContent := lcTAR;
end;
with CreateLine(FillSeries(CreateSeries(BarCount), 0)) do
begin
Name := '0';
Color := clSilver;
end;
with CreateLine(FillSeries(CreateSeries(BarCount), InnerValue)) do
begin
Name := '+Inner';
Color := clRed;
end;
with CreateLine(FillSeries(CreateSeries(BarCount), -InnerValue)) do
begin
Name := '-Inner';
Color := clLime;
end;
with CreateLine(FillSeries(CreateSeries(BarCount), OuterValue)) do
begin
Name := '+Outer';
Color := clRed;
end;
with CreateLine(FillSeries(CreateSeries(BarCount), -OuterValue)) do
begin
Name := '-Outer';
Color := clLime;
end;
with CreateLine(FillSeries(CreateSeries(BarCount), ExtremeValue)) do
begin
Name := '+Extreme';
Color := clYellow;
end;
with CreateLine(FillSeries(CreateSeries(BarCount), -ExtremeValue)) do
begin
Name := '-Extreme';
Color := clYellow;
end;
with CreateLine(sTrigger) do
begin
Name := 'Trigger';
Color := RGB(255, 128, 0);
end;
FillLinesRegion(2, 4, RGB(128,0,0), RGB(128,0,0), bsSolid);
FillLinesRegion(3, 5, RGB(0,128,0), RGB(0,128,0), bsSolid);
end.