Custom Impulse Strategy

T

Tostechnical

Member
So here is my custom Impulse strategy that is a tweaked version of Elders Impulse System. I was inspired after seeing DistributionTesting by @mcdon030 and his strategy stats he/she posted with his Distribution testing indicator, you should definily check out its very interesting. I believe the stats from his strategy are from, extending P/L. I wanted to make a simple momentum short term strategy. It uses the ToS built in Impulse indicator but with a 10 EMA instead of 13 and the 50 period HullMovingAvg.
Using HMA of 20 for weekly charts.

Long:
Impulse(10) turns green and close > HMA(50)
Short:
Impulse(10) turns red and close < HMA(50)


Strategy Below. Some issues with expectancy it displays a negative number.


Code:
input length = 10;



def EMA = expAverage(close, length);


input flength = 12;
input slength = 26;
input amacd = 9;
def Value = ExpAverage(close, flength) - ExpAverage(close, slength);
def Avg = ExpAverage(Value, amacd);
def MACDHist = Value - Avg;
def GreenPrice = if EMA > EMA[1] and MACDHist > MACDHist[1] then 1 else 0;
def RedPrice = if EMA < EMA[1] and MACDHist < MACDHist[1] then 1 else 0;

def neutral = !RedPrice and !GreenPrice;
input hma_length = 50;
def dma = hullMovingAvg(close, hma_length);



AddOrder(OrderType.BUY_TO_OPEN, GreenPrice[-1] == 1 and dma[-1] < close[-1], tickcolor = GetColor(8), arrowcolor = GetColor(8), name = "TMOLE");
AddOrder(OrderType.SELL_TO_CLOSE, RedPrice[-1] == 1 or neutral[-1], tickcolor = GetColor(8), arrowcolor = GetColor(8), name = "TMOLE");
AddOrder(OrderType.SELL_TO_OPEN, RedPrice[-1] == 1 and dma[-1] > close[-1], tickcolor = GetColor(6), arrowcolor = GetColor(6), name = "TMOSE");
AddOrder(OrderType.BUY_TO_CLOSE, GreenPrice[-1] == 1 or neutral[-1], tickcolor = GetColor(8), arrowcolor = GetColor(8), name = "TMOLE");

def bn = BarNumber();
def lbar = HighestAll(if !isnan(close) then bn else 0);
def entryPrice = EntryPrice();
def pl = FPL();
#Globals
def nan = Double.NaN;
#Inputs
input fplBegin = 0000;
#hint fplBegin: start time: the time in which then dailyHighLow profit should consider the day start.  Recommended value is 0000.
input fplTargetWinLoss = .50;
#hint fplTargetWinLoss: sets the target winlossRatio (in percent) which determines display colors of the W/L label.
input fplTargetWinRate = 1;
#hint fplTargetWinRate: sets the target winRate (float) which determines display colors of the WinRate label;
input fplHidePrice = no;
#hint fplHidePrice: hide's the underlying price graph. \nDefault is no.
input fplHideFPL = yes;
#hint fplHideFPL: hide's the underlying P&L graph.\nDefault is yes.
input fplShowEntryBubbles = no;
#hint fplShowEntryBubbles: display bubbles on the FPL showing the entry and exit P&L values
input fplEnableDebugging = no;
#hint fplEnableDebugging: displays various debugging labels and chart bubbles. \nIt's recommended to hide the price chart & set the fpl hide fpl setting to yes, when enabling.
#temp input var references
def begin = fplBegin;
def targetWinLoss = fplTargetWinLoss;
def targetWinRate = fplTargetWinRate;
def hidePrice = fplHidePrice;
def hideFPL = fplHideFPL;
def showEntryBubbles = fplShowEntryBubbles;
def enableDebugging = fplEnableDebugging;
#hide chart candles
HidePricePlot(hidePrice);
#Plot default Floating P&L
plot FPL = FPL();
FPL.SetPaintingStrategy(PaintingStrategy.SQUARED_HISTOGRAM);
FPL.DefineColor("Positive and Up", Color.GREEN);
FPL.DefineColor("Positive and Down", Color.DARK_GREEN);
FPL.DefineColor("Negative and Down", Color.RED);
FPL.DefineColor("Negative and Up", Color.DARK_RED);
FPL.AssignValueColor(if FPL >= 0
                            then if FPL > FPL[1]
                            then FPL.Color("Positive and Up")
                            else FPL.Color("Positive and Down")
                            else if FPL < FPL[1]
                            then FPL.Color("Negative and Down")
                            else FPL.Color("Negative and Up"));
