consulente esperto - domande varie - pagina 29

 
honest_knave:
Pubblica il tuo codice dove ottieni l'OrderTicket per fare il nome.

( Quando qualcuno ha bisogno di un po' di codice - ritardo a postarlo velocemente - perché uso le funzioni OBJECT_****, è un po' diverso dalle documentazioni degli oggetti )

Il codice sottostante è in 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);
  }

Ora, provo a chiamare quell'oggetto con OnChartEvent() come sotto.

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

Grazie in anticipo.

 
non è all'interno dell'orderloop, quindi non conosce l'OrderTicket().
 
Marco vd Heijden:
non è all'interno dell'orderloop quindi non conoscerebbe l'OrderTicket().
Quindi, non c'è nessuna possibilità?
 
Max Enrik:
Quindi, non c'è nessuna possibilità?

Molte cose sono possibili. Ma non mi è chiaro cosa state cercando di ottenere. Cos'è questo pulsante? Cosa vuoi fare quando viene cliccato?

Probabilmente puoi ottenere il risultato desiderato, ma il tuo approccio potrebbe dover essere cambiato.

 
honest_knave:

Molte cose sono possibili. Ma non mi è chiaro cosa state cercando di ottenere. Cos'è questo pulsante? Cosa vuoi fare quando viene cliccato?

Probabilmente puoi ottenere il risultato desiderato, ma il tuo approccio potrebbe dover essere cambiato.


Il mio scopo è questo oggetto pulsante potrebbe mostrare i biglietti nubers e il loro profitto quando li clicco, quella nuvola di ordine si chiude.

Ho scritto questo commento da un dispositivo mobile. Quindi, inizierò la ricerca su questo problema dopo 10 ore più tardi. Grazie per i vostri commenti.
 
Max Enrik:

Il mio scopo è questo oggetto pulsante potrebbe mostrare i biglietti nubers e il loro profitto quando faccio clic su di loro, quella nuvola ordine chiudere.

Ho scritto questo commento da un dispositivo mobile. Quindi, inizierò la ricerca su questo problema dopo 10 ore più tardi. Grazie per i vostri commenti.

Avere un tag unico nei nomi degli oggetti che identifica questi pulsanti. Sembra che tu stia usando "#".

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

Quindi estrarre il numero d'ordine dal resto del nome dell'oggetto o dal testo del pulsante.

Non c'è bisogno di usare OrderTicket() in questa fase.

 

I suoi oggetti sono identificati dall'orderticket.

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

In modo che ogni oggetto abbia il numero del biglietto nel suo nome di stringa per poter trovare a quale ordine l'oggetto appartiene.

Questo significa che ogni oggetto avrà "#" nel suo nome di stringa.

Quindi, essenzialmente, al clic di un pulsante deve prima estrarre il numero del biglietto d'ordine dal nome della stringa dell'oggetto, e poi eseguire l'orderelectloop, e quando l'orderticket selezionato corrisponde al numero dell'orderticket estratto dal nome della stringa del pulsante, avrà trovato l'ordine.

Oppure può semplicemente

SELECT_BY_TICKET

Per selezionare l'ordine all'interno dell'evento grafico.

Ora sarebbe molto più semplice se desse all'oggetto solo il numero/nome del biglietto e nient'altro.

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

Perché allora può semplicemente selezionare direttamente il biglietto o confrontare i numeri.

 

L'ultimo giorno ho provato OrderSelect() Loop. Ora prima lo proverò ancora una volta presto.
Poi ricercherò profondamente i vostri ultimi commenti.

Grazie per il vostro tempo prezioso.

 

Ho provato il codice sottostante nel mio file test.mq4, quindi il codice sottostante funziona perfettamente, e finora non ho affrontato alcun problema, ma lo sto ancora testando.

D: Puoi migliorare il codice qui sotto se è brutto, per favore?

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());
           }
        }
     }
  }

Grazie in anticipo.

(Ci sto lavorando)

 

Un esame sommario suggerisce che dovrebbe funzionare. Ma si potrebbe migliorare l'efficienza.

Pensate a quanti oggetti diversi avete disegnato sul vostro grafico. Se clicchi *qualsiasi* di questi oggetti, dovrai fare un loop su ogni singolo ordine e cercare di trovare una corrispondenza. Molti oggetti probabilmente non hanno nulla a che fare con gli ordini. Questo è inefficiente.

Ecco perché ho suggerito di controllare il primo carattere di sparam per "#". Questo identifica automaticamente l'oggetto come collegato ad un ordine.

Inoltre, non c'è bisogno di fare un ciclo attraverso gli ordini. Il nome dell'oggetto e/o il testo dell'oggetto contengono già il numero del biglietto. Quindi estrai il numero del biglietto da lì e chiudi l'ordine

Esempio:

Si apre un ordine. Gli viene dato il numero di ticket 12345

Crea un OBJ_BUTTON con nome"#12345".

Il codice in OnChartEvent() sarebbe qualcosa come questo (non compilato, non testato, a notte fonda...):

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());
        }
     }
  }
(probabilmente vorrete gestire anche OrderSelect, in caso di fallimento)