programmazione
Adesso stai leggendo
Praticamente MQL. Panic Button, part II [Programming Course]
0

Praticamente MQL. Panic Button, part II [Programming Course]

creato Radek SzafronMarzo 29 2019

Benvenuto nella seconda parte di Panic Button! Questa settimana, esamineremo nuovamente il codice del nostro pulsante di panico. Il nostro compito oggi è quello di aggiungere ciò che è più importante, cioè la funzione di liberarci dal peso delle posizioni aperte e liberarci dai vincoli di guardare costantemente il monitor.

Svilupperemo le funzionalità di base con qualcos'altro. Ci assicureremo che lo strumento che progettiamo sia sicuro e che i clic accidentali siano irremovibili e stoicamente calmi. Come ogni pulsante serio sul nostro pianeta e il nostro avrà una sorta di miccia che ti permetterà di chiudere la posizione solo quando il clic è accompagnato dalla pressione di un tasto [Shift] sulla tastiera.


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


Stiamo aprendo una fabbrica di algoritmi

Quindi accendiamo MetaEditor.

Andiamo a modificare il codice della nostra applicazione dalla scorsa settimana. Apri il file Panic Button.mq4 dal catalogo Esperti e diamo un'occhiata alla funzione OnInit (). La tua funzione dovrebbe apparire quasi identica alla funzione posta sotto con una piccola differenza. Oggi è apparso un nuovo elemento del codice // commento .

int OnInit ()
{
if(IsDemo () == falso)
{
 
ritorno INIT_FAILED;
 
}
bool blu = falso;
if(Tylko_ten_instrument == vero)
{
 
blu = vero;
 
}
Przycisku_utworz_sie (5, 15, blu);
// <- [Questo è il modo in cui formuliamo i commenti] EventSetMillisecondTimer(250); // Fine della novità
ritorno INIT_SUCCEEDED;
}
Codice MQL4

Aggiungi il codice mancante alla funzione OnInit ().

Iniziamo il tempo

La funzione API MQL è stata aggiunta al codice sopra bool EventSetMillisecondTimer(int millisecondo)ti permette di configurare il timer. Timer è un metodo che ti consente di chiamare un'altra funzione API: OnTimer () ogni specifico numero di millisecondi. Questa soluzione ci consente di eseguire periodicamente alcune parti del codice posizionandole all'interno della funzione OnTimer (). Nel nostro caso, 4 volte al secondo o cosa 250 millisecondi.

Il tempo stringe, quindi scriviamo una nuova funzione.

nulla OnTimer()
{
 
Przycisku_badz_czujny ();
 
}
Codice MQL4

Buon lavoro Hai appena creato un algoritmo responsabile della protezione del nostro pulsante contro i clic accidentali. E 'stata questa parte difficile. D'ora in poi, per fare clic sul pulsante sarà necessario tenere premuto il tasto [Shift] sulla tastiera. Gli spin sugli elettroni sono svitati in funzione Przycisku_badz_czujny ()che abbiamo importato dalla libreria Biblioteka_panic_button.ex4 la scorsa settimana.

La piattaforma richiede che il timer si spenga quando non ne abbiamo più bisogno. Possiamo farlo aggiungendo la funzione API EventKillTimer () per funzionare OnDeinit ()che abbiamo creato nella sezione precedente e che, come promemoria, verrà chiamato dalla piattaforma al momento della chiusura della nostra applicazione. Modifichiamo la funzione OnDeinit ()fai sembrare la funzione qui sotto

nulla OnDeinit(const int ragione)
{
 
Przycisku_bye_bye ();
 
EventKillTimer ();
}
Codice MQL4

È possibile avviare l'applicazione qui e vedere come risponde l'algoritmo premendo un tasto [Shift].

Guardiamo ogni mossa

È giunto il momento di iniziare a pensare alla funzione di chiusura della posizione. Per fare ciò, dobbiamo riconoscere il momento in cui si fa clic sul pulsante. La funzione API ci aiuta nulla OnChartEvent(const int id const lungo & lParam const double & dparam, stringa const & SPAR).

funzione OnChartEvent (...) viene chiamato dalla piattaforma ogni volta che si verifica un evento sul grafico che potrebbe essere rilevante per il funzionamento del programma, ad esempio l'utente fa clic sull'oggetto o sposta il mouse. Scriviamo la funzione appropriata.

