programmazione
Adesso stai leggendo
Praticamente MQL. Asso di intelligenza, ovvero notifiche sul telefono [Corso di programmazione]
0

Praticamente MQL. Asso di intelligenza, ovvero notifiche sul telefono [Corso di programmazione]

creato Radek SzafronAprile 12 2019

Bentornati alla parte IV del nostro corso pratico di programmazione. Oggi affronteremo questioni di immensa importanza, creeremo Asa di intelligenza, che in nostra assenza si occuperà di attività di intelligence incentrate sulle variazioni dei prezzi nel mercato azionario. Quando le cose vanno bene, la nostra As invierà immediatamente un messaggio segreto (non molto) al nostro telefono cellulare che ci permetterà di prendere in mano la situazione.

Assicurati di leggere: Praticamente MQL. Pulsante di panico, parte II

La nostra applicazione ti consentirà di impostare i livelli di prezzo, sui quali riceveremo una notifica spingere sul nostro telefono I livelli saranno determinati trascinando le linee colorate che disegneranno dopo aver cliccato sulla figura del nostro Asa di intelligenza. Iniziamo con quali sono queste notifiche e come configurare i nostri dispositivi per rendere tutto ok.

notifiche spingere

notifiche spingere sono una funzione della piattaforma Meta Trader, che consente di inviare messaggi dal terminale a un dispositivo iOS o Android su cui è installata l'applicazione mobile Meta Trader. Se non hai ancora un'app sul tuo telefonino, scaricala, perché senza di essa, la nostra As non può gestire molto bene.

rys_1 rys_2

La configurazione del dispositivo è molto veloce. Nel primo passo, dovresti conoscere il tuo ID MetaQuotes, cioè il numero con cui indirizzeremo il messaggio al telefono appropriato (o al frigorifero con sistema Android). numero ID MetaQuotes è nell'applicazione mobile nel menu Impostazioni / Chat e messaggicome nella foto qui sotto.

rys_3

Il numero viene letto ID MetaQuotes devi quindi entrare nel programma Meta Tarder sul nostro computer nel menu Strumenti / Opzioni / Notifiche.

rys_4

Pronto!

Background tecnico

All'inizio, scarica il pacchetto posizionato leggermente più in basso e installa il codice sorgente dell'applicazione o del file di oggi Come Intelligence.mq4 nel catalogo MQL4 \ Esperti \ .

Il nostro programma avrà anche una piccola interfaccia grafica collocata nella libreria elementy_graficzne.ex4che puoi copiare sul catalogo MQL4 \ Libraries \ As Intelligence .

SCARICA FILE

iniziamo

Dopo aver aperto il file Come Intelligence.mq4nella parte superiore vedrai il seguente frammento di codice.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#property rigoroso
# Import "As Intelligence As \\ elementi grafici.ex4"
nulla AgencieRozpocznijMisje (int x, int s);
nulla AgencieByeBye ();
stringa AgencieIdentyfikujSie ();
# Import
colore di input Kolor = clrDodgerBlue;
colore di input Kolor_wylaczony = clrGold;
ingresso ENUM_LINE_STYLE stile = STYLE_SOLID;
input int spessore = 2;
stringa Nome dello strumento = "";
stringa Id_line = "LINIE_WYWIADU";
Codice MQL4

Iniziamo il codice dall'importazione della libreria, quindi utilizzando le parole chiave di input creiamo i parametri per la configurazione nella finestra delle impostazioni. Le impostazioni ci permetteranno di definire l'aspetto della linea, per mezzo della quale stabiliremo il prezzo per le nostre notifiche.

Variabili globali

Sotto le definizioni di tipo ingresso vediamo qualcosa di nuovo, dichiarazioni variabili Nazwa_instrumentu e Id_liniiche sono al di fuori del contenuto di qualsiasi funzione. Cosa significa? In questo modo definiamo variabili globali, che sarà disponibile in ogni posto nel nostro codice, cioè ogni funzione dell'algoritmo sarà in grado di leggerli e dare loro un valore. Da variabili dichiarate come ingresso differiscono solo per il fatto che l'utente non può accedervi nella finestra delle impostazioni.

array

Quando si scrive un software, è spesso necessario gestire così tanti dati che la creazione di una variabile separata per ciascuno di essi sarebbe quantomeno ingombrante. Le tabelle vengono in soccorso, consentendo di creare un set ordinato di dati di un determinato tipo, ad esempio un tipo doppio, disponibile con un nome che abbiamo impostato. Per ogni tabella possiamo (non devi) definire la sua dimensione, cioè quanti pezzi di dati di un dato tipo ci saranno dentro. Diamo un'occhiata al seguente frammento di codice.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
stringa Tablica_nazwy_linii [];
doppio Tablica_dane_linii [] [4];
#define CZAS_AKTYWACJI 0
#define TYP_SYGNALU 1
#define STATUS_LINII 2
#define CENA_LINII 3
#define SYGNAL_LONG 0
#define SYGNAL_SHORT 1
#define LINIA_WYLACZONA 0
#define LINIA_ZMODYFIKOWANA 1
#define LINIA_AKTYWNA 2
#define LINIA_USUNIETA 3
Codice MQL4

Schede unidimensionali

Nel codice precedente, nelle linee 1 e 2, abbiamo creato due tabelle. Tablica_nazwy_linii sarà usato per memorizzare i nomi degli oggetti che disegneremo sul grafico. Ogni linea rappresenterà una, impostata dall'utente, una notifica e poiché la nostra applicazione ti consente di impostare qualsiasi numero di notifiche che ti servono per utilizzare le tabelle.

Tablica_nazwy_linii è una matrice unidimensionale, che riconosciamo dopo una coppia di parentesi quadre []. Tra parentesi è possibile inserire il numero di pezzi di dati che vogliamo mettere nella tabella, ma nel nostro caso non sappiamo quanto il grafo andare alla linea, in quanto dipende dall'utente, quindi lasceremo parentesi vuota, il che significa che avremo modo dinamico, al volo, set e ridimensiona il tavolo in base alle tue esigenze. Diamo un'occhiata al disegno sottostante, che descrive come funzionano le schede unidimensionali.

rys_5

Matrici multidimensionali

Il secondo consiglio, chiamato Tablica_dane_linii servirà per memorizzare dati aggiuntivi per ciascuna delle notifiche definite dall'utente. Non possiamo inserire ulteriori informazioni nella stessa tabella dei nomi oggetto, perché i nomi sono di tipo stringae digita i dati doppioe una tabella può contenere solo un tipo di dati.

Tablica_dane_linii è una tavola bidimensionale, che simboleggia due parentesi quadre [] [4]. La prima dimensione verrà utilizzata per l'identificazione, come nella tabella Tablica_nazwy_liniiquale linea intendiamo, e la seconda dimensione per memorizzare 4 dati aggiuntivi per ciascuna delle notifiche dell'insieme.

Per semplificare la navigazione degli elementi di una tabella bidimensionale mediante parole chiave #define abbiamo creato una lista di valori predefiniti con, per quanto conveniente ricordare i nomi. Sotto ogni nome elencato dopo la parola chiave #define c'è un numero che siamo sicuri che sarà costante.

Nel seguito, utilizzeremo le schede in pratica, nel frattempo, diamo un'occhiata al seguente grafico che spiega come funziona una tabella bidimensionale.

rys_6

Struttura dell'applicazione

La nostra applicazione utilizzerà cinque funzioni API MQL per la gestione degli eventi.

OnInit () - preparazione dell'algoritmo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int OnInit ()
{
if(IsDemo() == falso) ritorno INIT_FAILED;
// Record! Explore Area () è una versione breve
// Esamina terreno () == falso
if(! Invest Area ()) BlurSlady ();
EventSetMillisecondTimer(250);
AgencieRozpocznijMisje (0, 0);
ritorno INIT_SUCCEEDED;
}
Codice MQL4

