- 显示:
- 2076
- 等级:
- 已发布:
- 2017.04.21 12:20
- 已更新:
- 2018.02.22 13:43
-
需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
用于计算在固定保证金水平的条件下手数值的实例。也就是说,如果您指定 10%, 保证金为可用保证金10%的仓位就会建立。
输入参数:
- StopLoss (in pips) — 止损水平
- % risk — 可用保证金百分比作为仓位保证金
以下的循环是用于模拟交易的:
if(count%980==0) // 我们略过 980 个订单分时
{
//--- 取得建立买入仓位的手数大小 (CMoneyFixedMargin)
初始值 count=-21 设置用于策略测试器。然后计算把count除以980的余数 (这个数字是随机选择的),也就是说,每过980个订单分时,手数计算循环就会开始,在其中考虑到风险计算每次交易的手数。
手数计算的循环依赖于每次交易的风险 (计算买入仓位):
第一步
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方法:
以下参数在专家日志中会打印出来: StopLoss, 根据它在每个交易中的风险来计算手数,计算时交易账户的余额,以及计算时的保证金。
如果计算返回了 "0.0", 就退出:
return;
第二步
随后,我们如果有足够的资金,就可以得到买入仓位的手数,其数值是在chek_volime_lot 变量中得到的,使用了CTrade类的 CheckVolume 方法。以下参数会传入: m_symbol.Name() — 交易品种名称, check_open_long_lot — 我们想要建立的仓位的交易量 (这个参数是之前计算得到的):
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>=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 (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 Ltd译自俄语
原代码: https://www.mql5.com/ru/code/17282