Serve una formula di moneymanagement LOT size basata su SL e rischio del conto! - pagina 2

 
maleas_k:

Se ho capito bene la domanda, questo farà il lavoro per voi.


double free = AccountFreeMargin();

doppio potencial_loss,

doppio sum_potencial_loss = 0

doppio pips, lot_size;

doppio percent_depo = 5;

potencial_loss = (OrderLots() * (OrderOpenPrice() - OrderStopLoss()))*100000;
sum_potencial_loss = long_sum_potencial_loss + long_potencial_loss;

lot_size = ((((free-long_sum_potencial_loss) * percent_depo)/100.0)/pips)/100000 ;



Grazie ma ho già la formula, ho solo bisogno di correggere il valore del punto perché ho il conto EUR e non USD:

extern double MYSTOPLOSS = 50;  // CUSTOM SL SIZE IN PIPS AFTER THE STOPLEVEL
extern double  RISK =2; // 2% ACCOUNT RISK

double LOT =(AccountEquity()*RISK)/(100*(MarketInfo(Symbol(),MODE_STOPLEVEL)+MYSTOPLOSS)* Point *100000 );

E ho bisogno di sostituire il punto con TICKVALUE* TICKSIZE, quindi sarebbe come questo

extern double MYSTOPLOSS = 50;  // CUSTOM SL SIZE IN PIPS AFTER THE STOPLEVEL
extern double  RISK =2; // 2% ACCOUNT RISK

double LOT =(AccountEquity()*RISK)/(100*(MarketInfo(Symbol(),MODE_STOPLEVEL)+MYSTOPLOSS)* MarketInfo(Symbol(), MODE_TICKVALUE)* 
MarketInfo(Symbol(), MODE_TICKSIZE)  *100000 );

Se qualcuno può confermare che questa idea è corretta, allora il problema è risolto, quindi per favore aiutatemi velocemente, e buon Natale dopo!

 
RaptorUK:

Ho rimosso il tuo codice. . . .


Grazie per il tuo aiuto.
 
Proximus:

Grazie ma ho già la formula, ho solo bisogno di correggere il valore del punto perché ho un conto in EUR e non in USD:

E ho bisogno di sostituire il punto con TICKVALUE* TICKSIZE, quindi sarebbe come questo

Se qualcuno può confermare che questa idea è corretta, allora il problema è risolto, quindi per favore aiutatemi velocemente, e buon Natale!

Non posso confermarlo ma suggerisco di fare il debug con Alert(); come questo?

Alert("LOT : ",LOT);

o