In funzione OnInit() iniziamo controllando se stiamo giocando nel posto giusto, e poi se i dati che l'applicazione ha è corretta. Come è possibile, da allora OnInit() è la prima funzione chiamata dal programma per fare in modo che l'algoritmo abbia dati errati? Ciò può accadere, ad esempio, quando eseguiamo l'algoritmo sul grafico di uno strumento, e quindi cambia il simbolo. In questo caso, dovrò cancellare le righe precedentemente disegnate e tutte le notifiche cancellate. Questo è ciò che la funzione affronta ZatrzyjSlady ().

Nel prossimo passaggio, corriamo timer e chiamiamo una funzione dalla libreria AgencieRozpocznijMisje (...)il cui compito è disegnare il nostro Asa sul grafico.

Nel codice sorgente troverai molte altre interessanti funzionalità. Per quelli di voi che vorrebbero fare i nostri raggi x Asa dalla A alla Z, l'interpretazione di materiali aggiuntivi dovrebbe essere un buon addestramento nella navigazione della documentazione MQL. L'intero codice dell'applicazione di oggi ho cercato di mantenere i problemi discussi, in modo che la sua interpretazione fosse il più semplice possibile. Ti auguro un apprendimento fruttuoso e, poiché conosci già molti elementi del linguaggio, ti diverti a creare le prime soluzioni indipendenti!

OnChartEvent (...) - monitoraggio degli eventi

1
2
3
4
5
6
7
8
9
10
11
12
nulla OnChartEvent(const int id const lungo e lParam const doppio e dparam,
const string & SPAR)
{
if(id == CHARTEVENT_OBJECT_DRAG || id == CHARTEVENT_OBJECT_CHANGE)
{
if(StringFind(sparam, Id_linii)> = 0) Dati di aggiornamento (sparam);
}
Altrimenti se(id == CHARTEVENT_OBJECT_CLICK)
{
if (sparam == AgentIdentifySame ()) Create ();
}
}
Codice MQL4

Grazie alla funzione OnChartEvent(...) monitoriamo l'interazione dell'utente con l'applicazione. Nel primo, controlliamo se l'utente ha trascinato la linea della nostra notifica sul grafico (o modificato i suoi parametri nella finestra delle impostazioni) e se ciò accadeva, aggiorniamo i dati riguardanti le nostre notifiche nella funzione AktualizujDane (...)quale parametro assume il nome della riga modificata dall'utente. Utilizzando il nome della linea ricevuta, la funzione individua la riga appropriata nelle tabelle e aggiorna i dati rilevanti, tra gli altri informazioni sul prezzo impostato per la notifica.

Nella seconda parte della funzione, monitoriamo gli eventi di clic sugli oggetti nel grafico del nostro algoritmo. Ogni clic nella figura che abbiamo disegnato Asa di intelligenza crea una nuova linea sul grafico. Le linee create, dopo lo spostamento, chiameranno la funzione AktualizujDane (...)che pianificherà una notifica specifica a seconda della posizione della linea rispetto al prezzo al momento dell'interazione con l'utente.


esperti consulenti


OnTimer () - operazioni cicliche

1
2
3
4
nulla OnTimer ()
{
SynchronizujDane ();
}
Codice MQL4

Timer che si chiama 4 volte al secondo, che abbiamo definito nella funzione OnInit(), sincronizza i dati all'interno del nostro algoritmo. Per i compiti della funzione SynchronizujDane () Questi includono controllare quali linee sono già state rimosse e dare loro il colore giusto a seconda che la notifica sia abilitata.

OnTick () - osservazione del prezzo

Tutte le funzioni API MQL elencate finora ci sono familiari. È tempo di qualcosa di nuovo. funzione onTick() viene invocato dalla piattaforma a qualsiasi cambio di prezzo dello strumento su cui opera l'algoritmo. Questa è una funzione fondamentale per molte strategie automatiche. Diamo un'occhiata al codice qui sotto.

1
2
3
4
nulla OnTick ()
{
PoczynWywiad ();
}
Codice MQL4

In funzione onTick() nostro As va al lavoro e controlla se il prezzo dello strumento ha raggiunto il valore indicato dall'utente. Andremo alla funzione PoczynWywiad () un po 'oltre, e ora analizziamo un'altra ultima funzione necessaria per gestire gli eventi, OnDeinit(...).

OnDeinit (...) - la fine dell'algoritmo

1
2
3
4
5
6
7
8
9
nulla OnDeinit(const int ragione)
{
EventKillTimer();
AgencieByeBye ();
if(ragione! = REASON_CHARTCHANGE && reason! = REASON_PARAMETERS)
ZatrzyjSlady ();
}
Codice MQL4

Ci fermiamo all'inizio timer e cancelliamo l'immagine del nostro agente e poi, usando l'operatore if controlliamo qual è il motivo del completamento dell'applicazione. In alcuni casi, dopo aver chiamato la funzione OnDeinit(...) il programma si riavvierà e inizierà il suo algoritmo dall'inizio, cioè dalla funzione OnInit(). Questo è il caso, per esempio, quando l'utente cambia l'intervallo del grafico. In questa situazione, se lo strumento non è cambiato, non vogliamo eliminare le notifiche impostate da noi. Verifica del motivo per cui si chiama la funzione OnDeinit(...)o parametro ragione, possiamo decidere se eliminare oggetti e dati o lasciare invariato il set di notifiche.

Tabelle in pratica

Vediamo come la nostra applicazione utilizza le tabelle create in precedenza nell'esempio di una funzione ZapiszDane (...), il cui compito è creare una nuova riga nelle tabelle per i dati per la nuova notifica.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
bool ZapiszDane (stringa nazwa_linii, doppio cena_linii)
{
int numero_lin = arraysize(Tablica_nazwy_linii);
ArrayResize(Array_line_line, number_line, + 1);
ArrayResize(Array_path, numero_riga + 1);
// Write row_number ++ è la versione abbreviata number_line = number_line + 1
liczba_linii ++;
Array_of_line_lines [numero_links - 1] = nome della linea;
Array_data_data [numero_lins - 1] [DAY_TIME] = 0;
Array_data_data [numero_lins - 1] [SIRY TYPE] = SYGNAL_LONG;
Array_data_data [numero_lins - 1] [STATUS_LINES] = LINE_DIRTY;
Array_data_data [numero_lins - 1] [PRICE_LINE] = price_line;
ritorno vero;
}
Codice MQL4

Nella riga 3, controlla quanti oggetti contiene Tablica_nazwy_liniie perché Tablica_nazwy_linii è un array, il numero unidimensionale dei suoi elementi dovrebbe corrispondere al numero di righe in entrambe le tabelle. Quindi, nelle righe 5 e 6, aumentiamo il numero di righe delle nostre tabelle tramite 1 utilizzando l'API ArrayResize(...). Una nuova riga verrà aggiunta alla fine di ogni tabella.

Aumentiamo la variabile liczba_linii circa 1 perché abbiamo aggiunto una line array, e quindi integrare i dati sulla nuova linea di notifica di partenza No. 11 dove assegnare il nome della riga corrispondente nella tabella Tablica_nazwy_linii. Ricordare che le righe (e le colonne) delle tabelle sono numerate da zero, quindi se si desidera, ad esempio, salvare le informazioni per la quinta notifica, è necessario utilizzare la riga 4, quindi tra parentesi quadre, dopo il nome dell'array numero_line - 1 come il numero di riga.

