All posts by George Pruitt

George Pruitt - Author - Blogger - Programmer - Technician Bachelor of Science in Computer Science from UNC-Asheville Levo Oculos Meos In Montes

Welles Wilder’s smoothing = XAVG(PeriodLen*2-1)

I was referred to a very excellent blog http://etfhq.com/ and wanted to confirm that Welles Wilder’s trick (ease of calculating) smoothing algorithm was indeed equivalent to an exponential moving average but twice the length – 1.  This blog by Derry Brown is worth taking a look at.

Here is my TS code for verify the length difference between WellesSmooth and Exp. Smooth:

{Test for equivelance}

if currentBar = 1 then
begin
value1 = average(c,14);
end;

if currentBar > 1 then
begin
value1 = (13*value1+c)/14; //Wells Wilder Smoothing
end;

plot1(value1,"WSMA",red);
plot2(xaverage(c,14),"XMA",blue);
plot3(xaverage(c,27),"2X-1XMA",green);

Volatility Break Out Day Trader

Here is a nice template to use when testing a volatility break out system to daytade. Note I haven’t yet finished the filter coding.

{OPEN RANGE BREAK OUT with Trade Management}
{:data1 = 5 minbars
 :data2 = daily bars}
 
inputs: atrLookBack(10),brkOutAmt(.20),initProtStop$(500),profitThresh$(300),percentTrail(0.3),waitNumBars(3),endTradeEntryTime(1430);
inputs: tradeFilterNum(1);
{tradeFilterNum indicates how you want to 
 filter the trades:
 filter #1 : prior day was a narrow range
 filter #2 : prior day was a NR4
 filter #3 : buy/sell day only base on today's open
 filter #4 : combo of filter #1 and filter #3
 filter #5 : combo of filter #2 and filter #3 
 }


vars: buysToday(0),sellsToday(0),atrVal(0),todaysOpen(0),canBuy(false),canSell(false);
vars: trailLong(false),trailShort(false),trailLongStop(0),trailShortStop(999999);
vars: myBuysToday(0),mySellsToday(0);
if tradeFilterNum = 1 then
begin
	canBuy = false;
	canSell = false;
	if range of data2 < avgTrueRange(atrLookBack) of data2 and time < endTradeEntryTime then
	begin
		canBuy = true;
		canSell = true;
	end;
end; 

