| / | Форум |
|
Vladon
28.06.2010 23:42
Всем привет, Недавно один из программистов - Roger открыл мне глаза на то, что я неправильно написал функцию расчета лотов от %. моя функция следующая: double GetSizeLot() //Функция возвращает значение лотов, но тут он мне и говорит, что так мол и так, надо еще плечо использовать и текущую цену, ну дай я думаю проверю как у профи, и у ВСЕХ! абсолютно, перепроверил 1000 экспертов, у всех такая же функция, где правда? |
|
Организуйте багтрекинг и техсаппорт для своей компании В TeamWox имеются все для того чтобы организовать багтрекинг. Интегрировав модуль Сервисдеск с веб-сайтом, Вы сможете получать заявки своих клиентов напрямую в TeamWox. Более того, вся переписка с клиентами автоматически распознается и попадает в архив, где ее без труда можно найти в будущем. |
|
marketeer
29.06.2010 14:14
Обычно проблема в том, что существует путаница между загрузкой депозита и размером риска на позицию. Проверять желательно и то, и другое. То, что считается в приведенном коде - загрузка, точнее размер лота исходя из загрузки.
|
|
wenay
29.06.2010 14:53
Эта гарздо лучше, сдесь нет рассчета плеча тут другой способ решения. Мне очень понравился
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пп = надо ?лота" функция это вопрос и считает |
|
rensbit
29.06.2010 15:03
wenay:
Эта гарздо лучше, сдесь нет рассчета плеча тут другой способ решения. Мне очень понравился Расчет лота от % депо на данное растояние пп. т.е. "чтобы слить 20% депо за 10пп = надо ?лота" функция это вопрос и считает На мой взгляд, плечо должно присутствовать в расчетах лота. 1) Если не учитывать плечо, это обозначает что ТС не способна дать большую прибыль 2) Если депо уже достаточно большое, дц уменьшает плечо (в моём дц автоматически), поэтому появиться ошибка "Неправильный объем". Оно - это плечо, не резиновое же. P.S. это моё ИМХО |
|
wenay
29.06.2010 15:05
rensbit: > нет рассчета плеча На мой взгляд, плечо должно присутствовать в расчетах лота. 1) Если не учитывать плечо, это обозначает что ТС не способна дать большую прибыль 2) Если депо уже достаточно большое, дц уменьшает плечо (в моём дц автоматически), поэтому появиться ошибка "Неправильный объем". P.S. это моё ИМХО
как раз для вашего ДЦ потходит, т.к. система автоматически перейдет на другое плечо |
|
OneDepo
29.06.2010 17:59
Vladon: Если Risk задан в процентах, то:... надо еще плечо использовать ... lot = AccountEquity()*0.01*Risk / MarketInfo(Symbol(), MODE_MARGINREQUIRED); |
|
Vladon
29.06.2010 19:05
Очень помог 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); } |
|
marketeer
29.06.2010 23:08
А других валют счетов не бывает что-ли? ;-) И риски все-таки побоку? Этот вариант ведь тоже считает только от загрузки депо, а какие будут риски (в % от депо) при просадках - игнорируется. Можно подумать, когда Вы открываетесь, то всегда угадываете с направлением с первого момента и до последнего. |
|
keekkenen
29.06.2010 23:27
бесполезная функция, с ошибками кроме того.. 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 можно открыться по какой-либо паре.. |
|
Roger
30.06.2010 00:02
keekkenen:
если у нас 100 баксов, плечо 100 и 100% риска, т.е. открываемся по полной, то что получаем ? лот = 100 * 100 * 100 / 100 / 100 = 100 я ничего не перепутал ? на 100 баксов вряд ли лотом 100 можно открыться по какой-либо паре.. Конечно, перепутал, по настоящему будет так - 100*100*100/100/100000=0.1 |
|
keekkenen
30.06.2010 00:07
ах, извините, это я на золоте смотрел.. так что же по золоту теперь не торговать по вашей формуле ?
|
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий