Нужна помощь в модернизации советника ММ функции

MQL4 지표 전문가

명시


стратегий в одном терминале может быть много

нужен ММ для (баланс - сумма всех рисков)


//Maximum amount of money to risk
double moneyToRisk = NormalizeDouble( (AccountBalance() - Total_Current_Risk() )* RiskInPercent / 100, 7);


Total_Current_Risk() {


calculates all potential losses of all opened and all pending orders
+
all swaps
+
all commissions


return (Total_Current_Amount_At_Risk)

}



double sqMMRiskFixedBalancePct(string symbol, int orderType, double price, double sl, double RiskInPercent, int decimals, double LotsIfNoMM, double MaximumLots, double multiplier, double sizeStep) {
   Verbose("Computing Money Management for order -  Risk fixed % of account balance");

   if(UseMoneyManagement == false) {
      Verbose("Use Money Management = false, MM not used");
      return (mmLotsIfNoMM);
   }
      
   symbol = correctSymbol(symbol);
   sl = NormalizeDouble(sl, (int) MarketInfo(symbol, MODE_DIGITS));
   
   double openPrice = price > 0 ? price : (orderType == OP_BUY ? sqGetAsk(symbol) : sqGetBid(symbol));
   double LotSize=0;

   if(RiskInPercent < 0 ) {
      Verbose("Computing Money Management - Incorrect RiskInPercent size, it must be above 0");
      return(0);
   }
   
   double PointValue = MarketInfo(symbol, MODE_TICKVALUE) / MarketInfo(symbol, MODE_TICKSIZE);    
   double Smallest_Lot = MarketInfo(symbol, MODE_MINLOT);
   double Largest_Lot = MarketInfo(symbol, MODE_MAXLOT);    
   double LotStep = MarketInfo(symbol, MODE_LOTSTEP);

   //Maximum amount of money to risk 
   double moneyToRisk = NormalizeDouble(AccountBalance() * RiskInPercent / 100, 7);
                                                                                                                                                       
   //Maximum drawdown of this order if we buy 1 lot 
   double oneLotSLDrawdown = NormalizeDouble(PointValue * MathAbs(openPrice - sl), 7);
   if(oneLotSLDrawdown > 0) {
  LotSize = moneyToRisk / oneLotSLDrawdown;
   }
   else {
  LotSize = 0;
   }

   LotSize = LotSize * multiplier;
   
   // round computed trade size 
   LotSize = roundDown(LotSize, sizeStep, decimals);

   //--- MAXLOT and MINLOT management

   Verbose("Computing Money Management - Smallest_Lot: ", DoubleToStr(Smallest_Lot), ", Largest_Lot: ", DoubleToStr(Largest_Lot),", Computed LotSize: ", DoubleToStr(LotSize));
   Verbose("Max money to risk: ", DoubleToStr(moneyToRisk), ", SL:", DoubleToStr(sl), ", One lot drawdown: ", DoubleToStr(oneLotSLDrawdown), ", Point value: ", DoubleToStr(PointValue));

   if(LotSize <= 0) {
      Verbose("Calculated LotSize is <= 0. Using LotsIfNoMM value: ", DoubleToStr(LotsIfNoMM), ")");
LotSize = LotsIfNoMM;
}
   
   if(LotSize > MaximumLots) {
      Verbose("LotSize is too big. LotSize set to maximal allowed value (MaximumLots): ", DoubleToStr(MaximumLots));
      LotSize = MaximumLots;
   }

   //--------------------------------------------

   if (LotSize < Smallest_Lot) {
      Verbose("Calculated LotSize is too small. Minimal allowed lot size from the broker is: ", DoubleToStr(Smallest_Lot), ". Please, increase your risk or set fixed LotSize.");
      LotSize = 0;
   }
   else if (LotSize > Largest_Lot) {
      Verbose("LotSize is too big. LotSize set to maximal allowed market value: ", DoubleToStr(Largest_Lot));
      LotSize = Largest_Lot;
   }

   return (LotSize);
}

파일:

응답함

1
개발자 1
등급
(54)
프로젝트
102
23%
중재
12
25% / 17%
기한 초과
13
13%
무료
2
개발자 2
등급
(154)
프로젝트
202
18%
중재
18
44% / 17%
기한 초과
0
작업중
3
개발자 3
등급
(2)
프로젝트
3
0%
중재
2
50% / 50%
기한 초과
0
작업중
4
개발자 4
등급
(284)
프로젝트
458
39%
중재
93
44% / 18%
기한 초과
72
16%
로드됨
게재됨: 2 코드

프로젝트 정보

예산
30 - 50 USD
VAT (22%): 6.6 - 11 USD
총: 36.6 - 61 USD
개발자에게
27 - 45 USD