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.
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.

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
);