FPL.SetHiding(hideFPL);
plot ZeroLine = if IsNaN(close)
                then nan
                else 0;
ZeroLine.SetDefaultColor(Color.GRAY);
ZeroLine.SetHiding(hideFPL);
#Global Scripts
script calculateDrawdown {
    input plLow = 1;
    input plHigh = 1;

    def _drawdown = if plHigh == 0
                   then 0 #handles the divide by zero error
                   else (plLow - plHigh) / plHigh;
    plot calculateDrawdown = _drawdown;
}

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;
}
;
script getDurationInMins {
    input gdimBarCount = 1;
    #get the aggregation period (MS per bar)
    def aggPeriod = GetAggregationPeriod();
    #multiply length of bars by aggPeriod to determine total milliseconds then convert to minutes
    def _getDurationInMins = Floor((gdimBarCount * aggPeriod) / 60000);
    plot getDurationInMins = _getDurationInMins;
}
script formatDuration {
    input fdBarCount = 1;
    def _fdDuration = getDurationInMins(fdBarCount);
    def _formatDuration = if _fdDuration >= 60 and _fdDuration < 1440 #hours but not days
                         then 1
                         else if _fdDuration >= 1440 #days
                         then 2
                         else 0;
    plot formatDuration = _formatDuration;
}
script calculateDuration {
    input cdBarCount = 1;
    def _cdDurationFormat = formatDuration(cdBarCount);
    def _cdDuration = getDurationInMins(cdBarCount);  
    #if minutes > hour convert to hour, else if minutes > day, then convert to days
    def _calculateDuration = if _cdDurationFormat == 1
                             then _cdDuration / 60 #convert to hours if greater than 60min but less than a day (1440)
                             else if  _cdDurationFormat == 2
                             then Ceil(_cdDuration / 1440) #convert to days if greater than 1440mins
                             else _cdDuration; #fallback to minutes
    plot calculateDuration = _calculateDuration;
}
# Entry Calculations.  Note: Only parses on a Strategy Chart
def entry = EntryPrice();
def entryPrice1 = if !IsNaN(entry)
                 then entry
                 else entryPrice1[1];
def hasEntry = !IsNaN(entry);
def isNewEntry = entryPrice1 != entryPrice1[1];
#is active trade
def Active = if SecondsTillTime(begin) == 0 and
                SecondsFromTime(begin) == 0
             then 1
             else 0;
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 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 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 / entryCount;
def avgReturn = TotalSum(entryFPLAll) / entryCount;
def avgWin = TotalSum(entryFPLWins) / winCount;
def avgLoss = TotalSum(entryFPLLosses) / lossCount;
#Drawdown
def lowestLowBarNumber = HighestAll(if FPL == lowFPL then bn else 0);
def highestHighBarNumber = HighestAll(if FPL == highFPL and FPL != FPL[1] then bn else 0);
def hasPrevLow = lowestLowBarNumber < highestHighBarNumber;
def isPeak = FPL > Highest(FPL[1], 12) and FPL > Highest(FPL[-12], 12);
def isTrough = FPL < Lowest(FPL[1], 12) and FPL < Lowest(FPL[-12], 12);
def _peak = if isPeak then FPL else nan;
def _trough = if isTrough then FPL else nan;
def peak = if !IsNaN(_peak) then FPL else peak[1];
def trough = if !IsNaN(_trough) then FPL else trough[1];
def peakBN = if isPeak then bn else peakBN[1];
def troughBN = if isTrough then bn else troughBN[1];
def ptvDrawdown = if !hasPrevLow then calculateDrawdown(lowFPL, highFPL) else ptvDrawdown[1];
def equityDrawdown = if isTrough and trough < peak then trough - peak else equityDrawdown[1];
def equityDrawdownPercent = if isTrough and trough < peak then calculateDrawdown(trough, peak) else equityDrawdownPercent[1];
def largestEquityDrawdown = LowestAll(equityDrawdown);
def largestEquityDrawdownPercent = LowestAll(equityDrawdownPercent);
def drawdown = if hasPrevLow
               then largestEquityDrawdownPercent
               else ptvDrawdown;
# Drawdown Durations
def equityDrawdownLength = if bn >= peakBN and bn <= troughBN
                           then troughBN - peakBN
                           else equityDrawdownLength[1];
def ptvDrawdownLength = if bn >= highestHighBarNumber and bn <= lowestLowBarNumber
                        then lowestLowBarNumber - highestHighBarNumber
                        else ptvDrawdownLength[1];
def equityDrawdownDuration = calculateDuration(HighestAll(equityDrawdownLength));
def equityDrawdownDurationFormat = formatDuration(HighestAll(equityDrawdownLength));
def ptvDrawdownDuration = calculateDuration(ptvDrawdownLength);
def ptvDrawdownDurationFormat = formatDuration(ptvDrawdownLength);
#Daily profit
def Midnight = if Active then FPL else Midnight[1];
def DaysProfit = FPL - Midnight;
#Plots
AddChartBubble(!hideFPL and showEntryBubbles and isEntryBar, FPL, "Entry: " + entryBarPL + " | " + bn, Color.WHITE);
AddChartBubble(!hideFPL and showEntryBubbles and isExitBar, FPL, "Exit: " + exitBarPL,
               color = if isWin
                       then Color.LIGHT_GREEN
                       else if isLoss
                       then Color.DARK_RED
                       else Color.GRAY,
               up = no
              );
#Labels
AddLabel(yes,
         text = "LastEntry: " + AsPrice(entryPrice)
         );
AddLabel(hasEntry,
         text = "Current Trade % Return:  " + AsPercent(cumsum),
         color = if cumsum > 0
         then Color.GREEN
         else Color.RED
        );
AddLabel(yes,
         text = "Total Trades: " + entryCount,
         color = Color.WHITE
         );
AddLabel(yes,
         text = "WinCount: " + winCount +
                " | LossCount: " + lossCount +
                " | WinRate: " + winRate,
         color = if winRate >= targetWinRate
                 then Color.GREEN
                 else Color.RED
         );
AddLabel(yes,
         text = "W/L: " + AsPercent(winLossRatio),
         color = if winLossRatio > targetWinLoss
                 then Color.GREEN
                 else Color.RED
         );
AddLabel(yes,
        text = "HighestReturn: " +  AsDollars(highestReturn),
        color = if highestReturn > 0
                then Color.GREEN
                else Color.RED );
AddLabel(yes,
        text = "LowestReturn: " +  AsDollars(lowestReturn),
        color = if lowestReturn > 0
                then Color.GREEN
                else Color.RED  );

AddLabel(yes,
         text = "AvgReturn: " + AsDollars(avgReturn) +
                " | AvgWin: " + AsDollars(avgWin) +
                " | AvgLoss: " + AsDollars(avgLoss),
         color = if avgReturn >= 0
                 then Color.LIGHT_GREEN
                 else Color.RED );
AddLabel(yes,
        text = "PeakToValley DD: " +  AsPercent(drawdown) +
               " | Duration: " + ptvDrawdownDuration +
                if ptvDrawdownDurationFormat == 1
                then " hours"
                else if ptvDrawdownDurationFormat == 2
                then " days"
                else " mins" ,
        color = if drawdown > 0
                then Color.GREEN
                else Color.RED );
AddLabel(largestEquityDrawdown < 0,
        text = "Largest Equity DD: " +  AsDollars(largestEquityDrawdown) +
               " | Duration: " + equityDrawdownDuration +
                if equityDrawdownDurationFormat == 1
                then " hours"
                else if equityDrawdownDurationFormat == 2
                then " days"
                else " mins",
        color = if largestEquityDrawdown > 0
                then Color.GREEN
                else Color.RED );
AddLabel(yes,
         text = "P&L High" +
                (if enableDebugging
                then " at bar " + highBarNumber
                else "") +
                ":  " + AsDollars(highFPL),
        color = Color.GREEN );
AddLabel(yes,
         text = "P&L Low" +
                (if enableDebugging
                then " at bar " + lowBarNumber
                else "") +
                ":  " + AsDollars(lowFPL),
        color = Color.RED );
AddLabel(yes,
         text = "Days Profit: $" + DaysProfit,
         color = if DaysProfit > 0
                 then Color.GREEN
                 else Color.RED );
AddLabel(yes,
         text = "Total Profit: " + AsDollars(FPL),
         color = if FPL > 0
                 then Color.GREEN
                 else Color.RED );
#debugging
#peaks & troughs
AddChartBubble(enableDebugging and isPeak, FPL,
               text = "FPL: " + FPL
                      + " | Peak: " + peak
                      + " | Trough: " + trough[-1]
                      + " | Drawdown: " + AsPercent(calculateDrawdown(trough, peak))
                      + " | PeakBN: " + peakBN
                      + " | BarNumber: " + bn,
               color = Color.LIME        );
AddChartBubble(enableDebugging and isTrough, FPL,
               text = "FPL: " + FPL
                      + " | Peak: " + peak
                      + " | Trough: " + trough
                      + " | Drawdown: " + AsPercent(calculateDrawdown(trough, peak))
                      + " | TroughBN: " + troughBN
                      + " | BarNumber: " + bn,
              color = Color.LIGHT_RED,
              up = no );
AddVerticalLine(enableDebugging and isEntryBar,
                text = "EntryBarNum: " + entryBarNum
                       + " | ExitBarNum: " + exitBarNum[-1]
                       + " | BarNumber: " + bn,
                color = Color.WHITE);
AddVerticalLine(enableDebugging and isExitBar,
                text =  "EntryBarNum: " + entryBarNum[1]
                        + " | ExitbarNum: " + exitBarNum
                        + " | BarNumber: " + bn
                        + " | EntryReturn: " + entryReturn,
                color = if isWin
                        then Color.LIGHT_GREEN
                        else if isLoss
                        then Color.LIGHT_RED
                        else Color.LIGHT_GREEN
);

#####################
def FractionalWin = avgWin / fplBegin;
def FractionalLoss = avgLoss / fplBegin;
def Edge = (FractionalWin * winLossRatio) - FractionalLoss * (1 - winLossRatio);
### expectacy may need work. each time showing negative when should be positive
def Expectancy = (winLossRatio  - avgWin  ) - ((1 - winLossRatio) * avgLoss);
AddLabel(yes,
         text = "Edge : " + AsPercent(Edge) +
          " |  Expectancy " +   AsDollars(Expectancy),  
        color =  Color.WHITE
         );
 
Last edited:
M

mcdon030

Member
@Tostechnical Try this. It will help you find correlations to however you would like to build your plan.
Code:
#Pearson Correlation.
#Author: Mcdon030
#date: 2/26/2020
#notes: Not an indicator, it tests Signal Correlations to build trade plans.
script P {
input signalx = 0.0;
input signaly = 0.0;
input signalinx = 0.0;
input signaliny = 0.0;
def signalx_ = if isnan(signalx) then 0 else signalx;
def signaly_ = if isnan(signaly) then 0 else signaly;
def signalxv =if signaly_ then signalinx else signalxv[1];
def signalyv =if signaly_ then signaliny else signalyv[1];
def sigXsum = totalsum(if signaly_ then signalxv else  0 );
def sigYsum =  totalsum(if signaly_ then signalyv-signalyv[1] else  0 );
def sigXYsum = totalsum( if signaly_ then   sigXsum* sigYsum else 0 );
def sigX2sum = Totalsum( if signaly_ then power(sigXsum,2) else 0  );
def sigY2sum = Totalsum( if signaly_ then power(sigYsum,2) else 0  );
def totalsum =totalsum(if signaly_ then 1 else  0 );
plot SigPearson =(( totalsum*sigXYsum)-(sigXsum*sigYsum))/(SQRT(( totalsum*sigX2sum-power(sigXsum,2))*( totalsum*sigY2sum-power(sigYsum,2))));
}