if date <> date[1] then
begin
	todaysOpen = open; {Capture Today's Open}
	trailLongStop = 0;
	trailShortStop = 9999999;
	myBuysToday = 0;
	mySellsToday = 0;
end;

if marketPosition = 1 then myBuysToday = 1;
if marketPosition = -1 then mySellsToday = -1;

atrVal = avgTrueRange(atrLookBack) of data2;

if  canBuy and myBuysToday = 0 and marketPosition <> 1 then buy("BBO") next bar at todaysOpen + atrVal * brkOutAmt stop;
if canSell and mySellsToday = 0 and marketPosition <>-1 then sellshort("SBO") next bar at todaysOpen - atrVal *brkOutAmt stop;

if marketPosition <> 1 then trailLong = false;
if marketPosition <> -1 then trailShort = false;

if marketPosition = 1 then
begin
	sell("LongExit") next bar at entryPrice - initProtStop$/bigPointValue stop;
	if h > entryPrice + profitThresh$/bigPointValue then trailLong = true;
	if trailLong then
	begin
		trailLongStop = maxList(trailLongStop,h - (h - entryPrice)*percentTrail);
		sell("LongTrail") next bar at trailLongStop stop;
	end;
end;

if marketPosition = -1 then
begin
	buyToCover("ShrtExit") next bar at entryPrice + initProtStop$/bigPointValue stop;
	if l < entryPrice - profitThresh$/bigPointValue then trailShort = true;
	if trailShort then
	begin
		trailShortStop = minList(trailShortStop,l + (entryPrice - l)*percentTrail);
		buyToCover("ShortTrail") next bar at trailShortStop stop;
	end;
end;

setExitOnClose;

{finished}

Zone Analysis System

I posted some research on zone analysis at www.futurestruth/wordpress.com.  Based on this research I created a very simple system framework.  Here is some trade examples and performance results for the past four years.

ZoneWinner

ZoneLoser

ZonePerformance

 

 

 

 

 

//Zone Program by George Pruitt 
// Buy when market opens in zone 1 and dips into zone 3
// Sell when market opens in zone 4 and rises into zone 2

vars: myZone1B(0),myZone2T(0),myZone2B(0),myZone3T(0),myZone3B(0),myzone4T(0);
vars:oz1cz1(0),oz1cz2(0),oz1cz3(0),oz1cz4(0);
vars:oz2cz1(0),oz2cz2(0),oz2cz3(0),oz2cz4(0);
vars:oz3cz1(0),oz3cz2(0),oz3cz3(0),oz3cz4(0);
vars:oz4cz1(0),oz4cz2(0),oz4cz3(0),oz4cz4(0);

vars:myBarCount(0),buysToday(0),sellsToday(0);

inputs: profitAmt$(1000),riskAmt$(500),stopEntryTime(1300);
if date <> date[1] then
begin
	buysToday = 0;
	sellsToday = 0;
	myBarCount = 1;
end;

if(marketPosition = 1) then buysToday = 1;
if(marketPosition =-1) then sellsToday = 1;
	
if date<> date[1] then myBarCount = myBarCount + 1;
myZone1B = highD(1) + minMove/PriceScale;
myZone2T = highD(1);
myZone2B = (highD(1) + lowD(1))/2 + minMove/PriceScale;
myZone3T = (highD(1) + lowD(1))/2;
myZone3B = lowD(1); 
myZone4T = lowD(1) - minMove/PriceScale;


//if openD(0) > myZone1B and low > myZone1B and myBarCount > 1 and sellsToday = 0 and time <> Sess1endtime then sellshort next bar at low stop;
//if openD(0) < myZone4T and high < myZone4T and myBarCount > 1 and buysToday = 0 and time <> Sess1endtime then buy next bar at high stop;

if openD(0) > myZone1B and low < myZone2B and myBarCount > 1 and buysToday = 0 and time < stopEntryTime then buy next bar at low limit;
if openD(0) < myZone4T and high > myZone3T and myBarCount > 1 and sellsToday = 0 and time < stopEntryTime then sellshort next bar at high limit;

myBarCount = myBarCount + 1;
//print(date," ",time," ",buysToday," ",openD(0) > myZone1B and low > myZone1B and myBarCount > 1 and buysToday = 0);
setProfitTarget(profitAmt$);
setStopLoss(riskAmt$);

setExitOnClose;

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[1]) then Buy ("KKBuy") tomorrow at upBand stop;
if(movAvgVal < movAvgVal[1]) 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[1]) then lprft = highD(0)+1*tpAmt;
	if(low < low[1]) then sprft = lowD(0) -1*tpAmt;
	if(currentShares < maxSize and c < average(c,9) and low < low[1] and close < close[1]) then buy("pyrabuy")next bar at sts limit;
	if(currentShares < maxSize and c < average(c,9) and high >high[1] and close > close[1]) 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),
	lastTradeLoserFilter(false),accountSize(100000),riskPerTradePer(.01);

vars:lastTradeLoser(true),mp(0),virtmp(0),tradeProfit(0),
	virtBuyPrice(0),virtSellPrice(0),
	virtLongLiqPrice(0),virtShortLiqPrice(0),
	virtLongLoss(0),virtShortLoss(0),
	myFillPrice(0),N(0),N$(0),dollarRisk(0),lotSize(0),
	stopLoss(0),buyPrice(0),sellPrice(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;  
	dollarRisk = AccountSize * riskPerTradePer; 
	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] = 1 then
Begin
	tradeProfit = ExitPrice(1) - EntryPrice(1);
	lastTradeLoser = true;
	If tradeProfit > 0 then lastTradeLoser = false;	
	if debug then 
		print(date," Long Trader ",tradeProfit*bigPointValue," ",lastTradeLoser,
		" ExitPrice ",ExitPrice(1):6:6," entryPrice ",entryPrice(1):6:6);
end;
If mp <> -1 and mp[1] = -1 then
Begin
	tradeProfit = EntryPrice(1) - ExitPrice(1);
	lastTradeLoser = true;
	If tradeProfit > 0 then lastTradeLoser = false;
	if debug then
		print(date," **** Short Trader ",tradeProfit*bigPointValue," ",lastTradeLoser,
		" mp ",mp," ",mp[1]);	
end;

If lastTradeLoserFilter = False then lastTradeLoser = True;

If lastTradeLoser = False then
Begin
	if debug then
		print(date," In Virtual Section And VirtTmp = ",virTmp); 
	If(virtmp = 1) then
	Begin
	    virtLongLiqPrice = maxList(lowest(low[1],exitChanLen),virtLongLoss);
		if(virtualLongExit(virtLongLiqPrice,1,myFillPrice) =1) then
		Begin
			tradeProfit = myFillPrice - virtBuyPrice;  
			If tradeProfit < 0 then lastTradeLoser = true; 
			virtmp = 0;
			if debug then print(" Long Exit @ ",myFillPrice);
		end;	
	end;		
	If(virtmp = -1) then
	Begin
		virtShortLiqPrice = minList(highest(high[1],exitChanLen),virtShortLoss);
		if(virtualShortExit(highest(high[1],exitChanLen),1,myFillPrice) =1) then
		Begin
			tradeProfit = virtSellPrice - myFillPrice;
			If tradeProfit < 0 then lastTradeLoser = true;
			virtmp = 0;
			if debug then print(" ShortExit @ ",myFillPrice);
		end;
	end;		
	if(virtualBuy(highest(high[1],entryChanLen),1,myFillPrice) = 1) then
	Begin
		if virtmp <> 1 then
		begin
			virtBuyPrice = myFillPrice;
			virtLongLoss = myFillPrice - 2*N;
			virtmp = 1;
			tradeProfit = 0;
			If virtmp[1] = -1 then tradeProfit = virtSellPrice - virtBuyPrice;
			If tradeProfit < 0 then lastTradeLoser = true;
			if debug then print(" Long @ ",myFillPrice);
		end;
	end;
	if(virtualSell(lowest(low[1],entryChanLen),1,myFillPrice) = 1) then
	Begin
		if virtmp <> -1 then
		begin
			virtsellPrice = myFillPrice;
			virtShortLoss = myFillPrice + 2*N;
			virtmp = -1;
			tradeProfit = 0;
			If virtmp[1] = 1 then tradeProfit =  virtBuyPrice - virtSellPrice;
			If tradeProfit < 0 then lastTradeLoser = true;
			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
	if lastTradeLoser then
	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;
	
	if lastTradeLoser = false then
	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;

if lastTradeLoser then 
begin
	if currentContracts < 4 * lotsize then Buy ("Turtle20Buy") lotSize contracts next bar at buyPrice stop;
	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;

if lastTradeLoser = false then
begin
	if currentContracts < 4 * lotsize then Buy ("Turtle55Buy") lotSize contracts next bar at buyPrice stop;
	if currentContracts < 4 * lotsize then Sellshort ("Turtle55Sell") lotsize contracts next bar at sellPrice stop;
	if debug then print(date," ",iCnt," 55sellPrice ",sellPrice:6:6);
end;

If mp = 1 then Sell ("TurtleLExit") next bar at lowest(low,exitChanLen) stop;
If mp = -1 then BuyToCover("TurtleSExit") next bar at highest(high,exitChanLen) stop;

If mp = 1 then Sell ("TurtleLExit2N") next bar at entryPrice - stopLossPts stop;
If mp = -1 then BuyToCover("TurtleSExit2N") next bar at entryPrice + stopLossPts stop;