Precisa de uma fórmula de tamanho LOT de gerenciamento de dinheiro baseada em SL e Risco de Conta! - página 2

 
maleas_k:

Se eu tiver entendido bem a pergunta, isto fará o trabalho por você.


duplo livre = AccountFreeMargin();

perda_do dobro do potencial,

dupla soma_potencial_perda = 0

pips duplos, lote_tamanho;

duplo por cento_depo = 5;

potencial_loss = (OrderLots() * (OrderOpenPrice() - OrderStopLoss()))*100000;
sum_potencial_loss = perda_potencial_ longa_sum_potencial + perda_potencial_ longa;

tamanho_do_lote = (((( livre_desempenho_potencial_deluta) * por cento_depo)/100.0)/pips)/100000 ;



Obrigado, mas já tenho a fórmula, só preciso fixar o valor do ponto porque tenho conta em EUR e não em USD. O código é 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 );

E preciso substituir o Ponto por TICKVALUE* TICKSIZE, por isso ficaria assim

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 alguém pode confirmar que esta idéia está correta, então o problema está resolvido, então por favor me ajude rapidamente, e Feliz Natal depois!

 
RaptorUK:

Eu removi seu código . . . .


Obrigado por sua ajuda.
 
Proximus:

Obrigado, mas já tenho a fórmula, só preciso fixar o valor do ponto porque tenho conta em EUR e não em USD. O código é este:

E preciso substituir o Ponto por TICKVALUE* TICKSIZE, por isso ficaria assim

Se alguém pode confirmar que esta idéia está correta, então o problema está resolvido, então por favor me ajude rapidamente, e Feliz Natal depois!

Não posso confirmá-lo, mas sugiro depurá-lo com o Alerta(); assim ?

Alert("LOT : ",LOT);

ou

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

E você mesmo o confirmará.

 
maleas_k:

Obrigado por sua ajuda.
Obrigado por fazer a edição
 
maleas_k:

Não posso confirmá-lo, mas sugiro depurá-lo com o Alerta(); assim ?

ou

E você mesmo a confirmará.


Não, o que eu quis dizer é que é correto usar o TICKVALUE* TICKSIZE ou o TICKVALUE/ TICKSIZE como WHRoeder sugeriu, porque o * parece mais lógico lá. Então qual é o correto, dado que minha conta está em EUR, então olhamos para a moeda base e não para a cotação?

 

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 exemplo, EURUSD com moeda da conta em USD.
    Se TickValue for $10 e Ticksizeize=0,0001. Lá, se o mercado se mover 0,0020 o valor é $10/0,0001 * 0,0020=$200 / por lote. $10 por pip * 20 pips / por lote.
    Se TickValue for $1 e Ticksizeize=0,00001. Lá se o mercado se move 0,0020 o valor é $1/0,00001 * 0,0020=$200 / por lote ainda. Não há erro aqui.
  2. É sua equação que é falsa 100 * stoploss, StopLevel, Point * 10000, etc. Reler minha equação original e resolver para lotear
 

Ok, estes devem ser os passos para o (máximo) CÁLCULO DO TAMANHO DE VOLUME:

(por favor me corrija se eu estiver errado ^_^)

AccountMoneyRisk = AccountMoney * Risco%

AccountCounterQuote = Cotação(AccountCurrency/CounterCurrency)

ContraCurrencyRisk = AccountMoneyRisk * AccountCounterQuote

PipValue = ContraCurrencyRisk / StopLoss

LotTickValue = LotSize * TickSize

Volume = PipValue * LotTickValue


Exemplo:

Moeda AccountCurrency: EUR
CurrencyPair: GBPUSD
MoedaBaseC: GBP
Contra-moeda: USD

AccountMoney: 5000 EUR
Risco: 1%

StopLoss: 200 pips (Contra Moeda)
Tamanho do Lote: 100000 (Contra Moeda)
Tamanho do TickSize: 0. 00001

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

AccountCounterQuote = Cotação(AccountCurrency/CounterCurrency) = Cotação(EUR/USD) = 1.5000

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

PipValue = ContraCurrencyRisk / StopLoss = 75 / 200 = 0,375

LotTickValue = LotSize * TickSize = 100000 * 0,00001 = 1 USD

Volume = PipValue * LotTickValue = 0,375 * 1 USD = 0,375



 

Isso assume que a Contramoeda é a mesma que a Moeda de Conta, e não inclui o spread, e assume erroneamente que um pip == um ponto em um corretor de 5 dígitos e que o ticksize == ponto.

Não necessariamente. Saldo da conta *% = RISK = (OrderOpenPrice - OrderStopLoss)*DIR * OrderLots * DeltaPerlot (Nota OOP-OSL inclui o SPREAD)

 

Ok, esta é a versão final, confirme se está correta, eu não entendo porque você insiste em suas coisas DeltaPerlot quando claramente não funciona em minha situação, porque eu tenho conta em EUR.

Esta é a minha função de dimensionamento de lotes:

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);
} 
  • O STOPSLIP adiciona X quantidade de pips ao stoplevel+SPREAD atual
  • Eu uso TICKVALUE * TICKSIZE porque tenho conta em EUR e não em USD, então faz sentido que o valor do pip seja 0,000007 ao invés de 0,00001 no meu corretor de 5 dígitos porque é contado na taxa de câmbio do EUR
Portanto, alguém pode confirmar se está correto, ou se não está, por favor, corrija minha fórmula, não me dê links para outros posts, porque eu não os entendo, apenas corrija minha função LOTE() e eu ficarei feliz então, por favor, ajude-me!
 
double clot=(AccountEquity()*RISK)/(100*(MarketInfo(Symbol(),MODE_STOPLEVEL)+MarketInfo(Symbol(),MODE_SPREAD)+STOPSLIP)
            * MarketInfo(Symbol(),MODE_TICKVALUE)*MarketInfo(Symbol(),MODE_TICKSIZE) *100000 );

Isso me dá uma dor de cabeça só de tentar resolver os parênteses!

Para ser honesto, não tenho a menor idéia do que você está tentando alcançar aqui.

Não consigo ver como MODE_STOPLEVEL ou SPREAD são relevantes, certamente você deveria estar baseando seus cálculos na distância de stop-loss do preço atual?

Não deve fazer diferença qual é a moeda da conta, o cálculo deve ser o mesmo porque TICKVALUE está na moeda da conta.

Observe que, ao colocar sua linha de código em 2 linhas, o correio não é tão largo e facilita a leitura sem rolar para a direita e para a esquerda :)

Razão: