Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1194

 
vladmirad:

Grazie per il consiglio, sono consapevole di queste funzioni.

Sai perché tanta gente, te compreso, risponde a chi conosce mql come un'ascia. E ignorano il consiglio dei competenti? Se non ne hai, controlla questo suggerimento:

Il forum sul trading, i sistemi di trading automatico e il test delle strategie.

Tutte le domande dei principianti su MQL4 e MQL5, aiuto e discussione su algoritmi e codici

Artyom Trishkin, 2020.06.29 00:03

Salve.
Iniziate a monitorare lo stato del grafico in OnChartEvent() https://www.mql5.com/ru/docs/event_handlers/onchartevent
Ci sono alcuni eventi di cui avete bisogno:
CHARTEVENT_OBJECT_CREATE Create Create graphical object
CHARTEVENT_OBJECT_CHANGE Cambiate le proprietà dell'oggetto grafico attraverso il dialogo delle proprietà
CHARTEVENT_OBJECT_DELETE Eliminate l'oggetto grafico
https://www.mql5.com/ru/docs/constants/chartconstants/enum_chartevents
Registrate tutti i parametri del gestore OnChartEvent() e vedete i loro valori quando aggiungete/modificate/eliminate oggetti grafici. Questo vi darà la direzione dove andare.

 
vladmirad:

Grazie per il suggerimento, conosco queste funzioni.
Ma come possiamo usarli per trovare automaticamente un oggetto sul grafico e leggere i suoi parametri, se non conosciamo il suo nome a priori?
Quando si disegna un oggetto su un grafico con il mouse, il sistema dà il suo nome.

Certo, non è difficile organizzare l'inserimento manuale di tutti i dati necessari dell'oggetto dalla sua tabella delle proprietà, ma allora perché l'automazione?
Ma come dare programmaticamente a un EA il nome di un oggetto e poi tutte le funzioni che hai menzionato possono essere utilizzate, non mi è ancora chiaro...

Come già detto, lavorate con gli eventi del grafico:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool applyObject(const string _objName) {
  if(MessageBox("Сохранить параметры объекта \"" + _objName + "\" для эксперта?", "ObjChange", MB_YESNO) == IDYES) {
    objName = _objName; // Запись имени изменяемого объекта
    // Запись других параметров изменяемого объекта ...
    return true;
  }
  return false;
}

//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam
) {
//---
  if(id == CHARTEVENT_OBJECT_CREATE || id == CHARTEVENT_OBJECT_DRAG || id == CHARTEVENT_OBJECT_CHANGE) {
    applyObject(sparam);
  }
}
File:
ObjChange.mq5  5 kb
 
Artyom Trishkin:
Salve.
Inizia a tracciare lo stato del grafico in OnChartEvent() https://www.mql5.com/ru/docs/event_handlers/onchartevent
Ci sono alcuni eventi di cui hai bisogno:
CHARTEVENT_OBJECT_CREATE Crea un oggetto grafico
CHARTEVENT_OBJECT_CHANGE Cambia le proprietà di un oggetto grafico attraverso il dialogo delle proprietà
CHARTEVENT_OBJECT_DELETE Elimina un oggetto grafico
https://www.mql5.com/ru/docs/constants/chartconstants/enum_chartevents
Registra tutti i parametri da OnChartEvent() e vedi i loro valori quando aggiungi/modifichi/elimini oggetti grafici. Questo vi darà la direzione dove andare.

Grazie mille, ho già preso il tuo consiglio!

 
Mihail Matkovskij:

Potete trovare e registrare gli oggetti di un dato tipo con le loro coordinate come segue:

È possibile salvare qualsiasi dato in un file. E nell'Expert Advisor fare un caricatore che aggiungerà gli oggetti appropriati, e poi caricherà i dati dal file in essi. Ma almeno abbozzate un codice sorgente per il vostro compito specifico e pubblicatelo qui.

Grazie anche a te, Michael, per il tuo aiuto pratico!
 
Mihail Matkovskij:

Come notato sopra, lavorate con gli eventi del grafico:

Michael, l'aiuto tuo e di@Artyom Trishkin è stato molto utile!

Ora dobbiamo capire come trovare il punto di incrocio tra il grafico del prezzo e l'oggetto trovato, in questo caso, la linea di tendenza.

L'algoritmo è il seguente:
1. Utilizzando le coordinate di lettura della linea di tendenza, calcoliamo il coefficiente di aumento della tendenza per 1 barra del TF selezionato.
2. Calcola la coordinata del prezzo della linea di tendenza sulla barra corrente e controlla il fatto di attraversamento da parte del grafico di questo punto durante il TF selezionato.
3. Se è così, procediamo all'elaborazione di questo evento, per esempio, aprire un ordine. In caso contrario, la procedura viene ripetuta per la barra successiva.

Ma forse MT4(5), a causa delle specificità di questo sistema, ha una soluzione molto più semplice?

 
Alexey Viktorov:

Sai perché tanta gente, te compreso, risponde a chi conosce mql come un'ascia. E ignorano i consigli di coloro che sanno. Nel tuo caso, è questo consiglio:


Mio caro Alexey, hai assolutamente ragione sulla mia conoscenza di MQL. Tuttavia, ti sbagli nel dire che non presto attenzione ai consigli degli addetti ai lavori, perché il mio primo contatto è stato con@Artyom Trishkin, che credo sia uno dei migliori professionisti di MQL e che tu conosci bene.

I suoi consigli mi hanno permesso di capire immediatamente come risolvere il mio problema e mi hanno aperto gli occhi per ulteriori azioni. E@Mihail Matkovskij mi ha reso la vita ancora più facile!

 
vladmirad:

Michael, l'aiuto tuo e di@Artyom Trishkin è stato molto utile!

Ora dobbiamo capire come trovare il punto di incrocio tra il grafico del prezzo e l'oggetto trovato, in questo caso, la linea di tendenza.

L'algoritmo è il seguente:
1. Utilizzando le coordinate di lettura della linea di tendenza, calcoliamo il coefficiente di aumento della tendenza per 1 barra del TF selezionato.
2. Calcola la coordinata di prezzo della linea di tendenza sulla barra corrente e controlla il fatto di attraversamento da parte del grafico di questo punto durante il TF selezionato.
3. Se è così, procediamo all'elaborazione di questo evento, per esempio, aprire un ordine. In caso contrario, la procedura viene ripetuta per la barra successiva.

Ma forse MT4(5), a causa delle specificità di questo sistema, ha una soluzione molto più semplice?

Come ho detto sopra, abbozzate un codice sorgente per avere qualcosa da cui partire. Inoltre, avete già qualche conoscenza su come ottenere i dati dell'oggetto sul grafico. Nessuno vuole fare tutto per voi da zero. E in questo modo, ciò che manca al lavoro dell'esperto può essere completato...

 
vladmirad:

Michael, l'aiuto tuo e di@Artyom Trishkin è stato molto utile!

Ora dobbiamo capire come trovare il punto di incrocio tra il grafico del prezzo e l'oggetto trovato, in questo caso, la linea di tendenza.

L'algoritmo è il seguente:
1. Utilizzando le coordinate di lettura della linea di tendenza, calcoliamo il coefficiente di aumento della tendenza per 1 barra del TF selezionato.
2. Calcola la coordinata del prezzo della linea di tendenza sulla barra corrente e controlla il fatto di attraversamento da parte del grafico di questo punto durante il TF selezionato.
3. Se è così, procediamo all'elaborazione di questo evento, per esempio, aprire un ordine. In caso contrario, la procedura viene ripetuta per la barra successiva.

Forse, tutto è molto più facile in MT4(5) a causa del carattere specifico di questo sistema.

Non è molto chiaro cosa volete trovare. Volete trovare il punto di attraversamento della linea di tendenza dal prezzo su qualche barra? Per questo ci sono funzioni per ottenere il valore della linea su una barra. Ma io userei l'equazione della linea retta:

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

FAQ da principianti MQL5 MT5 MetaTrader 5

Artyom Trishkin, 2020.05.02 12:27

Usa un'equazione della linea retta:

//+------------------------------------------------------------------+
//| Уравнение прямой                                                 |
//+------------------------------------------------------------------+
double EquationDirect(const int left_bar,const double left_price,const int right_bar,const double right_price,const int bar_to_search) 
  {
   return(right_bar==left_bar ? left_price : (right_price-left_price)/(right_bar-left_bar)*(bar_to_search-left_bar)+left_price);
  }