Alert("AccountEquity : ",(AccountEquity()," RISK : " ,RISK," MODE_STOPLEVEL : ", MODE_STOPLEVEL," MYSTOPLOSS : ",MYSTOPLOSS," MODE_TICKVALUE : " ,MODE_TICKVALUE," MODE_TICKSIZE : ,MODE_TICKSIZE);

E lo confermerete da soli.

 
maleas_k:

Grazie per il vostro aiuto.
Grazie per aver fatto la modifica
 
maleas_k:

Non posso confermarlo, ma suggerisco di eseguire il debug con Alert(); come questo?

o

E tu lo confermerai da solo.


No, quello che volevo dire è che è corretto usare il TICKVALUE* TICKSIZE o il TICKVALUE/ TICKSIZE come suggerito da WHRoeder, perché l'* sembra più logico lì.Quindi qual è quello corretto, dato che il mio conto è in EUR quindi guardiamo la valuta base non la quota?

 

Proximus: WTF guys, shouldnt that be TICKVALUE * TICKSIZE instead of TICKVALUE /TICKSIZE ? I think there is a big mistake there

double LOT =(AccountEquity()*RISK)/(100*(MarketInfo(Symbol(),MODE_STOPLEVEL)+MYSTOPLOSS)* Point *100000 );
  1. Per esempio EURUSD con valuta del conto USD.
    Se TickValue è $10 e Ticksize=0.0001. Se il mercato si muove di 0.0020 il valore è $10/0.0001 * 0.0020=$200 / per lotto. $10 per pip * 20 pip / per lotto.
    Se TickValue è $1 e Ticksize=0.00001. Se il mercato si muove di 0.0020 il valore è ancora $1/0.00001 * 0.0020=$200 / per lotto. Nessun errore qui.
  2. È la tua equazione che è fasulla 100 * stoploss, StopLevel, Point * 10000, ecc. Rileggi la mia equazione originale e risolvi per lotsize
 

Ok, questi dovrebbero essere i passi per il CALCOLO DELLA DIMENSIONE DEL VOLUME(massimo):

(correggetemi se sbaglio ^_^)

ContoMoneyRisk = ContoMoney * Risk%

AccountCounterQuote = Quote(ContoValuta/ControValuta)

ControvalutaRischio = ContoMonetaRischio * ContoContatoreQuota

PipValue = ControValutaRischio / StopLoss

LotTickValue = LotSize * TickSize

Volume = PipValue * LotTickValue


Esempio:

Valuta del conto: EUR
Coppia di valute: GBPUSD
Valuta Base: GBP
Controvaluta: USD

Denaro del conto: 5000 EUR
Rischio: 1%

StopLoss: 200 pips (Controvaluta)
Dimensione del lotto: 100000 (Controvaluta)
TickSize: 0. 00001

ContoMoneyRisk = ContoMoney * Risk% = 5000 EUR * 1% = 50 EUR

ControvalutaContoQuote = Quota(ValutaConto/ControValuta) = Quota(EUR/USD) = 1.5000

ControvalutaRischio = ContoMoneyRisk * ContoContatoreQuote = 50 EUR * 1,5000 = 75 USD

PipValue = CounterCurrencyRisk / StopLoss = 75 / 200 = 0.375

LotTickValue = LotSize * TickSize = 100000 * 0.00001 = 1 USD

Volume = PipValue * LotTickValue = 0.375 * 1 USD = 0.375



 

Questo presuppone che la Controvaluta sia la stessa dell'AccountCurrency, e non include lo spread, e presuppone erroneamente che un pip == un punto su un broker a 5 cifre e che ticksize == punto.

Non necessariamente. Saldo del conto * percentuale = RISCHIO = (OrderOpenPrice - OrderStopLoss)*DIR * OrderLots * DeltaPerlot (Nota OOP-OSL include lo SPREAD)

 

Ok questa è la versione finale, per favore confermate se è corretta, non capisco perché insistete sulla vostra roba DeltaPerlot quando chiaramente non funziona nella mia situazione, perché ho un conto in EUR.

Questa è la mia funzione di dimensionamento dei lotti :

extern int STOPSLIP=20;
extern double RISK=0.5;

double LOT()
{
double clot=(AccountEquity()*RISK)/(100*(MarketInfo(Symbol(),MODE_STOPLEVEL)+MarketInfo(Symbol(),MODE_SPREAD)+STOPSLIP)* MarketInfo(Symbol(),MODE_TICKVALUE)*MarketInfo(Symbol(),MODE_TICKSIZE) *100000 );

if(clot<MarketInfo(Symbol(),MODE_MINLOT)) clot=MarketInfo(Symbol(),MODE_MINLOT);
if(clot>MarketInfo(Symbol(),MODE_MAXLOT)) clot=MarketInfo(Symbol(),MODE_MAXLOT); 
  return (clot);
} 
  • Lo STOPSLIP aggiunge X quantità di pips al livello corrente + SPREAD
  • Uso TICKVALUE * TICKSIZE perché ho un conto in EUR e non in USD, quindi ha senso che il pipvalue sia 0.000007 invece di 0.00001 nel mio broker a 5 cifre perché viene conteggiato nel tasso di cambio EUR
Quindi qualcuno può per favore confermare se è corretto, o se non lo è allora per favore correggete la MIA formula, non datemi link ad altri post, perché non li capisco, correggete solo la mia funzione LOT() e sarò felice allora, per favore aiutatemi!
 
double clot=(AccountEquity()*RISK)/(100*(MarketInfo(Symbol(),MODE_STOPLEVEL)+MarketInfo(Symbol(),MODE_SPREAD)+STOPSLIP)
            * MarketInfo(Symbol(),MODE_TICKVALUE)*MarketInfo(Symbol(),MODE_TICKSIZE) *100000 );

Questo mi fa venire il mal di testa solo cercando di risolvere le parentesi!

Ad essere onesti, non ho assolutamente idea di cosa tu stia cercando di ottenere qui.

Non riesco a capire come MODE_STOPLEVEL o SPREAD siano rilevanti, sicuramente dovresti basare i tuoi calcoli sulla distanza dello stop-loss dal prezzo corrente?

Non dovrebbe fare differenza quale sia la valuta del conto, il calcolo dovrebbe essere lo stesso perché TICKVALUE è nella valuta del conto.

Nota, mettendo la tua linea di codice su 2 righe, il post non è così ampio e rende più facile la lettura senza scorrere a destra e a sinistra :)