Per numerare le colonne nella tabella Tablica_nazwy_linii usiamo valori predefiniti all'inizio del nostro algoritmo usando parole chiave #define. Sotto i nomi dei valori ci sono numeri da 0 a 3, perché la tabella ha colonne 4. Grazie all'utilizzo di una tabella bidimensionale, possiamo salvare le informazioni aggiuntive di 4 per ogni notifica, tra le altre il prezzo e il tipo di segnale che utilizzi nella funzione ZapiszDane (...) diamo valori iniziali.

Asso in azione

Un'altra funzione che utilizza gli array nel nostro algoritmo è la funzione PoczynWywiad ()dove leggiamo i dati preparati nelle tabelle e li interpretiamo per decidere se inviare un messaggio all'utente. Diamo un'occhiata al codice della funzione PoczynWywiad ().

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
nulla PoczynWywiad ()
{
int i = 0;
int numero_lin = arraysize(Tablica_nazwy_linii);
for(i = 0; e <number_lines; i ++)
{
if(Array_data_data [i] [STATUS_LINES] == LINE_ACTIVE)
{
if(Array_data_data [i] [SIRY_TYPE] == SYGNAL_LONG)
{
if(Offerta > = Tablica_dana_linii [i] [PRICE_LINE])
{
WyslijWiadomosc (i);
Array_data_data [i] [STATUS_LINES] = LINE_ INTERVAL;
}
}
altro
{
if(Offerta <= Table_liner_data [and] [PRICE_LINE])
{
WyslijWiadomosc (i);
Array_data_data [i] [STATUS_LINES] = LINE_ INTERVAL;
}
}
}
}
}

Nella funzione sopra, usando un ciclo for otteniamo l'accesso a ogni riga nella tabella Tablica_dane_linii. Questo ci permette di controllare lo stato della notifica e il tipo di segnale, e in base ai dati ricevuti per verificare se il prezzo Offerta soddisfa le condizioni che ci aspettiamo. Quando nostro As sentirà che tenerci ignoranti sarebbe imprudente, ci invia in fretta una notifica usando la funzione WyslijWiadomosc (...), che abilmente fornisce il numero di riga in cui sono memorizzati i dati sulla notifica richiesta. Dopo aver inviato il messaggio, la notifica è disattivata e As, con fermezza, continua.

Dai un'occhiata al codice sul tuo computer per la funzione WyslijWiadomosc (...)per vedere come il nostro algoritmo utilizza la funzione API MQL sendNotification(...) quando si inviano notifiche spingere.

Somma

Se la piattaforma non lo ha ancora fatto per te, compila il file Come Intelligence.mq4 e prova la tua nuova applicazione! Per disegnare una nuova linea basta cliccare sulla bella immagine sul grafico.

Nel codice sorgente troverai molte altre interessanti funzionalità. Per quelli di voi che vorrebbero fare i nostri raggi x Asa dalla A alla Z, l'interpretazione di materiali aggiuntivi dovrebbe essere un buon addestramento nella navigazione della documentazione MQL. L'intero codice dell'applicazione di oggi ho cercato di mantenere i problemi discussi, in modo che la sua interpretazione fosse il più semplice possibile. Ti auguro un apprendimento fruttuoso e, poiché conosci già molti elementi del linguaggio, ti diverti a creare le prime soluzioni indipendenti!

Cosa ne pensi?
Io
20%
interessante
80%
Eh ...
0%
Cosa?
0%
Non mi piace
0%
Tragedia
0%
Circa l'autore
Radek Szafron
Radek Szafron
L'autore della pubblicazione è Radek Szafron, proprietario della società Expert Advisors, che da anni supporta gli investitori fornendo tecnologie dedicate al mercato FOREX. L'autore si è laureato alla Warsaw School of Economics con la specializzazione "Mercati finanziari" e un programmatore con quasi l'esperienza estiva 20. La società implementa progetti di algoritmi e applicazioni scritte in tutte le lingue dalla famiglia "C", comprese le piattaforme popolari Meta Trader 4 e 5. I consulenti esperti possono essere trovati su www.expertadvisors.pl.

Lascia una risposta