### example below
# x = BTO y=STC
# x  value is whatever occurred at BTO
# y value is whatever occurred at STC.
# This example tests winning trades at  entry and a higher aggregation signals before, after and ROC to winning trades
def FPL = FPL();
def fplreturn = (FPL - FPL[1]) / FPL[1];
def cumsum = Sum(fplreturn);
def ufiltfor = if BTOsig then aggflit[1] else ufiltfor[1];
def ufiltafter = if BTOsig then aggflit else ufiltafter[1];
def efiltfor = if STOsig then aggflit[1] else efiltfor[1];
def efiltafter = if STOsig then aggflit else efiltafter[1];
def efROC = if STOsig then (aggflit[1] - aggflit ) * 100 else efROC[1];
def ufROC = if BTOsig then (aggflit[1] - aggflit ) * 100 else ufROC[1];
def BTOsum = totalsum( if isnan(BTOSIG) then 0 else BTOSIG);
def bullP = stats(btosig,stcsig,cumsum ,cumsum ).SigPearson;
def bullPwin = stats(btosig,stcsig,fplreturn,fplreturn>fplreturn[1] ).P;
def bullPwinf = stats(btosig,stcsig,ufiltfor,fplreturn>fplreturn[1] ).P;
def bullPwinat = stats(btosig,stcsig,ufiltafter,fplreturn>fplreturn[1] ).P
def bullPwinchg = stats(btosig,stcsig,ufROC,fplreturn>fplreturn[1] ).P;
def sTOsum = totalsum(if isnan(sTOSIG) then 0 else sTOSIG);
def bearP= stats(stosig,btcsig,cumsum ,cumsum ).P;
def bearPwin= stats(stosig,btcsig,fplreturn,fplreturn>fplreturn[1] ).P;
def bearPwinf = stats(stosig,btcsig,efiltfor,fplreturn>fplreturn[1] ).P;
def bearPwinat = stats(stosig,btcsig,efiltafter,fplreturn>fplreturn[1] ).P;
def bearPwinchg = stats(stosig,btcsig,efROC,fplreturn>fplreturn[1] ).P;
Addlabel(yes,
"  BTO cnt : " +(BTOsum)
+ "  Win BTO P: " +aspercent(bullPwin)
+ " Win AggBefore BTO P: " +aspercent(bullPwinf)
+ " Win AggAt BTO P: " +aspercent(bullPwinat)
+ " Win AggCh BTO P: " +aspercent(bullPwinchg)
+ "  STO cnt : " +(STOsum)
+ "  Win STO P: " +aspercent(bearpwin)
+ " Win AggBefore STO P: " +aspercent(bearPwinf)
+ " Win AggAt STO P: " +aspercent(bearPwinat)
+ "Win  AggCh STO P: " +aspercent(bearPwinchg)
, Color.cyan);
 
Last edited by a moderator:
T

Tostechnical

Member
@mcdon030 Thanks! I will check it out. Quick question when going through the code I could not find what the stats function is. Could you post it? Is Signalinx supposed represent a BTC?
 
T

TrueDepth

Member
VIP
Code:
AddOrder(OrderType.BUY_TO_OPEN, GreenPrice[-1] == 1 and dma[-1] < close[-1], tickcolor = GetColor(8), arrowcolor = GetColor(8), name = "TMOLE");
AddOrder(OrderType.SELL_TO_CLOSE, RedPrice[-1] == 1 or neutral[-1], tickcolor = GetColor(8), arrowcolor = GetColor(8), name = "TMOLE");
AddOrder(OrderType.SELL_TO_OPEN, RedPrice[-1] == 1 and dma[-1] > close[-1], tickcolor = GetColor(6), arrowcolor = GetColor(6), name = "TMOSE");
AddOrder(OrderType.BUY_TO_CLOSE, GreenPrice[-1] == 1 or neutral[-1], tickcolor = GetColor(8), arrowcolor = GetColor(8), name = "TMOLE");
I think this part is wrong, where you have the [-1] after everything. It is making it read from a future bar and making the W/L% and profit/loss way higher than it really is.

The Elder's Impulse and Hull moving average signal isn't solid until the CLOSE of each bar. By default for strategies, TOS enters or exits the trade on the OPEN of the next bar after that Close. That is where it puts the arrows.

To be correct, you should remove all the [-1] like this.


Code:
AddOrder(OrderType.BUY_TO_OPEN, GreenPrice == 1 and dma < close, tickcolor = GetColor(8), arrowcolor = GetColor(8), name = "TMOLE");
AddOrder(OrderType.SELL_TO_CLOSE, RedPrice == 1 or neutral, tickcolor = GetColor(8), arrowcolor = GetColor(8), name = "TMOLE");
AddOrder(OrderType.SELL_TO_OPEN, RedPrice == 1 and dma > close, tickcolor = GetColor(6), arrowcolor = GetColor(6), name = "TMOSE");
AddOrder(OrderType.BUY_TO_CLOSE, GreenPrice == 1 or neutral, tickcolor = GetColor(8), arrowcolor = GetColor(8), name = "TMOLE");"

