新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 434

 
WinProject:

请告诉我如何删除一个图形对象。有一些垂直线,其名称是由变量值构建的。

string name=="test1"; string Vertline="line_"+name; ObjectCreate(0,VertLine,OBJ_VLINE,0,time,cena); 我怎样才能只删除名称为test1的垂直线?


你可能会发现这个功能很有用。

删除子窗口中按名称前缀指定类型的所有对象。

intObjectsDeleteAll(
longchart_id,// 图表ID
const stringprefix,// object name prefix
intsub_window=EMPTY,// 窗口的索引。
intobject_type=EMPTY//要删除的对象的类型
);

 
Vladislav Andruschenko:


你可能会发现这个功能很有用。

删除图表子窗口中按名称前缀指定类型的所有对象。

intObjectsDeleteAll(
longchart_id,//图表标识符
const stringprefix,// prefix对象名称
intsub_window=EMPTY,// 窗口索引
intobject_type=EMPTY// 要删除的对象类型
)。


谢谢,根据我的理解,这个函数将前缀理解为对象名称中的第一个子串,但如何通过对象名称中的第二个子串来删除?是否有办法使用StringSubstr 和StringFind来实现这个目的的对象名称?

 
WinProject:

谢谢,据我所知,这个函数通过前缀可以理解对象名称中的第一个子串,但是如何通过对象名称中的第二个子串来删除?是否有办法使用StringSubstr和StringFind来实现这个目的的对象名称?


等待。

你已经指定了代码。

string Vertline="линия_"+name; 


在你有前缀的地方。

这是每个人都会做的事情。

这就是为什么我建议你使用按前缀删除对象的功能。


"линия_"

如果你需要按后缀删除一行,你可以使用StringFind 来搜索所有对象

例如:

void ObjectsDelete()
  {
string NameEA="суффикс";
   for(int i=ObjectsTotal();i>=0;i--)
     {
      if(StringFind(ObjectName(i),NameEA)!=-1)ObjectDelete(ObjectName(i));
     }
  }
 

谢谢你,Vladislav,一切都很好,有了论坛成员的这种帮助,MQL就更有趣了。你的网站很有趣,谢谢你!

 

你好。请帮助我找出为什么它在出现头寸后停止了拖网。

重点是这样的:开设两个仓位1、2。在一个价格上,第一个仓位被拖网关闭,第二个拖网被激活,条件是在仓位的开盘价 上,仓位为1。

一切运作正常,位置1被关闭,位置2被拖网,但当再有两个位置3和4以不同的价格打开时,拖网就不会转到位置2。

为什么它会停止拖网?

void Tral_SL_one(int _TrailingStop=0,int _TrailingStep=0)
  {
   if(_TrailingStop<=0)
      return;
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(!(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)))
         continue;
      if(OrderSymbol()!=Symbol())
         continue;
      if(OrderMagicNumber()!=_MagicNumber)
         continue;
      if(OrderType()==OP_BUY)
        {
         if(NumPosByPrice(Symbol(),OP_BUY,OrderOpenPrice(),_MagicNumber)==1)
           {
            if(NormalizeDouble(Bid-OrderOpenPrice(),Digits)>NormalizeDouble(_TrailingStop *Point,Digits))
              {
               if(NormalizeDouble(OrderStopLoss(),Digits)<NormalizeDouble(Bid -(_TrailingStop+_TrailingStep-1)*Point,Digits) || OrderStopLoss()==0)
                 {
                  if(OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-_TrailingStop*Point,Digits),OrderTakeProfit(),OrderExpiration()));
                   
                 }
              }
           }
        }

      if(OrderType()==OP_SELL)
        {

         if(NumPosByPrice(Symbol(),OP_SELL,OrderOpenPrice(),_MagicNumber)==1)
           {
            if(NormalizeDouble(OrderOpenPrice()-Ask,Digits)>NormalizeDouble(_TrailingStop *Point,Digits))
              {
               if(NormalizeDouble(OrderStopLoss(),Digits)>NormalizeDouble(Ask+(_TrailingStop+_TrailingStep-1)*Point,Digits) || OrderStopLoss()==0)
                 {
                  if(OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+_TrailingStop*Point,Digits),OrderTakeProfit(),OrderExpiration()));
                    
                 }
              }
           }
        }
     }
  }
//===
int NumPosByPrice(string sy="",int op=-1,double pp=0,int mn=-1) 
  {
   double px,py;
   int    d,i,k=OrdersTotal(),num=0;

   if(sy=="0") sy=Symbol();
   for(i=0; i<k; i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
        {
         if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) 
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) 
              {
               if(mn<0 || OrderMagicNumber()==mn) 
                 {
                  d=MarketInfo(OrderSymbol(),MODE_DIGITS);
                  px=NormalizeDouble(pp, d);
                  py=NormalizeDouble(OrderOpenPrice(), d);
                  if(pp<=0 || px==py) num++;
                 }
              }
           }
        }
     }
   return(num);
  }
 
mila.com:

你好。请帮助我找出为什么它在出现头寸后停止了拖网。

重点是这样的:开设两个仓位1、2。在一个价格上,第一个仓位被拖网关闭,第二个拖网被激活,条件是在仓位的开盘价 上,仓位为1。

一切运作正常,位置1被关闭,位置2被拖网,但当再有两个位置3和4以不同的价格打开时,拖网就不会转到位置2。

为什么它会停止拖网?


我只想指出一个严重的错误。

   for(int i=0; i<OrdersTotal(); i++)
     {
      if(!(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)))
         continue;
      if(OrderSymbol()!=Symbol())
         continue;
      if(OrderMagicNumber()!=_MagicNumber)
         continue;
      if(OrderType()==OP_BUY)
        {
         if(NumPosByPrice(Symbol(),OP_BUY,OrderOpenPrice(),_MagicNumber)==1)


你通过订单,然后运行计算仓位数量的函数,从而在NumPosByPrice 函数中选择另一个仓位

因此,进一步的建设

 if(NormalizeDouble(Bid-OrderOpenPrice(),Digits)>NormalizeDouble(_TrailingStop *Point,Digits))


将无法正常工作。


有很多方法来解决这个问题。

比如说。

void Tral_SL_one(int _TrailingStop=0,int _TrailingStep=0)
  {
   if(_TrailingStop<=0)
      return;
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(!(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)))
         continue;
      if(OrderSymbol()!=Symbol())
         continue;
      if(OrderMagicNumber()!=_MagicNumber)
         continue;
      if(OrderType()==OP_BUY)
        {
         if(NumPosByPrice(Symbol(),OP_BUY,OrderOpenPrice(),_MagicNumber)==1)
           {
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
            if(NormalizeDouble(Bid-OrderOpenPrice(),Digits)>NormalizeDouble(_TrailingStop *Point,Digits))


虽然这从根本上说是错误的,但为了快速理解,这也可以做到。

后。


if(NumPosByPrice(Symbol(),OP_BUY,OrderOpenPrice(),_MagicNumber)==1)

添加 :

OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
 
Vladislav Andruschenko:


我只想指出这个严重的错误。

许多方法 来解决这个问题。

谢谢你,我明白了,trawl)

 

你能告诉我如何在mt4中重新打开警报窗口吗? 我以前有一个脚本,可以创建一个假信号并打开警报窗口,现在重新安装系统后,我在网上找不到它。也许有人有一个?

 
amenrazp:

你能告诉我如何在mt4中重新打开警报窗口吗? 我以前有一个脚本,可以创建一个假信号并打开警报窗口,现在重新安装系统后,我在网上找不到它。也许有人有一个?

Alert(""); 这样的脚本?
 
Vladislav Andruschenko:
Alert(""); 这样的脚本?

看起来是这样的。你有办法把它附在这里吗?