I am trying to help an associate who is migrating from MetaStock to 
AB.

The system is for shorting, does not have pyramiding or scaling and 
his exit rules are
1 - Disaster stop exit - EntryPrice + 4 * ATR(20)  - intra day exit
 
2 - Trailing/Profit Stop - Cover at MA(3) - 0.5 * ATR(20)  - intra 
day exit
 
3 - Time Exit - after being in trade for 2 days exit NEXT DAY ON OPEN
 
4 - Reversion test - If the minimum value of today's Open/Close - Low 
> 1 * ATR(15) then exit next day ON OPEN - this should not trigger on 
entry day of trade.

The only way I could see of achieving these is to use looping.  Is 
there a simpler way of combining these exits?  My code for the exits 
follows
SetTradeDelays(0,0,0,0);                                        
                        // Intraday Entry & Exit signals, no forward 
references
/*
Short = Ref(Entry Signal,-1) 
                AND Low <= Entry Price;
ShortPrice = Min(Open, Entry Price);
*/
Cover = 0;

xDisasterATRMult = 4;
//xDisasterATRMult = Optimize("Disaster ATR Multiplier", 4, 2, 6, 
0.5);
xDisasterATRPer = 20;
//xDisasterATRPer = Optimize("Disaster ATR Period", 20, 10, 30, 5);
xaDisasterStopOffset = xDisasterATRMult * ATR(xDisasterATRPer);
xDisasterStop = Null;

xProfitATRMult = 0.5;
//xProfitATRMult = Optimize("Profit ATR Multiplier", 0.5, 0.2, 1.1, 
0.3);
xProfitATRPer = 20;
//xProfitATRPer = Optimize("Profit ATR Period", 20, 10, 30, 5);
xProfitMAPer = 3;
//xProfitMAPer = Optimize("Profit MA Period", 3, 2, 5, 1);
xaProfitStop = MA(Close, xProfitMAPer) - (xProfitATRMult * ATR
(xProfitATRPer));

xReversionATRMult = 1;
//xReversionATRMult = Optimize("Reversion ATR Multiplier", 1, 0.5, 2, 
0.5);
xReversionATRPer = 15;
//xReversionATRPer = Optimize("Reversion ATR Period", 15, 10, 30, 5);
xaReversionValue = xReversionATRMult * ATR(xReversionATRPer);

xBarsInTrade = 0;
xEntryBar = 0;
xExitType = Null;
xTimeStopPer = 2;
//xTimeStopPer = Optimize("Time Stop Period", 2, 1, 5, 1);

for(xBar = 1; xBar < BarCount; xBar++)
{
        if(xDisasterStop == Null
                AND Short[xBar] == 1)   // Entry Bar & 0 positions 
open
        {
                // Position Opened
                
                xDisasterStop = ShortPrice[VBar] + 
xaDisasterStopOffset[xBar - 1]; // use previous bar ATR
                xEntryBar = xBar;
        }
        else
        {
                Short[xBar] = 0;        // Remove excess short signals
        }       // Not Entry Bar

        if(xDisasterStop != Null)       // trade is open
        {
                xBarsInTrade = xBar - xEntryBar;        // determine 
bars since trade opened

                if (xDisasterStop != Null
                        AND High > xDisasterStop)       // RULE 1
                {       
                        Cover[xBar] = 1;
                        if (xBarsInTrade == 0)
                        {
                                CoverPrice[xBar] = xDisasterStop;
                        }
                        else
                        {
                                CoverPrice[xBar] = Max(Open, 
xDisasterStop);
                        }
                        xExitType[xBar] = "Rule 1";
                        xDisasterStop = Null;   // resets flag to 
indicate "no open trades"
                }
                
                if (xDisasterStop != Null
                        AND Low < xaProfitStop[xBar - 1])       // 
RULE 2           - use previous bar stop value
                {       
                        Cover[xBar] = 1;
                        CoverPrice[xBar] = Min(Open, xaProfitStop
[xBar - 1]);
                        xExitType[xBar] = "Rule 2";
                        xDisasterStop = Null;   // resets flag to 
indicate "no open trades"
                }
                
                if (xDisasterStop != Null
                        AND xBarsInTrade > xTimeStopPer)        // 
RULE 3
                {       
                        Cover[xBar] = 1;
                        CoverPrice[xBar] = Open;
                        xExitType[xBar] = "Rule 3";
                        xDisasterStop = Null;   // resets flag to 
indicate "no open trades"
                }

                if (xDisasterStop != Null
                        AND xBarsInTrade > 0    // RULE 4
                        AND Min(Open[xBar - 1], Close[xBar - 1]) - Low
[xBar - 1] > xaReversionValue[xBar - 1])        // use previous bar 
values
                {       
                        Cover[xBar] = 1;
                        CoverPrice[xBar] = Open;
                        xExitType[xBar] = "Rule 4";
                        xDisasterStop = Null;   // resets flag to 
indicate "no open trades"
                }
        }
}



Thanks for any help

Graham


Reply via email to