//+------------------------------------------------------------------+

Specifica il numero della barra e il prezzo del punto a sinistra, specifica il numero della barra e il prezzo del punto a destra (una linea virtuale viene disegnata su questi punti) e specifica la barra che stai cercando.
La funzione restituirà il prezzo della barra che state cercando.


Non richiede la presenza di un oggetto reale.
 
Artyom Trishkin:

..... Ci sono funzioni per ottenere il valore della linea sulla barra. Ma io userei l'equazione della linea retta:

.....

Artyom, più dettagli qui, per favore.

O non sono stato molto attento prima, o la documentazione è stata modificata... Non lo so.

Ma ho sempre pensato che ObjectGetDouble restituisse il prezzo della linea su una particolare barra (intendo il prezzo esatto). E qui ho deciso di fare un piccolo script per controllarlo, e cosa ho visto?

1. Non c'è un numero di barra nei parametri, su cui il valore dovrebbe essere letto.

2. identificatore di proprietà:

OBJPROP_PRICE

Prezzo coordinato

modificatore=numero del punto di ancoraggio


è solo il punto di ancoraggio!

Sì, in generale, se disegno questa linea nel codice, ho già questi punti! Perché ho bisogno di conoscerli? In effetti, che senso ha?

Come posso ottenere il valore del prezzo di questa linea da qualche altra parte?


Si scopre che questo è

prop_modificatore

[Modificatore della proprietà specificata. Per la prima opzione, il valore predefinito del modificatore è 0. La maggior parte delle proprietà non richiede un modificatore. Indica un numero di livello neglistrumenti di Fibonacci e nell'oggetto grafico Pitchfork di Andrews. La numerazione dei livelli parte da zero.

Non ha alcun senso? Sta cercando i punti di attacco di QUALSIASI linea di ventilazione? Questa è una sciocchezza. Pardon.

Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Все объекты, используемые в техническом анализе, имеют привязку на графиках по координатам цены и времени – трендовая линия, каналы, инструменты Фибоначчи и т.д.  Но есть ряд вспомогательных объектов, предназначенных для улучшения интерфейса, которые имеют привязку к видимой всегда части графика (основное окно графика или подокна индикаторов...
 
Сергей Таболин:

Artyom, potresti entrare un po' più nel dettaglio, per favore?

O non sono stato molto attento prima, o la documentazione è stata modificata... Non lo so.

Ma ho sempre pensato che ObjectGetDouble restituisse il prezzo della linea su una particolare barra (intendo il prezzo). E qui ho deciso di fare un piccolo script per controllarlo, e cosa ho visto?

1. Non c'è un numero di barra nei parametri, su cui il valore dovrebbe essere letto.

2. identificatore di proprietà:

OBJPROP_PRICE

Prezzo coordinato

modificatore=numero del punto di ancoraggio


è solo il punto di ancoraggio!

Sì, in generale, se disegno questa linea nel codice, ho già questi punti! Perché ho bisogno di conoscerli? In effetti, che senso ha?

Come posso ottenere il valore del prezzo di questa linea da qualche altra parte?


Si scopre che questo è

prop_modificatore

[Modificatore della proprietà specificata. Per la prima opzione, il valore predefinito del modificatore è 0. La maggior parte delle proprietà non richiede un modificatore. Indica un numero di livello neglistrumenti di Fibonacci e nell'oggetto grafico Pitchfork di Andrews. La numerazione dei livelli parte da zero.

Non ha alcun senso? Sta cercando i punti di attacco di QUALSIASI linea di un ventilatore? Questa è una sciocchezza. Mi scusi.

Non ho lavorato molto con questi oggetti. Cosa restituirà questa funzione per l'andamento in base al tempo di barra specificato? Non ho il tempo di controllarlo. Anche se è fatto in un piccolo script...

ObjectGetValueByTime()

Документация по MQL5: Графические объекты / ObjectGetValueByTime
Документация по MQL5: Графические объекты / ObjectGetValueByTime
  • www.mql5.com
Функция использует синхронный вызов – это означает, что функция дожидается выполнения всех команд, которые были помещены в очередь графика перед её вызовом, и поэтому данная функция может быть затратной по времени. Нужно иметь это обстоятельство в виду...