If you want the strategy to Enter and Exit at the Close of the bar you can tell it to do that, like below. However, it still shows the Arrow on the next bar.

Code:
AddOrder(OrderType.BUY_TO_OPEN, GreenPrice == 1 and dma < close, close, tickcolor = GetColor(8), arrowcolor = GetColor(8), name = "TMOLE");
AddOrder(OrderType.SELL_TO_CLOSE, RedPrice == 1 or neutral, close, tickcolor = GetColor(8), arrowcolor = GetColor(8), name = "TMOLE");
AddOrder(OrderType.SELL_TO_OPEN, RedPrice == 1 and dma > close, close,  tickcolor = GetColor(6), arrowcolor = GetColor(6), name = "TMOSE");
AddOrder(OrderType.BUY_TO_CLOSE, GreenPrice == 1 or neutral, close, tickcolor = GetColor(8), arrowcolor = GetColor(8), name = "TMOLE");"
The default is open[-1]
 
Last edited by a moderator:
T

Tostechnical

Member
"
AddOrder(OrderType.BUY_TO_OPEN, GreenPrice[-1] == 1 and dma[-1] < close[-1], tickcolor = GetColor(8), arrowcolor = GetColor(8), name = "TMOLE");
AddOrder(OrderType.SELL_TO_CLOSE, RedPrice[-1] == 1 or neutral[-1], tickcolor = GetColor(8), arrowcolor = GetColor(8), name = "TMOLE");
AddOrder(OrderType.SELL_TO_OPEN, RedPrice[-1] == 1 and dma[-1] > close[-1], tickcolor = GetColor(6), arrowcolor = GetColor(6), name = "TMOSE");
AddOrder(OrderType.BUY_TO_CLOSE, GreenPrice[-1] == 1 or neutral[-1], tickcolor = GetColor(8), arrowcolor = GetColor(8), name = "TMOLE");


"
I think this part is wrong, where you have the [-1] after everything. It is making it read from a future bar and making the W/L% and profit/loss way higher than it really is.

The Elder's Impulse and Hull moving average signal isn't solid until the CLOSE of each bar. By default for strategies, TOS enters or exits the trade on the OPEN of the next bar after that Close. That is where it puts the arrows.

To be correct, you should remove all the [-1] like this.


"
AddOrder(OrderType.BUY_TO_OPEN, GreenPrice == 1 and dma < close, tickcolor = GetColor(8), arrowcolor = GetColor(8), name = "TMOLE");
AddOrder(OrderType.SELL_TO_CLOSE, RedPrice == 1 or neutral, tickcolor = GetColor(8), arrowcolor = GetColor(8), name = "TMOLE");
AddOrder(OrderType.SELL_TO_OPEN, RedPrice == 1 and dma > close, tickcolor = GetColor(6), arrowcolor = GetColor(6), name = "TMOSE");
AddOrder(OrderType.BUY_TO_CLOSE, GreenPrice == 1 or neutral, tickcolor = GetColor(8), arrowcolor = GetColor(8), name = "TMOLE");"

"


If you want the strategy to Enter and Exit at the Close of the bar you can tell it to do that, like below. However, it still shows the Arrow on the next bar.

"
"
AddOrder(OrderType.BUY_TO_OPEN, GreenPrice == 1 and dma < close, close, tickcolor = GetColor(8), arrowcolor = GetColor(8), name = "TMOLE");
AddOrder(OrderType.SELL_TO_CLOSE, RedPrice == 1 or neutral, close, tickcolor = GetColor(8), arrowcolor = GetColor(8), name = "TMOLE");
AddOrder(OrderType.SELL_TO_OPEN, RedPrice == 1 and dma > close, close, tickcolor = GetColor(6), arrowcolor = GetColor(6), name = "TMOSE");
AddOrder(OrderType.BUY_TO_CLOSE, GreenPrice == 1 or neutral, close, tickcolor = GetColor(8), arrowcolor = GetColor(8), name = "TMOLE");"

""

The default is open[-1]
Thank You! I was trying to set it at the close of the bar, I thought [-1] did the trick. Thank you for the fix, I was wondering why the stats where so high. Looks like I got more work to do.
 

Similar threads

Top