Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1174

 
Alexey Viktorov:

La seconda e le successive dimensioni di una matrice non possono essere dinamiche. Pertanto, come viene dichiarato un array, per esempio, int Mas[][7]; deve essere preso da MyFun(int &Mas[][7])

Sì, è così.
Grazie. Non avevo il cervello per farlo.
 

Ciao programmatori. Ancora una volta chiedo il vostro aiuto. C'è un indicatore standard da cui voglio ottenere un singolo valore. Ho collegato l'indicatore e copiato un array dei suoi valori nel buffer double buf_atr[] Stampato nel log ArrayPrint(buf_atr) mostra questi valori:

0.00032 0.00037 0.00039 0.00039 0.00041 0.00039 0.00037 0.00036 0.00034 0.00035 0.00035 0.00035 0.00034 0.00030

Come faccio ad applicare alla CHIAVE MASSIMA CHE HA IL VALORE 0,00030? Risulta che questo valore non è sulla candela corrente 0 e la precedente ha già formato 1

Sembra funzionare, ma come accedere all'array di celle per lavorarci ulteriormente non lo so ;(

input int InpPeriod=14;  // period
int handleIndicator; //указатель на индикатор


int OnInit()
{  
  
handleIndicator = iCustom(NULL,0,"Examples\\INDICATOR",InpPeriod);

   return(INIT_SUCCEEDED);
}



void OnTick()

{

int buf_size = 14;
double buf_atr[];

CopyBuffer(handleIndicator,0,0,buf_size,buf_atr);

ArrayPrint(buf_atr);

}
 
Kolya32:

Ciao programmatori. Ancora una volta chiedo il vostro aiuto. C'è un indicatore standard da cui voglio ottenere un singolo valore. Ho collegato l'indicatore e copiato un array dei suoi valori nel buffer double buf_atr[] Stampato nel log ArrayPrint(buf_atr) mostra questi valori:

0.00032 0.00037 0.00039 0.00039 0.00041 0.00039 0.00037 0.00036 0.00034 0.00035 0.00035 0.00035 0.00034 0.00030

Come faccio ad applicare alla CHIAVE MASSIMA CHE HA IL VALORE 0,00030? Risulta che questo valore non è sulla candela corrente 0 e la precedente è già formata 1

Sembra funzionare, ma come accedere all'array di celle per lavorarci ulteriormente non lo so ;(

void OnTick()

{

int buf_size = 14;
double buf_atr[];

CopyBuffer(handleIndicator,0,0,buf_size,buf_atr);
Print( buf_atr[buf_size-1] ); // Массив начинается с нуля
ArrayPrint(buf_atr);

}
 
Vitaly Muzichenko:
void OnTick()

{

int buf_size = 14;
double buf_atr[];

CopyBuffer(handleIndicator,0,0,buf_size,buf_atr);
Print( buf_atr[buf_size-1] ); // Массив начинается с нуля
ArrayPrint(buf_atr);

}


FUNZIONA EVVIVA!!! Ho bisogno di passare abuf_atr[buf_size-1] Ho provato di tutto. Molte grazie a teVitaly Muzichenko.

 

Lo stile mql è obbligatorio, riferimento all'array?

(
                                     double &value[],// Buffer of values
                                     double& clr[],                                 // Color buffer
                                     const bool asSeries,                           // Numbering flag as in time series
                                     const string label,                           // Series name
                                     const color& colors[],                        // Line colors )
 
Creata classeCAppDialogPTR- discendente di CAppDialog - consigliare come sovrascrivere correttamente m_background, m_caption ... dalla classe CDialog per accedervi dalla mia classe?
#property strict
#include <Controls\Dialog.mqh>

class CAppDialogPTR : public CAppDialog
{
private:
   int               m_deinit_reason;
public:
   CAppDialogPTR(void){};
   ~CAppDialogPTR(void){};
   virtual bool      Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2);
};

bool CAppDialogPTR::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2)
{
   m_deinit_reason=WRONG_VALUE;
   bool res = CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2);
   return(res);
}

Dialog.mqh.

