Improved Turtle Trader Strategy

barbaros

Administrator
Staff member
Another one from https://relaxedtrader.com/original-turtle-trading-rules/

Original Turtle Trader strategy was put into action in 1983 by Richard Dennis and William Eckhardt. This strategy doesn't work too well in the current market conditions. However, it can be used as a starting point and improved on.

Modern Turtle Trading Rules:

Buy if
moving_average_1 > moving_average_2 and
moving_average_2 > moving_average_3 and
Close is above highest close in 12 days
Sell if
Close is below lowest close in 5 days
Stop
10 ATR from entry price

Converted Thinkscript is below. I am not getting the exact returns as the original author.

xjZNP61.png


Code:
# Modern Turle Trader Strategy
# Free for use. Header credits must be included when any form of the code included in this package is used.
# v1.0 - barbaros - converted for b4signals.com

input MoneyManagement = yes;
input RiskPercent = 10;
input MaxLeverage = 10;
input ContractsSet = 1;

input BuyPeriods = 12;
input SellPeriods = 5;
input MovingAverage = 20;
input StopATR = 10;
input atrPeriods = 39;

input InitialBalance = 100000;
input targetWinRate = 1;
input targetWinLoss = .50;

def atr = Average(AbsValue(close - close[1]), atrPeriods);

plot ma1_long3 = Average(close, MovingAverage);
plot ma2_long3 = Average(ma1_long3, MovingAverage);
plot ma3_long3 = Average(ma2_long3, MovingAverage);

def FPL = FloatingPL();
def entry = EntryPrice();

def portfolioSize = if !isNaN(FPL) then FPL + initialBalance else initialBalance;
def contractsToTradeRT = ((riskPercent * 0.01) * portfolioSize) / (atr * 2.6);
def contgractsToTradeCalc = if contractsToTradeRT * close > portfolioSize * MaxLeverage then (portfolioSize * MaxLeverage) / close else contractsToTradeRT;
def contractsToTrade = if MoneyManagement then contgractsToTradeCalc else ContractsSet;

def buyCond = ma1_long3 > ma2_long3 and ma2_long3 > ma3_long3 and close >= ma2_long3 and close >= highest(close, BuyPeriods);
def sellCond = close <= lowest(close, SellPeriods);

def direction = if BarNumber() == 1 then 0
                else if direction[1] == 0 and  buyCond and !buyCond[1] and contractsToTrade > 0 then 1
                else if direction[1] == 1 and sellCond then 0
                else direction[1];

def stop_price = if BarNumber() == 1 then close else if direction crosses 0 then close - (StopATR * atr) else stop_price[1];

AddOrder(OrderType.BUY_TO_OPEN, direction crosses above 0 and contractsToTrade > 0, tradeSize = contractsToTrade, name = "LONG");
AddOrder(OrderType.SELL_TO_CLOSE, direction crosses below 1, name = "EXIT");
AddOrder(OrderType.SELL_TO_CLOSE, close crosses below stop_price, name = "STOP");

#Global Scripts
script incrementValue {
    input condition = yes;
    input increment =  1;
    input startingValue = 0;

    def _value = CompoundValue(1,
                if condition
                then _value[1] + increment
                else _value[1], startingValue);

    plot incrementValue = _value;
}
;

# Entry Calculations.  Note: Only parses on a Strategy Chart
def bn = if !IsNaN(close) and !IsNaN(close[1]) and !IsNaN(close[-1]) then BarNumber() else bn[1];

def entryPrice = if !IsNaN(entry)
                then entry
                else entryPrice[1];

def hasEntry = !IsNaN(entry);

def isNewEntry = entryPrice != entryPrice[1];

#is active trade
def highFPL = HighestAll(FPL);
def lowFPL = LowestAll(FPL);

def fplreturn = (FPL - FPL[1]) / FPL[1];
def cumsum = Sum(fplreturn);

def highBarNumber = CompoundValue(1, if FPL == highFPL
                                    then bn
                                    else highBarNumber[1], 0);

