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
-
-
05/30/2022 at 8:27 AM #194171
Ciao Roberto, ho provato ad aggiungere un codice martingala trovato a pag. 68 del manuale Probacktest im un Ts di prova, ma non mi funziona. Puoi controllare, oppure hai qualche codice migliore dato che questo è abbastanza vecchio?
Questo nel manuale:
123456789101112131415161718//***********Codice da inserire all'inizio del sistema di trading**********//ONCE OrderSize = 1ONCE ExitIndex = -2REM Initial position size of 1.//*********************////***********Codice da inserire subito dopo la chiusura della posizione**********//ExitIndex = BarIndex//***********Codice da inserire alla fine del sistema di trading**********//IF Barindex = ExitIndex + 1 THENExitIndex = 0IF PositionPerf(1) < 0 THENOrderSize = OrderSize * 2REM Se l'ultimo trade é perdente, allora raddoppiamo la grandezza della posizioneELSIF PositionPerf(1) > 0 THENOrderSize = 1REM Se l'ultimo trade é vincente, allora ritorniamo ad una posizione di grandezza 1ENDIFENDIFLo ho provato ad inserire in questo TS di prova funzionante (provato sul Dax 15 minuti):
12345678910111213141516defParam cumulateOrders = false //(test DAX 15m)once orderSize = 1//--------------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 100Ma unendo i due codici non funzionano (forse lo ho uniti male?)
1234567891011121314151617181920212223242526defParam cumulateOrders = false //(test DAX 15m)once orderSize = 1once exitIndex = -2//--------------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 marketexitIndex = barIndexendif//-------------------------------------set target pProfit 100//--------------------------------------------if barIndex = exitIndex + 1 thenexitIndex = 0if positionPerf(1) < 0 thenorderSize = orderSize * 2elsIf positionPerf(1) > 0 thenorderSize = 1endifendif05/30/2022 at 12:08 PM #194181Nel codice del libro devi usare:
12345IF StrategyProfit < StrategyProfit[1] THENOrderSize = OrderSize * 2ELSEOrderSize = 1ENDIFaltrimenti raddoppia ad ogni barra in cui la strategia è in perdita!
05/30/2022 at 12:19 PM #19418305/30/2022 at 2:27 PM #194194Si, c’era qualche aggiustamento da fare, STRATEGYPROFIT invece di POSITIONPERF, poi ho tolto EXITINDEX ed ho spostato il codice all’inizio subordinandolo a Not OnMarket.
Ho anche aggiunto TP e SL per fare le prove, altrimenti non riuscivo a capire bene.
12345678910111213141516171819202122232425defParam cumulateOrders = false //(test DAX 15m)once orderSize = 1if not OnMarket thenif StrategyProfit < StrategyProfit[1] thenorderSize = orderSize * 2elseorderSize = 1endifendif//--------------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 ordersize05/30/2022 at 4:39 PM #19420705/30/2022 at 7:14 PM #194218Fammi un esempio dicosa dovrebbe fare.
05/30/2022 at 8:02 PM #194220- Dovrebbe raddoppiare la posizione in caso di perdita soltanto una volta.
Esempio: se si entra con 1 contratto e si guadagna si continua con 1 contratto. Se capita un operazione in perdita, soltanto l’operazione successiva viene fatta con 2 contratti (per provare a recuperare la perdita). Se ci dovesse essere una seconda perdita consecutiva si entra comunque sempre con 1 contratto. In pratica si raddoppia la posizione soltanto una volta dopo che ad una operazione positiva ne segue una negativa (per evitare di bruciare tutto il capitale in caso di una serie di operazioni perdenti consecutive!)
- In ogni caso il codice che, nel manuale, mi piacerebbe utilizzare (dato che NON sono un sostenitore della Martingala) è il codice a pag. 72 chiamato: l’inverso d’Alembert (se riesci a scrivere il primo questo è una variazione soltanto). In questo caso bisogna fissare l’unità minima di incremento-decremento (diciamo 1), l’unità minima per non bloccare il TS (diciamo sempre 1) e l’ammontare massimo dei contratti (diciamo X) per non aumentare comunque troppo l’esposizione monetaria in caso di una sequenza positiva di trades (sebbene sia un caso favorevole questa volta). Ecco cosa riporta il manuale:
L’inverso d’Alembert
Diminuiamo la grandezza della posizione
in caso di perdita o aumentiamo la grandezza della posizione in caso di guadagno.
Questa tecnica é dunque pertinente quando si ritiene che una perdita passata aumenti la probabilità di una
perdita futura e un guadagno passato aumenti la probabilità di un futuro guadagno.
Questo codice puo’ essere integrato con le vostre condizioni di entrata e di uscita.
//***********Codice da inserire all’inizio di un sistema di trading**********//
ONCE OrderSize = 1
ONCE ExitIndex = -2
// Cominciamo con una posizione di 1
//*********************//
//***********Codice da inserire subito dopo la chiusura di una posizione**********//
ExitIndex = BarIndex
//***********Codice da inserire alla fine del sistema di trading**********//
IF Barindex = ExitIndex + 1 THEN
ExitIndex = 0
IF PositionPerf(1) < 0 THEN
OrderSize = MAX(OrderSize -1, 1)
ELSIF PositionPerf(1) >= 0 THEN
OrderSize = OrderSize + 1
ENDIF
ENDIF
//*********************//
REM La grandezza della posizione deve essere determinata dalla variabile OrderSize
nell’intero codice.05/31/2022 at 8:03 AM #194234Ho provato anche questo codice (cambiando solo alcuni nomi), funziona ma non fa nulla. Il risultato è identico allo stesso TS SENZA codice “Inverso d’Alembert”. Strano che nel manuale ci siano codici non funzionanti. Penso che debbano essere completamente riscritti.
12345678910111213141516171819202122232425262728//TEST TS codice "Inverso d'Alembert" (manuale proBackTest pag. 72)defParam cumulateOrders = false //(test DAX 15m)once positionSize = 1once closeTradeIndex = -2//--------------avg50 = average[50,0](close)if close crosses over avg50 thenbuy positionSize contract at marketendifif longOnMarket and close < (avg50 - 50*pointSize) thensell positionSize contract at marketcloseTradeIndex = barIndexendif//-------------------------------------set target pProfit 100//-----------------------------------------if barIndex = closeTradeIndex +1 thencloseTradeIndex = 0if positionPerf(1) < 0 thenpositionSize = max(positionSize-1,1)elsIf positionPerf(1) > 0 thenpositionSize = positionSize +1endifendif//------------------------------------------05/31/2022 at 11:53 AM #194269Io guardai pag. 68, ho visto che anche a pag. 71 c’è il problema di POSITIONPERF invece di STRATEGYPROFIT.
Qusto è il mio precedente codice aggiornato con la regola di raddoppiare alla sola PRIMA perdita DOPO un profitto:
12345678910111213141516171819202122232425262728293031323334defParam cumulateOrders = false //(test DAX 15m)once orderSize = 1once raddoppio = 0if not OnMarket thenif StrategyProfit < StrategyProfit[1] thenIF Raddoppio = 1 THENorderSize = orderSize * 2Raddoppio = 0ENDIFelseorderSize = 1IF StrategyProfit > StrategyProfit[1] thenRaddoppio = 1ENDIFendifendif//--------------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)05/31/2022 at 3:37 PM #19430805/31/2022 at 6:12 PM #194341Il codice sopra, sul DAX, 15 minuti, 200K barre, entra anche con 2 (seppure raramente).
Puoi vedere la foto allegata.
Non so cosa dirti, a questo punto devi chiedere a IG o PRT.05/31/2022 at 6:57 PM #194345Ricontrollo, ma anche il tuo grafico non è corretto (almeno secondo quello che vorrei che il codice facesse).
Mi spiego meglio: indico con + un operazione in guadagno (long o short) e con – un operazione in perdita (long o short).
Vorrei che dopo OGNI sequenza + – il TS entri con 2 contratti soltanto l’operazione seguente.
Quindi se abbiamo + (1 contratto ) e poi – (1 contratto), la terza operazione deve essere fatta con 2 contratti.
Se poi ne segue una con +, si attende un altra op con – prima di utilizzare nuovamente 2 contratti
Se invece segue una o più op con – si deve attendere una op con + , poi una con – e poi la seguente nuovamente deve essere fatta con 2 contratti.
Siccome è molto frequente la sequenza + – , le operazioni non possono essere rare.
05/31/2022 at 7:24 PM #194346Non sono un grande programmatore, ma questo codice potrebbe avvicinarsi a quello che stai cercando?
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 MinimumIF MyLongConditions THENBUY LotSize CONTRACTS AT MARKETENDIFIF MyShortConditions THENSELLSHORT LotSize CONTRACTS AT MARKETENDIF05/31/2022 at 9:51 PM #194358Dimmi sul 15 minuti DAX quale operazione è errata, così posso controllare meglio (con l’ultimo codice che ho postato).
05/31/2022 at 9:58 PM #194359Aspetta, ho visto un possibile errore, ti farò sapere.
-
AuthorPosts
Find exclusive trading pro-tools on