Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 434

 
WinProject:

Подскажите пожалуйста, как удалить графический объект. Есть вертикальные линии чьи имена строятся из значений переменной.

 string name=="test1"; string Vertline="линия_"+name; ObjectCreate(0,VertLine,OBJ_VLINE,0,time,cena);  Как удалить только вертикальные линии имеющие в названии test1?


может быть Вам будет полезна эта функция:

Удаляет по префиксу имени в подокне графика все объекты указанного типа.

int  ObjectsDeleteAll(
   long           chart_id,   // идентификатор графика
   const string     prefix,   // префикс имени объекта
   int    sub_window=EMPTY,   // индекс окна
   int    object_type=EMPTY   // тип объекта для удаления
   );

 
Vladislav Andruschenko:


может быть Вам будет полезна эта функция:

Удаляет по префиксу имени в подокне графика все объекты указанного типа.

int  ObjectsDeleteAll(
   long           chart_id,   // идентификатор графика
   const string     prefix,   // префикс имени объекта
   int    sub_window=EMPTY,   // индекс окна
   int    object_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));
     }
  }
 

Спасибо, Владислав, все работает,  с такой помощью от форумчан, MQL на порядок интереснее. Интересный у вас сайт, спасибо!

 

Здравствуйте. Помогите, пожалуйста, выяснить, почему прекращает тралить после появления позиций.

Смысл такой: открыты две позиции 1, 2. по одной цене первая закрывается по тралу,  включается второй трал по условию, что по цене открытия позиции, позиция одна.

Всё работает штатно, пзиция 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 закрылась, позиция 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:


я укажу только на грубую ошибку. 

можно решить это многими способами

Спасибо, понятно, тралит)

 

Подскажите, пожалуйста, как снова открыть окно алертов в мт4?  У меня раньше был скрипт, который создавал фейковый сигнал и открывалось окно алертов, теперь после переустановки системы не могу найти его в интернете. Может, есть у кого-то? 

 
amenrazp:

Подскажите, пожалуйста, как снова открыть окно алертов в мт4?  У меня раньше был скрипт, который создавал фейковый сигнал и открывалось окно алертов, теперь после переустановки системы не могу найти его в интернете. Может, есть у кого-то? 

Alert(""); такой скрипт? 
 
Vladislav Andruschenko:
Alert(""); такой скрипт? 

Похоже на то. У Вас есть возможность прикрепить сюда?

Причина обращения: