price_open - 开仓价格;
price_stoploss - 止损水平的价格;
risk_percent_equity - 每笔交易的风险,单位为存款的百分比;
double GetVolByRisk(double price_open, double price_stoploss, double risk_percent_equity) { double volume = {}; double margin_risk = AccountInfoDouble(ACCOUNT_EQUITY) * risk_percent_equity / 100; double tick_size = SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_SIZE); double tick_value = SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_VALUE); double min_lot = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MIN); double max_lot = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MAX); double lot_step = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_STEP); double delta_stoploss = MathAbs(price_open - price_stoploss); double margin_risk_1lot = delta_stoploss / tick_size * tick_value; volume = margin_risk / margin_risk_1lot; volume = MathFloor(volume / lot_step) * min_lot; if(volume == 0) volume = min_lot; if(volume > max_lot) volume = max_lot; return volume; }
使用此函数进行随机交易的智能交易系统示例
input int stoploss_points = 100;//止损点数 input double risk_percent_equity = 1;// 风险占存款的百分比 //+------------------------------------------------------------------+ ENUM_ORDER_TYPE order_type = ORDER_TYPE_BUY; double equity_open = {}; double profit_expected = {}; bool pos_open = false; //+------------------------------------------------------------------+ void OnTick() { if(!pos_open) { MqlTradeRequest request; MqlTradeCheckResult result_check; MqlTradeResult result_trade; ZeroMemory(request); ZeroMemory(result_check); ZeroMemory(result_trade); double tick_size = SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_SIZE); if(order_type == ORDER_TYPE_BUY) order_type = ORDER_TYPE_SELL; else order_type = ORDER_TYPE_BUY; if(order_type == ORDER_TYPE_BUY) { request.price = SymbolInfoDouble(Symbol(), SYMBOL_ASK); request.type = ORDER_TYPE_BUY; request.sl = request.price - tick_size * stoploss_points; request.tp = request.price + tick_size * stoploss_points; } else { request.price = SymbolInfoDouble(Symbol(), SYMBOL_BID); request.type = ORDER_TYPE_SELL; request.sl = request.price + tick_size * stoploss_points; request.tp = request.price - tick_size * stoploss_points; } double volume = GetVolByRisk(request.price, request.sl, risk_percent_equity); request.action = TRADE_ACTION_DEAL; request.symbol = Symbol(); request.volume = volume; request.deviation = 5; profit_expected = AccountInfoDouble(ACCOUNT_EQUITY) * risk_percent_equity / 100; equity_open = AccountInfoDouble(ACCOUNT_EQUITY); if(OrderCheck(request, result_check)) { OrderSend(request, result_trade); pos_open = true; } } } //+------------------------------------------------------------------+ void OnTradeTransaction(const MqlTradeTransaction& trans, const MqlTradeRequest& request, const MqlTradeResult& result) { if(trans.type == TRADE_TRANSACTION_DEAL_ADD) { HistoryDealSelect(trans.deal); ENUM_DEAL_ENTRY deal_entry = (ENUM_DEAL_ENTRY)HistoryDealGetInteger(trans.deal, DEAL_ENTRY); if(deal_entry == DEAL_ENTRY_OUT) { Print("=========="); Print("volume= ", trans.volume); Print("equity_open= ", equity_open); Print("equity_close= ", AccountInfoDouble(ACCOUNT_EQUITY)); Print("profit expected= +/- ", profit_expected); Print("profit real= ", HistoryDealGetDouble(trans.deal, DEAL_PROFIT)); Print("=========="); pos_open = false; } } } //+------------------------------------------------------------------+ double GetVolByRisk(double price_open, double price_stoploss, double risk_percent_equity) { double volume = {}; double margin_risk = AccountInfoDouble(ACCOUNT_EQUITY) * risk_percent_equity / 100; double tick_size = SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_SIZE); double tick_value = SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_VALUE); double min_lot = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MIN); double max_lot = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MAX); double lot_step = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_STEP); double delta_stoploss = MathAbs(price_open - price_stoploss); double margin_risk_1lot = delta_stoploss / tick_size * tick_value; volume = margin_risk / margin_risk_1lot; volume = MathFloor(volume / lot_step) * min_lot; if(volume == 0) volume = min_lot; if(volume > max_lot) volume = max_lot; return volume; } //+------------------------------------------------------------------+
由MetaQuotes Ltd译自俄语
原代码: https://www.mql5.com/ru/code/48222
ATR Cycles
基于 3 个 ATR 的波动率过滤器:快速 ATR、中间 ATR 和慢速 ATR
KA-Gold Bot MT5
KA-Gold Bot 是专为黄金设计的高级交易顾问,利用凯尔特纳通道策略和两条指数移动平均线(EMA)(10 期 EMA 和 200 期 EMA)的强大组合。运行原理:10 期 EMA 代表平均价格在 Keltner 波段上方/下方切入,确认上升趋势/下降趋势。价格高于 200 期 EMA 则支持上升趋势/下降趋势。考虑到过去 50 期的波动性,这表明上升/下降趋势强于前 10 期:M15
MathTicker - 数学模式下的刻度生成器
在真实刻度模式下记录刻度,在数学模式下读取刻度,每个刻度都会调用你的策略。
SAR ADX Signal
带移动通知的 SAR ADX 信号,由 MT4 版本改写而成(已找不到源代码)。 这是一个可重新绘制的指标,使用时请小心。