从保证金的百分比中正确计算出该批次的金额

 

大家好。

罗杰,一位程序员,最近让我大开眼界,我已经写好了我的按百分比计算手数的功能。


我的功能如下。


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));
}



我应该使用杠杆和当前价格


我试图用专家顾问检查,但他们都有相同的功能。


真相何在?


我想请你提供正确的函数来计算手数(%)!

 
通常的问题是,存款负荷和每个头寸的风险量之间存在混淆。建议同时检查这两种情况。在上述代码中,重要的是负荷,或者说是基于负荷的地段大小。
 
这个要好得多,没有肩部计算,这是一种不同的方式。我非常喜欢它。

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 );
}
在给定的点位距离内,计算手数占存款的百分比,即 "在10点内耗尽20%的存款=你需要手数",这个问题的功能和计数。
 
wenay:
这个要好得多,这里没有杠杆计算。我非常喜欢在给定的点位距离内计算手数,即 "在10点内耗尽20%的存款=你需要手数",这个功能会询问并计算出

在我看来,杠杆应该出现在地段计算中。

1)如果不考虑杠杆,意味着TS没有能力产生大的利润。

2)如果存款已经足够大,杠杆率就会降低(在我的经纪公司自动),所以出现"错误的交易量"的错误。

这是一个杠杆,它不是一个橡胶杠杆。

P.S. 这是我的IMHO

 
rensbit:

> 不计算杠杆率

在我看来,杠杆应该包括在地段计算中。

1)如果没有杠杆,意味着TS没有能力给予大量的利润。

2)如果存款已经足够大,DT会降低杠杆率(在我的经纪公司自动),所以会出现 "错误的交易量 "的错误。


P.S. 这是我的IMHO


与其说是杠杆作用,不如说是看一个虱子的成本。如果你有1k1的杠杆--一个刻度不贵(比如有1分钱),如果1k500--贵(5英镑)。也就是说,该系统在任何杠杆下都能很好地工作,这里有另一种计算方法,在我看来,它更理想,更正确。

你的经纪公司会自动为你切换到不同的杠杆。

 
Vladon:
...你还是要用肩膀...
如果风险被设定为百分比,那么。
lot = AccountEquity()*0.01*Risk / MarketInfo(Symbol(), MODE_MARGINREQUIRED);
 

罗杰在这个问题上非常有帮助,为此他值得特别感谢:!!!!


我稍稍重新设计了一下,使账户货币可以由我自己决定


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。
 
啊,对不起,那是我在看黄金......所以现在不能用你的公式交易黄金?