% 보증금에서 정확한 로트 계산

 

여보세요,

최근에 프로그래머 중 한 명인 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명의 전문가를 재검토한 결과 모두 동일한 기능을 가지고 있으며,


진실은 어디에 있습니까?


%에서 로트를 계산하는 올바른 기능을 알려주세요.

 
일반적으로 문제는 예치금 로드와 포지션당 리스크 금액 사이에 혼동이 있다는 것입니다. 둘 다 확인하는 것이 바람직합니다. 위의 코드에서 고려되는 것은 하중 또는 하중을 기반으로 하는 로트 크기입니다.
 
이 garzdo가 더 낫습니다. 여기에는 레버리지 계산이 없으며 다른 방법으로 해결할 수 있습니다. 난 정말 좋았어

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%를 비우려면 = 당신이 필요합니까? 많이" 기능은 질문이고 고려합니다
 
wenay :
이 garzdo가 더 낫습니다. 여기에는 레버리지 계산이 없으며 다른 방법으로 해결할 수 있습니다. 나는 주어진 거리 pp에 대한 % 창고에서 많은 계산을 정말 좋아했습니다. 저것들. "10pp에 대한 저장소의 20%를 비우려면 = 당신이 필요합니까? 많이" 기능은 질문이고 고려합니다

제 생각에는 레버리지가 로트 계산에 포함되어야 합니다.

1) 레버리지를 고려하지 않으면 TS가 큰 수익을 내지 못한다는 의미

2) 저장소가 이미 충분히 큰 경우 ds는 레버리지를 줄이므로(내 ds에서 자동으로) " Incorrect volume " 오류가 나타납니다.

고무가 아니라 어깨입니다.

추신 이것은 내 IMHO입니다

 
rensbit :

> 레버리지 계산 없음

제 생각에는 레버리지가 로트 계산에 포함되어야 합니다.

1) 레버리지를 고려하지 않으면 TS가 큰 수익을 내지 못한다는 의미

2) 디포가 이미 충분히 큰 경우 ds는 레버리지를 줄이므로(내 ds에서 자동으로) "잘못된 볼륨" 오류가 나타납니다.


추신 이것은 내 IMHO입니다


틱 비용 계산을 사용하는 레버리지 대신 자세히 살펴보십시오. 레버리지가 1k1이면 틱이 비싸지 않고(1센트라고 가정해 봅시다), 1k 500이면 비쌉니다(5달러). 저것들. 시스템은 모든 레버리지와 함께 명확하게 작동합니다. 다른 계산 방법이 있습니다. 더 최적화되고 정확합니다.

DC에 딱 맞습니다. 시스템이 자동으로 다른 어깨로 전환됩니다.

 
Vladon :
... 여전히 어깨를 사용해야합니다 ...
위험이 백분율로 주어진 경우:
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랏을 열 수 없습니다.

 
keekkenen :

100달러가 있다면 100%와 100% 위험을 활용하십시오. 우리는 무엇을 얻습니까?

로트 = 100 * 100 * 100 / 100 / 100 = 100

나는 아무것도 혼동하지 않았다? 100달러면 어떤 페어로도 100랏을 열 수 없습니다.



물론 섞은건데 진짜 이렇겠지 - 100*100*100/100/100000=0.1
 
아, 죄송합니다. 금을 보고 있었는데.. 그럼 이제 금을 당신의 공식에 따라 거래하지 않겠습니까?