def lowBarNumber = CompoundValue(1, if FPL == lowFPL
                                then bn
                                else lowBarNumber[1], 0);

#Win/Loss ratios
def entryBarsTemp = if hasEntry
                then bn
                else Double.NaN;

def entryBarNum = if hasEntry and isNewEntry
                then bn
                else entryBarNum[1];

def isEntryBar = entryBarNum != entryBarNum[1];

def entryBarPL = if isEntryBar
                then FPL
                else entryBarPL[1];

def exitBarsTemp = if !hasEntry
                and bn > entryBarsTemp[1]
                then bn
                else Double.NaN;

def exitBarNum = if !hasEntry and !IsNaN(exitBarsTemp[1])
                then bn
                else exitBarNum[1];

def isExitBar = exitBarNum != exitBarNum[1];

def exitBarPL = if isExitBar
            then FPL
            else exitBarPL[1];

def entryReturn = if isExitBar then exitBarPL - exitBarPL[1] else entryReturn[1];
def isWin = if isExitBar and entryReturn >= 0 then 1 else 0;
def isLoss = if isExitBar and entryReturn < 0 then 1 else 0;
def entryReturnWin = if isWin then entryReturn else entryReturnWin[1];
def entryReturnLoss = if isLoss then entryReturn else entryReturnLoss[1];
def entryFPLWins = if isWin then entryReturn else 0;
def entryFPLLosses = if isLoss then entryReturn else 0;
def entryFPLAll = if isLoss or isWin then entryReturn else 0;

#Counts
def entryCount = incrementValue(entryFPLAll);
def winCount = incrementValue(isWin);
def lossCount = incrementValue(isLoss);

def highestReturn = if entryReturnWin[1] > highestReturn[1]
                then entryReturnWin[1]
                else highestReturn[1];

def lowestReturn = if entryReturnLoss[1] < lowestReturn[1]
                then entryReturnLoss[1]
                else lowestReturn[1];


def winRate = winCount / lossCount;
def winLossRatio = winCount / (winCount + lossCount); # winCount / entryCount;
def avgReturn = TotalSum(entryFPLAll) / entryCount;
def avgWin = TotalSum(entryFPLWins) / winCount;
def avgLoss = TotalSum(entryFPLLosses) / lossCount;

#Labels

AddLabel(yes,
        text = "Total Trades: " + entryCount + "  ",
        color = Color.WHITE
        );

AddLabel(yes,
        text = "WinCount: " + winCount +
            " | LossCount: " + lossCount +
            " | WinRate: " + Round(winRate, 2) + "  ",
        color = if winRate >= targetWinRate
                then Color.CYAN
                else Color.MAGENTA
        );

AddLabel(yes,
        text = "W/L: " + AsPercent(winLossRatio) + " ",
        color = if winLossRatio > targetWinLoss
                then Color.CYAN
                else Color.MAGENTA
        );

AddLabel(yes,
        text = "AvgReturn: " + AsDollars(avgReturn) +
            " | AvgWin: " + AsDollars(avgWin) +
            " | AvgLoss: " + AsDollars(avgLoss) + "   ",
        color = if avgReturn >= 0
                then Color.CYAN
                else Color.MAGENTA
        );

AddLabel(yes,
        text = "Total Profit: " + AsDollars(FPL) + "  ",
        color = if FPL > 0
                then Color.CYAN
                else Color.MAGENTA
    );

AddLabel(yes,
        text = "Final Portfolio: " + AsDollars(portfolioSize) + " (" + AsPercent(portfolioSize / initialBalance) + ")  ",
        color = if portfolioSize > initialBalance
                then Color.CYAN
                else Color.MAGENTA
    );
 

Dukester021

New member
Good morning, this strategy script alerts with a signal the day after the criterial is met - right?

So to action the alert I would need to watch the open?

Thanks
 

barbaros

Administrator
Staff member
Good morning, this strategy script alerts with a signal the day after the criterial is met - right?

So to action the alert I would need to watch the open?

Thanks
That is correct. It will confirm entries after the bar is closed.
 
Top