Нужна формула размера LOT для управления капиталом, основанная на SL и риске счета! - страница 2

 
maleas_k:

Если я правильно понял вопрос, это поможет вам.


double free = AccountFreeMargin();

double potencial_loss,

double sum_potencial_loss = 0

double pips, lot_size;

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



Спасибо, но у меня уже есть формула, мне просто нужно исправить значение пункта, потому что у меня EUR счет, а не 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 );

И мне нужно заменить Point на TICKVALUE* TICKSIZE, так что это будет выглядеть следующим образом

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

Если кто-то может подтвердить, что эта идея верна, то проблема решена, я думаю. Так что, пожалуйста, помогите мне быстро, и с Рождеством после!

 
RaptorUK:

Я удалил ваш код. . . .


Спасибо за помощь.
 
Proximus:

Спасибо, но у меня уже есть формула, мне просто нужно исправить значение пункта, потому что у меня EUR счет, а не USD. Код такой:

И мне нужно заменить Point на TICKVALUE* TICKSIZE, так что это будет выглядеть следующим образом.

Если кто-то может подтвердить, что эта идея верна, тогда проблема решена, я думаю. Так что, пожалуйста, помогите мне быстрее, и с Рождеством после!

Я не могу подтвердить это, но я предлагаю отладить это с помощью Alert(); как это?

Alert("LOT : ",LOT);

или

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

И вы подтвердите это сами.

 
maleas_k:

Спасибо за помощь.
Спасибо за внесение изменений
 
maleas_k:

Я не могу подтвердить это, но я предлагаю отладить его с помощью Alert(); как это?

или

И вы подтвердите это сами.


Нет, я имел в виду, правильно ли использовать TICKVALUE* TICKSIZE или TICKVALUE/ TICKSIZE, как предложил WHRoeder, потому что * кажется более логичным. Так какой из них правильный, учитывая, что мой счет в EUR, поэтому мы смотрим на базовую валюту, а не на котировку?

 

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. Например, EURUSD с валютой счета USD.
    Если TickValue равен $10, а Ticksize=0.0001. То при движении рынка на 0.0020 значение будет $10/0.0001 * 0.0020=$200 / на лот. $10 за пункт * 20 пунктов / на лот.
    Если TickValue равен $1, а Ticksize=0.00001. Если рынок движется на 0.0020, то значение будет $1/0.00001 * 0.0020=$200 / на лот. Здесь нет ошибки.
  2. Это ваше уравнение является ошибочным 100 * stoploss, StopLevel, Point * 10000 и т.д. Перечитайте мое исходное уравнение и решите его для размера лота
 

Итак, это должны быть шаги для расчета(максимального) размера объема:

(пожалуйста, поправьте меня, если я ошибаюсь ^_^)

AccountMoneyRisk = AccountMoney * Risk%

AccountCounterQuote = Quote(AccountCurrency/CounterCurrency)

CounterCurrencyRisk = AccountMoneyRisk * AccountCounterQuote

PipValue = CounterCurrencyRisk / StopLoss

LotTickValue = LotSize * TickSize

Объем = PipValue * LotTickValue


Пример:

Валюта счета: EUR
Валютная пара: GBPUSD
Базовая валюта: GBP
Контрвалюта: USD

СчетДеньги: 5000 EUR
Риск: 1%

StopLoss: 200 пунктов (Контрвалюта)
Размер лота: 100000 (Контрвалюта)
Размер тика: 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

Объем = PipValue * LotTickValue = 0.375 * 1 USD = 0.375



 

Это предполагает, что CounterCurrency такая же, как AccountCurrency, и не включает спред, и ошибочно предполагает, что пункт == пункту на пятизначном брокере и что ticksize == пункту.

Не обязательно. Баланс счета * процент = RISK = (OrderOpenPrice - OrderStopLoss)*DIR * OrderLots * DeltaPerlot (Примечание OOP-OSL включает SPREAD).

 

Ок, это окончательная версия, пожалуйста, подтвердите, если это правильно, я не понимаю, почему вы настаиваете на вашем DeltaPerlot материал, когда он явно не работает в моей ситуации, потому что у меня есть EUR счет.

Это моя функция определения размера лота :

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);
} 
  • STOPSLIP добавляет X количество пунктов к текущему уровню + SPREAD.
  • Я использую TICKVALUE * TICKSIZE, потому что у меня счет в EUR, а не в USD, поэтому имеет смысл, чтобы значение пункта было 0.000007, а не 0.00001 у моего пятизначного брокера, потому что оно учитывается в курсе EUR.
Так что может кто-нибудь подтвердить, правильно ли это, или если нет, то пожалуйста, исправьте мою формулу, не давайте мне ссылки на другие сообщения, потому что я не понимаю их, просто исправьте мою функцию LOT() и я буду счастлив, пожалуйста, помогите!
 
double clot=(AccountEquity()*RISK)/(100*(MarketInfo(Symbol(),MODE_STOPLEVEL)+MarketInfo(Symbol(),MODE_SPREAD)+STOPSLIP)
            * MarketInfo(Symbol(),MODE_TICKVALUE)*MarketInfo(Symbol(),MODE_TICKSIZE) *100000 );

У меня голова болит от одной только попытки разобраться со скобками!

Честно говоря, я совершенно не понимаю, чего вы пытаетесь добиться.

Я не вижу, как MODE_STOPLEVEL или SPREAD имеют отношение к делу, конечно, вы должны основывать свои расчеты на расстоянии стоп-лосса от текущей цены?

Не должно быть никакой разницы, какая валюта счета, расчеты должны быть одинаковыми, потому что TICKVALUE в валюте счета.

Пожалуйста, обратите внимание, что благодаря размещению вашей строки кода в 2 строки, пост не такой широкий и его легче читать без прокрутки вправо-влево :)

Причина обращения: