向鉴赏家提问 - 页 13

 

是的,--我想是的。谢谢你,TheXpert !

我将试一试!

 
亲爱的专家,请帮助我理解OrderCloseBy()函数。我完全糊涂了。我有一个专家顾问,它通过反转条件开仓和平仓。也就是说,开盘买入和收盘卖出的条件是一样的,开盘卖出和收盘买入的条件也是一样的,这意味着在以相同的价格退出一个头寸后,马上就有一个相反方向的头寸以相同的规模开盘。所以我决定尝试取代OrderClose(),用双倍量开立一个相反方向的头寸,然后用OrderCloseBy()关闭相反的订单。也就是说,同样的算法应该被应用,但它会为每笔交易节省一个点差,但测试者却显示出相当不同的结果。我不能确定是我的代码写错了,还是误解了我的想法......。我将非常感谢您的解释......
 
首先,请向你的经纪公司的技术支持部门查询该终端是否支持该功能。并非所有的经纪公司都允许使用OrderCloseBy()函数。
 
在演示中,支持OrderCloseBy()。
 

我不是一个专家。在我的 "帮助 "文件夹中,除了所有 "正常 "的东西外,我还有这个关于这个功能的说明(也复制到这里了--我不记得是哪个分支了)--

OrderCloseBy 函数只用于同时关闭2个订单,其中一个价差被保存。
我们应该以编程方式走过终端,记住所有开放的订单号码及其特征,选择主要订单号码,将其与所需的(从可用的)反面订单相匹配,并粘贴该号码。


//也就是说,按照我的理解,用这个功能你只能关闭两个预先选定的计数器位置。

这就是它的全部内容。

 

是的,嗯...

这就是为什么它叫这个名字。

 

让我重新表述这个问题,即在以下两种立场逆转的可能性中是否存在任何经济上的差异。

1) 使用OrderClose 函数关闭1手卖出,然后打开1手买入。

2) 当SELL在1手中打开时,首先在2手中打开BUY,然后用OrderCloseBy函数关闭SELL,这也会在1手中留下一个打开的BUY位置。

根据工作簿中的例子,在2)的变体中会保留一个传播。

 
简而言之,1+1的价差将得到补偿,剩下的1将是正常的交易价差。
 
https://book.mql4.com/ru/trading/orderclose - 这里有一个关于OrderCloseBy()函数的描述。试着在演示中做了同样的事情--它确实减少了很多传播。但它仍然不能在专家顾问上工作...我很困惑...
 
Dmirtiy писал(а)>>
https://book.mql4.com/ru/trading/orderclose - 在这里你可以看到OrderCloseBy()函数如何工作。我试着在演示中做同样的事情--它确实有较小的传播。但它仍然不能在专家顾问上工作...我真的很困惑...

你已经在两个主题中提出了这个问题。你很有好奇心。

没有简单的解决方案。随着MQL5的发布,这个问题将完全消失。

我可以建议几个我在我的EA中使用的程序。

//检测未结订单的当前状态。

空白 检查订单()
{
int i;
BuyOrder = false;
SellOrder = false;
BuyLots = 0.0。
SellLots = 0.0;

for ( i=0; i < OrdersTotal(); i++)
{
OrderSelect(i, SELECT_BY_POS)。
如果 ( OrderSymbol() == Symbol()
{
如果 ( OrderType() == OP_BUY )
{
BuyOrder = true;
LastBuyLots = OrderLots()。
BuyLots += LastBuyLots; //未平仓的买入头寸之和
BuyTicket = OrderTicket()。
}
如果 ( OrderType() == OP_SELL)
{
SellOrder = true;
LastSellLots = OrderLots()。
SellLots += LastSellLots; // 未平仓的卖出头寸之和
SellTicket = OrderTicket()。
}
}
}
}

//开放(关闭)订单。

空白贸易变量( int variant )。
{
switch( variant )
{
// if (Pattern < 0 && !BuyOrder && !SellOrder && !FridayLastHour) variant = 1;
// 卖出信号,没有订单,而且现在不是周五的最后一个小时。
// 开立一个卖出订单
案例1:
OpenSellOrder(Lots)。
突破。

// if (Pattern < 0 && BuyOrder && ! SellOrder && ! FridayLastHour) variant = 2;
// 卖出信号,有一个开放的买入订单,没有卖出订单
// 这不是星期五的最后一小时--我们正在翻开
案例2:
OpenSellOrder(Lots + BuyLots)。
突破。

// if (Pattern < 0 && BuyOrder && ! SellOrder && FridayLastHour) variant = 3;
// 卖出信号,有一个开放的买入订单,没有卖出订单
// 现在是周五的最后一个小时--关闭买入指令。
案例3:
CloseBuyOrders()。
突破。

// if (Pattern > 0 && !SellOrder && !BuyOrder && !FridayLastHour) variant = 4;
// 买入信号,没有订单,而且不是周五的最后一个小时。
// 打开买入订单
案例4:
OpenBuyOrder(Lots)。
突破。

// if (Pattern > 0 && SellOrder && !BuyOrder && !FridayLastHour) variant = 5;
// 买入信号,有一个开放的卖出订单,没有买入订单
// 这不是星期五的最后一小时--我们正在翻开
案例5:
OpenBuyOrder(Lots + SellLots)。
突破。

// if (Pattern > 0 && SellOrder && !BuyOrder && FridayLastHour) variant = 6;
// 买入信号,有一个开放的卖出订单,没有买入订单
// 现在是周五的最后一个小时--关闭卖出指令。
案例6:
CloseSellOrders()。
突破。

case 7:
// if (SellOrder && BuyOrder) variant = 7;
// 有一个开放的交叉订单
if (WaitBeforeTransaction(WaitSeconds) == 1) // 请求之间的暂停
{
if (LastBuyLots <= LastSellLots)
OrderCloseBy( BuyTicket, SellTicket);
else
OrderCloseBy( SellTicket, BuyTicket);
}
break

//在其他变体中,不做任何事情
默认情况下。
突破。
}
}

我希望你能处理好这些变数。

>>祝你好运!