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 ); }주어진 거리 pp에 대한 % 창고에서 로트 계산. 저것들. "10pp에 대한 저장소의 20%를 비우려면 = 당신이 필요합니까? 많이" 기능은 질문이고 고려합니다
이 garzdo가 더 낫습니다. 여기에는 레버리지 계산이 없으며 다른 방법으로 해결할 수 있습니다. 나는 주어진 거리 pp에 대한 % 창고에서 많은 계산을 정말 좋아했습니다. 저것들. "10pp에 대한 저장소의 20%를 비우려면 = 당신이 필요합니까? 많이" 기능은 질문이고 고려합니다
제 생각에는 레버리지가 로트 계산에 포함되어야 합니다.
1) 레버리지를 고려하지 않으면 TS가 큰 수익을 내지 못한다는 의미
2) 저장소가 이미 충분히 큰 경우 ds는 레버리지를 줄이므로(내 ds에서 자동으로) " Incorrect volume " 오류가 나타납니다.
고무가 아니라 어깨입니다.
추신 이것은 내 IMHO입니다
> 레버리지 계산 없음
제 생각에는 레버리지가 로트 계산에 포함되어야 합니다.
1) 레버리지를 고려하지 않으면 TS가 큰 수익을 내지 못한다는 의미
2) 디포가 이미 충분히 큰 경우 ds는 레버리지를 줄이므로(내 ds에서 자동으로) "잘못된 볼륨" 오류가 나타납니다.
추신 이것은 내 IMHO입니다
틱 비용 계산을 사용하는 레버리지 대신 자세히 살펴보십시오. 레버리지가 1k1이면 틱이 비싸지 않고(1센트라고 가정해 봅시다), 1k 500이면 비쌉니다(5달러). 저것들. 시스템은 모든 레버리지와 함께 명확하게 작동합니다. 다른 계산 방법이 있습니다. 더 최적화되고 정확합니다.
DC에 딱 맞습니다. 시스템이 자동으로 다른 어깨로 전환됩니다.
... 여전히 어깨를 사용해야합니다 ...
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
여보세요,
최근에 프로그래머 중 한 명인 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명의 전문가를 재검토한 결과 모두 동일한 기능을 가지고 있으며,
진실은 어디에 있습니까?
%에서 로트를 계산하는 올바른 기능을 알려주세요.