Formula 123 Low

Ci sono alcune modifiche minori per gestire alcuni casi non previsti nella rilevazione dei pattern 123, sia high che low. Per quanto riguarda le strategy ho fatto alcune verifiche sperimentali sulle prestazioni dei pattern 123H e 123L, come primo risultato ho riscontrato che il 123H, che in teoria andrebbe usato per entrare short su sfondamento del low di 2, spesso dà ottimi risultati entrando long sù rottura dell'high di 3. Lo stesso vale per il 123L, dove anzichè entrare long sù rottura dell'high di 2, si può anche entrare short su sfondamento del low di 3. 
Alla luce di queste verifiche è stato introdotto un filtro per stabilire in che direzione entrare in presenza di un pattern,  "the trend is your friend" e quindi è stata inserita una media mobile esponenziale a 90 periodi come filtro indicatore del trend primario. Aggiunto anche l' Expert Commentary 
Descrizione di alcune variabili di Input: 
*Accountcapitale iniziale utilizzabile default (10000) 
*MaxPercRiskdefinisce in percentuale il capitale rischiato in caso di stop loss. Lo stop-loss è due volte questo parametro, di default (2) 
*MaxPercLossdefinisce in percentuale il massimo rischio accettabile tra prezzo di entry e prezzo di stop. Quando il rischio calcolato è maggiore, il sistema non genera ordini. Di default (5) 
*Noteil sistema non gestische entrate multiple, ovvero quando è sul mercato non genera altri ordini.
Release: 123 Low  Version 0.0.6 15.10.2005 
Categoria: StrategiaFormula per Tradestation™: 
INIZIO FORMULA 
input: BarsBackTrend(15), {Bars Back ricerca del trend}MaxBtwBar(4), {Max barre tra successive sequenze}DisplayRH(True), {Abilita/Disabilita visualizzazione RH}chkRange(True), {Abilita/Disabilita controllo Range > 0}Color1(Cyan), {Colore 1a Barra}Color2(Red), {"" "" 2a "" ""}Color3(Cyan), {"" "" 3a "" ""}History(True), {Cancella old 123Low}NrDelPrev(5); {Se History=False Nr di 123Low da cancellare}Input:Account(10000),MaxPercRisk(2),MaxPercLoss(5),LowRisk(True);{****************************************************************************}var: BarLow1(0), {contatore Low 1a barra}BarHigh2Low(0), { "" "" Low 2a "" ""}BarHigh2High(0), { "" "" High "" "" ""}BarLow3High(0), { "" "" High 3a "" ""}BarLow3Low(0), { "" "" Low "" "" ""}One(False), {True/False 1a Barra}Two(False), { "" "" 2a "" ""}Three(False), { "" "" 3a "" ""}High2High(False), {Setup High 2a Barra}High2Low(False), { "" Low "" "" }Low3High(False), { "" High 3a "" }Low3Low(False), { "" Low "" "" }OffSet(0), {Offset Up/Down Testo}OldLow1(0), {Precedente valore del High1 x Nullify Bar}ValueOne(0), {ID testo 1a barra}ValueTwo(0), {"" "" 2a "" ""}ValueThree(0), {"" "" 3a "" ""}ValueBrk(0), {}BarTwoTxt(0), {Posizione testo 2a barra}BarThreeTxt(0), {"" "" "" 3a "" }CompleteLow(False), {Setup 123Low Low }CompleteHigh(False),{Setup 123Low High }BarBrkout(0), {Posizione Breakout 123Low}idx(0), {Contatore generico }Complete(False); {Setup 123Low }Var:TradeAccount(-1),PosSize(0),TrailBars(10),cCurrentEntries(0),cAvgEntryPrice(0),cEntryPrice(0);Var:BuyStop(-1),LExitStop(-1),SellStop(-1),SExitStop(-1),LowLimit(-1),XAverage90(0),Eq(0),T1(0); 
{****************************************************************************} 
condition1=True;if chkRange then condition1=Range > 0 ; 
{Incrementa contatori}if complete then OldLow1=OldLow1+1;if complete then BarBrkOut=BarBrkOut+1;If One Then BarLow1=BarLow1+1;If High2High then BarHigh2High=BarHigh2High+1;if Two then BarTwoTxt=BarTwoTxt+1;If High2Low then BarHigh2Low=BarHigh2Low+1;If Two And Low3High then beginBarLow3High=BarLow3High+1;BarThreeTxt=BarThreeTxt+1;end;If Low3Low then BarLow3Low=BarLow3Low+1;{fine incremento contatori} 
{Inizio Setup}{Se il minimo e' inferiore al minimo del Low1 allora l' DownTrend continuaannulla il Setup }if Low <= Low[BarLow1] and One then beginOne=False;Two=False;Three=False;High2High=False;High2Low=False;Low3High=False;Low3Low=False;BarLow1=0;BarHigh2Low=0;BarHigh2High=0;BarLow3High=0;BarLow3Low=0;BarTwoTxt=0;BarThreeTxt=0;CompleteLow=False;CompleteHigh=False;end; 
{Ricerca la prima barra alla fine di un Downtrend }{Swing Low}if One=False And Low[1] <= Lowest(Low[2],BarsBackTrend) and Low > Low[1] then beginBarLow1=1;One=True;Two=False;Three=False;Low3High=False;Low3Low=False;CompleteHigh=False;CompleteLow=False;if Low > Low[1] then beginHigh2Low=True;BarHigh2Low=0;Two=True;BarTwoTxt=0;end;If Low[1] > Low[2] then beginHigh2Low=True;BarHigh2Low=1;Two=True;BarTwoTxt=1;end;end; 
{Ricerca della 2 barra del 123Low}{Se fine downtrend trovato e non e' stata ancora trovato il massimo > massimo 1a barra}If One And Two = False and High > High[1] and condition1 then beginHigh2High=True;Two=True;Three=False;Low3High=False;Low3Low=False;BarHigh2High=0;BarTwoTxt=0;end; 
{Se setup 1 e 2 barre dell'123Low sono passati cerca la 3 barra ritracciata}If One And Two And Three = False then beginif Low3High=False And High < High[BarHigh2High] or High < High[1] and Condition1 then beginLow3High=True;BarLow3High=0;end;if Low3Low=False And Low < Low[BarHigh2Low] or Low < Low[1] and condition1 then beginLow3Low=True;BarLow3Low=0;BarThreeTxt=0;end;if Low3High And Low3Low then beginThree=True;value1=High[BarLow1];BarTwoTxt=BarLow1;for idx = BarLow1 downto 0 beginif High[idx] > value1 then beginvalue1=High[idx];BarTwoTxt=idx;end;end;value1=Low[BarTwoTxt];for idx = BarTwoTxt downto 1 beginif Low[idx] < value1 then beginvalue1=Low[idx];BarThreeTxt=idx;end;end;End;CompleteLow=False;CompleteHigh=False;end; 
{Controllo che la combinazioni non superi il numero massimo delle barre}{Ross consiglia max 3 barre 1 ,2, e 3 }if BarLow1 > MaxBtwBar*3 or MaxList(BarHigh2Low,BarHigh2High) > MaxBtwBar*2 or MaxList(BarLow3High,BarLow3Low) > MaxBtwBar then beginOne=False;Two=False;Three=False;High2High=False;High2Low=False;Low3High=False;Low3Low=False;BarLow1=0;BarHigh2Low=0;BarHigh2High=0;BarLow3High=0;BarLow3Low=0;BarTwoTxt=0;end; 
{Completamento 123Low }{ricerca primo ritracciamneto completo dell'123Low}If One And Two And Three then beginIf CompleteLow=False And Low > Low[1] then CompleteLow=True;if completeHigh then BarBrkOut=BarBrkOut+1;if CompleteHigh=False And High > High[1] then beginCompleteHigh=True;BarBrkout=0;end;If CompleteHigh=False Or CompleteLow=False And Low <= Low[barThreeTxt] then BarThreeTxt=0;If CompleteLow And CompleteHigh then beginif date[BarTwoTxt] <= date[BarThreeTxt] then beginOffset=Average(Range,15)*0.5; {Offset x testo}{Trova il minimo e il massimo tra la 1a e la 3a dell-123Low}ValueOne=TEXT_new(Date[BarLow1],Time[BarLow1],Low[BarLow1]-Offset,"1");{Testo della prima barra}ValueTwo=Text_new(Date[BarTwoTxt],time[barTwoTxt],High[BarTwoTxt]+Offset,"2");{testo seconda barra }ValueThree=Text_new(Date[barThreeTxt],time[BarThreeTxt],Low[BarThreeTxt]-Offset,"3");Value1=Text_SetColor(ValueOne,Color1);Value2=Text_SetColor(ValueTwo,Color2);Value3=Text_SetColor(ValueThree,Color3);OldLow1=BarLow1;Complete=True;end;One=False;Two=False;Three=False;High2High=False;High2Low=False;Low3High=False;Low3Low=False;CompleteLow=False;CompleteHigh=False;end;end; 
{Set x RH e display 123L}if Complete then beginif DisplayRH then beginValueBrk=Text_new(Date[barbrkout],time[barbrkout],High[barbrkout]+offset*2,"RH------");Value1=Text_SetColor(ValueBrk,Color2);end;Alert("Buy Long > "+NumToStr(High[BarLow3High],3)+" / Stop < "+NumToStr(Low[BarLow3Low],3));{complete=False;}end; 
{Se True cancella vecchie barre}if History=False and ValueOne > NrDelPrev then value1=Text_Delete(Text_Getfirst(1)); 
{ if false then Plot1(0,""); Not in Signal } 
{ Strategy }XAverage90=XAverage(Close,89)[1];if Complete then beginvalue9=AbsValue(High[BarTwoTxt]-Low[BarThreeTxt])/Close*100;if value9<=MaxPercLoss and cCurrentEntries=0 then beginTradeAccount=Account-(CurrentContracts*AvgEntryPrice)+NetProfit;{print(Close," ",XAverage90," ",date);print(High[BarTwoTxt]," ",XAverage90[BarTwoTxt]," ",Low[BarThreeTxt]," ",XAverage90[BarThreeTxt]);print(Low[BarThreeTxt]," ",XAverage90[BarThreeTxt]," ",High[BarTwoTxt]," ",XAverage90[BarTwoTxt]);}if Close>XAverage90 and (LowRisk=false or (High[BarTwoTxt]>XAverage90[BarTwoTxt] and Low[BarThreeTxt]>XAverage90[BarThreeTxt])) then beginBuyStop=TicksRound(High[BarTwoTxt]+TicksMTS(High[BarTwoTxt]));LExitStop=TicksRound(Low[BarThreeTxt]-TicksMTS(Low[BarThreeTxt]));LowLimit=TicksRound(Low[BarLow1]-TicksMTS(Low[BarLow1]));SellStop=-1;SExitStop=-1;endelse if Close<=XAverage90 and (LowRisk=false or (Low[BarThreeTxt]<=XAverage90[BarThreeTxt] and High[BarTwoTxt]<=XAverage90[BarTwoTxt])) then beginSellStop=TicksRound(Low[BarThreeTxt]-TicksMTS(Low[BarThreeTxt]));SExitStop=TicksRound(High[BarTwoTxt]+TicksMTS(High[BarTwoTxt]));BuyStop=-1;LExitStop=-1;LowLimit=-1;end;if MaxList(BuyStop,SellStop)<>-1 and TradeAccount>2*MaxList(BuyStop,SellStop) thenPosSize=PositionMoneyMng(TradeAccount,MaxPercRisk,MaxList(BuyStop,SellStop),MaxList(BuyStop,SExitStop)-MaxList(LExitStop,SellStop))else beginBuyStop=-1;LExitStop=-1;LowLimit=-1;SellStop=-1;SExitStop=-1;end;end;Complete=False;{print("Complete0 ",date[BarLow1]," ",date[BarTwoTxt]," ",date[BarThreeTxt]);print("Complete1 ",date[BarHigh2Low]," ",date[BarHigh2High]," ",date[BarLow3Low]," ",date[BarLow3High]);}end; 
if MarketPosition=0 then beginif BuyStop<>-1 then beginif Low>LowLimit and Close>XAverage90 thenBuy ("RHL") PosSize shares next bar at BuyStop stopelse beginBuyStop=-1;LExitStop=-1;LowLimit=-1;end;endelse if SellStop<>-1 then beginif High<SExitStop and Close<=XAverage90 thenSell ("RHS") PosSize shares next bar at SellStop stopelse beginSellStop=-1;SExitStop=-1;end;end;end; 
cCurrentEntries=CurrentEntries;cAvgEntryPrice=AvgEntryPrice;if (cCurrentEntries>cCurrentEntries[1]) then begincEntryPrice=(CurrentContracts*AvgEntryPrice-(CurrentContracts-PosSize)*cAvgEntryPrice[1])/PosSize;BuyStop=-1;LowLimit=-1;SellStop=-1;end;if (cCurrentEntries=0 and cCurrentEntries[1]<>0) then beginLExitStop=-1;SExitStop=-1;end; 
{ Gestione Exit Stop & Trailing }if MarketPosition=1 then begin{if Low>cEntryPrice and cEntryPrice>LExitStop thenLExitStop=cEntryPrice;} {Peggiora performance}ExitLong ("LES") next bar at LExitStop stop;if BarsSinceEntry>TrailBars thenExitLong ("LET") next bar at TicksRound(Lowest(Low,TrailBars)) stop;endelse if MarketPosition=-1 then begin{if High<cEntryPrice and cEntryPrice<SExitStop thenSExitStop=cEntryPrice;} {Peggiora performance}ExitShort ("SES") next bar at SExitStop stop;if BarsSinceEntry>TrailBars thenExitShort ("SET") next bar at TicksRound(Highest(High,TrailBars)) stop;end; 
{ Expert Commentary Report }If AtCommentaryBar then beginEq=Account-(CurrentContracts*AvgEntryPrice)+NetProfit;Vars:Str("");Str=Str+"*************** System inputs **************************"+NewLine;Str=Str+"Starting Capital : "+NumToStr(Account,2)+NewLine;Str=Str+"Percentage of Equity to risk : "+NumToStr(MaxPercRisk,2)+" % "+NewLine;Str=Str+"*************** Current statistics ************************"+NewLine;Str=Str+"Market position : "+NumToStr(MarketPosition,0)+NewLine;Str=Str+"Current Shares held : "+NumToStr(CurrentContracts,0)+NewLine;Str=Str+"Current Equity : "+NumToStr(Eq,2)+NewLine;if BuyStop<>-1 or SellStop<>-1 thenStr=Str+"Percentage of current Equity to risk : "+NumToStr(MaxPercRisk,2)+" % equals "+NumToStr(-Eq*MaxPercRisk/100,2)+" dollars "+NewLine;If BuyStop<>-1 then beginStr=Str+"Entry Long : "+NumToStr(BuyStop,4)+NewLine;Str=Str+"Exit Long : " +NumToStr(LExitStop,4)+NewLine;Str=Str+"Difference between Entry Long and Exit Long in Dollars : "+NumToStr(BuyStop-LExitStop,4)+NewLine;Str=Str+"Number of shares to buy to risk "+NumToStr(MaxPercRisk,2)+" % of capital : "+NumToStr(PosSize,0)+NewLine;endelse If MarketPosition=1 then beginEq=Account+NetProfit;T1=-CurrentContracts*(cAvgEntryPrice-LExitStop);Str=Str+"Percentage of current Equity to risk : "+NumToStr(AbsValue(100*T1/Eq),2)+" % equals "+NumToStr(T1,2)+" dollars "+NewLine;Str=Str+"Entry Long : "+NumToStr(cEntryPrice,4)+NewLine;Str=Str+"Exit Long : " +NumToStr(LExitStop,4)+NewLine;Str=Str+"Difference between Entry Long and Exit Long in Dollars : "+NumToStr(cEntryPrice-LExitStop,4)+NewLine;Str=Str+"Open Position Profit in Dollars : "+NumToStr(OpenPositionProfit,2)+NewLine;end;If SellStop<>-1 then beginStr=Str+"Entry Short : "+NumToStr(SellStop,4)+NewLine;Str=Str+"Exit Short : " +NumToStr(SExitStop,4)+NewLine;Str=Str+"Difference between Entry Short and Exit Short in Dollars : "+NumToStr(SExitStop-cEntryPrice,4)+NewLine;Str=Str+"Number of shares to Sell to risk "+NumToStr(MaxPercRisk,2)+" % of capital : "+NumToStr(PosSize,0)+NewLine;endelse If MarketPosition=-1 then beginEq=Account+NetProfit;T1=-CurrentContracts*(SExitStop-cAvgEntryPrice);Str=Str+"Percentage of current Equity to risk : "+NumToStr(AbsValue(100*T1/Eq),2)+" % equals "+NumToStr(T1,2)+" dollars "+NewLine;Str=Str+"Entry Short : "+NumToStr(cEntryPrice,4)+NewLine;Str=Str+"Exit Short : " +NumToStr(SExitStop,4)+NewLine;Str=Str+"Difference between Entry Short and Exit Short in Dollars : "+NumToStr(SExitStop-cEntryPrice,4)+NewLine;Str=Str+"Open Position Profit in Dollars : "+NumToStr(OpenPositionProfit,2)+NewLine;end;Commentary(Str);end;
FINE FORMULA 
== Vedi anche: ==
*Indice sequenziale Formule 
*Formula 123 High
Category:Formule