[存档]任何菜鸟问题,为了不使论坛变得杂乱无章。专业人士,不要与它擦肩而过。没有你,哪里都不能去 - 5. - 页 346

 
hoz Vadim,如果你可以使用ObjectSet(),为什么要重新创建对象?

为什么要征求意见,然后挑战它?这是主流吗?
 
FAQ:

我认为没有必要再争论下去了。 我已经一步步详细地解释了一切。 继续做你一直在做的事情。

能有什么样的讨论呢?我们应该以价格的最大偏差来关闭订单。这意味着我们对价格感兴趣...也就是说,我们应该找到一个极端的挂单(有最高或最低开盘价)。如果你不同意,你可以争论。否则我毕竟是对的!我很清楚我在说什么。
 

该代码删除了ST和TP,我添加了一个条件来进行选择性删除

哪些地方写得不对?一直在删除所有东西 :(

 #property show_inputs
extern bool   StopLoss     = True;    // Удалить только StopLoss
extern bool   TakeProfit   = True;    // Удалить только TakeProfit
extern bool   ALL          = True;    // Удалить все
void start()
   {
   bool   fm;
   int     i;
   double SL=OrderStopLoss();
   double TP=OrderTakeProfit();

      if (StopLoss)   SL=0;
      if (TakeProfit) TP=0;
      if (ALL)       {SL=0; TP=0;}
     
      for (i=0; i<OrdersTotal(); i++)
         {
           if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
               {
                  if (OrderType()==OP_BUY)
                     {
                        fm=OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,CLR_NONE);
                     }
                  if (OrderType()==OP_SELL)
                     {
                        fm=OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,CLR_NONE);
                     }
               }
         }
   }

还是没有其他解决办法,必须为每个条件编写删除代码?

#property show_inputs
#include <WinUser32.mqh>
extern bool   StopLoss     = False;    // Удалить только StopLoss
extern bool   TakeProfit   = False;    // Удалить только TakeProfit
extern bool   ALL          = False;    // Удалить все
void start()
   {
   bool   fm;
   int     i;

    if (StopLoss)
         {
            for (i=0; i<OrdersTotal(); i++)
               {
                 if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
                     {
                        if (OrderType()==OP_BUY)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderTakeProfit(),CLR_NONE);
                           }
                        if (OrderType()==OP_SELL)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderTakeProfit(),CLR_NONE);
                           }
                     }
               }
           return(0);
         }
      if (TakeProfit)
         {
            for (i=0; i<OrdersTotal(); i++)
               {
                 if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
                     {
                        if (OrderType()==OP_BUY)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),0,CLR_NONE);
                           }
                        if (OrderType()==OP_SELL)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),0,CLR_NONE);
                           }
                     }
               }
           return(0);
         }
      if (ALL)
         {
            for (i=0; i<OrdersTotal(); i++)
               {
                 if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
                     {
                        if (OrderType()==OP_BUY)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,0,CLR_NONE);
                           }
                        if (OrderType()==OP_SELL)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,0,CLR_NONE);
                           }
                     }
               }
           return(0);
         }
   }             

 
hoz:


Vadim,当你可以使用ObjectSet() 时,为什么要再次创建对象

在这种情况下,有一个功能,图形对象被完全创建和配置。其中,创作功能得到了优化。如果该对象已经存在,则不会被创建。自己检查一下吧。测量创建对象的时间,然后改变属性。第二次通话时间会短很多。也就是说,没有任何东西被重新创造出来。

因此,我们有一个通用的函数,不仅可以创建一个对象,而且还可以通过改变对象的属性 来定制它,而不需要太多的时间。

 
你能建议一个EA的脚本来确定市场趋势吗?
 

我写了一个函数,将删除价格最低的卖单。 要关闭的空单数量 等于触发的买单数量,即进入市场订单。

因此,如果一个买单被触发,那么我们就关闭一个卖单,如果两个买单被触发,那么我们就关闭两个卖单。

以下是代码。

//+-------------------------------------------------------------------------------------+
//| Удаление несработанных отложеннык шортов                                            |
//+-------------------------------------------------------------------------------------+
void DeletePendingSells(int& amountOfCurrPending)
{
   int total = OrdersTotal() - 1,
       ordersToDelete = level - amountOfCurrPending,
       s_ticket;
   amountOfCurrPendingBuys = 0;
   amountOfCurrPendingSells = 0;
   Print("DeletePendingSells: level = ", level);
   Print("ordersToDelete = level - amountOfCurrPending ; ", level, " - ", amountOfCurrPending);
   int n = 0;
   double OOP = 2.0;
   Print("функция сноса отложек DeletePendingSells");
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if(OrderType() != OP_SELLSTOP) continue;
      
      while (n < ordersToDelete)
      {
         if (OOP > OrderOpenPrice())
         {
             Print("OOP > OrderOpenPrice() ; ", OOP, " > ", OrderOpenPrice());
             OOP = OrderOpenPrice();
             s_ticket = OrderTicket();
             ordersToDelete--;
         }
      }
   }
}

amountOfCurrPending-待处理的 买入订单 的数量。

