Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 434

 
WinProject:

Por favor, diga-me como apagar um objeto gráfico. Existem linhas verticais cujos nomes são construídos a partir de valores variáveis.

string name==="test1"; string Vertline="line_"+name; ObjectCreate(0,VertLine,OBJ_VLINE,0,time,cena); Como posso apagar somente as linhas verticais com o nome test1?


Você pode achar esta função útil:

Deleta todos os objetos do tipo especificado pelo prefixo do nome em uma subjanela.

intEfeitosDeleteAll(
longchart_id,// ID do gráfico
prefixoconst string,// prefixo do nome do objeto
intsub_window=EMPTY,// índice da janela
intobject_type=EMPTY// tipo de objeto a ser excluído
);

 
Vladislav Andruschenko:


você pode achar esta função útil:

Deleta todos os objetos do tipo especificado pelo prefixo do nome na subjanela do gráfico.

intObjetosDeleteAll(
longchart_id,//identificador do gráfico
prefixoda string const,// prefixonome do objeto
intsub_window=EMPTY,// window index
intobject_type=EMPTY// tipo de objeto a remover
);


Obrigado, até onde eu entendo esta função entende o prefixo como o primeiro substrato no nome do objeto, mas como apagar pelo segundo substrato no nome do objeto? Existe alguma maneira de usar StringSubstr e StringFind para o nome do objeto para este fim?

 
WinProject:

Obrigado, até onde entendi, por prefixo esta função entende o primeiro substrato no nome do objeto, mas como apagar pelo segundo substrato no nome do objeto? Existe alguma maneira de usar StringSubstr e StringFind para o nome do objeto para este fim?


esperar,

Você especificou o código:

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


Onde você tem o prefixo.

Isso é o que todos fazem.

Por isso, sugeri a função de apagar objetos por prefixo.


"линия_"

Se você precisar excluir uma linha por sufixo, você podeusar StringFind para procurar todos os objetos

por exemplo:

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

Obrigado Vladislav, tudo funciona, com tal ajuda dos membros do fórum, a MQL é muito mais interessante. Site interessante que você tem, obrigado!

 

Olá. Por favor, me ajude a descobrir por que ele pára de arrasto depois que as posições aparecem.

A questão é esta: abrir duas posições 1, 2. a um preço, a primeira é fechada por arrasto, a segunda é ativada na condição de que, ao preço de abertura da posição, a posição seja uma só.

Tudo funciona bem, a posição 1 é fechada, a posição 2 é arrastada, mas quando mais duas posições 3 e 4 abrem a preços diferentes, a rede de arrasto não passa para a posição 2.

Por que pára a pesca de arrasto?

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:

Olá. Por favor, me ajude a descobrir por que ele pára de arrasto depois que as posições aparecem.

A questão é esta: abrir duas posições 1, 2. a um preço, a primeira é fechada por arrasto, a segunda é ativada na condição de que, ao preço de abertura da posição, a posição seja uma só.

Tudo funciona bem, a posição 1 é fechada, a posição 2 é arrastada, mas quando mais duas posições 3 e 4 abrem a preços diferentes, a rede de arrasto não passa para a posição 2.

Por que pára a pesca de arrasto?


Eu só apontaria um erro grosseiro.

   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)


Você passa pelas ordens e depois executa a função contando o número de posições, selecionando assim outra posição na funçãoNumPosByPrice

para que a construção posterior

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


não funcionará corretamente.


há muitas maneiras de resolver isto.

Por exemplo:

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))


Embora isto seja fundamentalmente errado, servirá para uma rápida compreensão.

depois:


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

acrescentar :

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


Vou apenas apontar o erro grosseiro.

Há muitas maneiras de resolver isto.

Obrigado, estou vendo, arrasto)

 

Você pode me dizer como reabrir a janela de alertas no mt4? Eu costumava ter um script que criava um sinal falso e abria a janela de alertas, agora depois de reinstalar o sistema eu não consigo encontrá-lo na internet. Talvez alguém tenha um?

 
amenrazp:

Você pode me dizer como reabrir a janela de alertas no mt4? Eu costumava ter um script que criava um sinal falso e abria a janela de alertas, agora depois de reinstalar o sistema eu não consigo encontrá-lo na internet. Talvez alguém tenha um?

Alerta(""); tal roteiro?
 
Vladislav Andruschenko:
Alerta(""); tal roteiro?

Parece que sim. Você tem uma maneira de anexá-lo aqui?

Razão: