保証金の割合からロットを正しく計算すること

 

皆さん、こんにちは。

最近、プログラマーのロジャーが、私が書いたロット単位で計算する関数に目をつけてくれたんです。


私の機能は以下の通りです。


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



レバレッジと現在 価格を使うべきですね。


Expert Advisorで確認してみましたが、どれも同じ機能でした。


真実はどこにあるのか?


ロットを%で計算する正しい関数を教えていただきたいのです

 
通常、問題は、入金負荷とポジションごとのリスク量との間に混乱があることです。両方確認することをお勧めします。上記のコードでカウントされるのは、負荷というか、負荷に応じたロットサイズです。
 
こっちの方がずっといい、肩の計算がない、やり方が違うんです。とても気に入っています。

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 );
}
pipsの与えられた距離のための預金の%のロットの計算すなわち "10pipsで預金の20%を排出する=あなたは必要?ロット "は、この質問の関数とカウントされます。
 
wenay:
こっちの方がずっといい、ここにはレバレッジの計算がない。私は、与えられたpipsの距離のための預金の%のロットの計算が非常に好きです。すなわち、 "10pipsで預金の20%を排出する=あなたは、ロットが必要 "この関数は求め、計算されます。

私見では、ロットの計算にはレバレッジが存在するはずです。

1)レバレッジが考慮されていない場合、TSが大きな利益を生み出す能力がないことを意味します。

2) すでに十分な額の預金がある場合、(私の証券会社では自動的に)レバレッジが下がるので、"Wrong volume"というエラーが表示されます。

テコの原理で、ゴム製ではないんです。

P.S. これは私のIMHOです。

 
rensbit:

> レバレッジの計算をしない

私見では、レバレッジはロットの計算に含めるべきだと思います。

1) レバレッジがない場合、TSが大きな利益を与える能力がないことを意味します。

2)入金額がすでに大きい場合、DTはレバレッジを下げるので(私の証券会社では自動的に)、"Wrong volume "というエラーが発生する。


P.S. 私のIMHOです。


レバレッジの代わりに、ティックのコストを見てください。レバレッジが1k1なら-1ティックは高価ではない(1セントあるとする)、1k500なら-高価(5クォード)です。つまり、このシステムはどんなレバレッジでもうまく機能するのですが、ここで別の計算方法を紹介します。

証券会社が自動的に異なるレバレッジに切り替えてくれます。

 
Vladon:
...肩がこる
Riskがパーセンテージで設定されている場合。
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/100000=0.1です
 
あ、すみません、金を見ていたのは私です。では、あなたの計算式では、今は金の取引はできないのですね?
理由: