Announcement

Collapse
No announcement yet.

bottoni/pulsanti interattivi

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    bottoni/pulsanti interattivi

    Ciao a tutti,
    Chi saprebbe spiegarmi come rendere interattivi i pulsanti/bottoni che si possono creare con la funzione OBJ_BUTTON?
    Interattivi nel senso che vorrei ad esempio che alla pressione del pulsante mi apre un ordine buy/sell...

    #2
    È molto semplice... Tra le funzioni di gestione degli eventi dell'MQL4 c'è quella chiamata OnChartEvent().
    Per farla semplice, questa funzione viene richiamata ogni volta che il trader mette mano al grafico della MT4.
    In particolare, viene anche richiamata quando un utente fa clic su un oggetto grafico (nel nostro caso il bottone).

    Poniamo che io ho un EA che crea un bottone nella OnInit().
    Scrivo il codice sul momento senza ricontrollare, tanto dovresti già sapere come si crea un bottone.
    Quindi il codice sarà circa questo:
    Code:
    //+------------------------------------------------------------------+
    //| Expert initialization function                                   |
    //+------------------------------------------------------------------+
    int OnInit()
      {
       long chart=ChartID();
       ObjectCreate("Bottone",OBJ_BUTTON,0,0,0,0);
       ObjectSetInteger(chart,"Bottone",OBJPROP_CORNER,CORNER_RIGHT_UPPER);
       ObjectSetInteger(chart,"Bottone",OBJPROP_XDISTANCE,215);
       ObjectSetInteger(chart,"Bottone",OBJPROP_YDISTANCE,110);
       ObjectSetInteger(chart,"Bottone",OBJPROP_XSIZE,200);
       ObjectSetInteger(chart,"Bottone",OBJPROP_YSIZE,20);
       ObjectSetInteger(chart,"Bottone",OBJPROP_BGCOLOR,clrMediumVioletRed);
       ObjectSetString(chart,"Bottone",OBJPROP_TEXT,"Cliccare qui");
       ObjectSetString(chart,"Bottone",OBJPROP_FONT,"Arial");
       ObjectSetInteger(chart,"Bottone",OBJPROP_FONTSIZE,10);
       ObjectSetInteger(chart,"Bottone",OBJPROP_COLOR,clrWhite);
       ObjectSetInteger(chart,"Bottone",OBJPROP_STATE,false);
       
       return(INIT_SUCCEEDED);
      }
    Da notare bene 2 cose importanti che serviranno dopo.
    1) Il nome del bottone che utilizzi (in questo caso io ho usato Bottone).
    2) Lo stato (OBJPROP_STATE) del bottone. True=premuto, False=non premuto.

    Quindi ora ci concentreremo sulla funzione per gestire le istruzioni da eseguire quando viene cliccato il bottone.
    Metto già la funzione con tutto il codice che ci serve e lo spiegherò dopo:
    Code:
    //+------------------------------------------------------------------+
    //| ChartEvent function                                              |
    //+------------------------------------------------------------------+
    void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
      {
       if(id==CHARTEVENT_OBJECT_CLICK) //Se l'evento che è accaduto è stato un clic di un oggetto grafico...
         {
          if(StringFind(sparam,"Bottone")>=0) //Se il nome dell'oggetto è Bottone...
            {
             if(ObjectGet(sparam,OBJPROP_STATE)) //Se l'oggetto è cliccato (stato=true)...
               {
                //Istruzioni da eseguire...
                ObjectSet(sparam,OBJPROP_STATE,false); //Riposiziono il tasto con lo stato non premuto.
               }
            }
         }
      }
    Per farla breve visto che è tutto spiegato nel link ad inizio post, i parametri della OnCahrtEvent() sono:
    id=tipo di azione che è stata eseguita dall'utente. La lista delle azioni disponibili è nel link all'inizio di questo post.
    lparam=l'eventuale informazioni di tipo intero che potrebbe avere l'oggetto.
    dparam=l'eventuale informazioni di tipo decimale che potrebbe avere l'oggetto.
    sparam=l'eventuale informazioni di tipo testo che potrebbe avere l'oggetto (nel nostro caso il nome dell'oggetto).

    Quindi come vedi dai commenti che ho inserito nel codice, controllo che l'utente abbia fatto un clic (evento) sul bottone (nome oggetto) ed eseguo le istruzioni, riposizionando subito dopo il bottone su non premuto.

    Dove io ho scritto "Istruzioni da eseguire" tu puoi mettere quello che vuoi fare durante il clic del bottone.
    Nel tuo caso se vorrai aprire un ordine ci metterai il codice per aprirne uno.

    Credo sia tutto.
    Un ultimo appunto che posso fare (di cui ti accorgerai se incomincerai ad usarli) è che l'oggetto OBJ_BUTTON della MT4 fa schifo.
    È pieno zeppo di bug che quelli della MetaQuotes non correggono dalla build 600 di quasi 3 anni fa nonostante le ripetute segnalazioni da parte degli utenti sul forum ufficiale.
    Diciamo che non è un problema solo dei bottoni ma di tutti gli oggetti grafici aggiunti dalla build 600.

    Spero di esserti stato d'aiuto.
    Skype: cadddami

    Comment

    Working...
    X