nulla OnChartEvent(const int id const lungo & lParam const double & dparam, stringa const & SPAR)
{
 
}
Codice MQL4

Piattaforma, funzione di chiamata OnChartEvent (...) fornisce informazioni aggiuntive usando i parametri id, lParam, dparame asta. Questo ci permette di identificare cosa è successo e il tipo di evento è memorizzato nella variabile idche è di tipo int, cioè un numero intero. parola const quando il tipo di variabile indica che una determinata variabile non può essere modificata e viene utilizzata solo per leggere le informazioni.

Cerchiamo di espandere la nostra funzione con un altro elemento.

nulla OnChartEvent(const int id const lungo & lParam const double & dparam, stringa const & SPAR)
{
 
if(id == CHARTEVENT_OBJECT_CLICK)
{
 
}
 
}
Codice MQL4

Usando l'operatore if sopra controlliamo se la variabile id è uguale == il valore definito nella variabile generato automaticamente dal nome CHARTEVENT_OBJECT_CLICK. Se è così, siamo sicuri che l'utente abbia fatto clic su un oggetto non specificato sul grafico su cui funziona il nostro algoritmo.

Lo sappiamo già quando l'espressione condizionale dell'operatore if sarà logicamente vero che verrà fatto il codice tra le parentesi graffe {} appartenente a questo operatore. Aggiungiamo al nostro codice cosa dovrebbe accadere quando il grafico clicca su qualsiasi oggetto.

nulla OnChartEvent(const int id const lungo & lParam const double & dparam, stringa const & SPAR)
{
 
if(id == CHARTEVENT_OBJECT_CLICK)
{
 
if(Button_you_you_t_click_turned (sparam) == vero)
{
 
}
 
}
 
}
Codice MQL4

Il codice sopra controlla se era il nostro pulsante che è stato cliccato usando la funzione bool Przycisku_czy_jestes_klikniety (stringa object_name)che proviene dalla libreria importata. La funzione come parametro assume una variabile con tipo di dati stringa, che è una variabile di testo che dovrebbe contenere il nome dell'oggetto che è stato cliccato dall'utente. La funzione confronta il valore ricevuto con il nome dell'elemento grafico del pulsante e la risposta alla domanda se il nostro pulsante è stato cliccato risponderà con il valore del tipo boolo valore vero lub falso.

Come conosciamo il nome dell'oggetto che è stato cliccato? funzione OnChartEvent (...) riceve dalla piattaforma il nome dell'ultimo oggetto cliccato usando il parametro stringa detto astache possiamo passare direttamente come parametro per la nostra funzione, oh si Przycisku_czy_jestes_klikniety (SPAR).

Eseguiamo l'incarico affidato [Konkrety]

Quando funzioneButton_or_jestes_klikniety (...) restituirà il valore vero sapremo che non ci sono battute, devi salvare la situazione.

Aggiungiamo al nostro codice una funzione che realizzerà il compito principale del nostro algoritmo, ovvero, chiudere la posizione sull'account. La funzione ha la seguente dichiarazione:

bool Zamknij_pozycje_i_zlecenia (bool tylko_ten_instrument),

In pratica, lo inseriamo nel codice come nella casella qui sotto.

nulla OnChartEvent(const int id const lungo & lParam const double & dparam, stringa const & SPAR)
{
 
if(id == CHARTEVENT_OBJECT_CLICK)
{
 
if(Button_you_you_t_click_turned (sparam) == vero)
{
 
Zamknij_pozycje_i_zlecenia (Tylko_ten_instrument);
 
}
 
}
 
}
Codice MQL4

funzione Chiudi_posizioni_e_ ordini (...) accetta una variabile di tipo come argomento boolche dovrebbe portare informazioni, vero lub falsodovremmo chiudere le posizioni solo dello strumento su cui lavora l'algoritmo. Ti ricordi il parametro Tylko_ten_instrument dal riquadro delle impostazioni nella prima parte? Siamo appena tornati utili. A seconda della nostra scelta nelle impostazioni, il programma chiuderà gli elementi che sono compatibili con il grafico selezionato o tutti gli elementi nell'account.


esperti consulenti


Creiamo la funzione principale

Iniziamo a modificare il file "Funzioni_utili.mqh" dalla directory MQL4 \ Include \ Panic Button \

Fino ad ora, abbiamo usato solo le funzioni che provengono dall'API MQL o importate dalla libreria Biblioteka_panic_button.ex4. Nel mondo reale, tuttavia, la programmazione richiede che noi creiamo la maggior parte delle funzioni da noi stessi, mentre supportiamo l'intero spettro di soluzioni pronte all'uso. funzione Chiudi_posizioni_e_ ordini (...) , da cui utilizziamo quanto sopra, troverai nel file Przydatne_funkcje.mqh, quale nella parte precedente abbiamo inserito il catalogo MQL4 \ Include \ Panic Button \ e ci siamo uniti al codice usando la parola chiave #includere. Apri il file in MetaEditor perché, a sorpresa, la funzione che chiude le voci è già nel file, ma dobbiamo ancora dargli il contenuto.

Definizione della funzione

Dopo aver aperto il file Przydatne_funkcje.mqh vedrai che lui è dentro definizione funzione di chiusura della posizione. Sembra proprio come le funzioni che abbiamo usato finora con la differenza che è nostra, e possiamo dargli quale tipo di anima vorrà il nome, il tipo e il set di parametri. La tua funzione dovrebbe apparire più o meno come la funzione seguente:

bool Zamknij_pozycje_i_zlecenia (bool tylko_ten_instrument)
{
ritorno vero;
}
Codice MQL4

Quindi, in testata , abbiamo definito una funzione chiamata Zamknij_pozycje_i_zlecenia restituendo il tipo di dati bool e prendendo un parametro chiamato tylko_ten_instrument anche sul tipo di dati bool.

Il contenuto della funzione

Tutto ciò che mettiamo tra parentesi graffe {} dopo l'intestazione della funzione è costituito dal suo contenuto. Quindi arricchiamo il nostro contenuto con il primo codice.

bool Zamknij_pozycje_i_zlecenia (bool tylko_ten_instrument)
{
if(isconnected() == falso) ritorno falso;
int i = 0; int numero_della_power_and = OrdersTotal();
if(number_of_content_and == 0) ritorno vero;
bool risultato = vero;
ritorno avvenuta;
}
Codice MQL4

Sopra, prima if, controlliamo se siamo connessi al server utilizzando la funzione API isconnected() e in caso di problemi, abbandoniamo la funzione con l'aiuto dell'operatore ritorno mentre restituisce il valore falsoper farti sapere che qualcosa non va. Questo è giusto dopo if non ci sono parentesi graffe, perché utilizziamo un record abbreviato possibile in situazioni in cui, dopo l'espressione condizionale, vogliamo eseguire solo una operazione.

Quando siamo online, l'algoritmo va oltre e crea due variabili int sui nomi i e liczba_pozycji_i_zlecen assegnando al primo valore 0e il secondo valore dalla funzione API OrdersTotal(), che ti informa sul numero di posizioni aperte e ordini nel tuo account.

Un altro operatore if controlla se a volte tutti gli elementi non sono più chiusi e l'utente fa clic sul pulsante solo per divertimento o affetto che si traduce in lasciare la funzione con il trasferimento di valore veroperché tutto è a posto.

Quando una funzione ha ancora qualcosa da fare, crea una variabile bool detto rezultat, che servirà in seguito a fornire informazioni sul fatto che tutti gli articoli siano stati correttamente chiusi utilizzando l'operatore finale ritornoche abbiamo leggermente modificato in questo passaggio.

Per loop

Operatore per, che nella sua popolarità è suscettibile di cedere solo all'operatore if, è usato per eseguire un certo insieme di operazioni con un numero specificato di ripetizioni. Ideale per situazioni come la nostra, perché dobbiamo eseguire separatamente un'operazione di chiusura per ogni ordine. Aggiungiamo un ciclo alla nostra funzione per.

bool Zamknij_pozycje_i_zlecenia (bool tylko_ten_instrument)
{
if(isconnected() == falso) ritorno falso;
int i = 0; int numero_della_power_and = OrdersTotal();
if(number_of_content_and == 0) ritorno vero;
bool risultato = vero;
per(i = number_of_items_i_ orders - 1; i> = 0; I--)
{
 
}
ritorno avvenuta;
}
Codice MQL4

W testatadopo l'operatore per vediamo un record misterioso: (i = number_of_items_i_ orders - 1; i> = 0; I--) .

