King Keltner Source Code

Looking for a trend follower – give this one a try!

[LegacyColorValue = true];

{King Keltner Program
King Keltner by George Pruitt -- based on trading system presented by Chester Keltner
-- an example of a simple, robust and effective strategy}

Inputs: avgLength(40),atrLength(40);
Vars: upBand(0),dnBand(0),liquidPoint(0),movAvgVal(0);

movAvgVal = Average((High + Low + Close)/3.0,avgLength);
upBand = movAvgVal + AvgTrueRange(atrLength);
dnBand = movAvgVal - AvgTrueRange(atrLength);

{Remember buy stops are above the market and sell stops are below the market
-- if the market gaps above the buy stop, then the order turns into a market order
vice versa for the sell stop}

if(movAvgVal < movAvgVal) then Sell("KKSell")tomorrow at dnBand stop;

liquidPoint = movAvgVal;

if(MarketPosition = 1) then Sell tomorrow at liquidPoint stop;
if(MarketPosition =-1) then BuyTocover tomorrow at liquidPoint stop;

Pyramaniac

Code to pyramid up to N contracts on a day trade basis.

input: maxSize(5),startTime(1000),endTime(1555);
var: stb(0),sts(0),tpAmt(0),lprft(0),sprft(0);

stb = High + minMove/priceScale;
sts = Low - minMove/priceScale;

print(date," ",time," ",stb," ",sts," ",currentShares);

if (time > startTime and time < endTime ) then
begin
tpAmt = average(range,10);
if(high>high) then lprft = highD(0)+1*tpAmt;
if(low < low) then sprft = lowD(0) -1*tpAmt;
if(currentShares < maxSize and c < average(c,9) and low < low and close < close) then buy("pyrabuy")next bar at sts limit;
if(currentShares < maxSize and c < average(c,9) and high >high and close > close) then sellShort("pyrasell") next bar at stb limit;

end;

//if(currentShares >= maxSize and marketPosition = 1) then sell("longmaxliq") next bar sts stop;
//if(currentShares >= maxSize and marketPosition =-1) then buyToCover("shortmaxliq") next bar stb stop;
if(marketPosition = 1) then sell("longProf") next bar lprft limit;
if(marketPosition =-1) then buytoCover("shortProf") next bar at sprft limit;
setexitonclose;

Final Version of Geo’s Turtle with Virtual Trading

Final version posted below. A little advanced but if you can follow and make sense of it then you are well along on becoming an EasyLanguage programmer.

inputs: absEntryChanLen(55),entryChanlen(20),exitChanLen(10),

virtLongLiqPrice(0),virtShortLiqPrice(0),
virtLongLoss(0),virtShortLoss(0),
myFillPrice(0),N(0),N\$(0),dollarRisk(0),lotSize(0),
hh20(0),hh55(0),ll20(0),ll55(0),iCnt(0),initPrice(0),stopLossPts(0),debug(false);

mp = marketPosition;

if mp = 0 then
begin
N = AvgTrueRange(20);
N\$ = N*BigPointValue;
lotSize = IntPortion(DollarRisk/N\$);
if lotSize < 1 then lotSize = 1;
StopLoss = 2 * N\$ * lotSize;
StopLossPts = 2 * N * lotSize;
hh20 = highest(high,entryChanLen);
hh55 = highest(high,absEntryChanLen);
ll20 = lowest(low,entryChanLen);
ll55 = lowest(low,absEntryChanLen);
end;

If mp <> 1 and mp = 1 then
Begin
if debug then
" ExitPrice ",ExitPrice(1):6:6," entryPrice ",entryPrice(1):6:6);
end;
If mp <> -1 and mp = -1 then
Begin
if debug then
" mp ",mp," ",mp);
end;

Begin
if debug then
print(date," In Virtual Section And VirtTmp = ",virTmp);
If(virtmp = 1) then
Begin
virtLongLiqPrice = maxList(lowest(low,exitChanLen),virtLongLoss);
if(virtualLongExit(virtLongLiqPrice,1,myFillPrice) =1) then
Begin
virtmp = 0;
if debug then print(" Long Exit @ ",myFillPrice);
end;
end;
If(virtmp = -1) then
Begin
virtShortLiqPrice = minList(highest(high,exitChanLen),virtShortLoss);
if(virtualShortExit(highest(high,exitChanLen),1,myFillPrice) =1) then
Begin
virtmp = 0;
if debug then print(" ShortExit @ ",myFillPrice);
end;
end;
Begin
if virtmp <> 1 then
begin
virtLongLoss = myFillPrice - 2*N;
virtmp = 1;
if debug then print(" Long @ ",myFillPrice);
end;
end;
if(virtualSell(lowest(low,entryChanLen),1,myFillPrice) = 1) then
Begin
if virtmp <> -1 then
begin
virtsellPrice = myFillPrice;
virtShortLoss = myFillPrice + 2*N;
virtmp = -1;
if debug then print(" Short @ ",myFillPrice);
end;
end;
if debug then print("End of Virtual Module : virTmp = ",virTmp);
end;

for iCnt = 0 to 3
begin
begin
if mp <> -1 and currentContracts = iCnt * lotSize then
begin
buyPrice = hh20 + iCnt * N/2;
end;
if mp <> 1 and currentContracts = iCnt * lotSize then
begin
sellPrice = ll20 - iCnt * N/2;
end;
virTmp = 0;
end;

begin
if mp <> -1 and currentContracts = iCnt * lotSize then
begin
buyPrice = hh55 + iCnt * N/2;
end;
if mp <> 1 and currentContracts = iCnt * lotSize then
begin
sellPrice = ll55 - iCnt * N/2;
end;
//		virTmp = 0;
end;
end;

begin
if currentContracts < 4 * lotsize then Sellshort ("Turtle20Sell") lotsize contracts next bar at sellPrice stop;
if currentContracts < 4 * lotsize and debug then print(date," 20sellPrice ",sellPrice:6:6," ",currentContracts);
end;