下载MetaTrader 5

请观看如何免费下载自动交易

有趣的脚本?
因此发布一个链接 -
让其他人评价

喜欢这个脚本? 在MetaTrader 5客户端尝试它

显示:
596
等级:
投票: 19
已发布:
2017.04.21 12:20
已更新:
2018.02.22 13:43

用于计算在固定保证金水平的条件下手数值的实例。也就是说,如果您指定 10%, 保证金为可用保证金10%的仓位就会建立。

输入参数:

  • StopLoss (in pips) — 止损水平
  • % risk — 可用保证金百分比作为仓位保证金

以下的循环是用于模拟交易的:

   static long count=-21;
   if(count%980==0) // 我们略过 980 个订单分时
     {
      //--- 取得建立买入仓位的手数大小 (CMoneyFixedMargin)

初始值 count=-21 设置用于策略测试器。然后计算把count除以980的余数 (这个数字是随机选择的),也就是说,每过980个订单分时,手数计算循环就会开始,在其中考虑到风险计算每次交易的手数。

手数计算的循环依赖于每次交易的风险 (计算买入仓位):

第一步

      //--- 取得建立买入仓位的手数大小 (CMoneyFixedMargin)
      double sl=0.0;
      double check_open_long_lot=0.0;
      //--- 变数 #1: StopLoss=0.0
      sl=0.0;
      check_open_long_lot=m_money.CheckOpenLong(m_symbol.Ask(),sl);
      Print("sl=0.0",
            ", CheckOpenLong: ",DoubleToString(check_open_long_lot,2),
            ", 余额: ",    DoubleToString(m_account.Balance(),2),
            ", 净值: ",     DoubleToString(m_account.Equity(),2),
            ", 可用保证金: "DoubleToString(m_account.FreeMargin(),2));
      //--- 变数 #2: StopLoss!=0.0
      sl=m_symbol.Bid()-ExtStopLoss;
      check_open_long_lot=m_money.CheckOpenLong(m_symbol.Ask(),sl);
      Print("sl=",DoubleToString(sl,m_symbol.Digits()),
            ", CheckOpenLong: ",DoubleToString(check_open_long_lot,2),
            ", 余额: ",    DoubleToString(m_account.Balance(),2),
            ", 净值: ",     DoubleToString(m_account.Equity(),2),
            ", 可用保证金: "DoubleToString(m_account.FreeMargin(),2));
      if(check_open_long_lot==0.0)
         return;

然后,考虑到止损的买入仓位计算所得的手数值可以在变量check_open_long_lot中获得,需要使用CMoneyFixedMargin类的CheckOpenLong方法:

      double check_open_long_lot=m_money.CheckOpenLong(m_symbol.Ask(),m_symbol.Bid()-ExtStopLoss);

以下参数在专家日志中会打印出来: StopLoss, 根据它在每个交易中的风险来计算手数,计算时交易账户的余额,以及计算时的保证金。 

如果计算返回了 "0.0", 就退出:

      if(check_open_long_lot==0.0)
         return;

第二步

随后,我们如果有足够的资金,就可以得到买入仓位的手数,其数值是在chek_volime_lot 变量中得到的,使用了CTrade类的 CheckVolume 方法。以下参数会传入: m_symbol.Name() — 交易品种名称, check_open_long_lot — 我们想要建立的仓位的交易量 (这个参数是之前计算得到的): 

      //--- 在 OrderSend 之前检查交易量以避免 "资金不足" 错误 (CTrade)
      double chek_volime_lot=m_trade.CheckVolume(m_symbol.Name(),check_open_long_lot,m_symbol.Ask(),ORDER_TYPE_BUY);

第三步

如果 CheckVolume 返回了不是 "0.0" 的数值, 我们就检查条件: 我们是否有足够的资金来建立根据风险计算所得的手数。

      if(chek_volime_lot!=0.0)
         if(chek_volime_lot>=check_open_long_lot)
            m_trade.Buy(chek_volime_lot,NULL,m_symbol.Ask(),m_symbol.Bid()-ExtStopLoss,m_symbol.Bid()+ExtStopLoss);
      else
         Print("CMoneyFixedRisk lot = ",DoubleToString(check_open_long_lot,2),
               ", CTrade lot = ",DoubleToString(chek_volime_lot,2));

如果我们有足够的资金,就建立仓位,如果没有 — 根据每次交易风险计算的手数值 (DoubleToString(check_open_long_lot,2))以及我们所必需的资金数 (DoubleToString(chek_volime_lot,2)) 就在专家日志中打印出来。

一个用10%可用保证金来建立买入仓位的实例:

Money Fixed Margin open.png

以下内容会在日志中打印:

Money Fixed Margin (EURUSD,M1)  2016.11.28 00:03:24   sl=0.0, CheckOpenLong: 0.28, Balance: 3000.00, Equity: 3000.00, FreeMargin: 3000.00
Money Fixed Margin (EURUSD,M1)  2016.11.28 00:03:24   sl=1.05792, CheckOpenLong: 0.28, Balance: 3000.00, Equity: 3000.00, FreeMargin: 3000.00
Trade   2016.11.28 00:03:31   instant buy 0.28 EURUSD at 1.06076 sl: 1.05792 tp: 1.06292 (1.06042 / 1.06076 / 1.06042)
Trades  2016.11.28 00:03:31   deal #2 buy 0.28 EURUSD at 1.06076 done (based on order #2)
Trade   2016.11.28 00:03:31   deal performed [#2 buy 0.28 EURUSD at 1.06076]
Trade   2016.11.28 00:03:31   order performed buy 0.28 at 1.06076 [#2 buy 0.28 EURUSD at 1.06076]
Money Fixed Margin (EURUSD,M1)  2016.11.28 00:03:31   CTrade::OrderSend: instant buy 0.28 EURUSD at 1.06076 sl: 1.05792 tp: 1.06292 [done at 1.06076]

请注意,当根据可用保证金的风险来计算手数时,止损是没有关系的。

本文译自 MetaQuotes Software Corp. 撰写的俄文原文
官方代码: https://www.mql5.com/ru/code/17282

21hour 21hour

本 EA 交易在某一时间设置两个挂单。

Lucky Lucky

一个订单分时EA交易。它比较前一订单分时的价格与当前的价格。

RSI EA RSI EA

RSI EA - 根据由 iRSI (相对强弱指数,RSI)指标决定的超买/超卖区域而进行交易。

MA Reverse MA Reverse

根据移动平均进行交易,检查足够的资金。