版本 1.105:引入独立函数 OpenBuy 和 OpenSell
//| 按符号开仓买入|
//+------------------------------------------------------------------+
bool OpenBuy(const double lot)
{
bool res=false;
double price=m_symbol.Ask();
double tp=m_symbol.NormalizePrice(m_symbol.Bid()+InpTP*m_adjusted_point);
if(m_trade.Buy(lot,m_symbol.Name(),price,0.0,tp))
if(m_trade.ResultDeal()>0)
res=true;
return(res);
}
//+------------------------------------------------------------------+
//| 按符号建立卖出仓位|
//+------------------------------------------------------------------+
bool OpenSell(const double lot)
{
bool res=false;
double price=m_symbol.Bid();
double tp=m_symbol.NormalizePrice(m_symbol.Ask()-InpTP*m_adjusted_point);
if(m_trade.Sell(lot,m_symbol.Name(),price,0.0,tp))
if(m_trade.ResultDeal()>0)
res=true;
return(res);
}
现在代码更易读了。
问题始终是如何处理挂着的无利可图的头寸?下面是 1.105 版的一个示例:

和版本 1.105 有一个小变化:在 OnTradeTransaction(当检测到 TakeProfit 仓位平仓时)中,我们搜索最无利可图的仓位,并关闭这个最无利可图的仓位:

请注意,单笔测试完全在"基于真实点数的每一点数"模式下进行。
两个变体的起点都是 10000。选择哪种变体--我认为这取决于您的具体目标。
当至少有一个仓位收到 tp 时,可以选择关闭所有仓位。
在这种情况下可以这样
第一个开始 - 两个多方向头寸,其中一个获得 TakeProfit,我们关闭所有头寸(即关闭剩余头寸 - 无利可图的头寸)。结果,我们在 TakeProfit 上获利,同时在第二个仓位上亏损。
这听起来不太好。
在这种情况下,可以这样做:
首先开始 - 两个多方向头寸,其中一个获得 TakeProfit,然后我们关闭所有头寸(即关闭剩余的头寸 - 无利可图的头寸)。结果,我们在 TakeProfit 上获利,同时在第二个仓位上亏损。
这可不太好。
我有一个这样的系统,但至少应该有 2 个仓位 + 成功入场。
主要问题是找到一个入口,使成功入场的总和超过失败入场总和的一半。
如果不是十字星,从 0.01 开始的 8 个膝盖就足够了。
理论
1) 根据信号在不同方向开立 2 个各为 0.01 的订单
2) 如果价格超过所需的获利距离,则补仓,补仓次数、膝位和止损的步长--您可以玩很长时间。
我决定保留第二个选项(...有一个小改动: 在 OnTradeTransaction 中(当检测到 TakeProfit 平仓时),我们搜索最不盈利的仓位并关闭这个最不盈利的仓位......):
Vladimir Karputov, 2017.01.22 19:00
一如既往的问题--如何处理挂着的无利可图的头寸?下面是 1.105 版的一个例子:

和 1.105 版有一个小改动:在 OnTradeTransaction(当检测到 TakeProfit 仓位平仓时)中,我们搜索最不盈利的仓位并关闭这个最不盈利的仓位:

请注意,单笔测试完全在"基于真实点数的每一点数"模式下进行。
两个变体的起点都是 10000。选择哪个变量--我认为这取决于您的具体目标。
现在版本 1.106
1.007 版 - 防止终端重启:
if(!RefreshRates())
return;
if(m_first)
{
//--- 防止终端重启:
int total=0;
for(int i=PositionsTotal()-1;i>=0;i--) // 返回未结头寸的数量
if(m_position.SelectByIndex(i)) // 通过索引选择位置,以便进一步访问其属性
if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)
total++;
//--- 如果交易账户中已经有该智能交易系统开立的仓位
//--- 因此,我们初始化变量的方式似乎已经是第一次了。
if(total>0)
{
bln_buy=true;
bln_sell=true;
m_first=false;
return;
}
if(OpenBuy(InpLot))
bln_buy=true;
if(OpenSell(InpLot))
bln_sell=true;
m_first=false;
}
//---
现在,如果终端已重启或 EA 已重新编译,而 EA 已在指定交易账户 上开仓,则不会出现 "首次运行 "的情况。


新马丁:
新马丁智能交易系统启动时在两个相对方向开单。OnTradeTransaction 处理。当止盈触发, 它在同方向上开仓 (一个仓位)。两条均线指标的交叉点是大手数开单的信号。
作者: Vladimir Karputov