Codice martingala manuale
Forums › ProRealTime forum Italiano › Supporto ProOrder › Codice martingala manuale
- This topic has 38 replies, 3 voices, and was last updated 2 years ago by MauroPro.
Tagged: gestione lotti, gestione posizioni, lotsize, martingala, perdita, positionperf, profitto, strategyprofit
-
-
06/01/2022 at 7:14 AM #19437106/01/2022 at 8:03 AM #194377T4 Multi SP500 M5 V3 MM123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199//30.03.2022 200000k//US500 M5 Spread 0.6//German Timedefparam preloadbars = 10000defparam CUMULATEORDERS = false//MMONCE LotSize = 5 //starting number of lots/contractsONCE MinLots = 5 //minimum lot size required by the brokerONCE MaxLots = 10 //999 max lots allowed (to be also set in AutoTradung)ONCE Rise = 5 //numebe of lots to incrementONCE Fall = 5 //number of lots to decrementIF StrategyProfit > StrategyProfit[1] THENLotSize = LotSize + RiseELSIF StrategyProfit < StrategyProfit[1] THENLotSize = LotSize - FallENDIFLotSize = min(MaxLots,max(MinLots,LotSize)) //check both Maximum and Minimum//LotSize = 5timeframe(15minute, updateonclose)RangeMAD5 = average[480,0](close) //Wochentrend Daily MA5RangelongD5 = close > RangeMAD5RangeshortD5 = close < RangeMAD5RangeMAD20 = average[1920,0](close) //"Monatstrend" Daily MA20RangelongD20 = RangeMAD5 > RangeMAD20RangeshortD20 = RangeMAD5 < RangeMAD20MA1 = average[x1,0](close)MA2 = average[x2,0](close)//MA3 = average[x3,0](close)MA4 = average[x5,1](close)MA5 = average[x6,1](close)longA = MA1 > MA2 //and MA2 > MA3 //and MA2 > MA2[1]shortA = MA4 < MA5 //and MA5 < MA5[1]MAL1 = average[5,0](close)MAL2 = average[15,0](close) //15longB = MAL1 crosses over MAL2shortB = MAL1 crosses under MAL2timeframe(default)//M5long = RangelongD5 and longB and longA //and RangelongD20short = RangeshortD5 and shortB and shortA //and RangeshortD20Exit1 = RangeshortD5Exit2 = RangelongD5// trading windowONCE BuyTime = 110000ONCE SellTime = 213000ONCE BuyTime2 = 150000ONCE SellTime2 = 213000// position managementIF Time >= buyTime AND Time <= SellTime THENIf long then //not onmarket andBUY LotSize CONTRACT AT marketSET STOP %LOSS hlSET TARGET %PROFIT glEndIfendifIF Time >= buyTime2 AND Time <= SellTime2 THENIf short thensellshort LotSize CONTRACT AT marketSET STOP %LOSS hsSET TARGET %PROFIT gsEndIfendifIf longonmarket and Exit1 thensell at marketendifIf shortonmarket and Exit2 thenexitshort at marketendifif time = 223000 then //223000//sell at marketexitshort at marketendifif time = 225500 and dayofweek=5 then //225500sell at marketexitshort at marketendif////////////////////////////////////////// %trailing stop function incl. cumulative positionsonce trailingstoptype = 1if trailingstoptype then//====================trailingpercentlong = startl // %trailingpercentshort = start // %once acceleratorlong = stepl // typically tst*0.1once acceleratorshort= step // typically tss*0.1ts2sensitivity = 2 // [1] close [2] high/low [3] low/high [4] typicalprice//====================once steppercentlong = (trailingpercentlong/10)*acceleratorlongonce steppercentshort = (trailingpercentshort/10)*acceleratorshortif onmarket thentrailingstartlong = positionprice*(trailingpercentlong/100)trailingstartshort = positionprice*(trailingpercentshort/100)trailingsteplong = positionprice*(steppercentlong/100)trailingstepshort = positionprice*(steppercentshort/100)endifif not onmarket or ((longonmarket and shortonmarket[1]) or (longonmarket[1] and shortonmarket)) thennewsl = 0mypositionprice = 0endifpositioncount = abs(countofposition)if newsl > 0 thenif positioncount > positioncount[1] thenif longonmarket thennewsl = max(newsl,positionprice * newsl / mypositionprice)elsenewsl = min(newsl,positionprice * newsl / mypositionprice)endifendifendifif ts2sensitivity=1 thents2sensitivitylong=closets2sensitivityshort=closeelsif ts2sensitivity=2 thents2sensitivitylong=hights2sensitivityshort=lowelsif ts2sensitivity=3 thents2sensitivitylong=lowts2sensitivityshort=highelsif ts2sensitivity=4 thents2sensitivitylong=(typicalprice)ts2sensitivityshort=(typicalprice)endifif longonmarket thenif newsl=0 and ts2sensitivitylong-positionprice>=trailingstartlong thennewsl = positionprice+trailingsteplong + 0.2endifif newsl>0 and ts2sensitivitylong-newsl>=trailingsteplong thennewsl = newsl+trailingsteplongendifendifif shortonmarket thenif newsl=0 and positionprice-ts2sensitivityshort>=trailingstartshort thennewsl = positionprice-trailingstepshortendifif newsl>0 and newsl-ts2sensitivityshort>=trailingstepshort thennewsl = newsl-trailingstepshortendifendifif barindex-tradeindex>1 thenif longonmarket thenif newsl>0 thensell at newsl stopendifif newsl>0 thenif low crosses under newsl thensell at marketendifendifendifif shortonmarket thenif newsl>0 thenexitshort at newsl stopendifif newsl>0 thenif high crosses over newsl thenexitshort at marketendifendifendifendifmypositionprice = positionpriceendifif (shortonmarket and newsl > 0) or (longonmarket and newsl>0) thenif positioncount > positioncount[1] thenif longonmarket thennewsl = max(newsl,positionprice * newsl / mypositionprice)endifif shortonmarket thennewsl = min(newsl,positionprice * newsl / mypositionprice)endifendifendif//////////////////////////////////////////////////////////////06/01/2022 at 8:04 AM #19437806/01/2022 at 8:38 AM #194380
Ciao Phoetzs, grazie per l’esempio. Stavo facendo delle prove con il tuo codice. Ho visto che funziona in questo modo:
A) Raddoppia la posizione dopo un guadagno (come fa il tuo codice “Multi SP500”)
IF StrategyProfit > StrategyProfit[1] THEN
LotSize = LotSize + Rise
ELSIF StrategyProfit < StrategyProfit[1] THEN
LotSize = LotSize – Fall
ENDIFB) Raddoppia la posizone dopo una perdita (MARTINGALA):
IF StrategyProfit > StrategyProfit[1] THEN
LotSize = LotSize – Rise
ELSIF StrategyProfit < StrategyProfit[1] THEN
LotSize = LotSize + Fall
ENDIFVorrei però aggiungere nel codice B (Martingala), come stava provando Roberto, il flag: RADDOPPIO, per fare in modo che il TS usi due contratti solo dopo la PRIMA perdita, mentre il codice che hai postato mantiene due contratti anche se ci sono più operazioni in perdita consecutive (vd foto).
Siccome però funziona, Roberto potrebbe aggiungere il suo flag RADDOPPIO in questo codice.
06/01/2022 at 8:48 AM #19438306/01/2022 at 9:03 AM #194385Roberto puoi inserire in questo codice il flag per raddoppiare la posizione in perdita soltanto la prima volta? (vedi immagine allegata sopra)
123456789101112131415161718192021222324252627defParam cumulateOrders = false //(test DAX 15m)ONCE LotSize = 1 //starting number of lots/contractsONCE MinLots = 1 //minimum lot size required by the brokerONCE MaxLots = 2 //999 max lots allowed (to be also set in AutoTradung)ONCE Rise = 1 //numebe of lots to incrementONCE Fall = 1 //number of lots to decrementIF StrategyProfit > StrategyProfit[1] THENLotSize = LotSize - RiseELSIF StrategyProfit < StrategyProfit[1] THENLotSize = LotSize + FallENDIFLotSize = min(MaxLots,max(MinLots,LotSize)) //check both Maximum and Minimum//--------------avg50 = average[50,0](close)if close crosses over avg50 thenbuy lotSize contract at marketendifif longOnMarket and close < (avg50 - 50*pointSize) thensell lotSize contract at marketendif//-------------------------------------set target pProfit 500set stop pLoss 200//--------------------------------------------06/01/2022 at 9:04 AM #194386Ne ho uno in più. Mi è venuto in mente solo dopo aver letto la tua frase… Basta girare il “>”. Poi fa quasi quello che vuoi. Ho appena provato una strategia diversa… stessa performance ma riduce il drawdown.
IF StrategyProfit < StrategyProfit[1] THEN //erhöht bei Verlust
LotSize = LotSize + Rise
ELSIF StrategyProfit > StrategyProfit[1] THEN
LotSize = LotSize – Fall
ENDIF06/01/2022 at 9:11 AM #194390Questo che hai postato è il codice martingala che raddoppia la posizione in caso di perdita (come il mio caso B sopra).
Nel tuo “TS Multi” NON usavi il martingala, ma raddoppiavi la posizione in caso di guadagno (che è un altra tecnica).
06/01/2022 at 9:19 AM #194391Giusto. Rilancio a MaxPosition se vinco. Dopo aver parlato con te, ho scoperto che se rilanci in caso di perdita e torni a MinPosition in caso di vittoria, il drawdown del sistema diminuisce. Che a quanto pare è meglio. Questo sarebbe l’ultimo codice che ho postato. Ma penso che funzioni allo stesso modo del tuo codice B. Scritto in modo diverso.
06/01/2022 at 9:21 AM #194392Il vero Martingala raddoppia la posizione OGNI volta che si perde ( e porta ad azzerare i conti in quanto il capitale a disposizione non è infinito!)
Il codice che ho postato per Roberto, che utilizza la tua formula (strategyProfit < StrategyProfit[1] e lotSize +1) è un Martingala che raddoppia una volta la posizione e la mantiene raddoppiata fino che non capita un guadagno…)
Il codice che ho postato sopra e che vorrei che Roberto modificasse con il suo flag dovrebbe raddoppiare solo per la prima perdita la posizione e poi, anche se capitano perdite consecutive, utilizzare sempre un contratto.
Poi c’è il tuo codice Multi che invece raddoppia una posizione vincente e la mantiene raddoppiate per tutte le vincite consecutive fino a che non capita una perdita.
06/01/2022 at 9:34 AM #19439606/01/2022 at 9:36 AM #19439706/01/2022 at 3:54 PM #194440Ho cambiato una riga ONCE iniziale, più la verifica del raddoppio.
Adesso sembra segua perfettamente la regola del raddoppio solo quando c’è un risultato POSITIVO seguito da uno NEGATIVO (+-), negli altri casi (++ oppure –, oppure -+) non raddoppia.
123456789101112131415161718192021222324252627282930313233defParam cumulateOrders = false //(test DAX 15m)once orderSize = 1once raddoppio = 1if StrategyProfit < StrategyProfit[1] thenIF Raddoppio = 1 THENorderSize = orderSize * 2Raddoppio = 0ELSEorderSize = 1ENDIFelsif StrategyProfit > StrategyProfit[1] THENorderSize = 1Raddoppio = 1endif//--------------avg50 = average[50,0](close)if close crosses over avg50 thenbuy orderSize contract at marketendifif longOnMarket and close < (avg50 - 50*pointSize) thensell orderSize contract at marketendif//-------------------------------------set target pProfit 500set stop pLoss 200//--------------------------------------------graph ordersize coloured(255,0,0,255)graph Raddoppio coloured(0,0,255,255)graph StrategyProfit < StrategyProfit[1] coloured(0,0,0,150)1 user thanked author for this post.
06/01/2022 at 4:04 PM #194441Quello scritto da phoentzs va bene, il suo scopo è incrementare di uno o diminuire di uno in caso di perdita o di guadagno, rispettando i limiti di 1 e 2 (senza la regola +-)
Per modificarlo devo farlo uguale al mio, non ha molto senso.
06/01/2022 at 5:38 PM #194455Ciao Roberto, ho provato ed ora funziona.
Per raddoppiare la posizione (la prima volta) non di un trade perdente, ma vincente (anti martingala) ho visto (e funziona) che basta invertire < e > nelle rughe 5 e 12.
Volevo apportare un ultima modifica nel seguente TS anti martingala di prova: attendere prima di raddoppiare (la prima volta soltanto) la posizione vincente non un trade vincente, ma due trade vincenti (quindi si raddoppierebbe dopo -++).
Pensavo che bastava scrivere nella riga 5 : if strategyProfit > strategyProfit[1] and strategyProft[1] > strategyProfit[2], ma non funziona (tutte le op. tornano ad essere di un contratto), sai come si corregge?
-
AuthorPosts
Find exclusive trading pro-tools on