初学者的问题 MQL5 MT5 MetaTrader 5 - 页 890

 

有一个专家顾问,可以让你确定挂单 何时触发

https://www.mql5.com/ru/code/17610

我用它来获得一张SELL_STOP订单的票据

我已将代码改为

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(bln_find_order) // true -> you should look for a order
     {
      static long counter=0;
      Print("Attempt number ",counter);
      ResetLastError();
      if(HistoryOrderSelect(ul_find_order))
        {
         long type_order=HistoryOrderGetInteger(ul_find_order,ORDER_TYPE);
         if(type_order==ORDER_TYPE_SELL_STOP)
           {
            Print("The pending order ",ul_find_order," is found! Type of order is ",
                  EnumToString((ENUM_ORDER_TYPE)HistoryOrderGetInteger(ul_find_order,ORDER_TYPE)));
            bln_find_order=false;         // true -> you should look for a order
            counter=0;
            return;
           }
         else
           {
            Print("The order ",ul_find_order," is not pending");
            bln_find_order=false;         // true -> you should look for a order
            return;
           }
        }
      else
        {
         Print("Order ",ul_find_order," is not find, error#",GetLastError());
        }
      counter++;
     }
  }

在某一时刻之前,一切都很好。直到另一个订单类型出现在历史上。

例如,SELL_LIMIT。

例子

只要SELL_LIMIT出现在历史上,我就无法得到最后一个SELL_STOP的票据。

专家顾问抛出了一个错误。

9号令没有悬念

虽然在历史上有SELL_STOP

还有,如果我需要第七张票,为什么要和第九张做?

感觉专家顾问不是在所有的历史中搜索所需的订单,而是只搜索最后一个订单。
TypePendingOrderTriggered
TypePendingOrderTriggered
  • 投票: 21
  • 2017.02.14
  • Vladimir Karputov
  • www.mql5.com
()   {    (bln_find_order)      {        counter=;       (,counter);       ();         {          (type_order== || type_order== ||             type_order== ||type_order==)            {             (,ul_find_order,,                   (()(ul_find_order,)));             bln_find_order=;                     counter=;             ;            }...
 

你好。如果StopLoss_=0,我得到的是错误。

修改失败#2卖出3.00 Si-9.18 sl: 0, tp: 62749 -> sl: 0, tp: 62774 [无效停止]


 if(m_position.PositionType()==POSITION_TYPE_SELL)
                 {
                  if(m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)!=m_position.TakeProfit())
                    {
                     if(StopLoss_<=0)
                       {
                        m_trade.PositionModify(m_position.Ticket(),
                                               m_position.StopLoss(),
                                               m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)
                                               );
                        Sleep(200);
                       }

                     if(StopLoss_>0)
                       {
                        m_trade.PositionModify(m_position.Ticket(),
                                               m_symbol.NormalizePrice(m_position.PriceOpen()+StopLoss_*m_adjusted_point),
                                               m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)
                                               );
                        Sleep(200);
                       }
                    }
                 }
如果我在m_position.StopLoss()中加入零,也会出现同样的错误怎么了?
 
Sile Si:

你好。如果StopLoss_=0,我得到的是错误。

修改失败#2卖出3.00 Si-9.18 sl: 0, tp: 62749 -> sl: 0, tp: 62774 [无效停止]

   if(m_position.PositionType()==POSITION_TYPE_SELL)
     {
      if(m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)!=m_position.TakeProfit())
        {
         if(StopLoss_<=0)
           {
            m_trade.PositionModify(m_position.Ticket(),
                                   m_position.StopLoss(),
                                   m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)
                                   );
            Sleep(200);
           }

         if(StopLoss_>0)
           {
            m_trade.PositionModify(m_position.Ticket(),
                                   m_symbol.NormalizePrice(m_position.PriceOpen()+StopLoss_*m_adjusted_point),
                                   m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)
                                   );
            Sleep(200);
           }
        }
     }

如果我在m_position.StopLoss()后面加上零,同样的错误它是什么?

编写程序时 逻辑不正确。

当StopLoss_=0时,上面的条件就会触发--试图修改TakeProfit。错误在于你从开盘价中减去了 - 在这种情况下,获利水平可能高于当前价格,这是一个错误。

在你的例子中,从RIGHT PRICE(m_position.PriceCurrent)中减去。

 
Vladimir Karputov:

一个卖出头寸被打开,卖出限价被激活,我需要相对于该头寸的新价格移动tp,而不是相对于当前价格。

我应该做什么样的检查来避免试图修改为无效的价格?

 
Sile Si:

一个卖出头寸被打开,卖出限制被激活,我需要相对于新的头寸价格,而不是当前价格来移动tp。

我应该做什么样的检查才能不试图修改为无效的价格?

检查。

if(m_position.PriceOpen()-ExtTakeProfit<m_position.PriceCurrent()
   {
    m_trade.PositionModify(m_position.Ticket(),
                           m_position.StopLoss(),
                           m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)
                           );
...
 
Vladimir Karputov:

检查。

谢谢你,但错误仍然存在。

aqa

可能与目前的价格接近,令人难以接受。我怎样才能检查这个问题呢?

 
Sile Si:

谢谢你,但错误仍然存在。

可能与目前的价格接近,令人难以接受。你如何检查这个?

我没有机会接触到交易所,所以要么自己做,要么在外汇工具上下功夫。对不起。


新增: 引入另一项检查 - 对于卖出头寸,新的获利(计算值)不能高于或等于当前的获利。

 
Vladimir Karputov:

我没有机会接触到交易所,所以要么自己做,要么在外汇工具上下功夫。对不起。


新增: 引入另一项检查 - 对于卖出头寸,新的获利(计算值)不能高于或等于当前的获利。

可能是开盘价(POSITON_PRICE_OPEN) ?

 
Sergey Savinkin:

可能是开盘价(POSITON_PRICE_OPEN) ?

这个选项在上面。见上面的帖子。你在谈话中回答。

 
Vladimir Karputov:...再输入一个检查--对于卖出头寸,新的获利(计算值)必须不高于或等于当前头寸的获利。

不适合,由ATR修改 对于这个错误,还可以做哪些检查?都有可能。在mt4中,有STOPLEVEL,但这里是什么?