assessor especializado - perguntas diversas - página 29

 
honest_knave:
Coloque seu código onde você obtém o OrderTicket para fazer o nome.

( Quando alguém precisa de algum código - eu demoro a postá-lo rapidamente - porque eu uso as funções OBJECT_****, ele é pouco diferente das documentações de objetos )

O código abaixo está em OnTick().

for(i=OrdersTotal()-1;i>=0;i--)
  {
   if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
   if(Symbol()!=OrderSymbol()) continue;
   ObjectCreate(0,"#"+IntegerToString(OrderTicket())+" -"+"Object Button",OBJ_BUTTON,0,0,0);
  }

Agora, eu tento chamar esse objeto pelo OnChartEvent() como abaixo.

if(id==CHARTEVENT_OBJECT_CLICK && sparam=="#"+IntegerToString(OrderTicket())+" -"+"Object Button")
  {
   // when click this button - do something...
  }

Obrigado de antemão.

 
não está dentro do OrderTicket() para que não conheça o OrderTicket().
 
Marco vd Heijden:
não está dentro do OrderTicket() para que não conheça o OrderTicket().
Então, não há nenhuma chance?
 
Max Enrik:
Então, não há nenhuma chance?

A maioria das coisas é possível. Mas não estou claro sobre o que você está tentando alcançar. O que é este botão? O que você quer fazer quando ele é clicado?

Você provavelmente pode obter o resultado desejado, mas sua abordagem pode precisar mudar.

 
honest_knave:

A maioria das coisas é possível. Mas não estou claro sobre o que você está tentando alcançar. O que é este botão? O que você quer fazer quando ele é clicado?

Você provavelmente pode obter o resultado desejado, mas sua abordagem pode precisar mudar.


Meu objetivo é que este objeto de botão possa mostrar os nubers de bilhetes e seus lucros quando eu clico neles, aquela nuvem de ordem fecha.

Eu escrevi este comentário a partir de um dispositivo móvel. Portanto, começarei a pesquisar sobre este assunto após 10 horas. Obrigado por seus comentários.
 
Max Enrik:

Meu objetivo é que este objeto de botão possa mostrar os nubers de bilhetes e seus lucros quando eu clico neles, aquela nuvem de ordem fecha.

Escrevi este comentário a partir de um dispositivo móvel. Portanto, começarei a pesquisar sobre este assunto depois de 10 horas. Obrigado por seus comentários.

Ter uma etiqueta única nos nomes dos objetos que identifica estes botões. Você parece estar usando "#".

if(id==CHARTEVENT_OBJECT_CLICK && StringSubstr(sparam,0,1)=="#") // this is one of your order buttons being clicked

Em seguida, extrair o número do pedido do restante do nome do objeto, ou do texto do botão.

Não há necessidade de usar OrderTicket() nesta etapa.

 

Seus objetos são identificados pelo bilhete de encomenda.

"#"+IntegerToString(OrderTicket())+" -"+"Object Button"

Para que cada objeto tenha o número do bilhete em seu nome de corda para poder encontrar a que ordem o objeto pertence.

Isto significa que cada objeto terá "#" no nome da cadeia de caracteres.

Assim, essencialmente em um clique de botão, ele tem primeiro que extrair o número do bilhete de pedido do nome da cadeia de caracteres do objeto, e então executar o comandoselectloop, e quando o bilhete de pedido selecionado corresponder ao número do bilhete de pedido extraído do nome da cadeia de caracteres do botão, ele terá encontrado a ordem.

Ou ele pode simplesmente

SELECT_BY_TICKET

Para selecionar a ordem dentro do evento do gráfico.

Agora seria muito mais fácil se ele simplesmente desse ao objeto o número/nome do bilhete e nada mais.

ObjectCreate(0,"IntegerToString(OrderTicket()),OBJ_BUTTON,0,0,0);

Porque então ele pode apenas selecionar diretamente o bilhete ou comparar os números.

 

Eu estava no último dia experimentando OrderSelect() Loop. Agora primeiro vou tentar mais uma vez em breve.
Depois vou pesquisar profundamente seus últimos comentários.

Obrigado por seus valiosos momentos.

 

Eu tento o código abaixo em meu arquivo test.mq4, então o código abaixo está funcionando perfeitamente, e até agora não enfrentei nenhum problema, mas ainda estou testando-o.

P: Você pode melhorar o código abaixo se ele estiver ruim, por favor?

if(id==CHARTEVENT_OBJECT_CLICK)
  {
   for(i=OrdersTotal()-1; i>=0; i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if(OrderSymbol()!=Symbol()) continue;

      if(sparam=="#"+IntegerToString(OrderTicket())+" -"+"Object Button")
        {
         if(!OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,CLR_NONE))
           {
            Print("# Error ",GetLastError());
           }
        }
     }
  }

Agradecemos antecipadamente.

( Estou trabalhando nisso )

 

Um exame rápido sugere que deve funcionar. Mas você poderia melhorar a eficiência.

Pense em quantos objetos diferentes você desenhou em sua carta. Se você clicar em *qualquer* desses objetos, você vai percorrer cada ordem e tentar encontrar uma correspondência. Muitos objetos provavelmente não têm nada a ver com ordens. Isto é ineficiente.

É por isso que sugeri verificar o primeiro caracter de sparam para "#". Isto identifica automaticamente o objeto como sendo relacionado a uma ordem.

Além disso, não há necessidade de fazer loop através das ordens. O nome do objeto e/ou o texto do objeto já contém o número do bilhete. Então, extraia o número do bilhete de lá e feche o pedido.

Exemplo:

Você abre um pedido. É dado o bilhete número 12345

Criar um OBJ_BUTTON com o nome"#12345".

O código no OnChartEvent() seria algo assim (não compilado, não testado, tarde da noite...):

if(id==CHARTEVENT_OBJECT_CLICK && StringSubstr(sparam,0,1)=="#") // this is an order button
  {
   int ticket=(int)StringSubstr(sparam,1); // extract the ticket number
   if(OrderSelect(ticket,SELECT_BY_TICKET)) // select the order
     {
      if(!OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,CLR_NONE)) // close the order
        {
         Print("# Error ",GetLastError());
        }
     }
  }
(você provavelmente vai querer lidar com a OrderSelect também, em caso de falha)