水平- 最初发送给每一方的待定订单的数量。

OOP- 挂单的开盘价,我已经取了任何无法达到的值。

我们的条件如下:如果计数器低于ordersToDelete,我们就删除价格最低的挂单。但所有空头头寸都被删除。我有什么问题吗?

 
hoz:

我写了一个函数,将删除价格最低的卖单。 要关闭的空单数量 等于触发的买单数量,即进入市场订单。

因此,如果一个买单被触发,那么我们就关闭一个卖单,如果两个买单被触发,那么我们就关闭两个卖单。

以下是代码。

amountOfCurrPending- 待处理的买入订单的数量。

水平- 最初发送给每一方的待定订单的数量。

OOP- 挂单的开盘价,我已经取了任何无法达到的值。

我们的条件如下:如果计数器低于ordersToDelete,我们就删除价格最低的挂单。但所有空头头寸都被删除。我有什么问题吗?

我不明白你的逻辑。为什么不呢:该订单被转化为市场头寸--最远的相反挂单被删除。
这就是全部。还是你在一个价格上有一堆的订单?
 
artmedia70:

这就是全部。或者你有一揽子订单的价格吗?


不,订单是以递增的方式...
artmedia70:
我不明白你的逻辑...为什么不呢:订单被转换为市场头寸--最远的相反挂单被移除。

这就是我删除最远的相反头寸的方法,也就是说,既然是空头,就意味着开盘价 最低的头寸。在这里,我重写了这个函数,这里的一切应该都很清楚。我删除了印刷品,并删除了一个额外的变量。

变量amountOfCurrPending 转移买入时剩余的交易数量。也就是说,如果初始金额是水平,而amountOfCurrPending 是当前的订单金额,那么用当前的订单金额减去初始金额,我们将得到差额,这就是删除短线所需的金额。你看到了吗?

//+-------------------------------------------------------------------------------------+
//| Удаление несработанных отложеннык шортов                                            |
//+-------------------------------------------------------------------------------------+
void DeletePendingSells(int& amountOfCurrPending)
{
   int total = OrdersTotal() - 1,
       ordersToDelete = level - amountOfCurrPending,  // Количество отложек, которые требуется удалить
       s_ticket;
   amountOfCurrPendingBuys = 0;                       // Количество текущих отложек на покупку
   amountOfCurrPendingSells = 0;                      // Количество текущих отложек на продажу
   Print("DeletePendingSells: level = ", level);
   Print("ordersToDelete = level - amountOfCurrPending ; ", level, " - ", amountOfCurrPending);

   double OOP = 2.0;
   Print("функция сноса отложек DeletePendingSells");
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if(OrderType() != OP_SELLSTOP) continue;
      
      while (ordersToDelete > 0)                      // Если есть ордера, которые требуется удалить..
      {
         if (OOP > OrderOpenPrice())
         {
             Print("OOP > OrderOpenPrice() ; ", OOP, " > ", OrderOpenPrice());
             OOP = OrderOpenPrice();                  // Ищется ордер, с минимальной ценой открытия
             s_ticket = OrderTicket();                // Получаем тикет ордера с минимальной ценой открытия

             Print("DeletePendingSells: s_ticket = ", s_ticket);
             Print("DeletePendingSells: OOP = ", OOP);
             OrderDelete(s_ticket,Black); // Тут нужно закрыть найденный ордер, и видимо проверить, что он закрыт. И счётчик уменьшить!
             ordersToDelete--;                        // Уменьшаем количество требуемых ордеров для удаления
         }
      }
   }
   Print("DeletePendingSells: ordersToDelete = ", ordersToDelete);
}
我用红色标记的地方有错吗?如何解决这个问题?
 
hoz:

不,订单是递增的。

我就是这样删除最远的头寸,即既然是空头,就意味着开盘价最低的头寸。在这里我重写了这个函数,它应该是清楚的。我删除了印刷品,并删除了一个额外的变量。

变量amountOfCurrPending 转移买入时剩余的交易数量。也就是说,如果初始金额是水平,而amountOfCurrPending 是当前的订单金额,那么用当前的订单金额减去初始金额,我们将得到差额,这就是删除短线所需的金额。你看到了吗?

我用红色标记的地方有错吗?如何正确解决这个问题?
 Ищется ордер, с минимальной ценой открытия

我将在挂单的评论中指定其在网格中的订单号,并在相应的相反挂单中写上相同的号码。然后,当找到一个市场头寸时,在读取其评论中的数字后,可以找到相应的相反头寸,其评论中的数字也是相同的。既然magiks是用来做其他事情的。

ZS,我还没有时间去阅读/解析你的代码

 
artmedia70:

我会在待定位置的注释中写上它在网格中的序列号,并在相应的相反待定位置写上相同的数字。然后,当发现一个市场位置时,在读取其评论中的数字后,相应的相反挂单将通过其评论中的相同数字毫无问题地被发现。既然你用魔术师来做别的事情。

ZS,我还没有时间去阅读/解析你的代码



是的,如果每个方向的挂单数量相同,这样找到相应的挂单是没有问题的。如果不一样,那么按照我的理解,这将是行不通的。