Buonasera,
avrei bisogno di una indicazione su come impostare una formula per poter rischiare una somma (euro) sempre fissa indipendentemente dalla coppia di valute negoziate.
mi spiego meglio:
all’inizio del codice vorrei memorizzare due parametri del tipo:
MyCash = 10000 //importo versato sul conto destinato al trading
MyRisk% = 1 // percentuale del mio capitale che voglio rischiare ad ogni operazione
L’ 1% di 10000 è 100 ed io vorrei impostare automaticamente il valore di 100 euro come perdita massima per ogni operazione andando ad agire sul quantitativo di valuta acquistata.
il parametro di base dovrebbe essere in numero di Pips che intercorrono tra il mio valore Buy Stop (prezzo di apertura della posizione) ed il valore dello Stop Loss, qualora l’operazione venisse chiusa in perdita che conosco ancor prima di aprire la posizione, appena si è completato il pattern.
inoltre come posso calcolare sempre i soliti 100 euro di perdita massima anche quando le valute tradate non sono contro euro ma, ad esempio, AUD/USD, JPY/CHF, GBP/USD….
Grazie mille.
Puoi usare
SET STOP %LOSS MyRisk //MyRisk% sull'operazione in corso (sul prezzo d'entrata) espresso in percentuale (senza indicare %)
oppure
SET STOP $LOSS MyCash * (MyRisk / 100) //MyRisk% del tuo capitaleespresso in denaro (senza indicare il simbolo della valuta, è quella del tuo conto)
ok, grazie. Conoscevo già il comando $LOSS, ma temo che la soluzione che mi hai proposto non sia quella che volevo…
faccio un esempio per spiegarmi meglio e cercare di ottenere il risultato che desidero.
io ho un pattern (un qualsiasi pattern, in questo caso non importa quale…) che al suo completamento mi fornisce un prezzo di ingresso e contemporaneamente anche un prezzo di SL al di sotto del quale chiudo l’operazione in perdita.
ipotizziamo che voglio tradare EUR/USD, il mio BuyStop è a 1,1330 ed il mio SL è a 1,1290 (40 Pips di differenza tra entry e stop che sarebbero la mia perdita se l’operazione andasse male)
io vorrei acquistare un quantitativo “x” di valuta affinché i miei 40 Pips, qualora li perdessi, corrispondessero a 100 euro ad esempio.
se poi trado USD/JPY con Buy a 110,80 e SL a 110,65 vorrei che i miei 15 Pips in questo caso, se dovessi perderli, corrispondessero sempre a 100 euro, acquistando di conseguenza un quantitativo di valuta adeguato ad avere 15Pips=100 euro.
il numero di Pips tra Buy e SL è sempre diverso da operazione ad operazione ed è una variabile.
il valore del cross delle due valute è l’altra variabile e la perdita che sono disposto a subire in caso di operazione andata male è fisso ed è scritto in cima al codice.
penso che in questo caso ci voglia una formula un po’ più articolata di un semplice $LOSS (o mi sbaglio ?)
Grazie mille come sempre.
🙂
Già avevi fatto questa domanda qui https://www.prorealcode.com/topic/calcolo-della-positionsize/#post-88457.
Cos’è che non ti ha funzionato di quella formula?
ciao,
più che riproporre la stessa domanda avevo risposto chiedendo all’utente “StefanoCG” se era poi riuscito ad ottenere ciò che desiderava e che pensavo fosse ciò che desideravo anche io (ma senza ricevere risposta).
ho provato ad inserire il codice ma qualcosa non ha funzionato e pensando di essere stato in a non spiegarmi bene o a non aver compreso bene l’utilizzo della formula ho pensato di essere più “preciso” aprendo un topic specifico inserendo un mio esempio pratico.
ti chiedo scusa se ho involontariamente duplicato un argomento.
per ogni nuovo post che scrivo ne leggo decine di quelli già esistenti proprio per evitare di riproporre domande/argomenti già trattati, come giustamente indicato nelle regole del forum.
adesso riprovo a vedere la formula e a capire dove sbagliavo e poi posterò il codice.
grazie mille.
Non preoccuparti, magari può esserci un errore, fammi sapere.
Se c’è qualcosa che non va, oltre a dirmi i dettagli allega anche il codice, così che possa replicare tutto sul mio PC.
// Definizione dei parametri del codice
DEFPARAM CumulateOrders = True // Posizioni cumulate disattivate
//DEFPARAM FlatAfter = 220000
//DEFPARAM FLATBEFORE = 090000
// Condizioni per entrare su posizioni long
//indicator6 = CurrentDayOfWeek = 1
ONCE CapitaleMassimo = 10000
ONCE MaxLoss = 1 / 100
PositionSize = Round(CapitaleMassimo/(Close - Close*MaxLoss)/PointValue*PointSize)
Graph PositionSize
IF OnMarket OR Close < low[3] THEN //Azzerare il prezzo serve a non inserire ancora l'ordine pendente...
Prezzo = 0 //... una volta entrato oppure quando non ci sono più le condizioni
ENDIF
IF LOW[0] > LOW[2] AND LOW[1] > LOW[2] AND LOW[1] > LOW[0] AND HIGH[1] > HIGH[2] AND HIGH [1] > HIGH[0] THEN
Prezzo = HIGH[1] //Salvo il prezzo d'entrata
StopLoss = abs(LOW[2] - Prezzo) //SL sul minimo del pattern
TargetProfit = (Prezzo + StopLoss) //Target Profit pari all'ampiezza del pattern
ENDIF
IF Prezzo AND Not OnMarket THEN //Inserire l'ordine pendente ad ogni candela
BUY positionsize SHARES AT Prezzo STOP
SET STOP LOSS StopLoss
SET TARGET PROFIT TargetProfit
ENDIF
Buonasera,
sto procedendo (parallelamente all’altro topic) anche con il test del position size però non riesco ad ottenere i risultati sperati
indipendentemente dal fatto che il pattern utilizzato ancora non funziona, mi trovo ad avere tutta una serie di operazioni in perdita (anche se molte dovrebbero essere in utile 😉 ) che se rispettassero la formula dovrebbero avere tutte una perdita di 100 euro ognuna.
ma questo non avviene.
Potresti cortesemente verificare e correggermi il codice oppure dirmi le modifiche che devo apportare ?
allego la videata ottenuta con il backtest (EUR/USD). Se il position size funzionasse, è corretto che per tutte le operazioni in perdita nella colonna ABS PERF dovrei trovarmi tutti valori uguali a -100 euro ??
grazie mille.
Per favore, fornisci sempre TUTTE le informazioni per potere ripetare i test:
- strumento usato (EurUsd)
- TF usato
- periodo di backtest usato
- foto esplicative (manca quella dove sono indicati i quantitativi tradati)
Tra l’altro i conti demo hanno qualche problema di connessione stamani, mi sa che ci stanno lavorando per fare prove o aggiornamenti.
Buon fine settimana.
ciao,
il test è stato effettuato su EUR/USD, 1000 unita dal gennaio 2013 a ieri e con TF daily.
ti allego l’elenco delle operazioni con i quantitativi tradati. sembra che la formula calcoli un qualche valore probabilmente con base 100 euro perché quando nel 2013 il cambio valeva 1,30 ne venivano tradati 7700 circa mentre quando nel 2017 il cambio valeva 1,06 ne venivano tradati 9500 circa (ovviamente di più).
bisognerebbe però partire con il calcolo prendendo in considerazione il numero di Pips che intercorrono tra il prezzo di SL ed il prezzo di ingresso long e far valere questo numero di Pips (che varia di volta in volta per ogni operazione) 100 euro agendo sul quantitativo di valuta acquistato. Cosi che ogni eventuale perdita subita vale sempre 100 euro, ovvero l’1% del mio capitale.
Grazie mille.
ciao.
La formula per il dimensionamento della posizione (position sizing) è:
PositionSize = (CapitaleMassimo * MaxLoss) * Leva / ValoreContratto
Se ti restituisce un numero intero è il numero di contratti regolari che puoi acquistare, se è un decimale indica quanti mini contratti puoi acquistare.
Ti allego il codice modificato con la formula corretta:
DEFPARAM CumulateOrders = True // Posizioni cumulate disattivate
ONCE CapitaleMassimo = 10000
ONCE MaxLoss = 1 / 100
ONCE Leva = 10
ONCE ValoreContratto = 100000
//PositionSize = Round(CapitaleMassimo/(Close - Close*MaxLoss)/PointValue*PointSize)
PositionSize = (CapitaleMassimo * MaxLoss) * Leva / ValoreContratto
//PositionSize = max(1,(CapitaleMassimo * MaxLoss) * Leva / ValoreContratto)
graph PositionSize
IF OnMarket OR Close < low[3] THEN
Prezzo = 0
ENDIF
IF LOW[0] > LOW[2] AND LOW[1] > LOW[2] AND LOW[1] > LOW[0] AND HIGH[1] > HIGH[2] AND HIGH [1] > HIGH[0] THEN
Prezzo = HIGH[1] //Salvo il prezzo d'entrata
StopLoss = abs(LOW[2] - Prezzo) //SL sul minimo del pattern
TargetProfit = (Prezzo + StopLoss) //Target Profit pari all'ampiezza del pattern
ENDIF
IF Prezzo AND Not OnMarket THEN //Inserire l'ordine pendente ad ogni candela
BUY positionsize SHARES AT Prezzo STOP
SET STOP LOSS StopLoss
SET TARGET PROFIT TargetProfit
ENDIF
La riga 8 puoi usarla al posto della 7 per avere la certezza che la posizione minima sia 1.