Super Combo Day Trading 2020: System redesigned!

Aug 2, 2022 | EasyLanguage, General

Super Combo Day Trading 2020: System redesigned!

It seems to us that his approaches are excellent and can help us create our own strategies, by understanding the codes that he presents to us, the article was translated by our team, then we leave you with the EasyLanguage code for the redesigned Super Combo Day Trading 2020 System:

If you have some spare time and want to build your own Frankenstein monster from a bin of parts, this is your chance. The Super Combo Day Trading System was originally published in my book “Building Winning Trading Systems” in 2001. I designed it to be more of a tutorial than a pure trading system. You should be able to find the spare parts you need to create your own day trading system. In 2001, he wanted to show how to control and monitor different input and output techniques in a complete algorithm.

The system was designed to operate in the day with the large SP and the results at that time looked promising. Since the transition to ES and the higher levels of volatility we’ve seen over the years and the adoption of night trading, the system hasn’t fared as well, but the concepts remain viable as a teaching tool both today and today. 20 years ago. EasyLanguage has been improved during this period of time, so the Super Combo coding can definitely take advantage of the new improvements. These are the main premises of logic:

* Take advantage of a be Easier (easy buy) and short Easier (easy sell) pattern configuration

* Incorporate daily and 5-minute time frames on a single chart

* Include breakOut, failed BreakOut, and reverseOnLiquidation trade entry techniques

* Monitor which signal is currently online and apply the correct output signal

* Control the profit and incorporate a break even stop (equilibrium stop)

* Control the time and incorporate a trailing stop

* Provide an interface into the logic through the inputs

Well, here we go – there’s quite a bit of code to look at and understand, so let’s break it up and take advantage of it by looking at just one module at a time. This first module includes the inputs and variables section plus the daily calculations:

[LegacyColorValue = true]; 

{Super Combo by George Pruitt - redo 2020
 This intra-day trading system will illustrate the multiple data
 handling capabilities of TradeStation.  All pertinent buy and sell
 calculations will be based on daily bars and actual trades will be
 executed on 5-min bars.  I have made most of the parameters input
 variables}

 Inputs:waitPeriodMins(30),initTradesEndTime(1430),liqRevEndTime(1200),
 	thrustPrcnt1(0.30),thrustPrcnt2(0.60),breakOutPrcnt(0.25),
	failedBreakOutPrcnt(0.25),protStopPrcnt1(0.30),protStopPrcnt2(0.20),
	protStopAmt(3.00),breakEvenPrcnt(0.50),avgRngLength(10);
	
Variables:averageRange(0),canTrade(0),buyEasierDay(FALSE),
	sellEasierDay(FALSE),buyBOPoint(0),sellBOPoint(0),longBreakPt(0),
	shortBreakPt(0),longFBOPoint(0),shortFBOPoint(0),barCount(0),buysToday(0),
	sellsToday(0),mp(0),longLiqPoint(0),shortLiqPoint(0),
	longLiqPoint1(0),shortLiqPoint1(0),intraTradeHigh(0),intraTradeLow(999999);


{Just like we did in the psuedo code -- let's start out with the daily 
 bar calculations.  If Date <> Date[1] -- first bar of day}
if(Date <> Date[1]) then {save time by doing these calculations once per day}
begin
 	averageRange = Average(Range,10) of Data2; {Data 2 points to daily bars}
 	
	canTrade = 0;
    if range of data2 < averageRange then canTrade = 1;

	{use close of data2 - seems to be more accurate than CloseD(1)
	buyEasierDay =Close of Data2 >= Close[1] of Data2;
	sellEasierDay = Close of Data2 <  Close[1] of Data2;

	buyBOPoint = Open + thrustPrcnt1*averageRange;
	sellBOPoint= Open - thrustPrcnt2*averageRange;
	
	if(sellEasierDay) then
	begin
		sellBOPoint= Open - thrustPrcnt1*averageRange;
		buyBOPoint = Open + thrustPrcnt2*averageRange; 
	end;

	longBreakPt = HighD(1) + breakOutPrcnt*averageRange;
	shortBreakPt=  LowD(1) - breakOutPrcnt*averageRange;

	shortFBOPoint = HighD(1) - failedBreakOutPrcnt*averageRange;
	longFBOPoint=  LowD(1) + failedBreakOutPrcnt*averageRange;

{Go ahead and initialize any variables that we may need later on in the day}
	
	barCount = 0;
	buysToday = 0;sellsToday = 0;{You can put multiple statements on one line}	
end;

First Modules of SuperCombo 2020

Here I am just setting up the inputs and variables that I will need to run the algorithm. If you are using D data then the following code:

if date <> date[1] then

is a valid check for the first bar of the day. A new date will represent the beginning of the next day. The code controlled by this if-then function is only executed once a day. So if you can put most of the daily calculations in here then this should speed things up. The first thing I do is calculate the average range of the last 10 daily bars. I access this date from data2. You can build a loop and accumulate the difference between the HighD and LowD function calls:

  1. for i = 1 to 10 begin
  2. sum = sum + (HighD(i) – LowD(i));
  3. end;

The HighD() and LowD() functions are EasyLanguage enhancements that can help eliminate the need for a multiple data graph. However, if you do this, you’ll get a warning message that it doesn’t make sense. I’ve done it and it seems to work, but to be safe just use Data2. Next, I determine if there has been a tight range or range compression by comparing yesterday’s range to the averageRange.

If so, then I allow the negotiation. This is an old filter that looks for range expansion after compression. The concept of a buyDay and sellDay originated in the 1930s by George W. Cole (correct me if I’m wrong). I use this idea by comparing the closing ratios of the two previous bars. If there has been a bullish close, then I consider the next day to be a buyEasier day. If the opposite is true, then it’s a sellEasier day.

This system is not unidirectional and allows you to buy and sell in the same session, hence the word easier (Easier). I then calculate the levels that, if the market reaches, are expected to trigger a short-term trend in that direction. This is the once highly respected open range breakout or ORBO (Open Range Break Out). This methodology has lost its luster in the last 10 years or so due to overnight trading and allowing pent-up buying and selling to be expressed in overnight sessions. Twenty years ago it was still viable. The following code snippet creates the breakout levels based on the buyEasier or sellEasier days. Thrust is calculated by multiplying the range by thrustPrcnt1 and thrustPrcnt2.

So that’s method 1 – the breakout. I expect the market to break out and continue to the close. I wish it was that easy. Since it is not, the second methodology, FailedBreakOut, is calculated. This is also known as “ClearOut” trading. The market is pushed to take out all the buy stops and then pulled back for the pros to feast on the amateurs. SuperCombo tries to take advantage of this by calculating two points to determine a failed breakout. On the long side, it is the two points that the market rises to and then falls again. If the market breaks the longBreakPt, then look to sellShort at the shortFBOPoint. Here is the following module:

{Now we are going to trade and manage in 5 minute bars}
barCount = barCount + 1; {count the number of intraday data bars} if(barCount >= waitPeriodMins/BarInterval and canTrade = 1) then {Have we waited long enough?} begin if(MarketPosition = 1) then buysToday = 1; if(MarketPosition =-1) then sellsToday= 1; if(buysToday = 0 and Time < initTradesEndTime) then Buy("LBreakOut") next bar at buyBOPoint stop; if(sellsToday= 0 and Time < initTradesEndTime) then SellShort("SBreakout") next bar at sellBOPoint stop; if(highD(0) > longBreakPt and sellsToday = 0 and Time < initTradesEndTime) then SellShort("SfailedBO") next bar at shortFBOPoint stop; if(lowD(0) < shortBreakPt and buysToday = 0 and Time < initTradesEndTime) then Buy("BfailedBO") next bar at longFBOPoint stop;

Tracking market action and placing corresponding trades

if(barCount>= waitPeriodMins/BarInterval and canTrade = 1) then

It forces the logic to flow only if canTrade is 1 and we have waited for the amateur hour to complete, well 30 minutes to be exact. Is the first hour really the amateur hour? I don’t think this applies, but if you think so, this is how trading is controlled before the end of this period. Dividing by BarInterval and counting each bar you can generalize this code for any period of time. If MarketPosition is 1 then you know you entered a long position and the opposite is true for short positions. Only place exit orders if the time is less than initTradesEndTime.
If the market breaks into the Long and ShortBreakPts, then be prepared to take advantage of a failed breakout. You can only go short if you haven’t already entered a short position – same for longs. Thus, this logic places the breakOut and failedBreakOut commands. Next, we move on to the last module:

{The following module keeps track of positions and places protective stops}
mp = marketPosition; if(MarketPosition = 1) then begin longLiqPoint = EntryPrice-protStopPrcnt1*averageRange; longLiqPoint = MinList(longLiqPoint,EntryPrice - protStopAmt); longLiqPoint1 = EntryPrice - protStopPrcnt2*averageRange; longLiqPoint1 = MinList(longLiqPoint1,EntryPrice - protStopAmt); if Maxpositionprofit >= breakEvenPrcnt*averageRange*bigPointValue then begin longLiqPoint = EntryPrice; {Breakeven trade} longLiqPoint1 = EntryPrice; {Breakeven trade} end; if(Time >= initTradesEndTime) then begin longLiqPoint = MaxList(longLiqPoint,Lowest(Low,3)); {Trailing stop} longLiqPoint1 = MaxList(longLiqPoint1,Lowest(Low,3)); {Trailing stop} end; if(Time < liqRevEndTime and sellsToday = 0 and longLiqPoint <> EntryPrice and BarsSinceEntry >= 4) then SellShort("LongLiqRev") next bar at longLiqPoint stop; Sell("LongLiq-BO") from entry("LBreakOut") next bar at longLiqPoint stop; Sell("LongLiq-FBO") from entry("BFailedBO") next bar at longLiqPoint stop; Sell("LongLiq-RLoss") from entry("ShortLiqRev") next bar at longLiqPoint1 stop; end; if(MarketPosition =-1) then begin shortLiqPoint = EntryPrice+protStopPrcnt1*averageRange; shortLiqPoint = MaxList(shortLiqPoint,EntryPrice + protStopAmt); shortLiqPoint1 = EntryPrice + protStopPrcnt2*averageRange; shortLiqPoint1 = MaxList(shortLiqPoint1,EntryPrice + protStopAmt); if maxPositionProfit >= breakEvenPrcnt*averageRange*bigPointValue then begin shortLiqPoint = EntryPrice; {Breakeven trade} shortLiqPoint1 = EntryPrice; end; if(Time >= initTradesEndTime) then begin shortLiqPoint = MinList(shortLiqPoint,Highest(High,3)); {Trailing stop} shortLiqPoint1 = MinList(shortLiqPoint1,Highest(High,3)); {Trailing stop} end; if(Time < liqRevEndTime and buysToday = 0 and shortLiqPoint <> EntryPrice and BarsSinceEntry >= 4) then Buy("ShortLiqRev") next bar at shortLiqPoint stop; BuyToCover("ShortLiq-BO") from entry("SBreakOut") next bar at shortLiqPoint stop; BuyToCover("ShortLiq-FBO") from entry("SFailedBO") next bar at shortLiqPoint stop; BuyToCover("ShortLiq-RLoss") from entry("LongLiqRev") next bar at shortLiqPoint1 stop; end; end; SetExitOnClose;

TradeManagement (Enter Stop Loss or not?)

This code looks a bit cumbersome, but it’s not. Let’s just look at the logic of the long side to save time at this point. Let’s first calculate the LongLiqPoints (1 and 2.) Twenty years ago I thought it would be better to have a smaller stop for entries that occur on a Sell-Reversal. Oh yeah, that code is here too. Back in the day I wanted to make sure the stop was at least 3 points – ha ha ha – no, really, I’m serious. Really. Stop laughing! That code could be removed.
After calculating these two points I start to monitor the profit and if it reaches a predetermined level I take the longLiqPoints to a BreakEven stop. If you are lucky enough to still be in a trade after initTradesEndTime, then I start to place the stop at the low of the last 3 five minute bars – I don’t want to turn a small winner into a loser. Now this is the fun.

  1. if (Time < liqRevEndTime and sellsToday = 0 and
      longLiqPoint <> EntryPrice and BarsSinceEntry >= 4) then
  2. SellShort(“LongLiqRev”) next bar at longLiqPoint stop;

If the time is less than liqRevEndTime and BarsSinceEntry, then invest in the market and go short the price set for the longLiqPoint stop. Do this instead of liquidating. I thought that if the market reverses course quickly, then I want to take advantage of this counter-trend move. Removing this to see if it has any impact would be where I would start playing around with the template. Good, now settlements based on the Ticket take place next. If I am long a “ShortLiqRev”, then I use longLiqPoint1 instead of longLiqPoint. Ok the last part was the kitchen sink.

Now you have enough code to make your own day trading system – really too much code, but you should be able to piece something together from these parts. Let me know if you were able to create your own Frankenstein monster. I am going to update the parameters to see if there is any hope for the system as a whole. Keep checking back for updated performance metrics. Greetings to all and be careful.

Below you will find the link to an article created by George Pruitt “A tribute to Murray and his intermarket investigation”

With this we conclude the article on building your own Frankenstein monster from a container of EasyLanguage parts of the Super Combo Day Trading System 2020. We hope this information has been useful to you.

Thanks for visiting us!

This article was written by George Pruitt
and published on his blog on March 31, 2020.

Quantified Models Youtube Channel

On our YouTube channel we have several videos available that you may find very useful for developing trading systems. To access, click this link: Quantified Models YouTube Channel

We hope this information has been useful to you.

Subscribe to our Newsletter

Join our mailing list to receive the latest news and updates from Quantified Models team.

Subscribe to our Newsletter

You have Successfully Subscribed!

Skip to content