Il record significa che il ciclo inizia con la variabile creata in precedenza i uguale alla variabile liczba_pozycji_i_zlecen meno uno e ripeterà l'operazione tra parentesi graffe {} finché variabile i è maggiore o uguale a zero [io> = 0], e dopo la fine di ogni ciclo ridurrà la variabile i di uno [I--] in modo che il ciclo abbia una possibilità di finire prima o poi. Semplice, semplice e comodo da leggere.

Parlando nella lingua delle persone, il ciclo per esegue l'operazione tra parentesi {} tante volte quante sono le posizioni aperte.

Aggiungiamo il contenuto al nostro ciclo.

bool Zamknij_pozycje_i_zlecenia (bool tylko_ten_instrument)
{
if(isconnected() == falso) ritorno falso;
int i = 0; int numero_della_power_and = OrdersTotal();
if(number_of_content_and == 0) ritorno vero;
bool risultato = vero;
per(i = number_of_items_i_ orders - 1; i> = 0; I--)
{
if(OrderSelect(E, SELECT_BY_POS) == falso)
{
risultato = falso; continua;
}
if(only_ten_instrument == vero && OrderSymbol()! = Simbolo()) continua;
if(OrderType() == OP_BUY || OrderType() == OP_SELL)
{
if(OrderClose(OrderTicket(); OrderLots(); OrderClosePrice(); 0) == falso)
{
risultato = falso; continua;
}
}
Altrimenti se(OrderDelete(OrderTicket()) == falso) risultato = falso;
}
ritorno avvenuta;
}
Codice MQL4

Fisica dei razzi

Analizziamo passo a passo cosa sta accadendo all'interno del nostro ciclo perche abbiamo scritto con coraggio nella fase precedente.

Nel primo passaggio utilizzando la funzione API OrderSelect(...) scegliamo un ordine dal terminale usando il numero della sua posizione nella lista degli ordini (il primo ordine nell'elenco ha il numero zero). Abbiamo una variabile per questo scopo iche cambia il valore con ogni ciclo. In caso di errore, scriviamo l'errore nella variabile rezultat e informa il ciclo per usando l'operatore continuache dovrebbe fermarsi a questo punto e iniziare un nuovo ciclo con una variabile i meno uno [I--].

Quando tutto va bene, un altro operatore if userà, novità, operazione logica"e" &&che restituisce un valore vero solo se entrambe le espressioni, in ciascuna delle sue pagine, restituiscono un valore vero. Quindi, quando lo strumento dell'ordine selezionato [OrderSymbol()] non risponde [!=] uno strumento grafico [Simbolo()] e variabile tylko_ten_instrument ha un valore vero, ignoriamo l'ordine dato e usiamo l'operatore continua andiamo al prossimo ciclo del ciclo per. In tutti gli altri casi, l'algoritmo va sotto.

Quindi il nostro programma controlla l'ordine di cui abbiamo il piacere e utilizza la funzione API OrderType() e operazione logica"o" ||che restituisce un valore veroquando almeno una delle espressioni su ciascuna delle sue pagine restituisce un valore vero. Altrimenti, quando l'espressione logica dell'operatore if nel suo insieme, restituirà il valore falso l'operatore verrà eseguito Altrimenti sefunziona con il primo se sono e lo serve come piano B, quando non può essere d'accordo con la sua espressione logica.

In base al tipo di ordine in primo luogo if quando si tratta di un ordine di acquisto sul mercato [OP_BUY] o vendita sul mercato [OP_SELL] chiuderà la posizione utilizzando la funzione API OrderClose(...)e l'altro ifin realtà Altrimenti se annulla gli ordini in sospeso usando la funzione OrderDelete(...).

Mi inchino, il programma è pronto!

Salviamo le modifiche al file Przydatne_funkcje.mqh, torniamo al codice dell'applicazione principale Panic Button.mq4 ed entusiasta, piena di energia e curiosità derivante dalla volontà di provare un nuovo lavoro, stampa ... compilare! Allora correggiamo gli errori e ci vediamo la prossima settimana! 🙂

SCARICARE UN SET DI FILE MQL

Cosa ne pensi?
Io
95%
interessante
8%
Eh ...
0%
Shock!
0%
Non mi piace
0%
ferita
0%
Circa l'autore
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.