Jump to content
Sign in to follow this  
KirR

Расчет лота

Recommended Posts

KirR

Не могу добавить кредитное плечо в функцию расчета лота

При запуске советник выдает ошибку 134, если исключить AccountLeverage, лоты открываются без учета плеча. Где я ошибаюсь? Расчет лота ниже:

double GetLot(int MaxRisk)

{

double Free =AccountFreeMargin();

double Leverage =AccountLeverage ();

double One_Lot =MarketInfo(Symbol(),MODE_MARGINREQUIRED);

double Min_Lot =MarketInfo(Symbol(),MODE_MINLOT);

double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);

double Step =MarketInfo(Symbol(),MODE_LOTSTEP);

double Lot =MathFloor(Free*MaxRisk*Leverage/100/One_Lot/Step)*Step;

 

if(Lot<Min_Lot) Lot=Min_Lot;

if(Lot>Max_Lot) Lot=Max_Lot;

if(Lot*One_Lot>Free*Leverage) return(0.0);

return(Lot);}

Share this post


Link to post
Share on other sites
-Алексей-

Эта ошибка иногда возникает при округлении размера лота. Добавь такую строку, условие и место для неё сам найдёшь, надеюсь.

Max_Lot _1 = NormalizeDouble(Free * Leverage / MarketInfo(Symbol(), MODE_LOTSIZE) - Min_Lot, 2)


Напишу советник по Вашему алгоритму.

Возможно не дорого. По стратегии

«Ура!!! угадал точку входа...

...Блин, с направлением ошибся.» - дорого.

Share this post


Link to post
Share on other sites
KirR
Эта ошибка иногда возникает при округлении размера лота. Добавь такую строку, условие и место для неё сам найдёшь, надеюсь.

Max_Lot _1 = NormalizeDouble(Free * Leverage / MarketInfo(Symbol(), MODE_LOTSIZE) - Min_Lot, 2)

 

Попробовал, к сожалению та же ошибка

Share this post


Link to post
Share on other sites
huge mouse

Функция getlot() неправильная, чото очень большой лот возвращает. Она возвращает максимально возможный лот, который можно взять, что есть неправильно.

Edited by huge mouse

Кто знает меру, у того не будет неудачи.

Share this post


Link to post
Share on other sites
expforex2

ну конечно если плечо у на 500 а ВЫ пытаетесь умножить на 500


Ищите программиста? могу помочь..

Share this post


Link to post
Share on other sites
KirR
Функция getlot() неправильная, чото очень большой лот возвращает. Она возвращает максимально возможный лот, который можно взять, что есть неправильно.

 

Без кредитного плеча функция работает, почему максимально возможный лот - неправильно?

Share this post


Link to post
Share on other sites
KirR
ну конечно если плечо у на 500 а ВЫ пытаетесь умножить на 500

 

И где ошибка?

Share this post


Link to post
Share on other sites
huge mouse
Без кредитного плеча функция работает, почему максимально возможный лот - неправильно?

Потому, что размер лота должен рассчитываться из расстояния до стоплосса с учетом ММ. Т.е. при срабатывании SL вы потеряете не более 2-х процентов скажем)


Кто знает меру, у того не будет неудачи.

Share this post


Link to post
Share on other sites
Vanooo1
Потому, что размер лота должен рассчитываться из расстояния до стоплосса с учетом ММ. Т.е. при срабатывании SL вы потеряете не более 2-х процентов скажем)

Да прямо как в книгах пишут торгуйте 2% от депозита и будет вам счастье:aglol:

Человеку нужно код подправить в советнике а вы его торговать учите;-)

Share this post


Link to post
Share on other sites
huge mouse
Да прямо как в книгах пишут торгуйте 2% от депозита и будет вам счастье:aglol:

Человеку нужно код подправить в советнике а вы его торговать учите;-)

Я даю подсказки человеку! А код за него писать не собираюсь. :no:


Кто знает меру, у того не будет неудачи.

Share this post


Link to post
Share on other sites
expforex2
И где ошибка?

 

в плече, я же Вам сказал, ВЫ его на 500 умножаете.

 

