Ok, wat ik heb veranderd t.o.v. de vorige keer:
- ADX toegevoegd, moet boven het ingestelde level zijn voor een entrysignaal
- het entrysignaal moet op de eerste bar komen die een timestamp >= de ingestelde tijd heeft, latere bars worden niet beoordeeld
Code: Selecteer alles
{- Filename: Bakstenen MA system -}
type
TState = (stNone, stLong, stShort);
var
State: TState;
nMA, nADX, nMinADX, nMAType, i, LastDay, TradeCount: integer;
tOpen, tClose, BarTime: TDateTime;
nSL, nTP, SL, TP: real;
sMA, sADX: TSeries;
xMA: TLineCrossings;
begin
{ Parameters }
nMA := CreateParameterInteger('MA periode', 1, 999, 14, true);
nMAType := CreateParameterSelect('MA type', 'Gewone MA'#9'Exponentiële MA'#9'Gewogen MA', 0, true);
nADX := CreateParameterInteger('ADX periode', 1, 999, 14, true);
nMinADX := CreateParameterInteger('ADX entry level', 0, 100, 25, true);
nSL := CreateParameterReal('Stoploss (pt)', 0, 999, 20, true);
nTP := CreateParameterReal('Take profit (pt)', 0, 999, 30, true);
tOpen := CreateParameterTime('Entry vanaf', 9/24);
tClose := CreateParameterTime('Exit na', 17.5/24);
{ Indicator eigenschappen }
with Indicator do
begin
RequiredBars := 5*(nMA+nADX);
NewBand := false;
ScaleRange := srCommon;
SignalView := svShowInMain;
AdvancedTrades := true;
end;
{ Berekening }
case nMAType of
1: sMA := MA(Close, maExponential, nMA);
2: sMA := MA(Close, maWeighted, nMA);
else sMA := MA(Close, maSimple, nMA);
end;
sADX := ADX(High, Low, Close, nADX);
{ Signalen }
xMA := Crossings(Close, sMA);
for i:=MaxInt(FirstValidIndex(sMA), FirstValidIndex(sADX)) to BarCount-1 do
begin
BarTime := frac(DateTime[i]);
if (trunc(DateTime[i]) <> LastDay) or (BarTime < tOpen) then
begin
TradeCount := 0;
LastDay := trunc(DateTime[i]);
if BarTime < tOpen then BarTime := 2; // forceer exit indien open positie
end;
begin
case State of
stLong:
begin
if (nSL > 0) and (Low[i] < SL) then
begin
ExitLongStop(i, SL);
State := stNone;
end else
if (nTP > 0) and (High[i] > TP) then
begin
ExitLongLimit(i, TP);
State := stNone;
end else
if BarTime >= tClose then
begin
ExitLong(i);
State := stNone;
end;
end;
stShort:
begin
if (nSL > 0) and (High[i] > SL) then
begin
ExitShortStop(i, SL);
State := stNone;
end else
if (nTP > 0) and (Low[i] < TP) then
begin
ExitShortLimit(i, TP);
State := stNone;
end else
if BarTime >= tClose then
begin
ExitShort(i);
State := stNone;
end;
end;
end;
if (TradeCount=0) and (BarTime >= tOpen) and (BarTime <= tClose) then
begin
TradeCount := TradeCount+1;
if (sADX[i] > nMinADX) and (Close[i] > sMA[i]) then
begin
if EnterLong(i) then
begin
State := stLong;
SL := Close[i] - nSL;
TP := Close[i] + nTP;
end;
end else
if (sADX[i] > nMinADX) and (Close[i] < sMA[i]) then
begin
if EnterShort(i) then
begin
State := stShort;
SL := Close[i] + nSL;
TP := Close[i] - nTP;
end;
end;
end;
end;
end;
{ Weergave }
with CreateLine(sMA) do
begin
Name := 'MA';
Color := clYellow;
end;
end.
---
Eric