Announcement

Collapse
No announcement yet.

Creare oggetti dinamici in mql4

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

    Creare oggetti dinamici in mql4

    Buongiorno.
    Sono un neofita non sono un programmatore, ho gia scritto per me stesso un EA che elenca gli ordini a mercato e tramite dei pulsanti posso, inviare tutti gli ordini aperti su telegram, chiudere gli ordini, dimezzare le posizioni, il tutto seguito da un invio di messaggio su telegram.
    Sto provando adesso a riscriverlo utilizzando le librerie <Controls\Dialog.mqh>, <Controls\Label.mqh>; <Controls\Button.mqh>; etc etc.
    Primo ostacolo come dichiarare dinamicamente gli oggetti CLabel.
    Ho trovato questo nella documentazione MQL5 (io sto scrivendo in MQL4, ma sono compatibili) : https://www.mql5.com/it/docs/basis/t...bject_pointers.

    Allora ho provato a fare un test, ma ottengo in errore in inizializzazione dell'EA , e nessun errore in compilazione. Di seguito riporto il codice:

    Code:
    //+------------------------------------------------------------------+
    //| esercizi.mq4 |
    //| Copyright 2023, MetaQuotes Ltd. |
    //| https://www.mql5.com |
    //+------------------------------------------------------------------+
    #property copyright "Copyright 2023, MetaQuotes Ltd."
    #property link "https://www.mql5.com"
    #property version "1.00"
    #property strict
    
    #include <Controls\Dialog.mqh>;
    CAppDialog m_Pannello;
    
    #include <Controls\Label.mqh>
    CLabel *Testo_oggetti[];
    int OrdiniTotali = OrdersTotal();
    
    
    //+------------------------------------------------------------------+
    //| Expert initialization function |
    //+------------------------------------------------------------------+
    int OnInit()
    {
    //--- create timer
    EventSetTimer(60);
    Pannello();
    //---
    return(INIT_SUCCEEDED);
    }
    //+------------------------------------------------------------------+
    //| Expert deinitialization function |
    //+------------------------------------------------------------------+
    void OnDeinit(const int reason)
    {
    //--- destroy timer
    EventKillTimer();
    m_Pannello.Destroy(reason);
    int size=ArraySize(Testo_oggetti);
    for(int i=0; i<size; i++)
    delete(Testo_oggetti[i]);
    }
    //+------------------------------------------------------------------+
    //| Expert tick function |
    //+------------------------------------------------------------------+
    void OnTick()
    {
    //---
    
    }
    //+------------------------------------------------------------------+
    //| Timer function |
    //+------------------------------------------------------------------+
    void OnTimer()
    {
    //---
    
    }
    //+------------------------------------------------------------------+
    //| ChartEvent function |
    //+------------------------------------------------------------------+
    void OnChartEvent(const int id,
    const long &lparam,
    const double &dparam,
    const string &sparam)
    {
    //---
    m_Pannello.OnEvent(id, lparam, dparam, sparam);
    
    }
    //+------------------------------------------------------------------+
    
    
    //+------------------------------------------------------------------+
    //| |
    //+------------------------------------------------------------------+
    bool Pannello()
    {
    int x1, y1, x2, y2, Errore;
    
    //-- Crea Pannello
    x1 = 0;
    y1 = 0;
    x2 = 1000;
    y2 = 500;
    string txt = IntegerToString(AccountNumber()) + " - " + AccountName();
    if(!m_Pannello.Create(0, "Pannello Controllo - Conto " + txt, 0, x1, y1, x2, y2))
    {
    Errore = GetLastError();
    Print("Errore Creazione Pannello ", Errore);
    return(false);
    }
    m_Pannello.Run();
    
    
    x1 = 0;
    y1 = 25;
    x2 = 220;
    y2 = 235;
    
    
    if(OrdiniTotali > 0)
    {
    for(int i = 0 ; i < OrdiniTotali(); i++)
    {
    if(OrderSelect(i, SELECT_BY_POS,MODE_TRADES))
    {
    Testo_oggetti[i] = new CLabel();
    Testo_oggetti[i].Create(0,"Testo_" + IntegerToString(i), 0, x1, y1, x2, y2);
    m_Pannello.Add(Testo_oggetti[i]);
    x1 = 0;
    y1 = y1 + 50;
    x2 = 220;
    y2 = y2 + 50 ;
    }
    }
    }
    return true;
    }
    //+------------------------------------------------------------------+
    L'errore ottenuto è :
    2023.11.04 13:20:06.525 esercizi BTCUSD.,H1: array out of range in 'esercizi.mq4' (107,26)

    quindi in questa riga
    Code:
    Testo_oggetti[i] = new CLabel();
    va oltre il range dell'array, array dichiarato ad inizio codice
    Code:
    CLabel *Testo_oggetti[];
    Dove sbaglio?
    Grazie a chiunque voglia/possa aiutarmi.

    #2
    ciao Luctura, purtroppo conosco sommariamente la programmazione ad oggetti.

    Quello che mi viene in mente per cercare di capire dove nasca l'errore è il fatto che in Metatrader4 a volte gli array puoi dichiararli senza dover decidere una dimensione, alte volte è invece necessario.

    Quindi ti consiglierei di
    - definire una dimensione di default dell'array Testo_oggetti[] , 5, 10, 100, all'atto della dichiarazione dell'array. La dimensione nel seguito del codice puoi anche ridurre o aumentare con ArrayResize(...)
    - usare delle Print per stampare il valore di i così da comprendere qual è l'elemento che ti fa andare "out of range".

    La vita non è un giro di prova, cogli l’attimo..
    Realizzazione per Metatrader4 di trading system, indicatori, pattern grafici, Ottimizzazioni IS-OOS su Forex e CFD, Analisi di Portafoglio .

    Comment


      #3
      Buongiono e grazie per la risposta. La notte porta consiglio, questa notte ho letto della funzione arrayResize, poi ho letto il tuo messaggio e quindi bingo.
      Ho risolto proprio come mi hai consigliato tu, ho provato anche a lasciare la dichiarazione dell'array senza indicare una dimensione iniziale e funziona.
      dichiarazione array:
      Code:
      CLabel *Testo_oggetti[];
      Codice :
      Code:
      if(OrdiniTotali > 0)
      {
      ObjectsDeleteAll(0,"Testo_");
      for(int i = 0 ; i < OrdiniTotali; i++)
      {
      ArrayResize(Testo_oggetti,OrdiniTotali,0 );
      if(OrderSelect(i, SELECT_BY_POS,MODE_TRADES))
      {
      Testo_oggetti[i] = new CLabel();
      Testo_oggetti[i].Text("Testo_" + IntegerToString(i));
      Testo_oggetti[i].Create(0,"Testo_" + IntegerToString(i), 0, x1, y1, x2, y2);
      m_Pannello.Add(Testo_oggetti[i]);
      x1 = 0;
      y1 = y1 + 50;
      x2 = 220;
      y2 = y2 + 50 ;
      }
      }
      }
      riporto print con due ordini gia aperti a mercato.
      Capture.PNG

      Stramattina il brocker non mi passa i prezzi nemmeno su btcusd per verificare se quel
      Code:
      ObjectsDeleteAll(0,"Testo_");
      sia scritto correttamente e quindi se alla chiusura del ticket elimini correttamente gli l'oggetto interessato.
      Lo scoprirò domani.

      Ora devo capire come accedere alle proprieta dell'oggetto per modificarne gli attributi.
      Non posso scrivere Testo_1.Text("Pippo") per che sarebbe Testo_+ "i".
      ci sarà sicuramente un modo , e sarà scritto nella documentazione.

      Grazie del tuo consiglio, non c'è cosa piu bella di potersi confrontare. grazie.

      Comment

      Working...
      X