assessor especializado - perguntas diversas - página 30

 
honest_knave:

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)

Uau! Eu não sabia sobre isso.

Então, você mencionou duas vezes, e eu não descobri exatamente nada sobre isso.
Agora vou testá-lo por mim mesmo e trazê-lo para meu arquivo principal da EA.

Muito mais obrigado.

 

Eu uso OrderTicket() para outros objetos, agora eu vejo quando eu clico nesses objetos - ordem fechar.
Gostei do seu método, mas parece que ele influencia outros objetos.

Outro nome de objeto como este aqui é um deles.

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

Obrigado de antemão.

 
Max Enrik:

Eu uso OrderTicket() para outros objetos, agora eu vejo quando eu clico naquele objeto - ordem fechar.
Gostei do seu método, mas parece que ele influencia outros objetos.

Outro nome de objeto como este aqui é um deles.

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

Obrigado de antemão.

A solução mais elegante é mudar seu sistema de nomenclatura

No entanto, você ainda pode tirar o número do pedido. Depende apenas do formato exato do nome.

Mas antes de tudo isso, qual é o OBJPROP_TEXT do botão? Algum outro objeto tem o mesmo OBJPROP_TEXT?

 
honest_knave:

A solução mais elegante é mudar seu sistema de nomenclatura
No entanto, você ainda pode tirar o número do pedido. Depende apenas do formato exato do nome.
Mas antes de tudo, o que é o OBJPROP_TEXT do botão? Algum outro objeto tem o mesmo OBJPROP_TEXT?

Sim! Eu sei que posso mudar os nomes dos objetos de botão ( também uso Prefixo ) se eu mudar os nomes dos botões, então eu poderia mudar muitas coisas, por exemplo, apagar sistema e outras coisas que estão todas ligadas umas às outras.

Abaixo estão os nomes de Botões e HLine.

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

( claro, nomes de objetos um pouco mais diferentes, mas o mesmo método )

Obrigado de antemão.

 

Mercado Fechado

Talvez eu tenha encontrado, mas não tenho certeza.
Se isto não for bom, por favor, me avise.

if(id==CHARTEVENT_OBJECT_CLICK && StringFind(sparam,"close order button",0)>=0)

Obrigado de antemão.

//--- 2ª vez editado

Ei! cara!

Muito obrigado. Até agora, sem problemas. Funciona corretamente!

 

#Objetos de crossover - Abertos

Eu me deparei várias vezes com esta questão, às vezes passei, às vezes desisti, agora eu não gostaria de desistir mais uma vez.
Tenho 2 objetos " HLine e Button " que se cruzam, quero dizer, quando clico em um deles, ambos selecionados isto não é bom para mim. ( BUTTON Width = 20, HLINE Width = como você sabe )

P: Como posso fazer quando clico em BUTTON objeto HLINE não será selecionado enquanto eles se cruzam, por favor?
( Posso selecionar facilmente o objeto HLINE onde eles não se cruzam )

Obrigado de antemão.

( Estou trabalhando nisso, qualquer bom comentário seria melhor, por favor. )

 

#Lucro em Pips - Aberto |#Lucro em Pips - Fechado por enquanto - Eu resolvi

Sr. William- Eu uso seu " Pip, Point ... " códigos de cálculo.
Agora eu tento obter lucro no valor de pips com os códigos abaixo. Tenho 2 pedidos, um deles mostra corretamente ( OP_BUY ), o segundo não mostra corretamente - 399 - real 400 ( OP_SELL ).

P: Estou fazendo mal para ter lucro no cálculo de pips, por favor?

change_to_pips( OrderTakeProfit() - OrderOpenPrice() )

Agradecemos antecipadamente.

( no último dia, eu chequei fóruns em diferentes sites - isso não foi benéfico para mim )

 

Fórum sobre comércio, sistemas comerciais automatizados e estratégias comerciais de teste

MetaTrader 4 Build 574 com Linguagem MQL4 Atualizada e Mercado de Aplicações Lançado

whroeder1, 2014.01.27 14:11

  1. Não escreva códigos ilegíveis e incompreensíveis como esse.
    if (MyOrdersTotal() == 0 && (Hour()​>=​StartHour ​&& Hour()​<​EndHour && StartHour​<​EndHour) || (Hour()​>=​StartHour || Hour()​<​EndHour && StartHour​>​EndHour))
    Tornar legível e simplificar e sempre colocar entre parênteses quando misturar e/ou.
    bool    isHourOKnorm = StartHour < EndHour
                         && StartHour <= Hour() && Hour() < EndHour,
            isHourOKwrap = StartHour > EndHour
                         && (StartHour <= Hour() || Hour() < EndHour),
         isHourOK       = isHourOKnorm || isHourOKwrap;
    if(MyOrdersTotal() == 0 && isHourOK)
  2. E o caso em que StartHour == EndHour (ou seja, todos os 24?) Veja meu código e evite o enrolamento 24 horas.

Um exemplo surpreendente " se " de uma condição complexa do Sr. William.
Apenas
obrigado!


Lutei nos últimos dois dias para consertar minha condição complexa de operador "se", mas não consigo resolver meu problema até encontrar acima um grande exemplo.

 

Por favor, alguém me ajude, eu realmente luto para resolver este problema.

#296

Obrigado de antemão.

 

O código abaixo às vezes funciona perfeitamente, às vezes não. Eu não consigo resolver este problema. Quando uso um único pedido, funciona perfeitamente, mas quando abro vários pedidos, esta função não funciona corretamente.
Ajude-me, por favor, e um pouco mais explica ( que o que está errado no código abaixo ) que seria melhor para mim.

( Agora, estou trabalhando nisso. )

if(id==CHARTEVENT_OBJECT_CLICK && (StringFind(sparam,Button_1,0)>=0 || StringFind(sparam,Button_2,0)>=0))
  {
   ticketnumber=(int) StringSubstr(sparam,1);

   if(OrderSelect(ticketnumber,SELECT_BY_TICKET))
     {
      if(StringFind(sparam,Button_1,0)>=0)
        {
         // ...
        }

      if(StringFind(sparam,Button_2,0)>=0)
        {
         //...
        }

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

         update_1();
         update_2();
         update_3();
        }
     }
  }

Obrigado de antemão.