[警告关闭!]任何新手问题,为了不给论坛添乱。专业人士,不要走过。没有你,哪里都不能去。 - 页 858

 

这是个简单的问题,但我想不出来。

在一个特定的时间点上,有4个空缺职位。我正试图以下列方式关闭所有这些设备。

for (int i=0;i<OrdersTotal();i++)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
        if(OrderType()==OP_BUY)
           OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
        if(OrderType()==OP_SELL)
           OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
      }
  }

但它们不是全部关闭,而是通过一个关闭。事实上,他们有以下数字:2、4、6、7。因此,第2和第6的位置已经关闭。

有什么诀窍吗?

 
usver:

这是个简单的问题,但我想不出来。

在一个特定的时间点上有4个空缺职位。我正试图以下列方式关闭所有这些设备。

但它们不是全部关闭,而是通过一个关闭。事实上,他们有以下数字:2、4、6、7。因此,第2和第6的位置已经关闭。

有什么好处呢?


诀窍在于,在平仓 后,OrderSelect(i,SELECT_BY_POS,MODE_TRADES)中的编号会发生变化,同时并不是所有的都能被平仓。

SZY: 我得到了fts I.Kim的帮助,我做了一点改动--去掉了多余的括号,拉进了一行。

//+------------------------------------------------------------------+
void CloseAllFirstProfit() {
   int i, k=OrdersTotal();
   for (i=k-1; i>=0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) if (OrderProfit()+OrderSwap()>0) ClosePosBySelect();
   k=OrdersTotal();
   for (i=k-1; i>=0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) ClosePosBySelect();
}
//+------------------------------------------------------------------+
void ClosePosBySelect() {
   if (OrderType()==OP_BUY)  OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 10, CLR_NONE);
   if (OrderType()==OP_SELL) OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 10, CLR_NONE);
}
//+------------------------------------------------------------------+

搜索论坛--你会发现原件的。

 
IgorM:


是在关闭一个头寸后,OrderSelect(i,SELECT_BY_POS,MODE_TRADES)中的编号发生变化,不能同时关闭所有头寸。

SZY: 我得到了fts I.Kim的帮助,我做了一点改动--去掉了多余的括号,拉进了一行。

通过论坛搜索--你会发现原始的


谢谢你的提示和例子。我将研究这个问题。

在路上,我将问另一个问题。

任务如下:我需要确定由止损触发的订单类型被关闭,并将由止损关闭的未来订单与之前的订单进行比较(即比较它们的类型)。在翻阅了文档后,我没有找到与处理最后一个事件有关的内容。

在这一点上,我把这个操作实现为当订单达到设定的边界(Bid-OrderOpenPrice() >=TP*Point)时的平仓。这使我能够在一个变量中存储最后一个关闭的订单的类型,并将其与刚刚关闭的订单进行比较( if(type==OrderType())).在测试过程中一切正常。 然而,我想用止损来实现它。

我试图用OrderSelect() 和MODE_HISTORY参数从历史中选择一个已关闭的订单。由于没有关闭订单的条件,那么OrdersTotal()变量的变化可以被认为是触发了止损。但我遇到了一个问题:我无法找到最后关闭的订单的编号(因为它们的编号在不断变化),或者说我还没有想好怎么做。

问题是:如何利用止损来实现?也许有更容易的方法?那么,如果思维方向是正确的,那么我们如何找到最后的封闭订单呢?

 
IgorM:


在关闭一个头寸后,OrderSelect(i,SELECT_BY_POS,MODE_TRADES)中的编号被改变,而且所有头寸不能同时关闭

SZS: I.Kim的功能给了我很大的帮助,我把它们改了一下--我去掉了多余的括号,把它们拉成了一行。

通过论坛搜索--你会发现原始的

你已经说得够多了...都在一个堆里。
https://docs.mql4.com/ru/trading/OrderSelect
 
usver:

这是个简单的问题,但我想不出来。

在一个特定的时间点上有4个空缺职位。我正试图以下列方式关闭所有这些设备。

但它们不是全部关闭,而是通过一个关闭。事实上,他们有以下数字:2、4、6、7。因此,第2和第6的位置已经关闭。

问题是什么?

你说的是按顺序排列的数字吗? 还是门票?

 
abolk:

你说的是按顺序排列的数字吗? 还是门票?


我自己已经很困惑了。它们是票子,但我给它们是为了说明情况。他们一个接一个地关闭。
 

万幸的是,我得到了它的工作!!!。


维克多非常感谢你,我有一个错误,我没有正确写出指标的名称。

 
abolk:
你刚才所说的...一堆堆的
https://docs.mql4.com/ru/trading/OrderSelect


尝试在一组订单中改变/删除外卖或止损--任务很简单,但我遇到过,当使用OrderSelect(i,SELECT_BY_POS,MODE_TRADES)进行订单选择时,订单编号就在循环体中改变,我设法将一个已经修改的(没有外卖的)订单修改了几次--错误#1,这就是为什么我建议wever 有类似问题的原因。

请建议--如何使指标在几个柱状体的收盘时重新计算,例如:我想让指标每5个新柱状体重新计算。

 
IgorM:


请建议--如何使一个指标在几个柱子的收盘时重新计算,例如:我想让指标每5个新柱子重新计算一次。

你知道编程。

这是一个合乎逻辑的任务,你不需要很聪明就能解决它。用你的头脑思考。

有不同的情况。到底应该在什么地方重排,在什么TF上重排,应该如何重排,等等。如何回答你的问题。

注意小节的时间,五小节后重置这个时间并再次注意它。在归零的时候,你可以放一个条件来重新计算。函数iTime(NULL,0,0)会有帮助。其余的都是逻辑。

 
IgorM:


请建议--如何使一个指标在几个柱状体的收盘时重新计算,例如:我想让指标每5个新柱状体重新计算一次。


这个方法可能不是最可靠的,但只要尝试一下这个想法就可以了(比如说,一个草案)。

使用Bars变量并跟踪其变化。增加了5个,记住了,等等。

原因: