Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1345

 
Vitaly Muzichenko #:

Di nuovo, è necessario cambiare il prefisso quando si carica la prossima copia?

può dire a parole qual è lo scopo?

possono essere creati e controllati dall'esterno della vostra finestra.


cosa sarà?

 
Igor Makanu #:

può dire a parole qual è lo scopo?

I pulsanti possono anche essere creati e controllati dall'esterno della vostra finestra.


cosa sarebbe?

Non lo so, ma dovrebbe essere così: Crea nella tua sottofinestra, e quando clicchi, ottieni il numero di questa sottofinestra. Non c'è bisogno di disegnare nulla, solo un pulsante che, quando viene cliccato, visualizza in Alert le informazioni sul numero della sottofinestra

 
Vitaly Muzichenko #:

Non lo so, ma questo è il modo per farlo: Crea nella tua sottofinestra, e quando clicchi, ottieni il numero della sottofinestra. Non c'è bisogno di disegnare nulla, solo un pulsante che, quando viene cliccato, visualizza in Alert le informazioni sul numero della sottofinestra

controllato la mia prima fonte:

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
#include <Controls\Button.mqh>
CButton button;

//--- indicator buffers
double         Label1Buffer[];
input int MASlow = 21; // Период медленной МА
input int MAFast = 8;  // Период быстрой МА
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
   string short_name = MQLInfoString(MQL_PROGRAM_NAME) + "=Set (" + (string)MASlow + "/" + (string)MAFast + ")";
   IndicatorSetString(INDICATOR_SHORTNAME, short_name);

  // IndicatorSetString(INDICATOR_SHORTNAME, "IndicatorSetString() Demo");
   SetIndexBuffer(0, Label1Buffer, INDICATOR_DATA);
   srand(GetTickCount());
   long c_id = ChartID();
   int c_wf = ChartWindowFind();
   Print(c_id, " / ", c_wf);
   button.Create(c_id, "button" + (string)rand(), c_wf, 10, 10, 100, 100);
   button.Text("Button");
//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   for(int i = prev_calculated == 0 ? 0 : prev_calculated - 1; i < rates_total; i++)
   {
      Label1Buffer[i] = close[i];
   }
   return(rates_total);
}
//+------------------------------------------------------------------+


ahimè, tutto è come hai scritto - se si eseguono più copie di questo indicatore con parametri predefiniti, il pulsante sarà solo sul primo indicatore in una sottofinestra

ma se si cambiano i parametri durante l'avvio, tutto è OK


in generale, la situazione non è chiara

 
Igor Makanu #:

L'ho controllato sulla mia prima fonte:

ahimè, tutto è come scrivi - se esegui diverse copie di questo indicatore con parametri predefiniti, il pulsante sarà solo sul primo indicatore nella sottofinestra

ma se si cambiano i parametri durante l'avvio, tutto è OK

in generale, la situazione non è chiara

Quindi, ecco una domanda: come cambiare i parametri automaticamente, senza andare nelle impostazioni?

Niente funziona finora ...

---

P.S. Idealmente, ma ahimè

input long MASlow = TimeLocal(); //
 
Vitaly Muzichenko #:

Finora non funziona ...

E non lo farà:

aggiunto in:

int OnInit()
{
   Print(__FUNCTION__);

Metto un indicatore - ottengo OnInit nel log, ma l'indicatore successivo è già silenzioso, cioè solo una copia dell'indicatore è realmente in esecuzione, e gli altri indicatori sono solo una shell grafica

 
Igor Makanu #:

e non funziona:

aggiunto in:

Metto l'indicatore - ottengo OnInit nel log, ma l'indicatore successivo è già silenzioso, cioè solo una copia dell'indicatore è realmente in esecuzione, e gli altri indicatori sono solo una shell grafica

Ecco come stanno le cose. Credo che l'architettura di mt5 non sia giusta. Il terminale mt4 funziona bene.

Se avete deciso di farlo in mt5, sarebbe vietato eseguire copie dell'indicatore con gli stessi parametri di input, perché sembra essere presente ma assente.

 
Vitaly Muzichenko #:

Le cose stanno così. L'architettura di mt5 deve essere un casino. Tutto funziona bene in mt4.

Se hai deciso di farlo in mt5, avresti dovuto vietare il lancio di copie di indicatori con gli stessi parametri di input, perché sembra che ci sia, ma in realtà non è così.

La parte di calcolo dell'indicatore non è la stessa di quella grafica. Pertanto, la parte di calcolo è la stessa per tutti loro. Ce ne sono diversi grafici.

Non puoi semplicemente cercare tutte le sottofinestre in un indicatore e mettere delle etichette con il numero della sottofinestra? Allo stesso tempo per catturare nel timer il numero di sottofinestre del grafico: quando è aumentato - aggiungere a una nuova etichetta sottofinestra. Ma cerca anche quale indicatore vi è collocato - se è diverso, allora non aggiungere...

Solo un'idea non testata.

ZS. Non sono d'accordo sulla "curvatura". Una parte di calcolo per 20 indicatori identici è meglio di 20 parti di calcolo per 20 indicatori identici.

 
Artyom Trishkin #:

La parte di calcolo di un indicatore non è la stessa della parte grafica. Pertanto, la parte di calcolo è la stessa per tutti loro. Ce ne sono diversi grafici.

Non possiamo semplicemente cercare tutte le sottofinestre in un indicatore e mettere delle etichette con il numero della sottofinestra? Allo stesso tempo per catturare nel timer il numero di sottofinestre del grafico: aumentato - aggiungere a una nuova etichetta sottofinestra. Ma cercate anche quale indicatore è posto in esso - se diverso, allora non aggiungete...

Solo un'idea non testata.

ZS. Non sono d'accordo sulla "curvatura". Una parte di calcolo per 20 indicatori identici è meglio di 20 parti di calcolo per 20 indicatori identici.

Fatto, nessuna risposta al pulsante - la copia OnChartEvent non si attiva e non capisce il numero di sottofinestra.

Comunque, ecco cosa non funziona e insieme ad esso il resto del codice

Forum sul trading, sistemi di trading automatico e test di strategia

FAQ da principianti MQL5 MT5 MetaTrader 5

Igor Makanu, 2021.09.12 21:53

non lo fai:

aggiunto a:

int OnInit()
{
   Print(__FUNCTION__);

Ho messo un indicatore - ottengo OnInit nel log, ma l'indicatore successivo è già silenzioso, cioè solo una copia dell'indicatore è effettivamente in esecuzione, e gli altri indicatori sono solo una shell grafica


 
Vitaly Muzichenko #:

Fatto, nessuna reazione al pulsante - la copia OnChartEvent non funziona e non capisce il numero di sottofinestra.

Comunque, ecco cosa non funziona e con esso il resto del codice


MA!!! Se faccio un modello con 2-3 di questi indicatori sotto il nome "Debug.tpl" e inizio il debug dell'indicatore, allora OnInit() funziona come dovrebbe.

In generale, ho fatto un esperimento del genere:

Ho trasferito #proprietà al suo massimo in OnInit() sperando che mentre non è stato creato l'indicatore esegua OnInit() e faccia un nome breve per l'indicatore, a seconda del numero di indicatori nella finestra.

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
//#property indicator_label1  "Label1"
//#property indicator_type1   DRAW_LINE
//#property indicator_color1  clrRed
//#property indicator_style1  STYLE_SOLID
//#property indicator_width1  2
//--- indicator buffers
double         Label1Buffer[];
input int MASlow = 21; // Период медленной МА
input int MAFast = 8;  // Период быстрой МА
//input string shortName = "1";  // Префикс…
long chart_id = ChartID();
string short_name = "";
/********************************************************************\
|           Custom indicator initialization function                 |
\********************************************************************/
int OnInit()
 {
//--- indicator buffers mapping
  long windows_total = ChartGetInteger(chart_id, CHART_WINDOWS_TOTAL);
  short_name = (string)windows_total;
  Print(short_name);
  PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_LINE);
  PlotIndexSetInteger(0, PLOT_LINE_COLOR, clrRed);
  PlotIndexSetInteger(0, PLOT_LINE_STYLE, STYLE_SOLID);
  PlotIndexSetInteger(0, PLOT_LINE_WIDTH, 2);
  PlotIndexSetString(0, PLOT_LABEL, "Label1");
  IndicatorSetString(INDICATOR_SHORTNAME, short_name);
  SetIndexBuffer(0, Label1Buffer, INDICATOR_DATA);
  return(INIT_SUCCEEDED);
 }/******************************************************************/

Ma non ha aiutato:

Inizio la prima copia

Nome dell'indicatore 2.........

Avvio la seconda copia - il nome dell'indicatore è ancora 2 per entrambi gli indicatori

Avvio il debug e cosa vedo! L'indicatore non ancora caricato sta già stampando... leggi la seconda e la terza riga...

come può essere?


Ulteriore debug interrotto all'ingresso di OnInit(), la variabile windows_total contiene spazzatura, short_name è ancora una stringa vuota...

Hi......... ma è tutto già stampato... come mai???

E lo short_name è già cambiato.

Di conseguenza, dopo un caricamento completo dell'indicatore in modalità debug, l'indicatore ha i seguenti nomi

Forse dovremmo attirare l'attenzione degli sviluppatori su questi bug...

 
Ciao amici, forse sono nel posto sbagliato, ma vedo la sezione chiamata: "Domande dai principianti MQL5 MT5 MetaTrader 5". Quindi la mia domanda è: ho usato per scaricare Demo EAs da Market per testare ora che cosa mai ho fatto MT5 non può scaricare Demo. MT4 senza problemi, MT5 no qual è la ragione?