Естественно если убрать 500 то получится лот нормальный а с плечом умножение на 500.


Ищите программиста? могу помочь..

Share this post


Link to post
Share on other sites
KirR
Потому, что размер лота должен рассчитываться из расстояния до стоплосса с учетом ММ. Т.е. при срабатывании SL вы потеряете не более 2-х процентов скажем)

 

Размер лота от свободных средств определяется параметром MaxRisk/

А SL вообще не предусмотрен. Но все это моменты стратегии, а не программирования.

Share this post


Link to post
Share on other sites
KirR
в плече, я же Вам сказал, ВЫ его на 500 умножаете.

 

Естественно если убрать 500 то получится лот нормальный а с плечом умножение на 500.

 

К моему глубокому сожалению, я не вижу умножения на 500, не могли бы Вы показать это место в коде?

Share this post


Link to post
Share on other sites
Ugar68
Потому, что размер лота должен рассчитываться из расстояния до стоплосса с учетом ММ. Т.е. при срабатывании SL вы потеряете не более 2-х процентов скажем)

Это можно назвать процент риска на каждую сделку. Но не всегда такой ММ оптимален и не всегда применим.

Похоже что KirR хотел слепить процент залога от средств. Такой ММ то же имеет право на существование. А иногда результаты по нему лучше чем по риску.

 

Не могу добавить кредитное плечо в функцию расчета лота

При запуске советник выдает ошибку 134, если исключить AccountLeverage, лоты открываются без учета плеча. Где я ошибаюсь? Расчет лота ниже:

double GetLot(int MaxRisk)

{

...

double Lot =MathFloor(Free*MaxRisk*Leverage/100/One_Lot/Step)*Step;

...

return(Lot);}

Попробуй так:

double Lot =MathFloor((Free*MaxRisk/100/Step)/One_Lot)*Step;

Никакого кредитного плеча вставлять не надо. В double One_Lot =MarketInfo(Symbol(),MODE_MARGINREQUIRED); кредитное плечё учтено. По этому нужно понимать, при одинаковом MaxRisk, на счетах с разным кредитным плечём рассчётный лот будет разным.

Да, ещё MaxRisk лучше сделать double. На некоторых системах значения лучше ставить меньше 1.

  • Thanks 1

Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Share this post


Link to post
Share on other sites
KirR
Это можно назвать процент риска на каждую сделку. Но не всегда такой ММ оптимален и не всегда применим.

Похоже что KirR хотел слепить процент залога от средств. Такой ММ то же имеет право на существование. А иногда результаты по нему лучше чем по риску.

 

 

Попробуй так:

double Lot =MathFloor((Free*MaxRisk/100/Step)/One_Lot)*Step;

Никакого кредитного плеча вставлять не надо. В double One_Lot =MarketInfo(Symbol(),MODE_MARGINREQUIRED); кредитное плечё учтено. По этому нужно понимать, при одинаковом MaxRisk, на счетах с разным кредитным плечём рассчётный лот будет разным.

Да, ещё MaxRisk лучше сделать double. На некоторых системах значения лучше ставить меньше 1.

 

Спасибо.

double Lot =MathFloor((Free*MaxRisk/100/Step)/One_Lot)*Step; - работает, удивительно, формула та же, вроде бы.

MaxRisk во внешних параметрах есть.

Share this post


Link to post
Share on other sites
Ugar68

MaxRisk во внешних параметрах есть.

У тебя MaxRisk целочисленный int, а лучше делать дробный double.


Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Share this post


Link to post
Share on other sites
KirR
У тебя MaxRisk целочисленный int, а лучше делать дробный double.

 

Так я же его в процентах считаю, зачем мне доли процента?

Share this post


Link to post
Share on other sites
expforex2
К моему глубокому сожалению, я не вижу умножения на 500, не могли бы Вы показать это место в коде?

 

прости это я по старинке, думал ты меня поймешь.

double Leverage =AccountLeverage ();

 

double Lot =MathFloor(Free*MaxRisk*Leverage/100/One_Lot/Step)*Step;

 

например на Альпари на микро или демо оно = 500.


Ищите программиста? могу помочь..

Share this post


Link to post
Share on other sites
Ugar68
Так я же его в процентах считаю, зачем мне доли процента?

Потому что может понадобиться выставить 1.3% или 0.3%


Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Share this post


Link to post
Share on other sites
DenBen

Загвоздка с расчётом лота по EURUSD на рублёвом счёте. Как правильно посчитать лот, при определённом риске на сделку?

Приведу пример как я понимаю.

 

Баланс: 100000 рублей.
Риск на сделку: 10%.

Ask(usdrub): 75 рублей.

Стоп лосс: 100 пипсов.

 

Лот=(100000*0.1/75)/100=1.33

 

Правильно или нет?

Share this post


Link to post
Share on other sites
Ugar68

Загвоздка с расчётом лота по EURUSD на рублёвом счёте. Как правильно посчитать лот, при определённом риске на сделку?

Приведу пример как я понимаю.

 

Баланс: 100000 рублей.

Риск на сделку: 10%.

Ask(usdrub): 75 рублей.

Стоп лосс: 100 пипсов.

 

Лот=(100000*0.1/75)/100=1.33

 

Правильно или нет?

пункт=MarketInfo(symb,16);

шаг=MarketInfo(symb,24);

lot=MathRound((balance*риск/100/шаг)/(пункт*sl))*шаг;

Edited by Ugar68
  • Thanks 1

Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Share this post


Link to post
Share on other sites
DenBen

пункт=MarketInfo(symb,16);

шаг=MarketInfo(symb,24);

lot=MathRound((balance*риск/100/шаг)/(пункт*sl))*шаг;

Сделал расчёт по этой формуле. На долларовом депозите неправильно рассчитывает лот, на евро и фунтовом всё нормально.

Пара USDJPY, баланс 100000, тест идёт на фиксированном 1%-ом риске от стартового депозита. Ну т.е. в каждой сделке получается +/- 1000.

 

Депозит USD

post-430281-0-04383000-1457083676_thumb.png

 

Депозит EUR

post-430281-0-56032100-1457083700_thumb.png

 

Депозит GBP

post-430281-0-29819500-1457083729_thumb.png

 

На долларовом депозите риск меняется в зависимости от курса пары. Почему так?

Share this post


Link to post
Share on other sites
Ugar68

Не знаю почему у тебя так, наверное где то накасячил. Вот я у себя проверил. 1% от баланса, депозит USD, символ USDJPY. Сравни балансы и убыток от стоп лосса.

balance - это от чего считать. У меня это баланс счёта, у тебя должен быть стартовый депозит, предварительно запомненный где то.

sl - это размер стоп лосс в пунктах.

пункт это стоимость пункта в валюте депозита на 1 лот.

шаг - это шаг изменения лота

post-382944-0-31584800-1457165113_thumb.jpg

post-382944-0-22410400-1457165121_thumb.jpg

Edited by Ugar68

Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Share this post


Link to post
Share on other sites
DenBen

Проблема на всех парах, в случае если валюта депозита совпадает с базовой валютой в паре.

Глянь опытным взглядом.

//////////////////////////

DEPOSIT = 100000; (стартовый депозит)

risk = 0.01; (риск на сделку 1%)

 

punkt=MarketInfo("USDJPY",MODE_TICKSIZE);
Step=MarketInfo("USDJPY",MODE_LOTSTEP);
punktVal=MarketInfo("USDJPY",MODE_TICKVALUE);
 
 
покупка
 
Lots1=MathFloor(((DEPOSIT*risk)/(((Ask-STOP_1)/punkt)*punktVal))/Step)*Step;
 
продажа
 
Lots2=MathFloor(((DEPOSIT*risk)/(((STOP_2-Bid)/punkt)*punktVal))/Step)*Step;
//////////////////////////
 
Попробывал заменить функцию MODE_TICKVALUE на : MarketInfo("USDJPY",MODE_LOTSIZE)*MarketInfo("USDJPY",MODE_TICKSIZE)/MarketInfo("USDJPY",MODE_ASK).
 
Так работает нормально, но опять же для тех пар где валюта депозита совпадает с базовой валютой.
А вообще, можно ли так заменить MODE_TICKVALUE?
 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×