#property copyright "Copyright 2023, M & Q Investment Group" #property link "https://www.mql5.com" #property version "1.00" #include 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; }