¡Necesito la fórmula del tamaño de LOT de moneymanagement basada en el SL y el riesgo de la cuenta! - página 2

 
maleas_k:

Si he entendido bien la pregunta esto te servirá.


double free = AccountFreeMargin();

double pérdida_potencial,

double suma_pérdida_potencial = 0

double pips, lot_size;

double porcentaje_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 ;



Gracias pero ya tengo la formula, solo necesito arreglar el valor del punto porque tengo una cuenta en EUR y no en USD.El código es este:

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 );

Y necesito reemplazar el Punto con TICKVALUE* TICKSIZE, por lo que se vería así

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 );

Si alguien puede confirmar que esta idea es correcta, entonces el problema está resuelto, así que por favor ayúdenme rápido, y ¡feliz Navidad después!

 
RaptorUK:

He eliminado su código . . . .


Gracias por tu ayuda.
 
Proximus:

Gracias, pero ya tengo la fórmula, sólo necesito arreglar el valor de los puntos porque tengo una cuenta en EUR y no en USD:

Y necesito reemplazar el punto con TICKVALUE* TICKSIZE, para que se vea así

Si alguien puede confirmar que esta idea es correcta, entonces el problema está resuelto, así que por favor ayúdenme rápido, y ¡feliz Navidad después!

No puedo confirmarlo pero sugiero que lo depure con el Alert(); así ?

Alert("LOT : ",LOT);

o

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

Y lo confirmarás por ti mismo.

 
maleas_k:

Gracias por su ayuda.
Gracias por hacer la edición
 
maleas_k:

No puedo confirmarlo pero sugiero depurar con el Alert(); así ?

o

Y tú mismo lo confirmarás.


No, lo que quise decir es que si es correcto usar el TICKVALUE* TICKSIZE o el TICKVALUE/ TICKSIZE como sugirió WHRoeder, porque el * parece más lógico ahí.Entonces, ¿cuál es el correcto, dado que mi cuenta está en EUR por lo que miramos la moneda base no la cotización?

 

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. Por ejemplo EURUSD con la moneda de la cuenta en USD.
    Si TickValue es $10 y Ticksize=0.0001. Por lo tanto si el mercado se mueve 0.0020 el valor es $10/0.0001 * 0.0020=$200 / por lote. 10$ por pip * 20 pips / por lote.
    Si TickValue es $1 y Ticksize=0.00001. Por lo tanto, si el mercado se mueve 0.0020 el valor es $1/0.00001 * 0.0020=$200 / por lote. No hay error aquí.
  2. Es su ecuación que es falsa 100 * stoploss, StopLevel, Point * 10000, etc. Vuelva a leer mi ecuación original y resolver el tamaño del lote
 

Ok, estos deberían ser los pasos para el CALCULO DEL TAMAÑO DEL VOLUMEN(máximo):

(por favor corregidme si me equivoco ^_^)

AccountMoneyRisk = AccountMoney * Risk%

AccountCounterQuote = Quote(AccountCurrency/CounterCurrency)

CounterCurrencyRisk = AccountMoneyRisk * AccountCounterQuote

PipValue = CounterCurrencyRisk / StopLoss

LotTickValue = LotSize * TickSize

Volumen = PipValue * LotTickValue


Ejemplo:

Moneda de la cuenta: EUR
Paridad de divisas: GBPUSD
DivisaBase: GBP
Moneda de Contrapartida: USD

Dinero de la cuenta: 5000 EUR
Riesgo: 1%.

StopLoss: 200 pips (Contradivisa)
LotSize: 100000 (Counter Currency)
TickSize: 0. 00001

AccountMoneyRisk = AccountMoney * Risk% = 5000 EUR * 1% = 50 EUR

AccountCounterQuote = Quote(AccountCurrency/CounterCurrency) = Quote(EUR/USD) = 1.5000

CounterCurrencyRisk = AccountMoneyRisk * AccountCounterQuote = 50 EUR * 1.5000 = 75 USD

PipValue = CounterCurrencyRisk / StopLoss = 75 / 200 = 0.375

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

Volumen = PipValue * LotTickValue = 0.375 * 1 USD = 0.375



 

Eso asume que la CounterCurrency es la misma que la AccountCurrency, y no incluye el spread, y asume erróneamente que un pip == un punto en un broker de 5 dígitos y que ticksize == punto.

No necesariamente. Saldo de la cuenta * porcentaje = RIESGO = (OrderOpenPrice - OrderStopLoss)*DIR * OrderLots * DeltaPerlot (Nota OOP-OSL incluye el SPREAD)

 

Ok, esta es la versión final, por favor, confirme si es correcto, no entiendo por qué usted insiste en su DeltaPerlot cosas cuando claramente no funciona en mi situación, porque tengo cuenta de euros.

Esta es mi función de tamaño de lote :

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);
} 
  • El STOPSLIP agrega X cantidad de pips al nivel actual de la bolsa+SPREAD
  • Uso TICKVALUE * TICKSIZE porque tengo una cuenta en EUR y no en USD, así que tiene sentido que el pipvalue sea 0.000007 en lugar de 0.00001 en mi broker de 5 dígitos porque se cuenta en el tipo de cambio del EUR
¡Así que por favor, alguien puede confirmar si es correcto, o si no lo es, entonces por favor corregir mi fórmula, no me dan enlaces a otros puestos, porque yo no los entiendo, sólo corregir mi LOT () función y voy a ser feliz entonces, por favor ayuda!
 
double clot=(AccountEquity()*RISK)/(100*(MarketInfo(Symbol(),MODE_STOPLEVEL)+MarketInfo(Symbol(),MODE_SPREAD)+STOPSLIP)
            * MarketInfo(Symbol(),MODE_TICKVALUE)*MarketInfo(Symbol(),MODE_TICKSIZE) *100000 );

Esto me da dolor de cabeza sólo por tratar de entender los paréntesis.

Para ser honesto, no tengo ni idea de lo que está tratando de lograr aquí.

No puedo ver cómo MODE_STOPLEVEL o SPREAD son relevantes, seguramente debería basar sus cálculos en la distancia de stop-loss desde el precio actual.

No debería hacer ninguna diferencia cuál es la moneda de la cuenta, el cálculo debería ser el mismo porque TICKVALUE está en la moneda de la cuenta.

Tenga en cuenta, al poner su línea de código en 2 líneas, el post no es tan amplia y hace que sea más fácil de leer sin desplazarse a la derecha y la izquierda :)