***
class CDialog : public CWndContainer
  {
private:
   //--- dependent controls
   CPanel            m_white_border;        // the "white border" object
   CPanel            m_background;          // the background object
   CEdit             m_caption;             // the window title object
   CBmpButton        m_button_close;        // the "Close" button object
   CWndClient        m_client_area;         // the client area object
***
 
Peter Vorobyev:
Creata classeCAppDialogPTR- discendente di CAppDialog - consigliare come sovrascrivere correttamente m_background, m_caption ... dalla classe CDialog per accedervi dalla mia classe?

Dialog.mqh.

Non si può. Questi oggetti sono bloccati dalla modifica diretta nella vostra classe, come indicato dalla parola chiave private. Non si può lavorare con loro direttamente. Usate i metodi della classe CDialog che lavorano con questi campi.

 
Vasiliy Sokolov:

Non si può. Questi oggetti sono bloccati dalla modifica diretta nella vostra classe, come indicato dalla parola chiave private. Non si può lavorare con loro direttamente. Usate i metodi della vostra classe CDialog che lavorano con questi campi.

Supponiamo.

Un'istanza creata della classeCAppDialogPTR ha dei controlli (classe CWndContainer-> CWnd* Control(const int ind) const { return(dynamic_cast<CWnd *>(m_controls.At(ind); }) attraverso il quale si può accedere am_background, m_caption

1) Qual è la sintassi per accedere (riferirsi alla memoria) all'oggetto creato?

"CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2);"
 
Peter Vorobyev:

Supponiamo.

Un'istanza creata della classeCAppDialogPTR ha dei controlli (classe CWndContainer -> CWnd* Control(const int ind) const { return(dynamic_cast<CWnd *>(m_controls.At(ind)); } ) attraverso cui si può accedere am_background, m_caption

1) Qual è la sintassi per accedere (riferirsi alla memoria) all'oggetto creato?

Non potete ancora accedere ai contrails in modo indirizzabile attraverso la collezione m_controls perché è anche chiusa, inoltre non sapete quale indice corrisponde a quale particolare controllo. L'idea è che CDialog blocca l'accesso agli elementi che lo compongono, ma permette di gestire le sue proprietà principali in modo coerente. Per esempio non possiamo accedere direttamente a m_caption ma possiamo cambiare il suo testo usando il metodo Caption(const string text).

Quello che vuoi è un hack in sostanza. In linea di principio, quando si usa qualsiasi strumento MQ si vuole fare questo o quell'hack, quindi non siete soli. Probabilmente il modo più semplice è copiare la libreria in una directory separata e spostare la sezione privata in protetta. Questo è rozzo e stupido, ma funzionerà. Altre opzioni sono improbabili - codice troppo difficile.

 
Vasiliy Sokolov:

Non potrete comunque accedere alle controparti tramite la collezione m_controls, perché è anche chiusa, inoltre non sapete quale indice corrisponde a quale controllo. L'idea è che CDialog blocca l'accesso agli elementi che lo compongono, ma permette di gestire le sue proprietà principali in modo coerente. Per esempio non possiamo accedere direttamente a m_caption ma possiamo cambiare il suo testo usando il metodo Caption(const string text).

Quello che vuoi è un hack in sostanza. In linea di principio, quando si usa qualsiasi strumento MQ si vuole fare questo o quell'hack, quindi non siete soli. Probabilmente il modo più semplice è copiare la libreria in una directory separata e spostare la sezione privata in protetta. Questo è rozzo e stupido, ma funzionerà. È improbabile che le altre opzioni funzionino perché il codice è troppo difficile.

Modificare il codice sorgente di MQ e rendere pubblici i metodi non è chiaramente il nostro metodo :).
Ma posso fare riferimento alle proprietà Caption dopo la dichiarazione del pannello delle variabili globali:

CAppDialogPTR panel;

            int total=panel.ControlsTotal();
            for(int i=0;i<total;i++)
            {
               CWnd *_control=panel.Control(i);
               string _control_name=_control.Name();

               if(StringFind(_control_name,"Caption")>0)
               {
                  CEdit *_caption=(CEdit*)_control;
                  _caption.Text("test";
                  _caption.Color(clrRed);
                  ChartRedraw();
                  break;
               }
               
             }

Ma non solo non ha un bell'aspetto, ma questo codice dietro la classeCAppDialogPTR. Come posso fare lo stesso all'interno della classeCAppDialogPTR?