MnQInvestmentDevelopment/MnQInvestment/04_Tutorials/DynamicLotsTest.mq5

67 lines
1.7 KiB
MQL5
Raw Permalink Normal View History

2025-05-30 15:08:44 +02:00
#property copyright "Copyright 2023, M & Q Investment Group"
#property link "https://www.mql5.com"
#property version "1.00"
#include <trade/trade.mqh>
CTrade trade;
int OnInit()
{
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
}
void OnTick()
{
if(PositionsTotal() == 0){
double bid = SymbolInfoDouble(_Symbol,SYMBOL_BID);
double desiredriskpercpoints = 5;
double TradeDistance = 0.0004;
double TriggerP = bid - 0.0;
TriggerP = NormalizeDouble(TriggerP,_Digits);
double tp = TriggerP - TradeDistance;
tp = NormalizeDouble(tp,_Digits);
double sl = TriggerP + TradeDistance;
sl = NormalizeDouble(sl,_Digits);
double TrigSLDiff = sl - TriggerP;
TrigSLDiff = NormalizeDouble(TrigSLDiff,_Digits);
trade.Sell(CalcLots(desiredriskpercpoints,TrigSLDiff),_Symbol,bid,sl,tp);
}
}
double CalcLots(double riskPercent, double SLDistance){
double ticksize = SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);
double tickvalue = SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE);
double Lotstep = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
if(ticksize == 0 || tickvalue == 0 || Lotstep == 0){
Print(__FUNCTION__,"Lotsize cannot be calculated");
return 0;
}
double riskMoney = AccountInfoDouble(ACCOUNT_BALANCE) * riskPercent /100;
double MoneyperLotstep = (SLDistance / ticksize) * tickvalue * Lotstep;
if(MoneyperLotstep == 0){
Print(__FUNCTION__,"Lotsize cannot be calculated");
return 0;
}
double lots = MathFloor(riskMoney / MoneyperLotstep) * Lotstep;
return lots;
}