double LotSize( int type, double LotRisk, int SL ) { // int znakov_lot=0; double lot_min = MarketInfo( Symbol(), MODE_MINLOT ); double lot_max = MarketInfo( Symbol(), MODE_MAXLOT ); double lot_step = MarketInfo( Symbol(), MODE_LOTSTEP ); double lotcost = MarketInfo( Symbol(), MODE_TICKVALUE ); double lot = 0.0; double dollarsPerPip = 0.0; lot = AccountBalance()*LotRisk/100.0; dollarsPerPip = lot/SL; // if (lot_min<2) {znakov_lot=0; if (lot_min<0.2) {znakov_lot=1; if (lot_min<0.02) {znakov_lot=3; if (lot_min<0.002) {znakov_lot=4; }}}} lot = NormalizeDouble( dollarsPerPip/lotcost, 2 ); lot = NormalizeDouble( lot / lot_step, 0 ) * lot_step; if ( lot < lot_min ) lot = lot_min; if ( lot > lot_max ) lot = lot_max; if ( AccountFreeMarginCheck( Symbol(), type, lot ) < 10 || GetLastError() == 134 ) { Alert ( "Impossible to open position with lot = ", DoubleToStr( lot, 2 ), ". Not enough money." ); return(-1); } return( lot ); }Расчет лота от % депо на данное растояние пп. т.е. "чтобы слить 20% депо за 10пп = надо ?лота" функция это вопрос и считает
Эта гарздо лучше, сдесь нет рассчета плеча тут другой способ решения. Мне очень понравился Расчет лота от % депо на данное растояние пп. т.е. "чтобы слить 20% депо за 10пп = надо ?лота" функция это вопрос и считает
На мой взгляд, плечо должно присутствовать в расчетах лота.
1) Если не учитывать плечо, это обозначает что ТС не способна дать большую прибыль
2) Если депо уже достаточно большое, дц уменьшает плечо (в моём дц автоматически), поэтому появиться ошибка "Неправильный объем".
Оно - это плечо, не резиновое же.
P.S. это моё ИМХО
> нет рассчета плеча
На мой взгляд, плечо должно присутствовать в расчетах лота.
1) Если не учитывать плечо, это обозначает что ТС не способна дать большую прибыль
2) Если депо уже достаточно большое, дц уменьшает плечо (в моём дц автоматически), поэтому появиться ошибка "Неправильный объем".
P.S. это моё ИМХО
присмотрись вместа плеча использую расчет стоимости тика. Если у тебя плечо 1к1 - то тик стоит не дорого (допустим там 1 цент), если 1к 500 то дорого (5 баксов). Т.е. система четка работает при любом плече, тут другой способ расчета, как мне кажется более оптимальный и правельный
как раз для вашего ДЦ потходит, т.к. система автоматически перейдет на другое плечо
... надо еще плечо использовать ...
lot = AccountEquity()*0.01*Risk / MarketInfo(Symbol(), MODE_MARGINREQUIRED);
Очень помог Roger в данном вопросе, за что ему отдельный респект!!!!
я ее немного переделал, чтобы валюту счета сам определял
int Percent=10; string Valdepo=AccountCurrency(); int start() { double Lot,MinLots,MaxLots; int lotdig; if(MarketInfo(Symbol(),MODE_LOTSTEP)==0.01)lotdig=2; else lotdig=1; if(Valdepo=="USD") { if(StringSubstr(Symbol(),0,3)=="USD")Lot=NormalizeDouble(AccountFreeMargin()*Percent*AccountLeverage()/100/MarketInfo(Symbol(),MODE_LOTSIZE),lotdig); else if(StringSubstr(Symbol(),3,3)=="USD")Lot=NormalizeDouble(AccountFreeMargin()*Percent*AccountLeverage()/Ask/100/MarketInfo(Symbol(),MODE_LOTSIZE),lotdig); else { double pr=MarketInfo(StringSubstr(Symbol(),0,3)+"USD",MODE_ASK); if(pr!=0)Lot=NormalizeDouble(AccountFreeMargin()*Percent*AccountLeverage()/pr/100/MarketInfo(Symbol(),MODE_LOTSIZE),lotdig); else Lot=NormalizeDouble(AccountFreeMargin()*Percent*AccountLeverage()/100/MarketInfo(Symbol(),MODE_LOTSIZE),lotdig); } } if(Valdepo=="EUR") { if(StringSubstr(Symbol(),0,3)=="EUR")Lot=NormalizeDouble(AccountFreeMargin()*Percent*AccountLeverage()/100/MarketInfo(Symbol(),MODE_LOTSIZE),lotdig); else { pr=MarketInfo("EUR"+StringSubstr(Symbol(),0,3),MODE_BID); if(pr!=0)Lot=NormalizeDouble(AccountFreeMargin()*Percent*AccountLeverage()*pr/100/MarketInfo(Symbol(),MODE_LOTSIZE),lotdig); else Lot=NormalizeDouble(AccountFreeMargin()*Percent*AccountLeverage()/100/MarketInfo(Symbol(),MODE_LOTSIZE),lotdig); } } MinLots=MarketInfo(Symbol(),MODE_MINLOT); MaxLots=MarketInfo(Symbol(),MODE_MAXLOT); if(Lot < MinLots) Lot = MinLots; if(Lot > MaxLots) Lot = MaxLots; return(0); }
А других валют счетов не бывает что-ли? ;-)
И риски все-таки побоку? Этот вариант ведь тоже считает только от загрузки депо, а какие будут риски (в % от депо) при просадках - игнорируется. Можно подумать, когда Вы открываетесь, то всегда угадываете с направлением с первого момента и до последнего.
бесполезная функция, с ошибками кроме того..
if(Lot < MinLots) Lot = MinLots;
это что? денег не хватает все равно открываемся ?
если у нас 100 баксов, плечо 100 и 100% риска, т.е. открываемся по полной, то что получаем ?
if(StringSubstr(Symbol(),0,3)=="USD") Lot=NormalizeDouble(AccountFreeMargin()*Percent*AccountLeverage()/100/MarketInfo(Symbol(),MODE_LOTSIZE),lotdig);
лот = 100 * 100 * 100 / 100 / 100 = 100
я ничего не перепутал ? на 100 баксов вряд ли лотом 100 можно открыться по какой-либо паре..
если у нас 100 баксов, плечо 100 и 100% риска, т.е. открываемся по полной, то что получаем ?
лот = 100 * 100 * 100 / 100 / 100 = 100
я ничего не перепутал ? на 100 баксов вряд ли лотом 100 можно открыться по какой-либо паре..
Конечно, перепутал, по настоящему будет так - 100*100*100/100/100000=0.1
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Всем привет,
Недавно один из программистов - Roger открыл мне глаза на то, что я неправильно написал функцию расчета лотов от %.
моя функция следующая:
double GetSizeLot() //Функция возвращает значение лотов,
{ //если включен ММ то значение лотов,
double lots,MD,RM,MinLots,LotSize; int lotsdigit; //вычисляется путем:Свободные средства*Risk
LotSize = MarketInfo(Symbol(), MODE_LOTSIZE); //поделить на стоимость одного лота
MD = NormalizeDouble(MarketInfo(Symbol(), MODE_LOTSTEP), 2); //А также вычисляет колличество знаков
if(MD==0.01) lotsdigit=2; //присваивает значения максимума лотов
if(MD==0.1) lotsdigit=1;
if(MM>1) {lots=NormalizeDouble((AccountFreeMargin()*MM/LotSize),lotsdigit);Lot=lots;}
else lots=Lot;
MinLots=NormalizeDouble(MarketInfo(Symbol(),MODE_MINLOT),2);
if(lots < MinLots) lots = MinLots;
if(lots > MaxLot) lots = MaxLot;
return(NormalizeDouble(lots,2));
}
но тут он мне и говорит, что так мол и так, надо еще плечо использовать и текущую цену,
ну дай я думаю проверю как у профи, и у ВСЕХ! абсолютно, перепроверил 1000 экспертов, у всех такая же функция,
где правда?
подскажите правильную функцию расчета лота от %