Sei sulla pagina 1di 325

Daniele Livio Dainesi ha iniziato la sua carriera come

analista programmatore subito dopo la sua laurea in


Economia. E'stato giornalista nel settore informatico e ha
fondato una software house (SD Studio Dainesi) dopo aver
lavorato per anni come consulente per molte grandi
aziende multinazionali. Da molto tempo ha coniugato la
professione informatica con la vocazione economico
finanziaria diventando analista finanziario e trader di Borsa.
Dello stesso autore è il libro "Creare e programmare
Trading System per il mercato delle valute".
Dainesi - Guida di riferimento al linguaggio MQL

DANIELE LIVIO DAINESI

MQL
Programmare
Tradìng Systems
con MQL

Castellarla, 2010

Pagina 1
Dainesi - Guida di riferimento ai linguassio MQL

A mia moglie Nicoletta, che mi ha sopportato durante la scrittura di questo


libro.

Alla nostra gatta Pappis che ha saputo farmi prendere delle pause salutari
con le sue insistenti miagolate.

Ai miei genitori che mi hanno trasmesso l'entusiasmo per le sfide e mi hanno


spronato a proseguire nonostante le mille difficoltà.

Ai miei molti clienti che han saputo mettermi di fronte a nuove sfide logiche
nell 'affrontare e tradurre le toro strategie di trading.

Castellarne, 3 dicembre 2010.

Pagina 2
Dainesi - Guida di riferimento al /inguoggio MQL

Sommarlo
Introduzione 11
L'ambiente di sviluppo (IDE) 12
1 Elementi base del linguaggio 15
Le Variabili 18
Numeri interi (Integer) 19
Numeri a virgola mobile(Double) 21
Stringhe di testo (String) 22
Date e orari (dateti me) 22
Valori booleani (bool) 24
Valori di Colore (Color) 25
Valori Literals 28
Dichiarazione ed inizializzazione delle variabili 28
Gli Array 32
Le Costanti 34
Sintassi generale 35
Definizione di istruzione 35
Blocchi 35
Commenti 36
Le funzioni 36
Parametri 37
Passaggio dei parametri per valore 38
Passaggio dei parametri per riferimento 39
Le routine 40
Funzioni "scheletro" 40
Init 40
Deinit 41
Start 41
Funzioni native 42
Nomi delle variabili e funzioni 43
Parole riservate (token) 44
# Operatori ed espressioni 45
Incremento e decremento 45
Operazioni di assegnazione 46
Operazioni di confronto 47
Operatori Booleani 47
Operazioni di spostamento di bit (o BitWise) 48
Operazioni di indicizzazione 50
Regole di precedenza tra operatori 50
5 Struttura del codice 53
Formato delle istruzioni e annidamento 53
Blocchi 54
Inizializzazione delle variabili 54
Chiamate a funzione 55
Operatore condizionale IF - 55
Switch 56

Pagina 3
Dainesì - Guida dì riferimento al finguagsio MQJ.

while 57
Ciclo iterativo for 57
Break 59
Continue 59
Return 60
4 Funzioni 61
Definizione di funzione 61
Creare una funzione 63
Speciali funzioni init(), deinitQ e start() 65
Ir Variabili 67
Dichiarazioni 67
Arrays 69
Ambito di visibilità (Scope) 70
Variabili esterne o proprietà del trading System 71
Utilizzo e dichiarazione di funzioni esterne 71
6 Preprocessore 73
Dichiarazione di costante , 73
Controlli di compilazione 74
Inclusione di file 75
Importazione di funzioni e altri moduli 75
7 Informazioni sull'Account 77
AccountBalance , , 77
AccountCredit 78
AccountCompany 78
AccountCurrency 79
AccountEquity 80
AccountFreeMargin 80
AccountLeverage 81
AccountMargin 81
AccountName 82
AccountNumber 83
AccountProfìt 84
§ Funzioni di manipolazione degli Array 85
ArrayBsearch 86
ArrayCopy 87
ArrayCopyRates 87
ArrayCopySeries 89
ArrayDimension 90
ArrayGetAsSeries 90
Arraylnitialize 91
ArraylsSeries 91
ArrayMaximum , , 92
ArrayMaximum 92
ArrayRange , 93
ArrayResize 93
ArraySetAsSeries 94
ArraySize 95
ArraySort 95
9 Funzioni di uso comune 97

Pagina 4
Dainesi - Guida di riferimento ai linguaggio MQL

Alert 98
ClientTerminalName 99
CompanyName 99
Comment 100
GetLastError 101
GetTickCount 102
HideTestlndicators 102
IsConnected 103
IsDemo 103
IsDUsAllowed 104
IsLibrariesAllowed 104
IsStopped 105
IsTesting 105
IsTradeAllowed 106
Marketlnfo 106
MessageBox 108
Period 111
PlaySound 111
Print 112
RefreshRates 113
SendMail 113
ServerAddress..... 114
Sleep 115
Symbol 116
UninitializeReason 116
10 Funzioni di Conversione 119
CharToStr 120
ASCII Caratteri di controllo (character code 0-31) 120
ASCII caratteri stampabili (character code 32-127) 121
Codici ASCII estesi (character code 128-255) 123
DoubleToStr 126
NormalizeDouble 127
StrToDouble 127
StrToInteger 128
StrToTime 128
TimeToStr 129
11 Indicatori personalizzati 131
IndicatorBuffers 132
IndicatorCounted 134
IndicatorDigits 134
IndicatorShortName 135
SetlndexArrow 136
SetlndexBuffer 138
SetlndexDrawBegin 139
SetlndexEmptyValue 140
SetlndexLabel 141
Setlndexshift 142
SetlndexStyle 142
SetLevelStyle 144
SetLevelValue 144

Pagina 5
Dainesi - Guida di riferimento al linguaggio MQi

12 Funzioni di data e orario 147


CurTime 148
Day 148
DayOfWeek 148
DayOfYear 149
Hour 149
LocalTime 149
Minute 150
Month 150
Seconds 150
TimeDay 151
TimeDayOfWeek 151
TimeDayOfYear 151
TìmeHour 152
TimeMinute 152
TimeMonth 153
TimeSeconds 153
TimeYear 153
Year 154
13 Funzioni di manipolazione dei file 155
FileClose 156
FHeFlush 156
FHelsEnding 157
FHelsLineEnding 157
FileOpen 158
FileOpenHistory 159
FileReadArray 160
FileReadlnteger 161
FHeReadNumber 161
FileReadString 162
FileSeek 163
FileSize 163
FHeWrite 164
FileWriteArray 165
FHeWriteDouble 166
FìleWritelnteger 166
FileWriteString 167
14 Funzioni legate alle variabili globali 169
GlobalVariableCheck 170
GlobalVariableDel 170
GlobalVariableGet 171
GlobalVariableSet 171
GlobalVariableSetOnCondition 172
GlobalVariablesDeleteAU 172
15 Funzioni matematiche e trigonometriche 173
MathAbs 174
MathArccos 174
MathArcsin 175
MathArctan 176
MathCeil 177

Pagina 6
Dainesi - Guida di riferimento al linguaggio MQ/.

MathCos 178
MathExp 179
MathFloor 180
MathLog 181
MathMax 182
MathMin 182
MathMod 183
MathPow 183
MathRand 184
MathRound 185
MathSin 185
MathSqrt 187
MathSrand 187
MathTan 188
16 Funzioni legate agli Oggetti 191
ObjectCreate 192
ObjectDelete 194
ObjectDescription 194
ObjectFind 196
ObjectGet 196
ObjectGetFiboDescription 198
ObjectGetShiftByValue 198
ObjectGetValueByShift 199
ObjectMove 199
ObjectName 200
ObjectsDeleteAll 200
ObjectSet 201
ObjectSetFiboDescription 201
ObjectSetText 202
ObjectsTotal 202
ObjectType 203
17 Variabili predefinite 205
Ask 206
Bars 206
Bid 206
dose 207
Digits 207
High 207
Low 208
Open 209
Point 209
Time 210
Volume 211
1S Costanti enumeratile 213
Prezzi applicati 213
Forme disegnate 214
Codici di errore 214
Codici di errore ritornati dal server del broker 215
Codici di errore MQL4 a run time 216
Serie dati Ichimoku Kinko Hyo 217

Pagina 7
Dainesi - Guida di riferimento al linguaggio MQ/.

Identificatori delle linee degli indicatori 218


Identificatori utilizzati in ÌMACDQ, ÌRVI() e iStochastic() 218
Identificatori usati con iADX() 218
Identificatori utilizzati con iBands(), iEnvelopes(),iEnvelopesOnArray(), iFractals() e
iGator() 218
Informazioni del mercato 218
Codici di ritorno delle MessageBox 219
Caratteristiche delle MessageBox 220
Costanti utilizzate con le medie mobili 221
Costanti per la definizione delle proprietà degli oggetti 221
Costanti per la definizione del tipo di oggetto 223
Costanti per la visibilità degli oggetti , 223
Codici predefiniti delle frecce 224
Codici speciali per frecce che puntano il prezzo e la data 224
Identificatori delle serie in array 225
Costanti speciali 225
Costanti enumerative dei Tirne frame 225
Costanti relative all'operatività di trading 226
Codici di ritorno per l'evento Uninitialize 226
Simboli Wingdings 227
Costanti dei colori Web 228
19 Funzioni di manipolazione delle stringhe di testo 229
StringConcatenate 230
StringFind 231
StringGetChar 231
StringLen 232
StringSetChar 232
StringSubstr 232
StringTrimLeft 233
StringTrimRight 233
20 Indicatori di analisi tecnica 235
Accelerata-/Decelerata- 236
Accumulazione/Distribuzione 236
Indicatore Allìgator 237
Average Directional Movement Index , 239
AverageTrue Range 240
Awesorne 241
Bears Power 242
Bande di Bollinger 242
Bande di Bollinger su una serie dati 244
Bulls Power 245
Commodities Channel Index 246
Commodities Channel Index su una serie dati 247
Indicatore personalizzato 248
Indicatore di DeMarker 250
Envelope 251
Envelope su una serie dati 252
Indicatore Porce 253
Indicatore Trattale 254
Oscillatore Gator.... 255

Pagina 8
Dainesì - Guida dì riferimento al (inguaggio MQ/.

Indicatore Ichimoku Kinko Hyo 256


Market Facilitation 257
Momentum 258
Momentum su una serie dati 259
Indicatore Money flow index 260
Media mobile 261
Media mobile di una serie dati 262
Media mobile di un oscillatore 263
MACD o Moving averages convergence/divergence 264
Indicatore On Balance Volume 265
Indicatore Parabolic Stop And Reverse (SAR) 266
Indicatore dell'indice di forza relativa RSI 267
Indicatore di forza relativa di una serie dati 268
Indicatore dell'indice Relative Vigor 269
Deviazione standard 270
Deviazione standard di una serie dati 271
Oscillatore Stocastico 272
Indicatore %r di Larry William 273
21 Serie temporali 275
iBars 276
iBarShift 276
ìdose 277
iHigh 278
iLow 279
iOpen 280
iTime 281
(Volume 282
iHighest 283
iLowest 284
22 Funzioni di Trading 285
OrdersHistoryTotal 286
OrderClose 287
OrderCloseBy 288
OrderClosePrice 289
OrderCloseTime 290
OrderComment 290
OrderCommission 291
OrderDelete 291
OrderExpiration 292
OrderLots 292
OrderMagicNumber 292
OrderModify 293
OrderOpenPrice 294
OrderOpenTime 294
OrderPrint 295
OrderProfit 295
OrderSelect 296
OrderSend 297
OrderStopLoss 299
OrdersTotal 299

Pagina 9
Dainesi - Guida di riferimento al linguaggio MQL

OrderSwap 300
OrderSymbol 300
OrderTakeProfit 301
OrderTicket 301
OrderType 302
23 Funzioni di gestione finestre 303
HideTestlndicators 304
Period 304
RefreshRates 305
Symbol 305
WindowBarsPerChart 306
WindowExpertName 306
WindowFirstVisibleBar 306
WindowTimeOnDropped 307
WindowFind 307
WindowHandle 308
WindowIsVìsible 308
WindowOnDropped 309
WindowsPriceMax 309
WindowPriceMin 309
WindowRedraw 310
WindowScreenShot 310
WindowsTotal 311
WindowXOnDropped 311
WindowYOnDropped 311
Appendice A 313
stderror.mqh 313
stdlib.mqh 315
WinUser32.mqh 315
stdlib.mq4 322
Indice 329

Pagina 10
Dainesi ~ Guida di riferimento al linguaggio MQt

Introduzione

Anni or sono mi avvicinai alla programmazione per trovare


risposta nel mondo delle "macchine" a quei quesiti che la
mente umana avrebbe impiegato troppo tempo per risolvere.
Ben presto mi accorsi che "i pezzi di ferro" che ostinatamente
chiamavano computer in realtà richiedevano un'enorme
quantità di tempo per essere compresi, "ammaestrati" e
finalmente condotti a sostituire noi stessi nel compimento di
lavori routinari.
Quello che appare logico e "matematico" nel mondo dei
computer spesso si tramuta in un qualcosa di illogico e del
tutto irrazionale.
Per capire come si comporta un programma occorre capire
come funziona un computer e come questo gestisca la
memoria.
Ecco che allora iniziai ad appassionarmi all'informatica e ben
presto riuscii a capire molte cose.
Capire come impostare un programma, come memorizzare dei
dati e come far compiere delle azioni (leggere, scrivere,
elaborare ed inviare dati) è di fondamentale importanza per
comprendere cosa ci si può aspettare dall'informatica.

Pagina 11
Dainesi - Guida di riferimento al /insuaggio MQL

Per anni si è sempre pensato che un elaboratore potesse


risolvere molti dei nostri problemi o sostiturci nei nostri
compiti più ripetitivi ma nessuno ce lo aveva mai spiegato.
Con la comprensione di cosa ci serve, di cosa vogliamo e di
come strutturare la soluzione siamo finalmente giunti alla
realizzazione di una promessa.
Questo libro vuole aiutare il lettore a capire come
programmare con il linguaggio di sviluppo MQL.
MQL è il linguaggio di sviluppo utilizzato dal programma
MetaTrader per la realizzazione ed esecuzione di trading
systems in grado di sostituirsi a noi nella gestione del trading
online: il linguaggio viene utilizzato per "tradurre" le nostre
strategie di trading in programmi automatici operano anche in
nostra assenza (e su più strumenti contemporaneamente).
Per capire un linguaggio di sviluppo occorre capire la sintassi
(la "grammatica") ed il controllo di flusso.
Un programma può esser fatto per essere eseguito una sola
volta (chiusura di un'operazione aperta) oppure per essere
reiterato più volte sino a che si mantengono attive le
condizioni per cui è necessario che funzioni (attuazione di una
strategia di trading).

Il libro è strutturato in tre parti: nella prima si presenteranno


gli elementi fondamentali di un linguaggio (variabili e
costanti, funzioni e parametri), nella seconda si affronteranno
i gestori di flusso (valutazione di condizioni, come esaminare
degli insiemi, valutazione degli errori) mentre nella terza si
esamineranno tutte le funzioni native del linguaggio.

Questo libro vuole essere una guida di riferimento per il


trader-programmatore senza la pretesa di coprire ogni singolo
aspetto del linguaggio o delle problematiche specifiche nelle
quali, prima o poi, ogni programmatore sì imbatterà.

L'ambiente di sviluppo (IDE)

Se l'ambiente di utilizzo dei frutti della programmazione è la


piattaforma di trading (MetaTrader), l'ambiente o
applicazione in cui si scrive il codice si chiama MetaEditor.

Pagina 12
Dainesì - Guida di riferimento al (ìnguaggìo A1Q/.

& Eie Modifica Vedi Strumenti

MovingAvirages.rnqt

. . . - - , - . , i r , -..,..- ,|

^| Arbficlal!ntellgente.rr>q4
^] DayTradlna.niq*
ì DelfinoN8t.m(|4

xtMapBuMei[];
ExtCountedBaEs-Q;

,•1*5
language albwsto creale your ovjn ExpertAdvisorsthatmake tradì run rr^iaiKnif.nr automatecl and are

supported by r-telaQuotes Sofb'jaie Coro. YOJ can download thè Book tn .ehm formai at:
htlp^flav^.mqH..eornffiles/ni<1abpqkenglislichm (si;e 2.0 Mb).

35 basic anmmetic and logic operations are induded in MQL4 strutture. There are atso basic indicalors

All'interno di MetaEditor vengono creati e modificati i file di


codice che poi vengono compilati per il loro utilizzo
all'interno della piattaforma di trading.

I file di codice con estensione "mq4" sono semplici file di


testo che si potrebbero creare con qualsiasi editor, anche con
Notepad. Il valore aggiunto è dato dal compilatore che
traduce il testo in linguaggio macchina e salvando il compilato
in un file con estensione "ex4".

Pagina 13
Dainesi - Guida di riferimento al linsuasgio MQL

Elementi base del linguaggio

Ogni linguaggio possiede un elenco di vocaboli, di articoli,


avverbi aggettivi e verbi che grazie ad una sua grammatica
permette di costruire una frase di senso compiuto.
Un linguaggio di programmazione è simile ad un linguaggio
lessicale: esiste un insieme di vocaboli (token), articoli,
avverbi ed aggettivi (funzioni native) e un insieme di verbi
(funzioni di input e output) che ci permettono di far compiere
un'azione. Ogni frase deve rispettare la punteggiatura per
rendere compiuto il senso del discorso.
Nel trading, e in MQL nello specifico, il linguaggio ci permette
di leggere i dati delle quotazioni, elaborarli per poter
prendere delle decisioni che origineranno azioni (acquisto,
vendita, disegno di un grafico, ecc...).

Pagina 15
Dainesi - Guida di riferimento al (inguaggio MQL

I trading System sono programmi che compiono dei calcoli e


delle vantazioni sulla base dei pochi dati a loro disposizione:
quotazioni, volumi, date e informazioni ricavate
dall'ambiente circostante (il pc client o il server del broker).
Ogni applicazione per la generazione (ed esecuzione) di
trading System è basata sull'analisi dei dati e sulla loro
modificazione allo scorrere del tempo.
Rispetto ad applicazioni tradizionali dove si aspetta l'input
dell'utente (pressione di un tasto, movimento del mouse,
lettura di un codice a barre, ecc..) un trading System agisce in
risposta al passare del tempo, al verificarsì di un qualsiasi
cambiamento delle quotazioni (sia quelle "battute" sia quelle
relative ai valori di domanda e offerta).

I moderni linguaggi di programmazione sono pensati per


rispondere ad eventi e non seguire un esecuzione sequenziale.
Questo significa che i programmi generati non svolgeranno
una serie azioni una dopo l'altra sino ad arrivare alla fine ma
bensì intrapprenderanno un azione in risposta alla verifica di
un evento specifico (pressione di un pulsante, raggiungimento
di un dato orario, cambiamento di valore di una variabile
esterna come una quotazione, esaurimento delle batterie di
alimentazione, ecc... solo per citarne alcuni esempi).

Ogni problema, anche i più semplici che siamo abituati a


risolvere sin dai tempi delle scuole primarie, consiste in un
insieme di dati iniziali, la definizione della situazione di
partenza ed il quesito riguardante la situazione finale. Molto
spesso per arrivare alla soluzione occorre elaborare e
trasformare i dati iniziali in dati complessi, quindi operare dei
confronti.

Nel trading i dati di partenza sono i valori di cui possiamo


disporre e tra questi troviamo le serie storiche delle
quotazioni (prezzi, volumi e date delle singole candele') ed i
parametri definiti dall'utente, ovvero quelle impostazioni che

Una candela rappresenta un intervallo temporale definito nel quale si riporta il prezzo iniziale (Open), il prezz
minimo (Low), il prezzo massimo (Htgh), il prezzo di chiusura (dose), il volume scambiato (Volume) e la dati
completa di inizio (Time). Più avanti verrà ripreso il significato delle candele e loro utilizzo.
Pagina 16
Dainesi - Guida di riferimento al linguaggio MQL

vengono preimpostate dall'utilizzatone del programma


attraverso le finestre di impostazione.

I dati non sono tutti uguali ma cambiano per valore, natura e


tipo. L'età di una persona viene espressa attraverso un
numero finito mentre il suo nome viene rappresentato da una
stringa di testo. Ogni dato può essere rappresentato in una
delle seguenti grandi famìglie:

> Numero
> Testo
> Data
> Vero/Falso

A loro volta i numeri sono rappresentati da elementi interi


(numeri "tondi" come 1, 23 o -52) ed elementi decimali o
altrimenti detti a virgola mobile (come -3,14213456... o
1,4034).

Ogni programma deve interfacciarsi da una parte con l'uomo


e dall'altra con l'hardware (i componenti del computer) e ha
bisogno di archiviare i dati in appositi spazi all'interno della
memoria del pc.
La memoria di un elaboratore deve essere vista come un
enorme autosilos dove possono trovare posteggio biciclette,
motociclette, autovetture, autobus e camion con rimorchio.
Ogni vettura ha il suo "ticket" che riporta le coordinate del
suo posteggio e ogni posteggio è creato appositamente per
quel tipo di vettura.

I programmi hanno bisogno di conoscere in anticipo il tipo di


ogni dato prima di poterne memorizzare il valore, così come il
posteggiatore deve conoscere il tipo di ogni vettura prima di
poter indicare il suo posteggio.

I dati devono quindi essere "dichiarati" prima di poter essere


usati. Il nome di una variabile, inoltre, non può eccedere i 31
caratteri di lunghezza2.

!
Come suggerimento consiglio di essere il più concisi possibile pur rimanendo sufficientemente descrittivi.
Pagina 17
Daìnesi - Guida dì riferimento al linguaggio MQt

Le Variabili

Le variabili sono dei dati il cui valore può cambiare nel corso
del programma (da qui la dizione di "variabile") e per questa
ragione l'unica cosa che occorre dichiarare è la tipologia dei
dati che conterranno (numeri, testo, date, ecc...).
Nell'analogia dell'autosilos non è importante se il posto auto
sarà occupato da una Lamborghini o da una Trabant,
l'importante è che sia un automobile la cui lunghezza,
larghezza ed altezza sia compresa in determinati limiti. In
altre parole è importante dichiarare il tipo di ogni variabile
per far capire al sistema che in quello spazio di memoria sarà
memorizzato un dato con quelle dimensioni massime e non un
altro che eccederebbe per dimensioni. Se si volesse
memorizzare un valore più grande rispetto al consentito si
riceverebbe un errore di Overflow, owero di raggiunto limite
di memorizzazione per il tipo di variabile.

I tipi di variabile in MQL sono:

> Numeri interi (int)


> Booleani (bool)
> Literals (char)
> Stringhe di testo (string)
> Numeri a virgola mobile (doublé)
> Colori (color)
> Data (datetime)

All'interno delle parentesi sono riportati i nomi dei tipi di


dato utilizzati nel linguaggio MQL.
Gli ultimi due tipi di dato sono dati numerici interi che per
comodità di confronto e visualizzazione vengono dichiarati
diversamente. Una data infatti è rappresentata dal numero di
secondi passati dal 1° gennaio 1970 mentre un colore è la
rappresentazione numerica della trittica RGB3 che descrive il
colore.

3
RGB è racronimo di Red Green e Blue, tre colori le cui intensità presenti sono misurate in valori da O a 255 (es.
162.127.0)
Pagina 18
Daìnesì - Guida dì riferimento ai (inguaggio MQJL

II livello di precisione assunta dai diversi tipi di dato può


essere così ordinata:

1. int (bool,color,datetime);
2. doublé;
3. string;

Quando avviene un operazione tra diversi tipi di variabili, I


dati vengono trasformati nel tipo a maggior precisione.
Quando invece avviene un operazione di assegnazione vale il
contrario.

Numeri interi (Integer)

Le variabili di tipo integer possono memorizzare numeri


positivi o negativi ma senza valori decimali. Va da sé che ogni
assegnazione di valore decimale ad una variabile numerica
darà come risultato la troncatura della parte decimale
(mantissa).

ìnt A;
A=10/3;

//A sarà uguale a 3

Nell'esempio riportato nel riquadro si dichiara la variabile A


come un tipo di dato intero (i commenti, in questo caso, sono
preceduti da //).
Quindi scriveremo prima il tipo di dati che si intende
dichiarare (Intero e cioè int) seguito dal nome della variabile.
Il punto e virgola serve per terminare ogni istruzione del
linguaggio.
Queste variabili possono essere rappresentate in forma
decimale, esadecimale, letterale o booleana.

Pagina 19
Dainesi - Guida di riferimento al h'nguaggjo MOJ.

Decimale: i numeri sono composti da cifre comprese


nell'intervallo da O a 9; Lo zero non deve essere il primo
numero.

Es:
12, 111, -9561007

Esadecimale: numeri da O a 9, lettere a-f o A-F per


rappresentare valori 10-15; Iniziano con il suffisso Ox o OX.

Es:
OxOA, 0x12, 0X12, Ox2f, OxA3, OXa3, OX7C7

Per assegnare un valore alla variabile appena dichiarata


esistono due modi. Uno, più diretto e conciso, assegna il
valore direttamente insieme con la dichiarazione, mentre
quello usato nell'esempio utilizza un istruzione separata.

//Assegnazione diretta
int A - 10;

//Assegnazione dopo la dichiarazione


int B;
B - 10;

Per assegnare un valore si usa l'operatore di "assegnazione" =


che non svolge anche l'operazione di confronto. In C infatti
dire A è uguale a B è diverso dal dire A è uguale a B I
La prima istruzione si chiama operatore di assegnazione
mentre la seconda operatore di confronto.

L'operatore di assegnazione è = (singolo uguale) mantre


quello di confronto è == (doppio uguale).

//Assegnazione
A=B;

//Confronto
if(A—B) ...

Pagina 20
Dainesi • Guido di riferimento al linguaggio MQL

Una variabile intera può essere usata per memorizzare numeri


interi positivi e negativi da -2147483648 a 2147483647.
In genere si usano le variabili intere per memorizzare i punti"
di stop (oss o take profit, piuttosto che i periodi delle medie o
degli indicatori. Spesso poi si utilizzano variabili intere per
"ciclare5" gli ordini esistenti, cioè per passare in rassegna gli
ordini presenti in portafoglio e procedere ad una loro
disamina.

Numeri a virgola mobile (Doublé)

Le variabili di tipo doublé possono memorizzare numeri


positivi o negativi con la loro parte decimale. Possono
contenere valori da -1.7 * e-308 a 1.7 * e308 dome "e" sta per
"esponenziale". Nello specifico un doublé viene utilizzato per
memorizzare numeri particolarmente grandi.
Il suffisso dichiarativo per le variabili a virgola mobile è la
parola doublé.

doublé A;
A-10/3;

//A sarà uguale a 3.33333333333...

Le variabili di tipo doublé vengono solitamente utilizzate per


memorizzare i valori delle quotazioni, degli indicatori, dei
profitti e delle perdite.

4
Per punto e .a dal broker (da n onfondere con il Pip
5
Nel seguito del libro farò spesso riferimento al verbo ciclare intendendo per l'appunto It e di ogni elemento di
un insieme definito. Ad esempio gli ordini storici, le barre delle quotazioni e cosi via.
Pagina 21
Dainesi - Guida di riferimento al /inguagsio

Stringhe di testo (String,)

Le variabili di tipo string possono memorizzare stringhe di


testo con lunghezza compresa tra O e 255 caratteri
(l'eccedenza viene troncata dal compilatore),
le variabili stringa sono una successione di caratteri (codici
ASCII-code characters) racchiusi tra doppi apici. Se fosse
necessario inserire dei doppi apici come parte del testo è
necessario precedere il doppio apice da un back slash (\).
Generalmente vengono utilizzate per memorizzare commenti,
descrizione di errori o input/output per la lettura/scrittura di
file su disco, nonché testo da inserire sui grafici. Il suffisso
dichiarativo è la parola string.

string A;
A = "Ordine LONG su

Date e orar! (datetime)

Le variabili di tipo datetime memorizzano date e orari sotto


forma di combinazione Anno-Mese-Giorno-Ora-Minuto-Secondo
a partire dal 1° Gennaio 1970 sino a al 31 Dicembre 2037. Il
loro suffisso dichiarativo è la parola datetime.
La descrizione inizia con il carattere D ed è racchiusa da
singoli apici.

Es:
i 2010.01.01 00:00' // Capodanno del 2010
' 1981.07.06 12:30:27'
' 10.07.1997 10:30:00'
• 19.07.1980 12' //equivalente a D11980.01.19 12:00:00'
' 01.01.2004' //equivalente a D'01.01.2004 00:00:00'
1
12:30:27' //equivalente alla data corrente e ora indicata
1
' //equivalente alla data corrente e ora 00:00:00'

Pagina 22
Dainesi - Guida di riferimento al linguaggio MQf.

Questo tipo di dati è molto utile poiché ci permette di


misurare la distanza tra due barre conoscendo il time frame
del grafico, piuttosto che limitare l'operatività in determinati
orari o giorni.
All'utilizzo di variabili di tipo datetime torna utile associare
l'uso delle funzioni di analisi e manipolazione delle date per
poter calcolare il tempo trascorso tra due istanti, piuttosto
che ricavare il numero di barre trascorsa dall'ora di apertura
di un ordine (ad esempio).

datetime A;
datetime B;

A - OrderCloseTime ( ) i
B = OrderOpenTime();
Print("I/ ordine è stato aperto per " + ((A-B)/Periodf)) + "
barre");

/*
Periodo è una funzione nativa che riporta il timeframe del
grafico espresso in minuti

Nell'esempio precedente si determina il numero di barre


durante il quale l'ordine selezionato è rimasto a mercato. Da
notare l'uso della funzione Period (da usare con le parentesi
aperta e chiusa !) che riporta il numero di minuti espressi
dall'attuale time frame (quello del grafico per intendersi).
In questo esempio i commenti, essendo multi-linea, sono stati
racchiusi tra il delimitatore di inizio ( /* ) e quello di termine
commento (*/ ).
La funzione Print serve invece per inviare un messaggio al log6
dei consiglieri. Da notare come la concatenazione di stringhe
avvenga con l'operatore +. Se, una delle stringhe da
concatenare è il frutto di un operazione tra parametri
(variabili o numeri) è importante racchiudere l'operazione tra
parentesi in modo da offrire all'operatore di concatenazione
solo una stringa.
s
Un log è da intendersi come un file dì testo nel quale sono inseriti lutti i commenti, informazioni o segnalazione di
errori generati dal programma contenitore (MetaTrader) o dal trading System. Il contenuto dei file dì log viene
visualizzato attraverso delle finestre che riportano tutte le annotazioni separate in righe e mostrando la data e orario di
generazione dell' informazione.
Pagina 23
Dainesi - Guida di riferimento al linguaggio MQ/.

int A;
int B;

A - 5;
B = 4;
print("A - B = " + A-B) ; // ERRORE M Verrebbe generato un
errore
PrintC'A + B = " A + B); // ERRORE ! ! Risulterebbe "A + B = 5
+ 4"
Print("A + B = " (A+B) ) ; // Risulterebbe "A + B - 9"

Valori booleani (bool)

Le variabili di tipo booleano sono i tipi più semplici in quanto


memorizzano solo due tipi di valore: O che equivale a FALSE o
I che equivale a TRUE7. In tutti i linguaggi di programmazione
falso vale O e qualsiasi cosa non sia zero significa vero (questo
perché in alcuni linguaggi si usa 1 ed in altri -1).
II suffisso dichiarativo delle variabili booleane è la parola
bool.
Queste variabili sono utilizzate per impostare "semafori",
ovvero fornire una risposta rapida che dia o neghi l'assenso al
compimento di determinate azioni. Personalmente sono solito
utilizzare una variabile booleana come valore di ritorno sulle
funzioni di generazione dei segnali di apertura e chiusura
ordine.

//Oppure potrei utilizzare la seguente forma


iffresult != false)Print("Segnale di apertura ordine LONG");

7
In molti linguaggi di programmazione il valore corrispondente alla costante True è 1 mentre in altri è -I. Da ques
indecisione è nata nei programmatori l'abitudine a verìficare che il valore sìa "non zero" al posto di verifìcarne

Pagina 24
Dainesì - Guida di riferimento al /inguogs/o MQL

Nell'esempio precedente possiamo notare come viene


utilizzato il simbolo = come operatore di assegnazione (result
= VerificaLongO) e la riga successiva come invece si utilizzi il
doppio uguale == quale operatore di confronto (result ==
true). Il costrutto "if(condizione) azione;" verrà discusso più
avanti ma comunque si può capire fin da subito come serva a
compiere un azione se la condizione racchiusa fra le parentesi
tonde sia verificata.
Nella istruzione alternativa si utilizza invece l'operatore di
disuguaglianza ("non uguale") definito dai simboli != .

Valori di Colore (Colar)

Le variabili di tipo color rappresentano il valore RGB di


identificazione di un colore. Possono essere valorizzate con il
nome di una costante (solo per i colori denominati "Web") o
con un intero di 4 byte il cui primo byte è vuoto mentre i
successivi tre rappresentano le gradazioni RGB (Red, Green e
Blu) o con un valore Literal (rappresento dai tre valori RGB
delimitati da singoli apici e separati da una virgola e
preceduti dalla lettera C. Il suffisso dichiarativo delle variabili
colore è la parola color.

color GRIGIO = C'128,128,128'


color VERDE_MARE = SeaGreen;
color BIANCO = 16777215;

Una rappresentazione esadecimale avrà il seguente formato


OxOOBBGGRR dove RR è la quantità di rosso, GG - è la quantità
di verde e BB - quella di blu.
L'uso dei colori diviene molto importante nel momento in cui
dobbiamo scrivere del codice per gli indicatori (distinguere le
linee e forme e separarle dalle altre pre-esistenti è
importante) o dagli oggetti che inseriremo sul grafico (ad
esempio il saldo settimanale o giornaliero: rosso se negativo e
oro se in guadagno).

Pagina 25
Danesi - Guida dì riferimento al linguaggio MQ_L

Di seguito si inserisce un immagine con la descrizione dei


colori "Web" il cui nome è una costante che richiama il valore
della combinazione RGB.

Il nome scritto in ogni casella della tabella rappresenta la


costante enumerativa con la quale richiamare il colore web.

Pagina 26
Dainesj - Guida di riferimento o MQL

Pagina 27
Dainesi - Guida di riferimento al linguaggio A1QL

Valori Literals

Le variabili di tipo literals sono rappresentate da qualsiasi


carattere singolo racchiuso tra singoli apici o un codice ASCII
esadecimale di un relativo carattere come \x10'. Alcuni
caratteri come il singolo apice ('), doppio apice (") il punto
interrogativo (?), un back slash (\) ed I caratteri di controllo
possono essere rappresentati come una combinazione di più
caratteri, tutti inizianti con un back slash (\) in accordo con la
lista seguente:

line feed NL (LF) \n


horizontal tab HT \t
carnose return CR \r
reverse slash \ \\
single quote 'V
doublé quote " \"
hexadedmal ASCII-code hh \xhh

Se si usa un carattere diverso da quelli presenti nella


precedente lista il risultato sarà imprevedìbile.

Es:
a = 'A';
int b = '$';
int C = '©' ; // code OxA9
int d = '\xAE'; // symbol code ®

Dichiarazione ed inizializzazione delle variabili

Prima di poter essere utilizzata una variabile deve essere


dichiarata. Come anticipato nelle pagine precedenti una
variabile può essere dichiarata ed inizializzata
contemporaneamente se necessario. E' questo il caso quando
si utilizza una variabile intera di comodo per passare in
rassegna gli ordini aperti.

Pagina 28
Dainesi - Guida di riferimento al linguaggio MQf.

forfint i - 0;i<OrdersTotal () ;i++)


{ • .- }

//La funzione nativa OrdersTotal ritorna il numero di ordini


"att ivi"
//il doppio più dopo la i indica un incremento di uno al valore
//Le parentesi graffe delimitano un blocco di istruzioni
indi visibili

Oppure possono essere dichiarate ed utilizzate direttamente


sfruttando il loro valore di dafault che è Zero per i valori
numerici o assimilabili e testo nullo per le stringhe di testo e
il 1 gennaio 1970 per le date8.
Le variabili booleane sono assimilabile alle variabili numeriche
e quindi sono inizializzate a zero.
Inoltre, variabili dello stesso tipo possono essere dichiarate
sulla stessa linea per brevità.

doublé dLast, dMax, dMin;


color cBrillant, cMatt, CDark;
datetime dtToday, dtYesterDay;

Per rendere più "leggibile" il codice è sempre meglio dotare i


nomi delle variabili di un suffisso che ne suggerisca la natura:

i per variabili intere (es. iBarra, iPunti)


d per variabili doublé (es. dOpenQuote, dLastLoss)
e per variabili color (es. cDark, cLightBlue)
b per variabili booleane (es. bCloseOnFriday, bStopAndReverse)
s per variabili di testo (es. sMsg, sComment)
dt per variabili datetime (es. dtOpenOrder, dtCloseOrder)

8
Anche il tipo daletìme può ric< nsursi ad un tipo numerico in quanto fonda il suo valore sul numero di secondi
dal 1° gennaio 1970 e quindi il i alore di default di zero rappresenterà la mezzanotte del 31 dicembre 1969.
Pagina 29
Dainesi - Guida di riferimento al /jnguaggio MQL

Questa consuetudine è famosa con il nome di "notazione


ungherese" in quanto il suo inventore, Charles Simonyi, era
ungherese.

Nella notazione ungara, un nome di variabile inizia con un


prefisso costituito da una o più lettere minuscole in modo da
formare un codice mnemonico per il tipo o lo scopo di questa
variabile. Il prefisso è seguito dal nome scelto dal
programmatore. Quest'ultima parte è spesso indicata come il
"nome assegnato".

Il primo carattere del nome assegnato è in maiuscolo per


separarlo visivamente dal prefisso.

Per migliorare ulteriormente la leggibilità del codice e la


comprensione del contenuto delle variabili si è soliti utilizzare
un'ulteriore tecnica, in aggiunta alla notazione ungherese,
nota col nome di "Carne/Case".

/( Carne/Case è la pratica di scrìvere parole composte o frasi


unendo tutte le parole tra loro, ma lasciando le loro iniziali
maiuscole. Il nome (letteralmente "carattere a cammello")
deriva dai "salti" all'interno di una parola, che fanno venire in
mente le gobbe di un cammello. La prima lettera può essere
sia maiuscola (es. Carne/Case), come il nome delle classi in
Java, che minuscola (es. camelCase), come le proprietà di un
oggetto in Java. Nel caso di prima lettera maiuscola si parla
anche di Pascal Case, dato che questa nomenclatura ha
origine dal Pascal.

Il CamelCase è stata la prima convenzione usata dai wiki per


la creazione dei wikilink: l'idea è che è immediato per un
sistema automatico riconoscere questo tipo di parole e
Pagina 30
Dainesi - Guida di riferimento al (inguaggio MQL

convenirle in un collegamento. Il problema legato alla


necessità di avere sempre almeno due parole per comporre
un link ha in seguito portato all'uso della convenzione tra
doppie quadre [[ ]].
L'uso di una simile pratica è però molto anteriore:
tralasciando i cognomi come McCartney, alcuni esempi degli
anni cinquanta come Cinemascope, o addirittura il nome
stesso della azienda di Redmond, Microsoft, il CamelCase è
diventato relativamente comune tra i programmatori durante
gli anni settanta, per usare più parole per una variabile o un
nome di programma mantenendo la leggibilità.

(tratto da Wikìpedia)

Pagina 31
Daìnesì - Guida di riferimento al (inguasgìo MQL

Gli Array

Uno speciale tipo di variabili sono gli array, owero dei vettori
o contenitori ordinati di variabili elementari.
Un array può essere monodimensionale o multidimensionale.
Se pensiamo ad una lista di valori questo sarà un array
monodimensionale. Se pensiamo invece ad un elenco dei
quattro valori delle barre di prezzo avremo un array bi-
dimensionale (la prima dimensione è il numero della barra
mentre la seconda è il valore).

Array Monodimensionale di 7 elementi

34 23 21 19 76 2 17

Array Bidimensionale di 7 elementi per 2

64 3 2 19 17 1 72
34 23 21 19 76 2 17

Per raffigurare meglio cosa sia


un array pensate ad un
contenitore di uova che potete
trovare tra gli scaffali di un
supermercato. La classica
confezione è da sei uova
formata da due file parallele
da tre. Questo contenitore
potrebbe essere definito un
array bidimensionale la cui
prima dimensione è 3 mentre la seconda è 2.

Pagina 32
Dainesj - Guida di riferimento al linguaggio MQL

Gli array vengono dichiarati esattamente come una variabile


normale a parte il fatto che alla destra del nome si attacca
una coppia di parentesi quadre quante sono le dimensioni.

<Tipo> NomeArray[Prima dìmensione][Seconda dimensione];

Se le dimensioni sono note all'atto della dichiarazione queste


saranno inserite all'interno delle parentesi graffe, altrimenti
si passerà al dimensionamento dinamico, ovvero nel corso del
programma attraverso la funzione ArrayResize

doublé dPrezzi[50] [4] ;


int IDailyPoints [];

//Ridimensionamento dell'array
ArrayResize(iDailyPoìnts,7);

E' importante notare che tutti gli array hanno come indice
iniziale lo zero e non il numero uno cosicché per impostare o
recuperare il primo valore di un array monodimensionale si
utilizzerà l'indice zero.

i D a i l y P o i n t s t d ] = 50;

int B;
B = iDailyPoints[0];

Le funzioni di manipolazione degli array sono le seguenti:


ArrayBsearch Ritorna l'indice dell'elemento più simile a
quello ricercato.
ArrayCopy Copia il contenuto di un array in un altro.
ArrayCopyRates Copia le quotazioni rappresentate nel sraficoin
un array.
ArrayCopySeries Copia un array contenente una serie (ad
esempio le quotazioni) da un array ad un altro.
ArrayDimension Ritorna la dimensione dell'array.
ArrayGetAsSeries Ritorna True se t'array è un array di serie dati.

Pagina 33
Dainesi • Guida di riferimento ai linguaggio AtQ/.

Arraylnitialize Inizializza tutti gli etementi dell'array ad un


dato valore.
ArraylsSeries Ritorna True se l'array passato contiene una
serie dati.
ArrayMaximum Ritorna l'indice dell'elemento dal valore più
alto.
ArrayMimmum Ritorna l'indice dell'elemento con il valore più
basso.
ArrayRange Ritorna il numero di elementi contenuti nella
dimensione passata dell'array.
ArrayResize Ridimensiona l'array.
ArraySetAsSeries Reimposta gli indici dell'array come quelli di
una serie dati, ovvero l'ultimo elemento ha
indice 0.
ArraySize Ritorna il numero di elementi nell'array.
ArraySort Riordina l'array utilizzando la prima
dimensione (non si applica agli array di serie
dati).

Gli array di serie dati sono array contenenti elementi che a


loro volta hanno più valori come le candele dei prezzi le quali
ognuna memorizza i valori per High, Low, Open, Close,
Volume e Time.

Le Costanti

Le costanti sono come le variabili ma rispetto ad esse non


hanno facoltà di cambiar valore durante l'esecuzione del
programma. Lo spazio di memoria viene ottimizzato in virtù
della loro immutabilità.

Per dichiarare una costante occorre utilizzare l'operatore di


precompilazione #define seguito dal nome della costante e
dal suo valore.
ftdefine NomeCostante VatoreCostante;

II simbolo cancelletto ("#") indica una riga di codice


contenente una direttiva di precompilazione, ovvero che deve
essere analizzata dal compilatore prima della generazione del
file ex4. Queste direttive servono per unire più file, includere
i collegamenti a librerie esterne o, come in questo caso, per
fissare i valori delle costanti.
Pagina 34
Dajnesi - Guida di riferimento al (inguaggio MQ/.

tdefine WEBSITE "http://www.sdstudioaainesi.com";


tdefine GMT -1;
#define DEFAULT COLOR Blue;

Sintassi generale

In questi paragrafi verranno spiegati dei concetti che saranno


approfonditi in un secondo momento. La loro introduzione si
rende però necessaria per permettere al lettore di
comprendere meglio gli esempi esposti.

Definizione di istruzione

II codice MQL è composto da istruzioni. Ogni istruzione


rappresenta un calcolo, un assegnazione, un confronto od un
analisi di flusso. Ogni istruzione è un blocco di codice a sé
stante che include un azione completa. Ogni istruzione è
chiusa con (si completa con) un punto e virgola.

Idefine WEBSITE "http://www.sdstudiodainesi.com";


Lnt A = 100;
i f ( A > B ) r e s u l t = false;

Blocchi

Spesso è necessario che più istruzioni siano parte di un blocco


di istruzioni indivisibili, delimitano il loro codice da parentesi
graffe9. E' questo il caso del corpo delle funzioni così come

' Se la tastiera non riporta il relativo simbolo è possibile richiamarlo tramite la combinai editastÌAlt+123perla
graffa dì apertura e Alt+125 per quella di chiusura.
Pagina 35
Doìnesi • Guido di riferimento al linguaggio MQJ.

del gruppo di azioni da compiere in base ad algoritmi


predefiniti.

void S t a r t ( )
{
A-B;
OF;
H-A/2;

if (Period()==15)

C=F;
H-A/2;

Commenti

Per inserire un commento si possono utilizzare due metodi a


seconda che si voglia inserire una sola riga di commento o un
intero blocco di righe.

Il simbolo // inizia una riga di commento.


I simboli /* e */ iniziano e terminano un blocco di commenti.

// Questo commento è equivalente al prossimo

Questo commento è equivalente al precedente

Le funzioni

Le funzioni sono blocchi di codice che accettano dei


parametri e possono ritornare un valore. In realtà possono
anche non avere parametri e non ritornare nulla ma svolgere
alcuni compiti come la chiusura di tutti gli ordini pendenti o

Pagina 36
Dainesi ~ Guida di riferimento al linguaggio MQL

l'invio per posta elettronica di tutti i risultati della giornata,


ad esempio.

Partendo dalla sintassi generale possiamo dire che una


funzione è formata dal nome della funzione, un elenco di
parametri e un tipo di dato di ritorno.

//Funzione generica
int OrdiniAperti(int Tipo, string strumento)

return ( ... ) ;

II corpo della funzione è racchiuso tra due parentesi graffe


che la delimitano. Il modo per restituire un valore è
attraverso la funzione nativa return che vuole come
argomento proprio il valore di ritorno.
La funzione return termina immediatamente l'esecuzione del
codice all'interno della funzione in cui è posta.

Parametri

Ogni funzione può accettare uno o più parametri il cui valore


può essere preimpostato dando modo di renderne opzionale
l'inserimento in fase di chiamata.
Naturalmente i parametri il cui valore viene omesso devono
essere quelli più a destra nell'elenco.

// Funzione con tre parametri e suo utilizzo

SwapRate=0)

doublé donare = costoTrade 10.10, 10, 0.0275);

// Funzione con tre parametri con valori predefinìti e suo


utilizzo
int CostoTrade (doublé Lotti, doublé Commissione = 10, doublé
SwapRate = 0.03)

Pagina 37
Dainesi - Guida di riferimento al linguaggio MQ}.

//Il parametro mancante (SwapRatel avrà il valore di default


doublé donere = CostoTrade (0.10, 10);

//I parametri mancanti avranno i valori di default


doublé donere = CostoTrade (0.10, 10);

//II parametro mancante in questo caso viene equivocato ! ! !


doublé donere = CostoTrade (0.10, 0.018);

Da notare che dopo un parametro dotato di valore di default


tutti i rimanenti parametri alla sua destra devono esser
anch'essi dotati di valore di default.

Passaggio dei parametri per valore

Se non diversamente specificato tutti i parametri di una


funzione sono passati per valore, il che significa che se
all'interno della funzione i loro valori vengono modificati
nulla accade al valore della variabile della routine
"chiamante".

Un esempio vale più di cento parole:

int A = 10;
int B = Quadrato(A);
PrintC'A = " + A + " e B = " + B);
/*
L'output sarà "A = 10 e B = 100"
Nonostante A sia stata modificata ali'interno della funzione

//Funzione
int Quadrato(int Base)
{
Base = Base*Base;
return(Base);

Pagina 38
udinesi - Guida dì riferimento al linguaggio MQJ.

Passaggio dei parametri per riferimento

Se un solo valore di ritorno non è sufficiente o si desidera


maggiore flessibilità alle proprie funzioni è possibile passare
un "puntatore" alla variabile che funge da parametro. In
questo modo se il parametro dovesse subire delle modifiche
all'interno della funzione, queste saranno riportate anche sul
valore della variabile utilizzata dalla routine "chiamante".

int A = 10;
int B = Quadrato(A);

L'output sarà "A = 100 e B = 100"


*/

//Funzione
int Quadrato(int& Base)
1
Base = Base*Base;
return(Base!;

Da notare che per dichiarare un parametro per riferimento


occorre far seguire il tipo dell'argomento dal simbolo & (e
commerciale). Questo semplice simbolo indica al compilatore
che il valore non va copiato ma piuttosto viene utilizzato
l'indirizzo di memoria di dove risiede la variabile originale e
questa la ragione per cui le eventuali modifiche si riflettono
subito.

Naturalmente i parametri per riferimento non possono avere


valori di default e prima di essi non possono esserci parametri
per valore con valori di default.

Pagina 39
Dajnesi - Guida di riferimento al lin$uas$io MQL

Le routine

Le routine sono essenzialmente delle funzioni che non


ritornano alcun valore poiché il loro scopo è quello di
compiere delle azioni e non quello di ritornare un valore.
Sono routine, ad esempio, l'applicazione del trailing stop così
come la scrittura di un log.
La sintassi è identica a quella utilizzaa per le funzioni con
l'unica differenza che il tipo di dati restituito è un tipo
particolare chiamato void, ovvero un valore vuoto.

Funzione
«tipo di ritorno NomeFunzione(<tipo1 argJ>, <tipo2 arg2>,...)

Routine
void NomeRoutine(<tipo1 arg1>, <tipo2 arg2>, ...)

Naturalmente anche qui valgono le stesse argomentazioni al


riguardo della metodologia di passaggio dei parametri: per
valore o per riferimento. Stesso discorso per quanto riguarda
l'inserimento di valori di default.

Funzioni "scheletro"

Ogni applicazione scritta in MQ.L è composta da alcune


funzioni essenziali ed eventualmente da alcune funzioni
utente.
Lo scheletro di un trading System (e di un indicatore) è
costituito da tre funzioni particolari che racchiudono il
"cuore" del codice:

Init

La funzione Init è utilizzata da MetaTrader per compiere quei


controlli preliminari necessari per eseguire correttamente il
trading System o l'indicatore. Generalmente si sfrutta questa
Pagina 40
Dainesi - Guida di riferimento al lin$uassio MQL

funzione per ripulire lo schermo, normalizzare il valore delle


variabili, determinare le convenzioni adottate dal broker
(valore del punto o Pip, livelli di distanza minima tra prezzo
corrente e prezzo di un ordine condizionato, ecc...). La
funzione Init viene eseguita una sola volta per sessione di
lavoro del trading System/indicatore. Più precisamente viene
eseguita nei seguenti casi:

•/ Viene trascinato sul grafico l'ExpertAdvisor/Indicatore e


si accettano/modificano le impostazioni (i trading
System devono altresì essere attivati)
</ Vengono modificati dei parametri tramite l'apposita
casella della finestra di dialogo Proprietà
J Viene modificato il codice sorgente e successivamente
ricompilato.
•/ Viene lanciata l'applicazione MetaTrader

Deinit

Questa funzione viene utilizzata per compiere delle azioni alla


fine dell'utilizzo del trading System/indicatore.
Generalmente ha un uso diffuso nel codice degli indicatori ove
viene utilizzato per "ripulire" le finestre grafico da tutti gli
oggetti disegnati sopra di esso (frecce, pallini, testo, ecc..).
E' anche utile, specie per l'uso nei backtest, per riasumere le
informazioni di gestione (ad esempio scrivere su file a video la
somma dei profitti e perdite delle operazioni compiute
durante il backtest).

Start

La funzione start è la più importante di tutte in quanto


contiene il codice che viene eseguito ogni volta che:

Pagina 41
Dainesi - Guida di riferimento ot linguaggio MQÌ-

S Accade uno scambio (un trade)


^ SI modifica uno dei valori del grafico (Bid, Ask)
•/ Inizia una nuova barra

In questa funzione, fulcro dell'applicazione, sono contenute


tutte le azioni che compongono l'algoritmo del trading
System/indicatore.
Dall'interno della funzione start, init e deinit è possibile
richiamare altre funzioni e routine create dall'utente.

Funzioni native

Per richiamare una routine è sufficiente utilizzare il suo


nome, aprire una parentesi, inserire i parametri richiesti
separandoli l'un l'altro da una virgola, chiudere la parentesi
ed inserire un punto e virgola per terminare l'istruzione.
Una funzione, restituendo un valore, sarà inserita a destra di
un simbolo di assegnazione oppure come elemento all'interno
di un espressione in quanto essa verrà sostituita con il suo
valore di ritorno.

//Routine
ClassicTrailingStop(30,25);

//Funzioni
int a ;
a = OrdiniPendenti();

int b = (a + OrdiniPendenti())/e;

MQL dispone di un nutrito insieme di routine e funzioni native


in grado di rispondere a molte esigenze del programmatore.
La presenza di queste funzioni "interne" evita di dover
reinventare la ruota rendendo la creazione di un programma
un processo più rapido ed efficiente.

Pagina 42
Dainesi - Guida di riferimento al linsuassio MQL

Le funzioni native possiamo suddividerle per aree di


applicazione:

^ Account
^ Array
^ Funzioni di uso comune
^ Funzioni di Conversione
S Funzione per la gestione degli indicatori personalizzati
^ Date e orari
^ Funzioni di gestione dei File
^ Funzioni di gestione delle variabili Globali
^ Funzioni Matematiche e Trigonometriche
S Funzioni di manipolazione degli Oggetti
^ Variabili predefinite
^ Funzioni di manipolazione delle stringhe
•/ Indicatori di analisi tecnica
^ Funzioni di interrogazione delle serie temporali
•/ Funzioni di Trading
S Funzioni di gestione delle finestre

All'interno di ognuna di queste aree verranno analizzate le


singole funzioni e se le stesse presenteranno delle insidie
queste verranno spiegate così come il metodo per aggirarle e
risolverle.

Nom; delle variabili e funzioni

Come già anticipato nei capitoli precedenti, i nomi che


identificano le variabili o le funzioni utente possono
contenere numeri o lettere ma non devono esser più lunghi di
31 caratteri.
I numeri ammessi sono 0-9, le lettere a-z, A-Z, il simbolo di
sottolineatura (_). Il primo carattere non può essere un
numero ne il carattere di sottolineatura. Il nome non deve
inoltre coincidere con il nome di una parola riservata del
linguaggio (token).

Pagina 43
Daìnesi - Guida di riferimento al linguaggio MQL.

Parole riservate (token)

L'elenco seguente contiene I token del linguaggio. Parole


riservate dedicate a descrittori di flusso, dichiaratori,
costruttori di MQL.

bool doublé return


break else static
case extern stn'ng
colar false switch
contìnue <f true
datetime int void
default far while

Pagina 44
Dainesi - Guida di riferimento al linguaggio MQL

Operatori ed espressioni

In MQL ogni istruzione termina con un punto e virgola (;). Un


istruzione è una dichiarazione, un assegnazione, un azione o
un controllo di flusso. Ogni istruzione può essere scritta su più
righe.

Incremento e decremento

Le operazioni aritmetiche avvengono utilizzando gli operatori


appositi e, in virtù del fatto che MQL deriva dal linguaggio C,
l'incremento o il decremento avviene con l'utilizzo del doppio
più (++) o del doppio meno (--). Queste operazioni non
possono però avvenire all'interno di istruzioni complesse,
nelle quali quindi avvengono già altre assegnazioni od
operazioni.
Pagina 45
Dainesi - Guida di riferimento al tinsua$$io MQf.

II Somma
i = j + 2;

//Sottrazione
i = j - 3;

//Cambio di segno

//Prodotto
z = 3 * x;

//Divisione
i = j / 5;

//Resto (per il calcolo del modulo si usi la funzione MathModO


minutes = time % 60;

//Incremento di 1

//Decremento di 1
k— ;

//Espressione valida
g+ + ;

//Espressione sbagliata
C = d * (h — )+ 2;

Operazioni dì assegnazione

Le operazioni di assegnazione determinano il valore di una


variabile tramite la soluzione di un espressione posta a destra
dell'operatore di assegnazione {=).

Assegnazione semplice y equivale a x


Assegnazione per addizione y vale y più x
Assegnazione per sottrazione y vale y meno x
Assegnazione per moltiplica y vale y per x
Assegnazione per divisione y vale y diviso x
Assegnazione per divisione intera y %= x; y vale la parte
intera di y diviso x ed il

dell'operatore y
Spostamento logico di bit a dx y »= x; Solo per binari sotto le
cinque digitazioni
Spostamento logico di bit a sx y «= x;

Pagina 46
Daìnesi - Guida di riferimento al linguaggio MQL

Maschera di bit AND Solo su numeri interi


Maschera di bit OR
Maschera di bit OR esclusivo

Operazioni di confronto

Come anticipato ad inizio capitolo, il valore logico false viene


rappresentato dal valore zero mentre qualsiasi altro valore
assume il significato di true.
Ogni operazione di confronto presuppone un risultato
booleano per definire l'eguaglianza o differenza dei due valori
confrontati.
L'operatore di confronto per verificare l'uguaglianza è
rappresentato da un doppio uguale (==), da non confondere
con l'operatore di assegnazione che invece è un singolo
uguale.

True se a uguale a b a k• ugua e a


True se a NOH è uguale a ta a != b; dive so da
True se a è minore di b a < b; mino e di
True se a è maggiore di b a > b; magg ore di
True se a è minore o uguale di b a <= b; mino e/uguale a
True se a è maggiore o uguale a b a >= b; magg ore/uguale a

Operatori Booleani

L'operatore di negazione NOT (!) restituisce true o false a


seconda che la variabile o la funzione a cui è anteposto valga
O o qualsiasi altro valore.

// True se è false.
lf(la)
print("non ' a ' " ) ;

Pagina 47
Dainesi - Guido di riferimento al linguaggio MQL.

L'operatore logico OR ( 1 1 ) restituisce true solo se almeno una


delle due espressioni coinvolte non vale zero.

if fx<k I I x>l)
Print("fuori dalla fascia di pertinenza");

L'operatore logico AND (Et&) ritorna true solo e solo se


entrambe le due espressioni sono vere (ovvero non zero).

i f ( p ! = K SS p>yl
PrintC'true") ;

Operazioni di spostamento di bit (o BitWise)

Ogni valore viene rappresentato, a livello binario, come una


sequenza di 1 e 0. Ógni singolo bit assume quindi un valore
pari a vero (1) o falso (0). Il processo di carica e scarica porta
il nome di "ciclo di isteresi"10. Ogni variabile, in virtù della
quantità di memoria preallocata, è rappresentata in memoria
con una serie dì bit i cui valori sono 1 o O a seconda del valore
che devono memorizzare (va da sé che più è alto il numero di
bit disponibili e più ampio sarà il range di valori
rappresentabili).

Le operazioni di bitwise agiscono sui valori delle variabili


manipolando i bit che le rappresentano.
Lo spostamento verso destra o verso sinistra dei valori dei
singoli bit che compongono la "maschera" di memorizzazione
della variabile vengono ottenuti con gli operati » e «.

10
La memorizzazione è un processo fisico che consiste nella magnetizzazione o smagnetizzazione di un particolare
elemento. Il singolo bit altro non è che una celletta di silicio che subisce questo processo definito per l'appunto ciclo di
isteresi.
Pagina 48
Dainesr - Guida di riferimento al linguaggio MQf.

L'inversione di valore dei singoli bit avviene invece con


l'operatore unario ~.
Le operazioni logiche sui bit sono invece il confronto dei
singoli bit di due variabili ed il risultato è dato dal confronto
bit a bit. In MQL le operazioni di confronto sui bit sono
possibili solo sui tipi integer.

Sostituzione del valore dei bit con il loro opposto: dove è 1 diventa O
viceversa

Spostamento a destra di y posizioni dei bit del valore di x. Gli spazi a


sinistra sono riempiti di O

/*
Spostamento a sinistra di y posizioni dei bit del valore di x. Gli spazi

*/
x = x « y;

/*
Nell'operazione AND binaria i bit il cui valore è in entrambe le
variabili 1 vengono riportati come 1 mentre i bit discordanti o entrambi
a O vengono tradotti con O
*/
b = ((x & yì !=0);

Nell'operazione OR binaria i bit il cui valore è in entrambe le variabili

tradotti con O
V
b = x | y;

Nell'operazione EXCLUSIVE OR binaria i bit il cui valore è discordante


vengono riportati come 1 mentre i gli altri bit vengono tradotti con O
*/
Example:
b = x " y;

Pagina 49
Dainesi - Guida di riferimento al linguaggio MQ/.

Operazioni di indicizzazione

Operando con gli array (o matrici) bisogna ricordare che in


MQL (così come nella maggioranza dei linguaggi di
programmazione) l'indice degli elementi dell'insieme parte
dalla posizione 0. Quindi un array monodimensionale di 10
elementi avrà il primo elemento in indice O e l'ultimo con
indice 9.
E' inoltre importante ricordarsi che qualora un elemento
dell'array dovesse venire meno per una cancellazione (non
azzeramento del valore ma proprio per l'eliminazione
dell'elemento i-esimo) l'ordinale di tutti gli elementi
rimanenti verebbe aggiornato.
Questa riflessione vuole essere un avvertimento quando si
gestiscono gli ordini in portafoglio e nel processo di gestione è
inclusa la chiusura o cancellazione.

Resole di precedenza tra operatori

Nella scrittura delle espressioni occorre prestare attenzione


alla precedenza che alcuni operatori hanno su altri per far si
che il risultato voluto sia effettivamente quello ottenuto.

() Funzioni (chiamate di funzione)


[] Array, selezione degli elementi
! Negazione
Bitwise negazione
Cambio di segno
* Multiplicazione (da sx a dx)
/ Divisione
% Modulo
+ Addizione (da sx a dx)
Sottrazione
Spostamento a sx (da sx a dx)
Spostamento a dx
Minore di (da sx a dx)
Minore o uguale a
Maggiore di
Maggiore o uguale a

Pagina 50
Dainesi - Guida di riferimento al /inguaggjo MQf.

Uguale
!= Diverso
a Bitwise AND (da sx a dx)
Bitwlse exclusive OR (da sx a dx)
| Bitwise OR (da sx a dx)
aa AND logico (da sx a dx)
11 OR logico (da sx a dx)
Assegnamento (da dx a sx)
+= Assegnamento addizione
Assegnamento per sottrazione
*= Assegnamento per moltiplicazione
/= Assegnamento per divisione
%= Assegnamento per modulo
»= Assegnamento per spostamento a dx
«= Assegnamento per spostamento a sx
a= Assegnamento per bitwise AND
|= Assegnamento per bitwise OR
A
= Assegnamento per exclusive OR
, Virgola (da sx a dx)

Usare le parentesi per variare le precedenze degli operatori.

//Le seguenti due espressioni sembrano equivalenti ma ottengono risultati


differenti
a = 3 + 4 * 2;

b - (3 + 4) * 2;

//Nella prima si ottine 11 mentre nella seconda 14

Pagina 51
Dainesì - Guida di riferimento al (inguaio MQ}_

Struttura del codice

Formato delle istruzioni e annidamento

La scrittura del codice prevede che ogni istruzione debba


terminare con un punto e virgola (;) ma non pone limiti sul
numero di righe che occupa (potremmo anche scrivere due
istruzioni sulla stessa linea).
Per rendere più leggibile il codice è spesso necessario
suddividere le istruzioni in più linee. Ciò non di meno è
possibile inserire istruzioni all'interno di altre istruzioni:
questo procedimento è chiamato annidamento e lo si trova

Pagina 53
Dainesi - Guido dì riferimento al (inguaggio MQ/.

all'interno delle istruzioni che comprendono if, if-else,


switch, while e for.

Blocchi

Un blocco è definito come un insieme di istruzioni racchiusi


insieme tramite due parentesi graffe Q.
Le singole istruzioni devono terminare con un punto e virgola
ma non l'istruzione di blocco che in realtà è solo un
delimitatore di insieme. I blocchi sono molto utili quando, a
seguito di un confronto, si voglia eseguire un elenco di
istruzioni alternative. Al posto di verificare ogni volta il
confronto e successivamente eseguire l'istruzione, si esegue
una sola volta il confronto e successivamente si eseguono
tutte le istruzioni necessarie derivate.
Per maggior chiarezza visiva è buona norma identare il
contenuto di ogni blocco.

"1; Y-2; z-3;

Inizializzazione delle variabili

Per assegnare un valore ad una variabile si usa l'operatore di


assegnamento che viene rappresentato da un singolo segno di
uguale (=). Da non confondere con il doppio segno di uguale
che invece rappresenta il confronto (==).

Variabile = expression;

X = 3;
string sMsg = "Questo è un commento";

Pagina 54
Dainesi - Guida di riferimento al (inguaggio

All'interno di un istruzione è possibile utilizzare il segno di


assegnamento una sola volta.
In fase di dichiarazione una variabile viene inizializzata ad un
valore di partenza" che per i dati numerici equivale a O
mentre per quelli string è pari ad una stringa vuota, mentre
per le date è il valore del 1° gennaio 1970. In alternativa è
possibile assegnare un valore alla variabile nella stessa
istruzione di dichiarazione tramite l'operatore di
assegnamento come mostrato nell'esempio e nei capitoli
precedenti.

Chiamate a funzione

Ogni funzione ed ogni metodo devono essere chiamate


includendo le parentesi anche se non possiedono argomenti.

Function_name(argument1,..., argumentN);

tnt a = Periodo ;
int b = TrailingStoptOrderTicket(},40,20);

Refreshorders();

Operatore condizionale IF

L'operatore condizionale per eccellenza è rappresentato dal


costrutto if che esegue un istruzione se la condizione, oggetto
di verifica, risulta essere vera.

if (espressione da verificore)
istruzione se vero;

Se l'espressione è falsa il controllo passa oltre, a meno che,


dopo il blocco di istruzioni "se vero", si inserisce il taken else.
In quest'ultimo caso è possibile inserire un istruzione o un

Pagina 55
Dainesi - Guida di riferimento al (inguags'o AiQ/.

blocco di istruzioni da eseguire in caso di "se falso". Spesso si


annidano più cicli if quale conseguenza dei cicli superiori.

//if singolo
if(a==x)
temp*=3;

//if else
if(a>b)
e - 1;
else
C - 2;

//Esempio di if annidato
if(a>b)
if(d<e)
c=l;
else
c-3;
else
c=2;

Switch

Quando occorre eseguire un istruzione differente a seconda


che una variabile (o un espressione) assuma un valore
predefinito si utilizza l'operatore switch.

switch (espressione)
{
case constanti: istruzioni; break;
case constant2: istruzioni; break;

default: istruzioni; break;

II valore dell'espressione da valutare viene confrontata con un


elenco di costanti. Se c'è corrispondenza verranno eseguite le
istruzioni associate e le successive (a meno che non si
interrompa il flusso con l'operatore break). I valori riportati
dai token case rappresentano una coincidenza di valore
mentre il taken default rappresenta il blocco di istruzioni da
eseguire se nessuna corrispondenza è stata trovata.
Pagina 56
Dainesi - Guida di riferimento al linguaggio MQL

Attenzione che se non si inserisce break alla fine del blocco di


istruzioni legate alla corrispondenza, l'esecuzione si
trasferisce al controllo successivo.

switch(x)
(
case 'A' :
Print("CASE A \ n " ) ;
break;
case ' B ' :
case ' C ' :
PrintC'CASE B or C \ n " ) ;
break;
default:
PrintC'NOT A, B or C \ n " ì ;
break;

while

while (expressìon)
operator;

Nel ciclo while mentre l'espressione di controllo è vera (true)


l'istruzione (o blocco di istruzioni) viene eseguita. Il ciclo si
interrompe solo quando l'espressione di controllo risulta falsa
o viene utilizzata l'istruzione di uscita incondizionata break.

Ciclo iterattivo far

far (espressione 1; espressione^; espressione.?,)


operator;

Pagina 57
Dainesi - Guida di riferimento al (inguaggio MQL

vista anche così:

for(valore intero di partenza, fintante che questa condizione


è vera, passo del ciclo)
(Istruzioni)

L'espressione 1 identifica l'inizio del ciclo basato su una


variabile di iterazione, owero ci si basa sul valore assunto da
una variabile di tipo intero.
L'espressione 2 indica una condizione che deve risultare vera
affinchè il ciclo continui. L'espressione 3 indica invece il
passo del ciclo, ovvero l'incremento o decremento che la
variabile di controllo subisce ad ogni ciclo eseguito.
Il ciclo for viene usato molto per "ciclare" l'insieme degli
ordini.

//Variabile di controllo
int i;

for(i=0;i<OrdersTotal{) ;i++)
(
Orderselect(i,SELECT_BY_POS);
if (OrderSymbol() == SymtaolO &S OrderMagicNumber(] — MagicNumber)
(
//fa qualcosa con l'ordine selezionato;

Ognuna delle tre espressioni dell'operatore for può essere


omessa ma deve comunque essere inserito il punto e virgola di
separazione (;) per dar modo al compilatore di interpretare
l'algoritmo di iterazione (ogni espressione mancante viene
interpretata come vera).

Il ciclo for è un ciclo continuo come il ciclo while. Mentre nel


ciclo for si fa uso di una variabile di controllo e di una
espressione di controllo nel ciclo while ci si basa solo
sull'espressione di controllo.

Pagina 58
Dainesi - Guida di riferimento al /inguasgio MQJ.

Break

L'operatore break termina l'esecuzione di un ciclo. Se siamo


in presenza di cicli annidati break termina il ciclo in
esecuzione ed il controllo passa all'istruzione successiva. Lo
scopo di questo operatore è quello di interrompere cicli
infiniti o abbreviare i cicli di controllo una volta che si è
trovata la condizione cercata.

// Ricerca di una posizione in guadagno


bool bProfit;

OrderSelect (i, SELECT_BY_POS) ;


if (orderProfit O >0)
bprofit=true;
break ;

Continue

L'operatore continue riporta il controllo al successivo


elemento di un ciclo. La finalità è opposta a quella
dell'operatore break.

// somma degli elementi diversi da zero


int fune(int a r r a y [ ] )
(
int array_size=ArraySìze(array);
int sum=0;
for(int i=0;i<array_size; i++)

if ( a [ i ] « = 0 ) continue;
sum+=a[i];
}
return(suro);

Pagina 59
Damesi - Guida di riferimento al linguaggio MQL

Return

L'operatore return termina l'esecuzione di una funzione o


metodo restituendo il valore in argomento, restituendo il
controllo all'istruzione chiamante.
Il valore in argomento pari a zero viene spesso utilizzato come
terminazione forzata della funzione.

doublé FunzioneA(int a, ìnt b)

if(b==0)return(O) ;
return(a/b) ;

Pagina 60
Daìnesi - Guida di riferimento al linsuasgio MQL

Funzioni

Definizione di funzione

Una funzione è un blocco di codice che viene invocato da una


alto punto del programma e può restituire un valore così
come può accettare dei parametri. Solitamente si definisce
funzione quando il blocco di codice restituisce un valore
mentre si parlerà di metodo (o routine) quando non ci sono
valori restituiti.

type NomeFunzione([type[s] NomeVariabile,][ type[s] NomeVariabile,]..)

return (valore di ritorno),-

Pagina 61
Dainesi - Guida di riferimento al (inguoggio MQJ.

La dichiarazione di funzione inizia con la dichiarazione del


tipo restituito, ovvero con il tipo di dati che viene reso dalla
funzione.
Rispetto ai tipi conosciuti qui bisogna aggiungere il tipo void,
utilizzato per indicare che la funzione non restituisce nessun
valore ed è quindi un metodo.

//Funzione
doublé RadiceQuadrata (doublé variabile)

return{MathSqrt(variabile));

//Metodo
void TrailingStop()

//corpo del metodo

//Uso delle funzioni .. .


doublé a = RadiceQuadrata(b);
II... e dei metodi
TrailingStop O ;

Ogni funzione può avere degli argomenti, ovvero dei dati che
gli vengono passati e su cui il corpo della funzione si basa per
calcolare il valore di ritorno.
Come si è visto più sopra (nella definizione di funzione) gli
argomenti sono contenuti all'interno delle parentesi tonde
che seguono il nome della funzione. Ogni argomento è
preceduto dalla sua dichiarazione di tipo.

In MO_L (così come in qualunque linguaggio di


programmazione) il metodo predefinito di passaggio dei
parametri è "per valore", ovvero alla funzione vengono
passati dei valori che sono la copia delle variabili del codice
chiamante. All'interno del corpo della funzione questi valori
possono anche essere modificati ma nulla accade ai reali
valori della procedura chiamante.

Pagina 62
Daìnesi - Guida di riferimento al //nsuasgio MQL

Esiste un secondo modo per passare i parametri ed è chiamato


"passaggio per riferimento". In questo caso non viene passata
una copia del valore della variabile ma bensì un puntatore
allo spazio di memoria dove è memorizzata la variabile della
procedura chiamante. Se la funzione modifica il valore di
questi argomenti questi saranno modificati anche nel codice
chiamante in quanto trattasi della stessa allocazione di
memoria. Questo secondo metodo di passaggio è utilissimo
quando si vuole restituire più di un valore dall'uso di una
funzione.

//Esempio di recupero dell'assenso e dello stop per una operazione di


//acquisto
doublé SL;
if(VerificaLong(SL)™true) o r d e r S e n d ( N O N E , O , O P _ B U Y , L o t s , A s k , 3 , S L , O , " " , 0 , O ,
Green);

bool VerificaLong(doubles StopLoss)


I
bool result;
//codice

StopLoss = ... ;
return(resulti ;

Creare una funzione

Le funzioni devono essere scritte in una zona "esterna" al


codice delle funzioni "scheletro" (vedi paragrafo successivo).
Personalmente inizio a scrivere le funzioni dopo la linea che
termina la funzione start.
Per migliorare la leggibilità del codice (specie se lo si desidera
stampare o scorrere velocemente a video) è buona prassi
inserire delle linee di commento al cui interno inseriremo
solamente lineette in grado di formare un "divisorio".

Pagina 63
Dainesi - Guida di riferimento al linguaggio MQf.

//I sdTrendBB.mq4 |
//I Copyright © 2010, SD Studio Dainesi I
//I http://www.sdstudiodainesi.cora I

tproperty copyright "Copyright © 2009"


ttproperty link "http://www.sdstudiodainesi.com"

extern int SL = 25;


extern int TP = 8;

//| expert initìalization function

//I expert deinitialization function

//I expert start function


//+
int start{)

void DeleteAllOrders{)
{
//Questa funzione cancella tutti gli ordini pendenti

int i;
int total = OrdersTotal();

for(ì=0;i<total;i++)
{
OrderSelect(i,SELECT_BY_POS);
if (OrderType () >OP_SELL && OrderSynibol f ) ==Symbol ( ) &S
OrderMagicNuraber() == MagicNumber) OrderDelete(OrderTicket());

Pagina 64
Dainesi - Guida di riferimento al linguaggio MQL

E' inoltre altamente consigliato inserire un commento, subito


dopo la riga di intestazione della funzione e la sua graffa di
apertura, per descriverne lo scopo.

Speciali funzioni init(), deinit() e startQ.

In MQL ogni programma inizia con una speciale funzione di


inizializzazione denominata "init()". Questa funzione viene
eseguita ogni qualvolta un programma viene legato ad un
grafico, si cambia simbolo o timeframe del grafico, ogni volta
che viene Ravviata la piattaforma o riattivati gli expert
advisor.
Così come esiste una funzione di inizializzazione ne esiste una
di terminazione che viene eseguita ogni qualvolta un
programma termina. Questa funzione si chiama "deinitO".

La funzione deinit() viene eseguita anche quando si chiude la


piattaforma, quando si chiude un grafico, quando si cambia
strumento finanziario o si cambia timeframe. In fase di test
viene eseguita anche quando termina il backtest.

Quando le quotazioni cambiano (per via di uno scambio o


semplicemente per il cambiamento dei valori offerti o
richiesti) viene invocata automaticamente la funzione
"startO".
Se, nel mentre che la start viene processata, arrivano nuove
quotazioni queste vengono ignorate.
Negli Script la funzione start viene invece eseguita
immediatamente dopo che lo Script viene rilasciata sul grafico
tramite "drag'n'drop".

1
Pagina 65
Daìnesi - Guida di riferimento al /inguoggjo MQL

Variabili

In questo capitolo vedremo come e dove dichiarare delle


variabili, il loro ambito di visibilità (ovvero dove possono
essere utilizzate). Le differenze di tipo di dato delle variabili
lo abbiamo già visto nei capitoli precedenti, qui andremo
oltre e analizzeremo il perché è meglio dichiarare una
variabile in quel modo ed in quel punto del codice.

Dichiarazioni

Definire una variabile significa innanzitutto dichiararne il tipo


e assegnargli un valore di partenza, ovvero inizializzarla. Ogni
variabile deve essere dichiarata prima di essere utilizzata e
occorre ricordare che il compilatore legge il codice in maniera
sequenziale per cui è importante rispettare la precedenza:
prima si dichiara e poi si usa la variabile.
Per inizializzare una variabile si possono usare solamente
delle costanti (un numero o un testo è considerato una
costante mentre il valore ritornato da una funzione non lo è).
Inizializzare una variabile significa assegnargli un valore in
sede dichiarativa e non va confusa con l'assegnazione di
valore che può avvenire successivamente alla dichiarazione.

Pagina 67
Dainesi - Guida dì riferimento al linguaggio N

//Dichiarazione
int a;

//Dichiarazione e inizializzazione
int b = 3;
doublé e = PERIOD_M5;

//Dichiarazione e inizializzazione errata


int d = MathSqrt(b);

//Dichiarazione e successiva valorizzazione iniziale

e = MathSqrt(b);

Come visto nei capitoli precedenti i tipi dato principali sono i


seguenti:

> string una stringa di caratteri


> int un numero intero
> doublé un numero a virgola mobile a precisione
doppia (rispetto all'intero)
> bool un valore binario: vero (true) o falso (false).

I dati derivati sono invece i due seguenti:

> datetime rappresenta una data come numero di


secondi passati dal 1° Gennaio 1970.
> color rappresenta un colore tramite il valore
intero del suo indice all'interno di una
tabella di colori che elencano le
combinazione dei tre colori primari
componenti (codifica RGB).

I tipi di variabile derivata sono tipi principali che però


rappresentano particolari sottoformati che risultano più
comodi nel loro utilizzo (è decisamente più pratico trattare le
date come insieme di giorni, mesi ed ore piuttosto di uno
sterile numero enorme rappresentante i secondi passati dalla
mezanotte di chissà quale giorno).
Pagina 68
Dainesi - Guida di riferimento al linguaggio MQL

datetime dtStartData = D12004.01.01 00:00';


color cBullColor = C10x44,OxB9,OxE6';

Arrays

Gli array sono dei contenitori sequenziali di dati dello stesso


tipo. Questi contenitori in matematica vengono comunemente
chiamati "vettori". Gli array possono avere più dimensioni ed
in questo caso dovremo localizzare il dato tramite le sue
coordinate (una per dimensione). L'indice degli array inizia
con zero e termina con il numero di elementi contenuti meno
uno (il primo dato possiede l'indice zero sebbene sia il primo).
In MQL il limite delle dimensioni ammesse è di quattro.

Per dichiarare un array è sufficiente in fase dichiarativa


aggiungere a destra del nome della variabile una coppia di
parentesi quadre.

tipo NomeArrayn :

In fase dichiarativa è possibile indicare la/e dimensioni


dell'array oppure omettere la dimensione e definirla a
runtime.

int Operazioni []; //Array dina nico di valori interi


doublé Profitti [10] ; //Array cont inerite 10 valori di tipo doublé
doublé SetuptlO] [2]; //Array bidi nensionale di 10 Setup formati da 2
//valori

Un metodo pratico per inizializzare gli array


monodimensionali è quello di assegnare il valore degli
Pagina 69
Daìnesì - Guida di riferimento al linguaggio MQ/>

elementi tramite un insieme di valori, separati da vìrgola,


racchiusi tra parentesi graffe.

nt mta[6] = (1, 4, 9, 16, 25, 36};

Analogamente per quanto avviene con i normali parametri di


funzioni e/o routine, anche gli array possono essere passati
come argomenti e naturalmente è possibile passare i
parametri array per valore o per riferimento, ampliando le
potenzialità elaborative delle funzioni/routine. Ipotizziamo ad
esempio di creare un array che contiene i dati esaustivi delle
nostre operazioni di trading (orari, strumenti tradati, verso
dell'operazione, prezzo dì apertura e di chiusura, massimo e
minimo raggiunto dalle quotazioni durante l'apertura) e di
volerlo passare ad una routine affinchè effettui una stampa o
un invio per email. Al posto di invocare la funzione per ogni
ordine è possibile prima popolare l'array ed infine inviare lo
stesso alla routine per una elaborazione unica.

Ambito di visibilità (Scope)

Come anticipato nei capitoli precedenti, ogni variabile viene


prima dichiarata e poi utilizzata. Per risparmiare memoria
(mai abbastanza !) le variabili dichiarate all'interno delle
funzioni e blocchi di codice delimitato occupano memoria per
il tempo in cui la funzione o blocco di codice viene eseguito,
dopodiché la memoria viene liberata e della variabile si perde
traccia. Esistono tuttavia dei token (parole chiave del
linguaggio) che permettono di mantenere in memoria il valore
delle variabili che altrimenti verrebbe distrutto": questo
token è rappresentato dalla parola Static che precede il tipo.

1
' II termine distruzione ben si adatta al contesto in quanto nei linguaggi dì programmazione si parla di "costruttore"
"distruttore" per definire le procedure di iniziai i zza/ione ed allocazione di memoria e quelli; di finalizzazione e
liberazione di memoria utilizzata dalle variabili.

Pagina 70
Dainesi - Guida di riferimento at (inguaggio MQL

Una variabile definita Static mantiene il suo valore tra una


chiamata e la successiva all'interno di una funzione.

Un trading System è fatto di funzioni e aree di codice pubblico


dove le variabili in esso dichiarate mantengono il loro valore
fintanto che il trading system è attivo.
Un altro aspetto molto importante da comprendere è la
visibilità di una variabile. Le variabili dichiarate nell'area
pubblica sono visibili da tutto il trading System mentre quelle
definite all'interno delle funzioni sono visibili solo dal codice
in esse contenuto e, generalizzando, le variabili definite
all'interno di un blocco delimitato di codice sono visibili al
solo blocco. In altre parole la visibilità delle variabili è
concentrica (da dentro si vede verso l'esterno).

Variabili esterne o proprietà del trading System

II token "extern" anteposto alla definizione di una variabile


pubblica rende il suo valore modificabile dall'utente in fase di
caricamento (in questo contesto non si possono utilizzare
array).

extern int StopLoss = 50; //Pips di stop loss

int initO

Utilizzo e dichiarazione di funzioni esterne

Può capitare spesso di dover utilizzare funzioni contenute in


altre librerie (file di Windows in formato dll o exe, oppure
librerie di MQL in formato ex4). I motivi sono i più disparati
ma nella maggior parte dei casi si tratta di processi di
razionalizzazione.

Pagina 71
Dainesì - Guida di riferimento

Per poter utilizzare le funzioni definite in librerie esterne


occorre prima definirle indicando la libreria di provenienza e
quindi la sintassi di richiamo.
Per dichiarare le funzioni si usa il token ffimport con il
riferimento al file di libreria. Al termine dei blocco di
dichiarazioni si termina con lo stesso token ftimport.

(timport "user32.dll"
int MessageBoxA (int hWnd , string szText, string szCaptìon, nType)
int SendMessageA(int hWnd, int Msg,int wparam,int IParara);
ttimport "Iib.ex4"
doublé round(double value);
#import

Occorre tenere presente che non è necessario scrivere il


percorso (la path) del file solo se questo si trova in uno dei
percorsi predefiniti di Windows. Se la libreria fosse in un
percorso particolare è necessario specificarlo in modo
completo.

//Definizione completa del percorso della libreria


flimport "e:\Projects\MetaLib\lib.ex4"
doublé round(double value);
ftimport

Dh

Pagina 72
Dainesì - Guida di riferimento al linsua$$io MQ}.

Preprocessore

Per istruzioni di preprocessore si intendono tutte quelle


istruzioni atte a dichiarare delle costanti, ad includere file di
codice al momento della compilazione (utile spesso per
utilizzare librerie "preconfezionate"), per dichiarare
collegamenti esterni a librerie scritte magari in altri linguaggi
(ad esempio in C++ o VB.NET).

Dichiarazione di costante

Se il primo carattere nella lìnea di codice è il cancelletto, #,


significa che ciò che segue è un comando per il compilatore. Il
comando termina con il ritorno a capo.
Per definire una costante si utilizza la sintassi seguente

#define NomeCostante Valore

A differenza delle variabili nelle cui dichiarazioni è necessario


indicarne il tipo, nella definizione di una costante ciò è
superfluo in quanto il compilatore conoscendo in anticipo il

Pagina 73
Dainesi - Guida di riferimento al fljnguasgio MQL

valore della costante può allocare in automatico lo spazio di


memoria minimo necessario.

ttdefine ABC 100


«dafine PI 0 . 3 1 4
#define COMPANY NflME "SD Studio DAINESI"

Controlli di compilazione
Int
Queste istruzioni sono utilizzate per definire il valore di
specifici identificatori, alcuni dei quali rappresentano delle
proprietà esterne utilizzate dagli indicatori.

ttproperty identificatore valore

#property link "http://www.sdStudioDainesi.com"


tfproperty copyright "SD Studio DAINESI"
#property stacksize 1024

Qui sotto riporto la tabella completa degli identificatori


utilizzati in MQL.

Tipo Descrizione
string Link al sito internet
copyright string Nome della società
int Stack size
library Una libreria;
indicator_chart_window void L'indicatore appare sul grafico delle quotazìor
indicator_separate_window void L'indicatore appare in una finestra separata
irtdicator_buffers int Numero di buffer dell'indicatore (max 8)
indicatorjninirnum doublé Limite inferiore posto nella finestra separata dell'indicatore
indiC3tor_maximurn doublé Limite superiore posto nella finestra separata dell'indicatore
indicator_colorN coler Colore della linea N (N sarà compresa tra 1 e 8)

Pagina 74
Dainesi - Guida di riferimento al linguaggio MQt

indicator__widthN int Larghezza della linea N (N sarà compresa tra 1 e 8)


indicator__styleN int Stile della linea N (N sarà compresa tra i e 8)
indicator leveIN doublé Livello predefinita N per indicatori in finestre separate (N sarà compresa tra 1
e 8)
indicator_Jevelcolor coior Livello linea colore
indicatorjevelwidth int Livello larghezza linea
indicatorjevelstyle int Livello stile linea
show__conflnn void Prima dell'esecuzione di uno script chiede conferma tramite rnessage box
showjnputs void Prima dell'esecuzione di uno script compare la pagina delle proprietà;

Inclusione di file

La direttiva ^include, inserita in un qualsiasi punto del


programma produce l'effetto di inserire in quel punto il
contenuto del file indicato.

Jtinclude <file_name>

^include <win32.h>

Le parentesi angolari indicano che il file risiede all'interno


della cartella predefinita (di norma
terminal_directory\experts\include).

^include "file_name"

Se si usano le virgolette per indicare il nome del file significa


che questo risiede nella cartella corrente.

Importazione dì funzioni e altri moduli

Per importare funzioni o routine da file o librerie esterne è


necessario utilizzare la direttiva seguente:

ttimport "filejname"
fund();
Pagina 75
Dainesi - Guida di riferimento al (inguaggjo WQL

func2();
#import

Tra la prima #lmport e la successiva sono dichiarate le


funzioni da importare con la loro sintassi di chiamata (tipo
restituito e tipo dei parametri).

ttimport "user32.dll"
int MessageBoxA(int hWnd,string lpText,strinig IpCaption,
int uType);
int MessageBoxExA(int hWnd,string IpText,string IpCaption,
int uType,int wLanguageld);
..__
ttimport _..jHb.ex4
"melib.eK4"
ftin^ort "gdi32.dll
int GetDCUnt hWnd) ;
int ReleaseDC(int hWnd,int h D C ) ;
ttiraport

In caso di più librerie importate non è necessario chiudere


ogni importazione con #lmport purché ci sia la chiusura finale.

Pagina 76
Dainesi - Guida di riferimento al linguaggio MQL

Informazioni sull'Account

Le funzioni che rientrano in questo insieme ritornano


informazioni relative allo specifico account, e quindi grazie a
queste potremo conoscere il nome del broker ed il numero di
conto del cliente, così come la leva applicata ed il margine
disponibile.
Queste funzioni non mostrano particolari problemi nel loro
impiego.

AccountBalance

doublé AccountBalance()

Questa funzione ritorna il saldo dell'account corrente (un


valore in virgola mobile). Attenzione che il saldo non è il
margine né il controvalore delle operazioni in essere ma
semplicemente l'importo la cifra rimasta inadoperata. Nel
terminale è la cifra rappresentata più a sinistra.
Pagina 77

i
DaJnesf - Guida di riferimento al (inguoggio MQ/_

2010.02.2615:31 Duy 1.00 eurusd 1,36200 0.00000

2010.02.2617:12 sell Q.50 eurjpy 120.930 0,000

I Controvalore: 104 721,91 Margine: 2 042,43 Margine disponibile: 102 673.48 Livelo dd margine: 5127.32%

-un,,;.! | Notizie | Allarmi | Casella postale | Consiglieri | Diario |

Nelriquadroè evidenziato il valore ritornato dalla funzione AccountBalance().

//Esempio.

doublé dAB = AccountBalancaO ;


Print("Account balance = " + dAB);

AccountCredit

doublé AccountCredit()

Questa funzione ritorna il valore del credito accordato sul


conto. Normalmente questo valore equivale a zero.

//Esempio.

doublé dAC - AccountCreditO ;


Print ("Account credit = " + dAC) ;

AccountCompany

string AccountCompanyO

Questa funzione ritorna il nome del broker/banca presso il


quale è aperto l'account. L'utilizzo di questo valore può
essere molto utile per tutte quelle software house che
vogliono passare questo valore in associazione con il numero

Pagina 78
Dainesi - Guida di riferimento al linguaggio MQ/.

di conto per controllare i diritti di licenza per l'utilizzo dei


trading System commerciali.

Grafici Strumenti Finestra Aiuto

i^j, Nuovo ordine T ':g Consiglieri esperti Mi ME. MI


Nel riquadro viene edidenziato il valore ritornato dalla funzione AccountCompanyO.

//Esempio.

string sAC = AccountCompanyO;


Print{"Broker/Banca = " + sAC);

AccountCurrency

string AccountCurrencyO

Questa funzione ritorna il simbolo della moneta di conto


utilizzata dall'account corrente. E' importante sottolineare
come l'utilizzo di questa funzione possa esser d'aiuto nella
comprensione del valore dei singoli pips in moneta differente
dal dollaro.

string SAC = AccountCurrencyO;


Print("Moneta di conto = " + sAC);

Pagina 79
Dainesi - Guida di riferimento al (ìnguaggio

AccountEquity

doublé AccountEquityO

Questa funzione ritorna il valore del saldo aggiornato con il


risultato parziale delle posizioni aperte. Questo valore,
denominato Equity, è utilizzato per il calcolo del drawdown.

//Esempio.

doublé dAE = AccountEquityO;


Print("Account equity = " + dAE AccountCurrency());

.0.02,2615:31 buy 1,00 eurusd 1,36200 0.00000


Là 3731543B Q2.2617:12 sell 0.50 eurjpy 120.960 0.000
- Saldo: 104 852.72 C % 104 721.91 forgine: 2 042.43 Margine disponibile: 102 679.48 Livelli, del margine: S127.3Z*

| Porzioni aperteJ'-.N » ..AI tip »T .-iyic.nl I Nutrie [ Osa M ] il*jr!h i»v.i-.-jls | ':n'«:,iqii.--n I Diario |

Nell'immagine è evidenziato il valore ritornato dalla funzione AccountEquityO.

AccountFreeMargin

doublé AccountFreeMargin()

Questa funzione ritorna il margine libero a disposizione


dell'utente per poter aprire nuove operazioni. Questa
funzione è anche importante per controllare l'entità del
margine prima che raggiunga i livelli di "sell out", ovvero il
livello oltre il quale il broker provvede in automatico alla
chiusura delle operazioni (alcuni broker non chiudono
automaticamente le posizioni ma la maggioranza lo fa).

2010.02.2617:12 se
controvalore: 104 721.91 Margine: 2 042.43 Margine

j Podricm aperte Borico oretazior.l | rtonae | Allarmi I creila Melale I owiglte,, ! :.i

Pagina 80
Daìnesi - Guida di riferimento al linsuassio MQL

Nell'immagine è evidenziato il valore ritornato dalla funzione AccountFreeMargin().

//Esempio.

doublé dAF = AccountFreeMargin () ;


Print("Margine libero = " + dAF + AccountCurrencyO);

Inoltre il valore ritornato da questa funzione viene spesso


utilizzato per verificare la possibilità di aprire la posizione con
il margine rimanente.

AccountLeverage

int AccountLeverageO

Questa funzione ritorna il livello della leva espresso come


numero intero (un leva 200:1 ritorna il valore 200). Il suo
utilizzo non ha problemi.
Spesso viene utilizzata per calcolare la dimensione di un
ordine in relazione al margine disponibile ed al margine
necessario per contratto.

//Esempio.

int iLv = AccountLeverage ( ) ;


Print("Leva a disposizione =

AccountMargin

doublé AccountMargin()

Questa funzione ritorna il valore del margine utilizzato.


Attenzione che è il valore totale del margine impegnato e
NON quello disponibile.

Pagina 81
Dainesi - Guida di riferimento al linguaggio MQL

Data(0rarlo Tipo Lotti Simbolo Prezzo StopLoss


2010.02.2615:31 buy 1,00 eutusd 1,36200 0.00000
J 37315439 2010.02,2617:12 ssll 0.50 eur]py 120.930 0.000
! Saldo: 104 852.72 Controvalore: 104 721.91 Margini^042.43^argirie disponibile: 102 679.48 Livello del margine: 5127.3Z<h>

Nell'immagine è evidenziato il valore ritornato dalla funzione AccountMargìn().

//Esempio.

doublé dMG = AccountMargin();


Print("Margine impegnato = " + dMG);

AccountName

string AccountName()

Questa funzione ritorna il nome che si ritrova come


intestazione dell'Account. Può essere utile qualora si vogliano
gestire più account e utilizzare il nominativo dell'intestatario
del conto per evidenziarne l'individualità (anche in fase di
esportazione dei risultati su un file esterno da "trattare" con
apposite applicazioni dì reportistica).

''rTj MIG Trading Station L'utilizzo di questa funzione non


S © Conti pone particolari problemi di
fi 972736; Danesi utilizzo.
fi
fi 1019709: Topix

ffl \f] Indicatori Nell'immagine è rappresentato il


+ ^ Consiglieri esperti "navigatore" di MetaTrader nel
r
'+, ff-, Indicatori personalizzati
quale è evidenziato dal circolo il
tti 2£ Programmi

Comune Preferiti |
valore ritornato dalla funzione
AccountName().
Nell'esempio si ipotizza che il conto in uso sia quello centrale.

Pagina 82
Dafnesi - Guida di riferimento al linguaggio MQj.

string sAN = AccountName();


Print("Conto intestato a " + sAN) ;

AccountNumber

int AccountNumberQ

Questa funzione ritorna un numero intero che rappresenta il


numero di conto dell'account
.'•; MIC-Trading 5tation MetaT rader (è utile ricordare che
d © Conti spesso il numero di account del
fi 972736: Dainesi broker, da cui dipende la
fi(|749&9>Oaniele Livio Dainesi
fi 1019709: Topix
piattaforma MetaTrader, possiede
a (?) Indicatori un altro identificativo). Questa
i+i "^! Consiglieri esperti funzione è molto utile per quelle
ffl OQ Indicatori personafezati
'•±. •-*> Programmi
software house che legano il nome
Cnmtlne | Pl,-h [ - - account, numero conto e nome del
broker alla licenza d'uso di sistemi
commerciali concessi in licenza.
Infatti, attraverso l'uso di una DLL esterna, si interroga il
server delle licenze d'uso e si cerca la trittica composta da
Password - Account Number - AccountCompany. Se non si
trova nessun record con quella password allora lo si aggiunge
(la password deve esistere nella tabella delle password delle
copie date in licenza). Se il record esiste si confronta la
corrispondenza con AccountNumber e AccountCompany.
Qualora il numero di copie concesse sia superiore ad una si
effettuerà il conteggio dei record presenti e se inferiori al
numero massimo si aggiungerà un nuovo record. Qualora il
numero massimo sia raggiunto e nessun record corrisponde
alla trittica inviata il trading System andrà in fase
"dormiente".

Pagina 83
Dainesì - Guida di riferimento al Jinguaggfo MQL

//Esempio
int iANum = AccountNumberO ;
Printf"Conto nr. " + iANum);

AccountProfit

doublé AccountProfit()

Questa funzione ritorna la perdita od il profitto accumulato


delle posizioni in essere. Occorre prestare attenzione al fatto
che il valore corrisponde al saldo di TUTTE le operazioni in
essere e non solo quelle generate dall'expert advisor che
richiama la funzione. Il valore comprende inoltre il saldo delle
commissioni e degli interessi di swap.

Nell'immagine è evidenziato il valore restituito dalla funzione AccountProfit().

//Esempio.

doublé dGain = Accountprofito ;


PrintC'Saldo operazioni correnti: " + dGain);

Pagina 84
Daìnesi - Guida di riferimento al (inguaio MQjL

Funzioni di manipolazione degli Array

Gli Array sono insiemi ordinati contenenti variabili dello stesso


genere. Possono essere monodimensionali come ad esempio
un elenco, oppure pluridimensionali come una tabellina
(bidimensionale), un cubo di tabelline (tridimensionale) o
insiemi multidimensionali che non è possibile rappresentare
graficamente. Un concetto importante da assimilare è
comprendere che un array è un "contenitore" ordinato dove
ogni elemento trova la sua collocazione precisa. Lo si usa per
memorizzare prezzi, dati completi di una o più serie storiche
(quotazioni complete di Simbolo, TimeFrame, Open, Close,
Hìgh, Low, Time e Volume) e compiere delle manipolazioni
sugli stessi, così come memorizzare un elenco di ordini da
Pagina 85
Dainesi - Guida di riferimento al (inguogsjo AlQt

"trattare" in un secondo momento. Il ricorso agli array,


sebbene richiede un uso più esteso della memoria volatile
(RAM), permette di velocizzare i processi di "auto-
ottimizzazione" che alcuni programmatori trader fanno
compiere ai propri trading System alla fine della sessione
settimanale.
ArrayBsearch

int ArrayBsearch(douue arravii, donni Junt=WHOLE_ARRAY, int start=0, i

d1rection=MODE_ASCEND)

Questa funzione ritorna l'indice del primo elemento della


prima dimensione che contiene il valore ricercato, (o quello
più vicino se l'esatta corispondenza non si trova). Questa
funzione cerca un valore numerico ed è quindi vietata la
ricerca di testo o serie storiche.
Questa funzione di ricerca binaria deve essere applicata solo
ad array ordinati per evitare risultati anomali. Per ordinare un
array si utilizzi la funzione ArraySort().

Parametri
Array L'array numerico dentro il quale si cerca.
Value Il valore ricercato.
Count Numero di elementi entro I quali cercare (per
default è l'intero array).
Start Indice dell'elemento dell'array dal quale iniziare
la ricerca. Di default la ricerca inizia dal primo
elemento.
Direction Direzione della ricerca (ascendente o
discendente) espressa con una delle due
costanti: MODE_ASCEND o MODE_DESCEND.

//Esempio.
datetime dDays [ ] ;
//Copio la serie temporale dell'EURUSD
ArrayCopySeries (dSays, MODEJTIME, Symbol () , PERIOD_D1) ;
int iG=ArrayBSearch (dDays (OrderOpenTimes () ,WHOLE_ARRAY, 0,MODE_DESCEND) ;
Print ("L' operazione è stata aperta w + iG + " giorni fa") ;

Pagina 86
Dainesi - Guida di riferimento al flinguass/o MQL

ArrayCopy

ft dest[], object sourcet], int start_dest=0, int start_source=0,int count=WHOLE_ARRAy)

Questa funzione copia il contenuto di un array in un altro e


ritorna il numero di elementi copiati. Utile quando occorre
fare dei controlli ciclici. Gli arrays devono contenere dati del
medesimo tipo.

Parametri
dest[] Array di destinazione.
source[] Array di origine.
start_dest Indice dell'elemento dell'array di destinazione
(di default è 0)
start_source Indice dell'elemento dell'array di origine (di
dafault è 0).
Count II numero degli elementi che devono essere
copiati. Se non specificato si intende l'intero
array (WHOLE_ARRAY).

//Esempio.
int a r r a y f i [ ] [ 3 ] ;
int a r r a y B [ 2 2 ] [3] ;
int arrayC[31] [3] ;

//Copio n e l l ' a r r a y A I primi 5 elementi dei due array B e C


ArrayCopy(arrayA,arrayB,0,0,5) ;
ArrayCopy{arrayA,arrayC,5,0,5);

ArrayCopyRates

int ArrayCopyRates(doubi» rame=o)

Questa funzione copia le quotazioni all'interno di un array


bidimensionale copiando I dati dall'array del grafico
denominato Ratelnfo. La seconda dimensione contiene i sei
elementi caratteristici delle quotazioni:

Pagina 87
Dainesi - Guida di riferimento al linguaggio MQL

0 lime Orario di apertura della candela


1 open Quotazione di apertura
2 low Quotazione minima
3 high Quotazione massima
4 dose Quotazione di chiusura
5 volume Volumi scambiati12

In genere si usa questa funzione per copiare delle serie


storiche da analizzare poi con programmi esterni attraverso il
passaggio di parametri via DLL .

Parametri
dest_array[] Array numerico di destinazione.
Symbol Sìmbolo dello strumento quotato (di default è il
simbolo del grafico corrente).
Timeframe Time frame della serie storica copiata. Se non
diversamente specificato viene utilizzato il time
frame corrente sul grafico (può essere solo uno
compreso nei time frame standard).

//Esempio.
doublé arrayAU [61;

grafico
V
ArrayCopyRatestarrayA, Symbol O, PERIOD_M5);

11
Si ricordi bene che i volumi riportati sono SOLO quelli del broker e NON quelli dell'intero mercato. Questi volumi
assumono una qualche forma di attendibilità orientativa solo su time frame elevati (dal 4 ore in su).
13
Una DLL (Dynamic Link Library) è un programma esterno che attraverso delle apposite funzioni di interfaccia
permette di interagire con altri programmi (in questo caso con MetaTrader). Nel contesto di MetaTrader una DLL è
utile per poter elaborare i dati con un programma esterno creato per ottimizzare i calcoli e le performance oltre i limtt
intrinseci della piattaforma di trading (ad esempio tramite l'accesso a database esterni).
Pagina 88
Dainesì - Guida dì riferimento al linguas$io MQL

ArrayCopySeries

ìnt ArrayCOpySerieS(double6 arra/I], int serlesjndex, string symbol=NULL, ini timeframe=o)

Questa funzione copia una serie di dati da un array ad un


altro, ritornando il numero di elementi copiati.
Se il parametro series_index è di tipo MODE_TIME, il primo
parametro deve essere una array di tipo datetime.

Parameters
array[] Riferimento all'array numerico
monodimensionale (o array di date
monodimensionale se anche l'array di origine è
di tipo datetime).
series_indexldentificatore della serie dati passata, ovvero
una tra quelle ammesse:

MODEJ3PEN Open price.

MODEJ.OW Low prìce.

MODE_HIGH High pn'ce.

MODE_CLOSE dose price.

MODEJ/OLUM Volume, used in iLowestQ and


E iHighestO functions.

Bar open time, used in


ArrayCopySeries() function.

Symbol Nome del simbolo dello strumento finanziario (di


default è quello relativo al grafico in uso).
Timeframe Time frame, di default quello del grafico.

doublé arrayAH;
//Copio nell'array A i volumi a 1 giorno dello strumento sul grafico
ArrayCopySeries {arrayA, MODE_VOLUME, SymbolO, PERIODAI) ;

Pagina 89
Dainesi - Guida di riferimento al linguaggio MQL

ArrayDimension

int ArrayDimension(int array[])

Questa funzione restituisce il numero di dimensioni dell'Array.


Il risultato non va confuso con il numero di elementi
contenuti. Qui si ottiene l'informazione necessaria per capire
se l'array è monodimensìonale, bidimensionale, ecc..

Parameters
array[] Array dal quale recuperare il numero di
dimensioni.

//Esempio.
int iDimension = ArrayDimension(arrayA);

ArrayGetAsSeries

bool ArrayGetAsSeries(object arrayf])

Questa funzione ritorna true se l'array passato contiene una


serie storica (dove gli elementi sono ordinati dall'ultimo al
primo, ovvero l'elemento O è il più recente e quello più
remoto ha un numero positivo) altrimenti ritorna false.

Parameters
array[] Array da controllare.

//Esempio.
if(ArrayGetAsSeries(arrayA)—true)
Print("Array ordinato come una serie");
else
Print("Array ordinato in modo standard");

Pagina 90
Daìnesi - Guida di riferimento ai (inguaggio MQL

Arraylnitialize

int Arraylnitialize(double& array[], doublé value)

Questa funzione inizializza un array e imposta il valore di ogni


elemento ad un valore prefissato. Il valore ritornato è il
numero degli elementi inizializzati.

Parametri
array[] Array numerico da inizializzare.
Value Nuovo valore di default per ogni elemento
dell'array.

//Esempio. Inizializzo a zero tutti gli elementi dell'array A


int ìElementi = Arraylnitialize(arrayA,0);

ArraylsSeries

bool ArraylsSeries(object array[])

Questa funzione ritorna True se l'array passato è una serie


(lime, open, dose, high, low o volume).

Parametri
array[] Array da controllare.

//Esempio.
if(ArraylsSeries(arrayA)) Print("L'array A contiene una serie");

Pagina 91
Doinesi - Guida di riferimento al linguaggio MQ/.

ArrayMaximum

int ArrayMaximum(double array[], int count=WHOLE_ARRAY, int


start=0)

Questa funzione ricerca l'elemento contenente il valore


massimo e ritorna l'indice della sua posizione.

Parametri
array[] L'array numerico sotto esame.
Count Elementi dell'array da esaminare.
Start Indice di partenza per la ricerca.

//Ricerca del massimo negli ultimi 30 elementi partendo dall'ultimo


int iMassimo - ArrayMaximum(arrayA, 30, 0) ;

ArrayMaximum

int ArrayM1nimum(double array[], int count=WHOLE_ARRAY, int


start=0)

Questa funzione ricerca l'elemento contenente il valore


minimo e ritorna l'indice della sua posizione.

Parametri
array[] L'array numerico sotto esame.
Count Elementi dell'array da esaminare.
Start Indice di partenza per la ricerca.

int iMìnimo = ArrayMinimumtarrayA, 30, 0 ) ;

Pagina 92
Dainesi - Guida di riferimento al (inguaggio MQL

ArrayRange

int ArrayRange(object array[], int range_index)

Questa funzione ritorna il numero degli elementi contenuti


nell'array nella dimensione specificata. Per gli usi che si
possonone fare con il risultato della funzioni si ricordi che
ogni array ha l'indice a base zero per cui un ArrayRange di 10
significa che gli elementi andranno da O a 9.

Parametri
array[] Array da controllare
range_index Indice della dimensione controllata.

//Controllo di ogni elemento d e l l ' a r r a y


int arrayA[] [ 6 ] ;

int ìTot = ArrayRange(arrayA, 1) ;


for(int i = 0;i<iTot; i++)

Print("Elemento " + (i+1) + " = arrayA[i][2]);


J

ArrayResize

int ArrayResize(object6t array[], int new_size)

Questa funzione reimposta la prima dimensione dell'array.


Quando la funzione riesce nel suo intento ritorna il numero di
elementi contenuti nell'array ridimensionato, in caso
contrario ritorna zero (che significa che l'array non è stato
ridimensionato).

Parameters
array[] Array da ridimensionare.
new_size Nuova estensione per la prima dimansione.
Pagina 93
Dainesi - Guida di riferimento al linguaggio MQf.

//Ridimensionamento dell'array
int arrayA[] [1] ;
ìnt iTot = ArrayResize{arrayA, 52) ;
iffiTot > 0)

forfint i = +)

arrayA[i][0])=iClose(Symbol(),PERIOD_W1,i);

ArraySetAsSeries

bool ArraySetAsSeries(double& array[], bool set)

Questa funzione ritorna True se riesce a ordinare gli elementi


dell'array come una serie, ovvero impostando l'ultimo
elemento con l'indice 0.
Returns previous state.

Parametri
array[] L'array numerico da impostare.
Set L'indicazione di impostazione a Serie (true per
impostare a serie o false per togliere
l'impostazione).

//Impostazione di un array a serie


doublé macd[600];
doublé signal[600];
int i, iSize=ArraySize(macd);

ArraySetAsSer:L&s (macd,true);
for(i=0; i< iSize; i++)

doublé FastEMA - ÌMA(HULL,O,12,0,MODE_EMA,PRICE_CLOSE,i);


doublé SlowEMA = ÌMA{HULL,O,26,0,MODE_EMA,PRICE_CLOSE,i);
macd[i]= FastEMA - SlowEMA;

Pagina 94
Dainesi - Guida di riferimento al linguaggio MQL

for(ì=0; i< isize ) signal [i] =iMAOnArray (macd, iSize, 9, 0,MODE_SMA, i)

ArraySize

int ArraySize(object array[])

Questa funzione restituisce il numero di elementi contenuti


nell'array.

Parametri
array[] Array.

//Ottenimento del numero di elementi dell'array


int iTot - ArraySize(arrayA);
for(int i = 0;i<iTot; i++)
(
Print(arrayA[i]);

ArraySort

int ArraySOrt(.!o;i!.i, & arrayl], int count=WHOLE_ARRAY, iht start=0,int sort_dir=MODE_ASCENo)

La funzione è utilizzata per ordinare un array secondo uno dei


due criteri di ordinamento applicato alla prima dimensione
dell'array. L'aspetto interessante di questa funzione è che
permette di ordinare tutto l'array o solo una porzione di esso
definita dai due parametri count e start. Attenzione che le
Serie non possono essere ordinate.

Parametri
array[] L'array numerico da ordinare.
Count Numero di elementi da ordinare.
Start Indice dell'elemento di inizio ordinamento.

Pagina 95
Dainesi - Guida di riferimento Qt (inguaggio MQL

sort_dir Criterio di ordinamento. Uno dei due seguenti:

MODE_ASCEND - Ordinamento crescente (123 ..)


MODE_DESCEND - Ordinamento decrescente (.. 321)

//Ordinamento di un array
doublé num_array[5]={4,l,6,3,9}; // Contenuto disordinato

ArraySort(num_array);
// Ora il contenuto è ordinato in modo crescente (1,3,4,6,9)

ArraySort (num_array, HODE_DESCEND) ,-


// Ora il contenuto è ordinato in modo decrescente (9,6,4,3,1)

Pagina 96
Dainesi - Guida di riferimento al (ìnguaggio MQf.

Funzioni di uso comune

AlertQ lsTradeAllowed()
ClientTerminalNameO Marketlnfo()
CompanyName() MessageBox()
Commento Periodo
GetLastError() PlaySound()
GetTickCount() Print()
HideTestlndicatorsO RefreshRates()
IsConnectedf) SendMailO
lsDemo() ServerAddressf)
IsDMsAllowedO Sleep()
lsLibrariesAllowed() SpeechText()
IsStoppedO Symbol()
IsTestingO UninitializeReasonO

In questo insieme troviamo alcune funzioni molto utili per


orientarsi in mezzo alle mille variabili dovute alle differenti
implementazioni delle caratteristiche di MetaTrader (pensate
solamente ai decimali utilizzati nel flusso informativo delle
quotazioni). In linea generale in questo capitolo si
conosceranno tutte quelle funzioni del linguaggio che per la
loro natura non rientrano in nessuna altra specifica categoria.
Alcune riguardano il mercato, altre l'account e altre ancora
l'interfaccia grafica o l'interazione con l'esterno.
Pagina 97
Dainesi - Guida di riferimento al (inguaggio MQL

Alert

void Alert(... )

Questa procedura genera un allarme sonoro accompagnato


dalla comparsa di una finestra di popup che elenca tutti i
messaggi di allarme in ordine cronologico.
Questa funzione è
\ Prezzo oltre livello d'apertura!
occorre segnalare
un anomalia o un
segnale di
] O 11:31:12 Prezzo oltre livello d'apertura! entrata/chiusura
O 11:31:11 Prezzo oltre livello d'apertura! da effettuare in
11:31:11 Prezzo ofcre livello d'apertura ! discrezionale.
C 11:31:08 Prezzo oltre livello d'apertura!
Più o meno tutti i
v

trader che
CMH traghettano dal
discrezionale all'automatico passano in questa fase, dove si
preferisce che il sistema segnali le operazioni da effettuare,
lasciando all'utente l'effettiva esecuzione.
Un metodo alternativo e quello di attivare gli expert advisors
ma imponendo la conferma manuale alle operazioni generate.
Alla procedura non è possibile passare array mentre sono
consentiti tutti gli altri tipi di dato. Essendo i parametri
separati da virgole, il risultato altro non sarà che una
concatenazione del testo risultante.
I numeri decimali vengono troncati alla quarta cifra decimale
a meno di utilizzare la funzione di conversione DoubleToStr() .
Funzioni simili per interesse: Commento e Print().

Parametri
Qualsiasi valore separato da virgole.

if(VerificaLong()==true)

Alert("Segnale di acquisto!", Bid, "Strategy A " ) ;


}

Pagina 98
Dainesì - Guida di riferimento al tinsuassio MQL

C//entTermina(Name

string ClientTerminalNameO

Questa funzione restituisce il nome della piattaforma.


Dovrebbe essere MetaTrader ma nella realtà ogni broker gli
assegna un nome differente per cercare di fidelizzare i propri
clienti.

• 1019709: MIG Tradire Statici. [EURUSD,M11


1^1 File Visualizza Inserisci Grafici Strumenti Finestra Auto
^* 9" '!Ì5Ì <!>!'-:& :SLÌ '"\ 1^ Nuovo ardine '"p ^ Consiglieri esperti |J,
MI M5 MIE M3D HI H4 DI Wl MN , , If

Per quelle software house che intendono vincolare l'uso dei


propri Expert Advisors a specifici conti di clienti è bene non
prendere in considerazione il nome della piattaforma in
quanto spesso, a causa del marketing, questo può cambiare.
Rimane invece fisso il numero di conto.

//Mostro il nome della piattaforma


Comment("II nome della piattaforma è -t- clientTerminalName() ) ;

CompanyName

string CompanyNameO

Questa funzione ritorna il nome del broker. Usata spesso dagli


introducer broker per creare indicatori da usare solo ed
esclusivamente sulle piattaforme dei broker che introducono
(un altro mezzo per aumentare la fidelizzazione).

Pagina 99
Dainesi - Guida dì riferimento al linguaggio MQL

(1019709: MIE Tradicig Station - [EURUSD,M1]


File Visualizza inserisci Grata Strumenti Finestra Aiuto

I' ;|!5) O fe :E E ^Nuovowrine • > (

//Mostro il nome della piattaforma


Comraent("II broker è " + CompanyName O ) ;

Comment

void Comment(... )

Questa utilissima funzione permette di scrivere sullo schermo,


a carattere predefinito, delle frasi contenenti parole e
numeri, su più righe, nell'angolo in alto a sinistra del grafico.
I suoi usi sono i più svariati, si faccia solo attenzione a non
"invadere" troppo il grafico per evitare di rendere poco
leggibile l'insieme.
Si tenga presente che l'argomento della funzione è una
stringa o comunque una variabile che viene tramutata in
stringa di testo.
Bisogna solo prestare attenzione al fatto che la
concatenazione di stringhe è permessa ma l'effetto non
sempre è quello voluto quando si concatenano stringhe di
testo con variabili numeriche che verranno poi convertite in
testo in automatico. Se si vuole passare il risultato di un
operazione algebrica occorrerà racchiudere la stessa tra
parentesi tonde.
Si ricordi che non è possibile passare array come parametri.
Pagina 100
Dainesi - Guida ài riferimento al linguaggio MQL

Si vedano anche le funzioni AlertQ e Print().

Parametri
Qualsiasi valore, separato da virgole.

//Mostro il valore dello stop loss

//Modo errato
comment("Lo Stop Loss è fissato a " + OrderOpenPrice O + 50*Point);
//ottengo "Lo stop Loss è fissato a 1.34520.0050"

comment("Lo Stop Loss è fissato a " + (OrderOpenPriceO + 50*Point));


//Ottengo "Lo Stop Loss è fissato a 1.3402"

GetLastError

int GetLastError()

Questa funzione ritorna il codice dell'ultimo errore generato,


quindi si resetta per cui il riutilizzo della funzione otterrà
zero come valore di ritorno.
E' utile il suo utilizzo per "catturare" eventuali errori di
esecuzione dovuti a requotes o cambiamenti delle
caratteristiche del linguaggio accettate dai broker.
La funzione non ha parametri.

//Controllo della corretta esecuzione di uno stop and reverse


int iErr;
int iTck;
strino, msg;

iTck - OrderSendfSymbol O,OP_SELL,Lots*2,Bid,3,SL,TP,"",MN, O, Red) ;


OrderCloseBy(TickToClose, iTck);
iErr = GetLastErrorO ;
if(iErr>0)

Pagina 101
Dainesi - Guida di riferimento al (inguaggio MQL

GetTickCount

int GetTickCount()

Questa funzione ritorna il numero di millisecondi trascorsi


dall'avvio del sistema. L'uso di questa funzione è utile per
calcolare il tempo di esecuzione impiegato da un determinato
blocco di codice e dedurne quindi la durata completa in modo
da avvisare l'utente dei tempi di attesa affinchè il processo di
calcolo volga a termine.

int iStart;
int iElapsed;
int iForecast;
string

iStart = GetTickCount () ;
f or (int i = 0; i<Bars; i++)
{
OrderClose (TickToClose,OrderLots () ,Ask,3,Gr
if (i=10) iElapsed = GetTickCount () -iStart;
if (i>=10)

iForecast = ((Ba i)/IO * iElapsed)71000;


msg = iForecast secondi rimanenti alla
Corament(msg);

HideTestlndicators

void HideTestlndicators(booI hide)

Questa funzione permette di istruire il tester della


piattaforma se mostrare o nascondere gli indicatori richiamati
dal nostro codice a fine esecuzione.

Pagina 102
Dainesi - Guida di riferimento al (inguaggio MOJ.

Parametri
Hide TRUE se si vogliono nascondere gli indicatori
altrimenti FALSE

//Inibisco gli indicatori


HideTestlndicators(true);

IsConnected

bool lsConnected()

Questa funzione è utile per testare il collegamento con il


server. Sfortunatamente quando non c'è collegamento non ci
sono neanche scambi per cui non verranno richiamati né gli
indicatori né gli expert advisor. Rimane quindi solo la
possibilità di testare la connettività nel momento stesso in cui
si attivano i trading System (poca cosa ...).

//Testo la connessione
if(isConnectedf)==false) MessageBox{"Connessione interrotta!"}; ;

IsDemo

bool IsDemoQ

Questa interessante funzione di verifica ambiente ritorna true


se il conto con il quale ci si è "loggati" alla piattaforma è
reale o virtuale. Questo aspetto è ritenuto molto importante
da tutti coloro che producono e vendono sitemi
"commerciali" (trading systems) che permettono l'uso
illimitato su conti demo ma, al contrario, esigono un controllo
rigoroso sui conti reali.

Pagina 103
Dainesi - Guida di riferimento al /j'n(?ua§g;o AIQ/.

//Testo 1'ambiente
if(IsDemo()==false) MessageBox("Conto Reale!");

IsDIIsAllowed

bool IsDIIsAllowedO

Questa funzione restituisce un valore booleano indicante se è


abilitato l'uso di DLL esterne o no. Una DLL, o Dynamic Link
Library, altro non è che una libreria di funzioni residenti in un
file esterno a MetaTrader. Solitamente sono applicazioni che
vengono richiamate da una applicazione "chiamante" per
svolgere determinati compiti impossibili al chiamante (vedi
l'accesso a database ad esempio).

/*Se posso accedere alle DLL e f f e t t u o la chimata, in caso contrario


altrimenti esco */
if (IsDLLAllowedO==false) return ( 0 ) ;

IsLibrariesAllowed

bool IsLibrarìesAllowedO

Questa funzione verifica se è permesso accedere alle librerie


di funzione create con MQL e contraddistinte dall'estenzione
*.ex4.

//Testo l'ambiente. Se non posso accedere alle librerie esco,


limport "usefulfunc.ex4"
void firstfuncO;

if(IsLibrariesAllowed()==false)

MessageBox(
Return(O);

Pagina 10-4
Dainesi - Guida ài riferimento al linguaggio MQL

IsStopped

bool lsStopped()

Questa funzione ritorna true se l'expert è bloccato.


Normalmente le operazioni svolte da un expert ad ogni tick
sono velocissime. Se i processi in atto impiegano più di 2,5
secondi l'expert appare bloccato e la funzione ritorna true.

//Verifico che non sia bloccato l'Expert


if(IsStopped<)==true)

IsTesting

bool IsTestingO
Quest'altra utilissima funzione permette di sapere se
l'esecuzione dell'expert avviene in tempo reale oppure in un
backtest. Quest'aspetto rivolge un importanza notevole
qualora si vogliano ottimizzare i tempi di esecuzione. Alcuni
sistemi richiedono l'uso di indicatori esterni che a loro volta
ad ogni tick ri-analizzano centinaia se non migliaia di dati
(serie storica delle quotazioni). Questa caratteristica si
riperquote pesantemente sui tempi di test che sull'analisi di
un anno posson significare decine di ore di durata. La
soluzione consiste nell'utilizzare una versione "snella"14
dell'indicatore in fase di test in grado di ridurre sensibilmente
il tempo di esecuzione.
Un altro esempio in cui è utile questa funzione è nel test di
sistemi di "gestione", ovvero in tutti quei casi in cui l'ordine
viene immesso manualmente e lasciato poi all'expert la
gestione del money management.
14
La versione snella di un indicatore è una manipolazione dell'originale in grado di ritornare simili risultati con
differenza rispetto agli originali di un valore trascurabile (ad esempio i valori cambiano solo a partire dal sesto
decimale).
Pagina 105
Daìnesi - Guida di riferimento al linguaggio MQL

//Per soli scopi di BackTest, genero degli ordini da "gestire"


if(IsTeating()==true) OrdìneRandom(i ;

IsTradeAllowed

bool IsTradeAllowedO

Questa funzione verifica se è permessa la compravendita. La


compravendita non è permessa perché:

• Non è abilitato il comando nelle proprietà dell'expert


• II conto non è abilitato per le compravendite (account
informativo)

//Per soli scopi di BackTest, genero degli ordini da "gestire"


if(!IsTradeAllowedOi MessageBox("Non è abilitata la compravendita !");

Marketlnfo

doublé Marketlnfo(string symboi, int type)

Questa funzione è utilissima e capita di utilizzarla molto


spesso in quanto è particolarmente poliedrica. Permette di
ottenere moltissime informazioni riguardanti lo strumento
finanziario desiderato.
Il primo parametro indica lo strumento finanziario (parità o
CFD) mentre il secondo è una delle seguenti costanti
enumerative che identificano una caratteristica dello
strumento.

Pagina 106
Dainesi - Guida di riferimento al linguaggio MQ).

Costante ! Descrizione

MODE_LOW Prezzo minimo di giornata.


MODEJHIGH
MODE_TIME Ultimo orario conosciuto del server del broker.

MODE^BID Ultimo prezzo Bid ricevuto. Equivale alla variabile Bid se riferito allo
strumento del grafico.
MODE_A5K Ultimo prezzo Ask ricevuto. Equivale alla variabile Ask se riferito allo
strumento del grafico.

MODE_POINT Dimensione del ponto sui prezzo della valuta. Equivale alla variabile Point
se riferito allo strumento del grafico.
MODE_DIGITS Numero di decimali utilizzati sul prezzo esposto. Equivale alla variabile
Digits se riferito allo strumento del grafico.
MOOE_SPREAD Valore dello Spread in punti.
MODE_STOPLEVEL Stop level in punti.

MODE_LOTSIZE Dimensione del (otto in moneta base.


MODE_TTCKVALUE Valore del Tick in moneta di conto.
MODEJTÌCKSIZE Dimensione del Tick nella valuta base.
MODE_SWAPLONG Entità dello Swap per le posizioni di acquisto.
MODE_SWAPSHORT Entità dello Swap per le posizioni di vendita.
MODE_START1NG Data di inizio quotazione (solitamente utilizzata per i contratti Futures).

MODE_EXPIRATTON Data di scadenza (solitamente utilizzata per i contratti Futures).


MODE_TRADEAaOWED Verifica se è permessa l'operatività sullo strumento finanziario.
MODE_MINLOT

MODE_LOTSTEP Lotto minimo di incremento (a partire dal lotto minimo).


MODE_MAXLOT i Lotto massimo ammesso.

MODE^SWAPTYPE Metodo di calcolo dello Swap: O - in punti; 1 - in moneta base; 2 - in


percentuale di interesse; 3 - in margine di valuta.
MODE_PROF!TCALCMODE Metodo di calcolo dei profitti. O - Forex; 1 - CFD; 2 - Futures.
MODE_MARGINCALCMODE Metodo di calcolo del MArgine. O - Forex; 1 - CFD; 2 - Futures; 3 - CFD
per gli indici.
MODE_MARGININIT ; Margine iniziale richiesto per un lotto.
MODE_MARGÌNMAINTENANCE Margine necessario per mantenere aperta la posizione di un lotto.
MODE_MARGINHEDGED Margine richiesto per posizioni Hedge su un lotto.
MODE_MARGINREQUIRED : Margine libero richiesto per aprire una posizione in acquisto di un lotto.

MODE_FREEZELEVEL Livello in punti di "non modificabilità" di un ordine. Quando il prezzo sì


avvicina al setup impostato l'ordine diventa non modificabile.

Parametri
Symbol Simbolo dello strumento finanziario.
Type Una delle costanti enumerative contenute nella
tabella riportata prima.

Pagina 107
DainesJ - Guida di riferimento al linguaggio MQf.

//Calcolo della dimensione corretta dell'ordine in base al importo voluto


doublé mLots;
doublé AmountPerOrder = 1000;

doublé dLotStep - Marketlnfo("BMWGR",MODE_LOTSTEP);


doublé dMinLot = Marketlnfo("BMWGR",MODE_MINLOT);
doublé dMinStep = Marketlnfo{"BMWGR",MODE_LOTSTEP);
doublé dMarginRqd = Marketlnfo {"BMWGR" ,MODE_MARGINREQOIRED) ;

mLots = AmountPerOrder/dMarginRqd;

if(mLots<dMinLot)
mLots = dMinLot;
else
mLots = dMinLot + MathRoundf(mLots-dMinLot)/dLotStep)* dMinStep;

MessageBox

int MessageBox(string text=NULL, string caption=NULL, int


flags=EMPTY)

Questa funzione mostra una finestra di messaggio che può


essere utilizzata in due modi: come semplice comunicazione
monodirezionale (l'utente legge e può solo chiudere la
finestrella) o bidirezionale (l'utente legge il messaggio
mostrato e può scegliere quale tasto, tra quelli presenti sulla
finestrella, premere per esprimere la sua scelta.
Il messaggio è costituito da un corpo mostrato al centro della
finestrella, un titolo che verrà posto sul bordo della
finestrella e uno o più tasti da mostrare.
Il valore di ritorno corrisponde alla costante rappresentativa
del tasto premuto dall'utente.

Parametri
Text Testo (opzionale) contenuto nel messaggio
mostrato.
Caption Testo (opzionale) del titolo del messaggio. Se il
valore è NULL verrà utilizzato il nome dell'Expert
Advisor.

Pagina 108
Dainesi - Guida di riferimento al tinguassio MQ}.

Flags Specifica il contenuto e le caratteristiche della


finestra messaggio. Si possono usare combinazioni
di costanti per definire i pulsanti presenti ed
eventualmente quale di questi deve risultare il
predefinito. E' inoltre possibile inserire un icona
predefinita che rimarchi l'enfasi del messaggio.
Per l'elenco delle costanti enumerative utilizzate
per questo parametro si consulti la tabella
seguente.

Costante Descrizione
IDOK OK è stato premuto.
IDCANCEL Cancel è stato premuto. Cancella nella versione italiana.

IDABORT Abort è stato premuto. Annulla nella versione italiana.

IDRETRY Retry è stato premuto. Riprova nella versione italiana,

IDIGNORE Ignote è stato premuto. Ignora nella versione italiana.

IDYES Yes è stato premuto. Si nella versione italiana.

IDNO No è stato premuto. No nella versione italiana.


IDTRYAGAIN Try Again è stato premuto. Prova ancora nella versione Italia

IDCONTINUE Continue è stato premuto. Continua nella versione italiana.

Per indicare quali pulsanti inserire nella finestra occorre


utilizzare le costanti seguenti.
Descrizione
MB_OK 0x00000000 La message box contiene un pulsanti OK. Essendo l'unico
scelta di default.

MB_OKCANCEL 0x00000001 La message box contiene due pulsanti: OK e Cancel.


MB_ABORTRETRYIGNOR£ 0x00000002 La message box contiene tre pulsanti: Abort, Retry, e Ignore.
MB_YESNOCANCEL 0x00000003 La message box contiene tre pulsanti: Yes, No e Cancel.

MB_YESNO 0x00000004 La message box contiene due pulsanti: Yes e No.


MB_RETRYCANCEL 0x00000005 La message box contiene due pulsanti: Retry e Cancel.

MB_CANCELTRYCONTINUE 0x00000006 Solo per Windows 2000: la message box contiene tre pulsanti: Cancel,
Try Again, Continue. Usare questa combinazione in luogo di
MB_ABORTRETRYIGNORE.

Per mostrare un icona nella message box utilizzare una delle


costanti seguenti.
Valore
0x00000010 Un segnale di Stop.

Pagina 109
Dainesì - Guida di riferimento al ftnguaggi'o MQL

MB_ICONERROR,
MBJCONHAND

MBJCONQUESTION 0x00000020 Punto interrogativo (?).

MBJCONEXOAMATION, 0x00000030 Punto esclamativo (!).


MBJCONWARNING

MBJCONINFORMAT1ON, 0x00000040 Segno "i" di Infoi


MBJCONASTERISK

Per indicare quali pulsanti è selezionato di default usare le


seguenti costanti.

MB__DEFBLnTONl 0x00000000 It primo pulsante è il predefìmto. MB_DEFBUTTON1 è predefinito fintante che


non viene utilizzato MBJ3EFBU1TON2, MB_DEFBUTTON3, o MBJDEFBUTTON4.

MB_DEFBLTTTON2 0x00000100 If secondo pulsante è il predefinito.

MB_DEFBUTTON3 0x00000200 II terzo pulsante è il predefinito.

MB_DEFBUTTON4 0x00000300 II quarto pulsante è il predefinito.

riga all'inizio del codice sorgente.


*/
Sinclude <W±nUser32.mqh>

if(MessageBox("Adottare i lotti variabili ?",NULL, + MB_YESNO +


MB__ICONQUESTION + MB_DEFBUTTON2) == IDYES)
MessageBox("Lotti variabili adottati","Money Management Engaged");

Message box risultanti dall'esempio riportato.

Pagina 110
Dainesi - Guida di riferimento al tinguagsio A1QL

Period

int Periodo

Questa funzione ritorna il time frame del grafico espresso


come numero di minuti contenuti per ogni barra. Per il
confronto si possono anche usare le costanti enumerative
appositamente proposte.
Viene usata molto di frequente in tutte quelle funzioni
informative che richiedono questo valore come parametro.

PERIOD_M1

PERIOD_M5 5 minuti.

PERIOD_M15 15 minuti.

PERIOD_M30 30 minuti.

PERIODAMI 1 ora.

PERIODJ-H 4 ore.

PERIODJJl Giornaliero,

PERIOD.W1 Settimanale.

PERIOD_MN1 Mensile.

O {zero} Tìmeframe in

//Uso della funzione Periodo


if (Periodo ==Period_Ml)
iMovingAverageType-1;
else
iMovingAverageType=0;

PlaySound

void PlaySound(string filename)

Questa funzione richiama un file sonoro per la riproduzione.


Il file deve trovarsi nella cartella <terminal_dir>\sounds o una
sua sottocartella.

Parametri

Pagina 111
Dainesi - Guida di riferimento ai linguaggio MQÌ.

Filename Nome del file da riprodurre. Sound file name. Non


è necessario inserire il percorso completo ma
quello relativo (es. \mus\buy.wav che indica un file
la cui path completa è
c:\Prosrammi\MetaTrader\sound\mus\buy.wav)

//Riproduzione di un file sonoro al raggiungimento di un obiettivo


if (OrderProf it ( ) >=Target)

OrderClose (OrderTicket ( ) ,orderLots O , Bid, 3,Green) ;


PlaySound("jackpot . wav") ;

Print

void Print(... )

Questa funzione permette di inserire dei messaggi nei log dei


consiglieri (o log expert file). Come per la funzione Comment,
si possono passare tutti i dati che si desidera tranne gli array.
I tipi numerici Doublé verranno troncati al quarto decimale.
Per ottenere più decimali occorre convenire il numero in
testo utilizzando la funzione
DoubleToStrf). Per convenire una variabile di tipo datetime
utilizzare la funzione TimeToStr().
Print, insieme a Comment è molto utilizzata per far fronte
alle carenze di debug dell'editor MQL. Per controllare il
valore di una variabile all'interno di una funzione o di una
routine si "esporta" il valore con Print o Comment per poterlo
visionare sul video o sul log file.

Parametri
Qualsiasi valore o insiemi di valori separati da virgole.

//Uso di Print
if(GetLastError O==129)Print("Errore DoubleToString(Bid,5});

Pagina 112
Dainesi - Guida di riferimento ai (inguaggfo MQÌ-

RefreshRates

bool RefreshRatesQ

Questa funzione aggiorna I dati contenuti nelle variabili di


sistema che memorizzano I dati delle quotazioni (serie
storiche). Si usa quando l'expert deve eseguire delle routine
molto lunghe prima di eseguire ordini. Se l'aggiornamento va
a buon fine la funzione ritorna true, altrimenti false.

//Uso di RefreshRatesO
if {dose [0]>dSetup)
(
OrderSend(Symbol O , OP_SELL, Lots, Bid, 3 , O , O , " " , O , O , R e d ) ;
int iErr = GetLastErrorO ;
iffiErr==135 I I iErr==129)
(
RefreshRates();
OrderSend(Symbol O , OP_SELL, Lots, B i d , 3 , O , O , " " , O , O , R e d ) ;

SendMail

void SendMail(string subject, string some_text)

Questa routine permette di inviare una mail all'indirizzo


specificato nel pannello delle Opzioni della piattaforma.

Parametri
Subject Soggetto della mail.
some_text Corpo del messaggio.

//Invio di un messaggio di posta elettronica


SendMail ("Riepilogo di giornata", "saldo odi

Pagina 113
Dainesì - Guida di riferimento al linguaggio MQj.

Servet Grafici Oggetti Posizioni aperte Consiglieri esperti Ernail Editore Eventi

nm
SMTP server: [^

SMTPIogin: \^

SMTPpasswotd: [

Da

II tuo nome, nome(-z>.j.;ien<ÌE> I;L

GK , Annulla

ServerAddress

string ServerAddress()

Questa funzione ritorna una stringa di testo contenente


l'indirizzo del server. Questo può essere sotto forma di
ottetto IP (es. 92.44.155.12:443) o come URL15.

1S
URL o Uniform Resource Locator è l'acronimo con il quale si definisce la sequenza di cartteri che identifica
univocamente l'indirizzo di una risorsa internet.
Pagina 114
Dainesi - Guida di riferimento al linguaggio MQL

NeU'immagine compare l'output del sorgente dell'esempio.

//Determinazione del nome del server remoto


Comraent("L'indirizzo del server è " + ServerAddress());

S/eep

void Sleep(int milliseconds)

Questa funzione sospende l'esecuzione del codice per un


intervallo definito nell'argomento.
La si usa quando occorre aspettare che il server remoto
processi un ordine precedente e il codice possa trovare
traccia di esso nell'insieme corrispondente.

Parametri
Milliseconds Intervallo di pausa espresso in millisecondi.

//Chiusura e cancellazione di tutti gli ordini


for(int i=OrdersTotal()-1;i>=0;i—)
{
doublé B = MarketlnfofOrderSymbol(),MODE_BID) ;
doublé A = Marketlnfo(OrderSymbol(),MODE_ASK);

OrderSelect(i,SELECT_BY_POS);
if(OrderType()==OP_BUY)
OrderClose(OrderTicket O,OrderLots(),B,3,Red);
if(OrderType()==OP_SELL)
OrderClose(OrderTicket(),OrderLots(),A,3,Red);
if (OrderType()>OP_SELL)
OrderDelete(OrderTicket());
//Attesa di mezzo secondo
Slesp(500);

Pagina 115
Dainesi - Guida di riferimento ai /jnguaggio MQL

Symbol

string Symbol()

Questa funzione ritorna il nome dello strumento


rappresentato nel grafico. Grazie a questa funzione si può
scrivere del codice "auto-adattante" senza bisogno di
intervenire manualmente.
Sono molte le funzioni interne così come gli indicatori che
richiedono il dato restituito da questa funzione.
Un classico esempio di dove risulti la sua utilità è nella
gestione degli ordini esistenti. Un trading System solitamente
è chiamato a gestire solo gli ordini che genera e quindi quelli
del grafico a cui è collegato (da qui l'importanza di
riconoscere lo strumento tradato e confrontarlo con lo
strumento rappresentato sul grafico).

for (int i=OrdersTotal I )-1; i>=0; i — )

OrderSelect(i,SELECT_BY_POS);
if(OrderSymbol() =- Symbol())GestioneOrdine();

UninitializeReason

int UninitializeReason()

Questa funzione ritorna il codice che spiega il motivo per cui


il trading System o l'indicatore è stato disattivato.
I motivi possono essere molteplici, dagli errori di
programmazione alla disabilitazione volontaria da parte
dell'utilizzatore.
L'utilizzo di questa funzione risulta utile qualora si volesse
documentare tutte le attività svolte dal client e documentare
il tutto in un file di log (in alternativa si potrebbe inviare una
mail).
I codici restituiti possono essere uno di quelli riportati nell
atabella seguente.

Pagina 116
Dainesi - Guida di riferimento al linguaggio MQL

Descrizione
o Lo script è terminato autonomamente.
REASON...REMOVE 1 Expert rimosso dal grafico,
REASON_RECOMPILE 2 Expert ricompilato.

REASON_CHARTCHANGE 3 Cambio di strumento finanziario o di time frame.

REASON_CHARTCL05E 4 Chiusura del grafico.

REASOhLPARAMETERS 5 Cambio dei parametri utente dell'expert.


REASON_ACCOUNT 6 E' stato attivato un altro acount utente.

//Invìo dì una mali in caso di arr


int deinitO

string msg = TìmeDay(TimeCurrenti)1 + "." eMonth(TimeCurrent ( ));


msg = msg + "." +• TimeYear (TimeCurrent ()) + " ";
msg = msg + TimeHour(TimeCurrent()) + ":";
msg = msg + TimeMinute(TimeCurrent(]) + " " + Symbol{) + " " + Periodo ;
msg = msg + "Codice disabilitazione: " + UninitializeReasoni : + " (";

switch(Uni. itializeReason() )

case REASON_CHARTCLOSE: msg = msg + "CHARTCLOSE"; break;


case REASON_REMOVE: msg = msg + "REMOVE"; break;
case REASON_RECOMPILE: msg = msg + "RECOMPILE"; break;
case REA3ON_CKARTGRANGE : msg = msg + "CHARTCHANGE"; break;
case REASOH_PARAMETERS: msg = msg + "PARAMETERS"; break;
case REASON_ACCOUNT: msg = msg + "ACCOUNT"; break;
default: msg = "";break;

msg = msg + ")";


SendMail("Warning", msg);
Dainesi - Guida di riferimento al linguaggio MQL

Funzioni di Conversione

CharToStr() StrTolnteger()
DoubleToStr() StrToTime()
NormalizeDouble() TimeToStr()
StrToDouble()

Le funzioni di conversione permettono di convertire variabili


da un tipo ad un altro in modo che si possano utilizzare per
operazioni o pubblicazioni. Spesso è necessario convertire un
tipo in un altro per agevolare operazioni di confronto o di
calcolo. Si pensi ad esempio di voler calcolare l'entità dello
stop loss di una operazione quale multiplo della volatilità
espressa con l'indicatore ATR (Average True Range).
L'indicatore ritorna un valore in virgola mobile e questo deve
essere diviso per il valore del Pip per poter restituire l'entità
dello stop loss in pips. In questo caso occorre convertire un
valore doublé (l'ATR) per ottenere un numero intero di pips.
Pagina 119
Dainesi - Guida di riferimento al linguaggio MQL

CharToStr

string CharToStr(int char_code)

Questa funzione ritorna una stringa di un carattere


corrispondente al codice ASCII passato come argomento.

Parametri
char code Codice ASCII del carattere da ritornare.

string sCode = CharToString(189) + posizione al BEP";

il risultato sarà:
"% posizione al BEP e k all'attivazione del trailing stop"

Per comodità si riporta di seguito la tabellina dei 255 codici


ASCII

ASCII Caratteri di controllo (character code 0-31)


I primi 32 caratteri della tabella ASCII non sono stampabili ma rappresentano codici per la stampante o
altre periferiche

DEC OCT HI BIN Simbolo HTML Nr HTML Descri


0 000 00 00000000 NUL a#ooo; Nuli char
1 001 01 00000001 SOH &#001; Start of
2 002 02 00000010 STX &S002; Start of Text
3 003 03 00000011 ETX &#003; End of Text
4 004 04 00000100 EOT &#004;
5 005 05 00000101 ENQ &#005;
6 006 06 00000110 ACK &#006;
7 007 07 00000111 BEL &#007;
8 010 08 00001000 BS &#008;
9 Oli 09 00001001 HT S#009;
10 012 OA 00001010 LF &#010;
11 013 OB 00001011 VT &#011;
12 014 OC 00001100 FF &#012;
13 015 OD 00001101 CR &#013;
14 016 OE 00001110 SO &#014;
15 017 OF 00001111 SI &#015;
16 020 10 00010000 OLE &#016;
17 021 11 00010001 DC1 &#017; Device Control 1 (oft.
18 022 12 00010010 DC2 &#018; Device Control 2
19 023 13 00010011 DC3 &#019; Device Control 3 (oft. XOFF)

Pagina 120
Dainesi - Guida di riferimento al fingi/aggio MQL

024 4 00010100 DC4 &#020; Device Control 4


025 5 00010101 NAK &#021; Negative Acknowiedgernent
026 6 00010110 SYN &#022; Synchronous Idle
027 7 00010111 ETB &#023; End of Transmit Block
030 8 00011000 CAN &#024; Cancel
031 9 00011001 EM &#025; End of Medium
032 A 00011010 SUB &#026; Substitute
033 B 00011011 ESC &#027; Escape
034 C 00011100 FS &#028; Fiie Separator
035 n 00011101 65 &#029; Group Separator
036 F 00011110 RS &#030; Record Separator
037 F 00011111 us &#031; Unit Separator

ASCII caratteri stampabili (character code 32-127)


I codici da 32 a 127 sono comuni per tutte le diverse varianti della tabella ASCII, sono chiamati
stampabili poiché rappresentano lettere, caratteri, digitazioni, punteggiatura e una piccola varietà di
sìmboli. Molti di questi caratteri si ritrovano sulle tastiere estese. Il carattere 127 rappresenta il comando
DEL.

DEC OCT HEX BIN Sìmbolo HTMLN HTML Descrizione


040 20 00100000 &#32; Space
041 21 00100001 &#33; Exclamation mark
042 22 00100010 a#34; Doublé quotes {or speech
marks)
043 23 00100011 a#35; Number
00100100 a#36; Doflar
00100101 &#37; Procenttecken
046 00100110 a#38; Ampersand
047 00100111 a#39; Single quote
050 00101000 &#40; Open parenthesis (or open
bracket)
00101001 &#41; Close parenthesis (or dose
bracket)
42 052 2A 00101010 * a#42; Asterisk
43 053 2B 00101011 + a#43; Plus
44 054 2C 00101100 a#44; Comma
45 055 2D 00101101 &#45; Hyphen
46 056 2E 00101110 a#46; Perìod, dot or full stop
47 057 2F 00101111 / &#47; Slash or divide
48 060 30 00110000 0 a#48; Zero
49 061 31 00110001 1 a#49; One
SO 062 32 00110010 2 &#50; Two
51 063 33 00110011 3 &#51; Three
52 064 34 00110100 4 M52; Four
53 065 35 00110101 5 &#53; Rve
54 066 36 001 10 110 6 &#54; Six
55 067 37 00110111 7 &#55; Severi
56 070 38 00111000 8 &#56; Eight
57 071 39 00111001 9 &#57; Mine
58 072 3A 00111010 : &#58; Colon
59 073 3B 00111011 ; &#59; Semicoion
60 074 3C 00111100 < a#60; Less than (or open angled
bracket)
61 075 3D 00111101 &#61; Equals
62 076 3E 00111110 > a#62; &gt; Greater than {or dose
angled bracket)
63 077 3F 00111111 ? &#63; Question mark
64 100 40 01000000 @ a#64; At symboi

Pagina 121
Dainesi - Guida di riferimento al fingi/aggio MQL

5 101 41 01000001 A &#65; Uppercase A


>6 102 42 01000010 B a#66; Uppercase B
7 103 43 01000011 C &#67; Uppercase C
58 104 44 01000100 D a#68; Uppercase D
39 105 45 01000101 E &#69; Uppercase E
70 106 46 01000110 F a#70; Uppercase F
71 107 47 01000111 G &#71; Uppercase G
72 110 48 01001000 H &#72; Uppercase H
73 111 49 01001001 I &#73; Uppercase I
74 112 4A 01001010 J a#74; Uppercase J
75 113 4B 01001011 K &#75; Uppercase K
76 114 4C 01001100 L &#76; Uppercase L
77 115 4D 01001101 M &#77; Uppercase M
78 116 4E 01001110 N a#78; Uppercase N
79 117 4F 01001111 0 &#79; Uppercase O
90 120 50 01010000 p &#80; Uppercase P
31 121 51 01010001 Q &#81; Uppercase Q
92 122 52 01010010 R a#82; Uppercase R
33 123 53 01010011 s &#83; Uppercase S
94 124 54 01010100 T &#84; Uppercase T
35 125 55 01010101 u a#85; Uppercase U
96 126 56 01010110 V a#86; Uppercase V
B7 127 57 01010111 w &#87; Uppercase W
98 130 58 01011000 X &#88; Uppercase X
89 131 59 01011001 Y a#89; Uppercase Y
W 132 5A 01011010 z a#90; Uppercase Z
91 133 5B 01011011 [ &#91; Opening bracket
92 134 5C 01011100 \ &#92; Backslash
93 135
136
5D
SE
01011101 ]A
a#93; Closing bracket
Caret - circumflex
94 01011110 &#94;
95 137 5F 01011111 _ &#95; Underscore
96 140 60 01100000 &#96; Grave accent
97 141 61 01100001 a &#97; Lowercase a
98 142 62 01100010 b &#98; Lowercase b
99 143 63 01100011 C a#99; Lowercase e
100 144 64 01100100 d &#100; Lowercase d
101 145 65 01100101 e &#1Q1; Lowercase e
02 146 66 01100110 f &#102; Lowercase f
03 147 67 01100111 g &#103; Lowercase g
04 150 68 01101000 h &#104; Lowercase h
05 151 69 01101001 1 &#105; Lowercase i
06 152 6A 01101010 j &#106; Lowercase j
07 153 6B 01101011 k &#107; Lowercase k
08 154 6C 01101100 1 &#108; Lowercase I
09 155 6D 01101101 m &JH09; Lowercase m
10 156 6E 01101110 n & 110; Lowercase n
11 157 6F 01101111 0 & 111; Lowercase o
12 160 70 01110000 p & 112; Lowercase p
13 161 71 01110001 q & 113; Lowercase q
14 162 72 01110010 r & 114; Lowercase r
15 163 73 01110011 s & 115; Lowercase s
16 164 74 01110100 t & 116; Lowercase t
17 165 75 01110101 u & 117; Lowercase u
18 166 76 01110110 v S 118; Lowercase v
19 167 77 01110111 w & 119; Lowercase w
20 170 78 01111000 X & 120; Lowercase x
21 171 79 01111001 y & 121; Lowercase y
22 172 7A 01111010 z a 122; Lowercase z
123 173 7B 01111011 { & 123; Opening brace
124 174 7C 01111100 I &#124; Vertical bar

Pagina 122
DaJnesi - Guida di riferimento al linsuassio MQL

125 01111101 Closing brace


126 01111110 Equivalency sign - tilde
omini Delete

Codici ASCII estesi (character code 128-255)


Esistono molte varianti della tabella ASCII a 8 bit. L'elenco seguente siu riferisce alle norme ISO 8859-1
anche chiamate ISO Latin-1. I codici da 129 a 159 contengono il set esteso Microsoft® Windows Latin-1.

DEC OCT BIN HTML Hr HTML Descrìption


128 200 10000000 &#128; Euro sign
129 201 10000001
10000010 &#130; &sbquo; Single iow-9 quotation
msrk
10000011 a#131; Sfnof; Latin small letter f with
hook
84 10000100 &#132; Sbdquo; Doublé Iow-9 quotation
mark
133 85 10000101 a#133; &hellip; Horizontal ellipsis
134 10000110 &#134; &dagger; Dagger
135 10000111 &#135; &Dagger; Doublé dagger
10001000 &#136; Modifier letter circumflex
accent
10001001 &#137; Per mille sign
212 10001010 &#13S; ascaron; Latin capitai letter S with

213 a#139; Slsaquo; Single left-pointing angle


quotation
214 10001100 &#140; aOElig; Latin capitai ligature OE
215 10001101
216 10001110 &#142; Latin captisi ietter Z with

217 10001111
220 10010000
221 10010001 a#145; Left single quotation mark
146 222 10010010 a#146; Righi singie quotation rnark
147 223 10010011 a#147; Left doublé quotation mark
10010100 &#148; Right doublé quotation
mark
225 10010101 Sbull; Buliet
226 10010110 &#150; Sndash; En dash
227 10010111 &#1S1; arndash; Ern dash
230 10011000 &ti!de; Small tilde
153 10011001 a#153; atrade; Trade mark sign
154 10011010 a#154; ascaron; Latin small letter S with
caron
10011011 &#155; &rsaquo; Single right-pointing angle
quotation mark
234 10011100 a#156; &oelig; Latin small ligature oe
235 9D 10011101
236 9E 10011110 &#158; Latin small letter z with

10011111 Latin capitai letter Y with


diaeresis
10100000 &ntasp; Non-breaking space
10100001 &#16I; aiexcl; Inverted exclamatìon mark
10100010 &#162; Cent sign
243 10100011 apound; Round sign
244 10100100 Scurren; Currency sìgn

Pagina 123
Daìnesi - Guida di riferimento ai f/nguaggio MQL

165 245 A5 10100101 ¥ &#165; ayen; Yen sign


166 246 A6 10100110 i a#166; abrvbar; Pipe, Broken vertical bar
167 247 A7 10100111 § a#167; asect; Sertion sign
168 250 A8 10101000 &#168; &.uml; Spacing diaeresis - umlaut
169 251 A9 10101001 © S#169; &copy; Copyright sign
a
170 252 AA 10101010 a#170; &ordf; Feminìne ordinai indicator
171 253 AB 10101011 « a#171; aiaquo; Left doublé angle quotes
172 254 AC 10101100
&#17 anot; Not
2; sign
173 255 AD 10101101
&#17 ashy; Soft
3; hyphe

174 256 AE 10101110 ® a 74; areg; Registered trade mark sign


175 257 AF 10101111 a 75; amacr; Spacing macron - overline
176 260 BO 10110000 ° & 76; adeg; Degree sign
177 261 Bl 10110001 ± & 77; &plusmn; Plus-or-minus sign
2
178 262 B2 10110010 & 78; &sup2; Superscript two - squared
3
179 263 B3 10110011 & 79; &sup3; Superscript three - cubed
180 264 B4 10110100 a 80; aacute; Acute accent - spacing
acute
181 265 B5 10110101 |J a#181; &micro; Micro sign
182 266 B6 10110110
&#18 apara Riero
2; w
sign-
parag
raph
sign
183 267 B7 10110111 a#183; amiddot; Middle dot - Georgian
comma
184 270 88 101 1000 &#184; &cedil; Spacing cedilla
1
185 271 B9 101 1001 a#185; &supl; Superscript one
186 272 BA 101 1010 ° a#186; aordrn; Masculine ordinai indicator
187 273 BB 101 1011 » &#187; Sraquo; Right doublé angle quotes
188 274 BC 101 1100 Vi a#188; &frac!4; Fraction one quarter
189 275 BD 101 1101 Vi a#189; &frac!2; Fraction one half
190 276 BE 101 1110 % a#190; afrac34; Fraction three quarters
191 277 BF 101 lili i &#191; aiquest; Inverted question mark
192 300 CO 11000000 A &#192; &Agrave; Latin capitai letter A with
grave
acute,
' acute
194 302 C2 nooooio A a#194; aAcirc; Latin capitai letter A with
ctrcumfiex
195 303 C3 11000011 A a#195; aAtilde; Latin capitai letter A with
tilde
196 304 C4 11000100 A &#196; aAuml; Latin capitai letter A with
diaeresis
197 305 C5 11000101 A a#197; SAring; Latin capitai letter A with
ring a bove
198 306 C6 11000110 /E a#198; &AEIig; Latin capitai letter AE
199 307 C7 11000111 C &#199; SCcedil; Latin capitai letter C with
cedilla
200 310 C8 11001000 È a#200; aEgrave; Latin capitai letter E with
grave
201 311 C9 11001001 È &#201; aEacute; Latin capitai letter E with
acute
202 312 CA 11001010 È a#202; &Ecirc; Latin capitai letter E with
circumflex

Pagina 124
Dainesi - Guida di riferimento al linguaggio MQL

203 313 CB 11001011 E &#203; SEuml; Latin capitai letter E with


diaeresis
204 314 CC 11001100 i &#204; &ìgrave; Latin capitai ìetter I with

205 315 CD 11001101 i a#205; aiscute; Latin capitai letter I with


acute
206 316 CE 11001110 i a#206; Sdcirc; Latin capitai letter I with
circumflex
207 317 CF 11001111 i &#207; aiuml; Latin capitai letter I with
diaeresis
208 320 DO 11010000 D S#208; &ETH; Latin capitai letter ETH
209 321 DI 11010001 N &#209; SNtilde; Latin capitai letter N with
tilde
210 322 D2 11010010 o &#210; &0grave; Latin capitai letter 0 with
grave
211 323 D3 11010011 o &#211; SOacute; Latin capitai letter O with
acute
212 324 D4 11010100 o S#212; &0circ; Latin capitai letter 0 with
circumfìex
213 325 D5 11010101 o &#213; SOtilde; Latin capitai letter 0 with
tiìde
214 326 D6 11010110 o &#214; &0uml; Latin capitai letter 0 with
diaeresis
215 327 D7 11010111 X &#215; atirnes; Multiplication sign
216 330 D8 11011000 0 &#216; aoslash; Latin capitai letter 0 with
slash
217 331 D9 11011001 ù &#217; &Ugrave; Latin capitai letter U with
grave
218 332 DA 11011010 ù &#218; &Uacute; Latin capita) letter U with
acute
219 333 DB 11011011 ù &#219; &UcÌrc; Latin capitai letter U with
circumflex
220 334 DC 11011100 u a#220; &Uuml; Latin capitai letter U with
diaeresis
221 335 DD 11011101 ? &#221; &Yacute; Latin capitai letter Y with
acute
222 336 DE 11011110 t> a#222; &THORN; Latin capitai Setter THORN
223 337 DF 11011111 lì &#223; &szlig; Latin srnall letter sharp s -

224 340 EO 11100000 a &#224; &agrave; Latin srnall letter a with


grave
225 341 El 11100001 a &#225; &aacute; Latin small letter a with
acute
226 342 E2 11100010 a &#226; &acirc; Latin srnall letter 3 with
circumflex
227 343 E3 11100011 a &#227; &ati!de; Latin small letter a with
tilde
228 344 E4 11100100 a &#228; &auml; Latin small letter a with
diaeresis
229 345 E5 11100101 a &#229; &aring; Latin small letter a with
ring a bove
230 346 E6 11100110 sa &#230; Sgelici; Latin small letter ae
231 347 E7 11100111 5 &#231; &ccedil; Latin srnall letter e with
cedilla
232 350 E8 11101000 è &#232; Segrave; Latin small letter e with
grave
233 351 E9 11101001 è &#233; &eacute; Latin small letter e with
acute
234 352 EA 11101010 è &#234; Secirc; Latin srnall letter e with
circumflex
235 353 EB 11101011 è &#235; &euml; Latin small letter e with
diaeresis

Pagina 125
Doinesi - Guida di riferimento al linguaggio MQL

236 354 EC 11101100 i &#236; &igrave; Latin srnall letter i with


grave
237 355 ED 11101101 i &#237; Siacute; Latin smatl letter i with
acute
238 356 EE 11101110 ì S#238; Sicirc; Latin small letter i with
cirojmflex
239 357 EF 11101111 i' &#239; &iuml; Latin small letter ì with
diaeresis
240 360 FO 11110000 5 S#240; &eth; Latin small iettereth
241 361 FI 11110001 fi &#241; Sntilde; Latin small letter n with
tilde
242 362 F2 11110010 O &#242; Sograve; Latin small letter o with
grave
243 363 F3 11110011 o &#243; &oacute; Latin small letter o with
acute
244 364 F4 11110100 6 &#244; Stocirc; Latin small letter o with
circumflex
245 365 F5 11110101 6 S#245; Sotilde; Latin small letter o with
tilde
246 366 F6 11110110 o &#246; Souml; Latin small letter o with
diaeresis
247 367 F7 11110111 -i &#247; Sdivide; Division sign
248 370 F8 11111000 0 &#248; Soslash; Latin small letter o with
slash
249 371 F9 11111001 ù &#249; Sugrave; Latin small letter u with
grave
250 372 FA muoio ù &#250; Suacute; Latin small letter u with
acute
251 373 FB limoli o &#251; &ucirc; Latin small letter u witft
circumflex
252 374 FC 11111100 Ù &#252; &uuml; Latin small letter u with

253 375 FD 11111101 y &#253; &yacute; Latin srnali letter y with


acute
254 376 FÉ ninno b &#254; &thom; Latin small letter thorn
255 377 FF umili y &#255; &yuml; Latin smail ìetter y with

DoubleToStr

string DoubleToStr(double value, int digits)

Questa funzione ritorna una stringa di testo che converte in


testo un numero a precisione doppia e troncandolo ad un
numero dato di decimali.

Parametri
Value Valore numerico.
Digits Numero di decimali rappresentati (da O a 8).

//Conversione di un numero a virgola mobile in testo

Pagina 126
Daìnesì - Guida dì riferimento al /injuaggio AiQjL

doublé dM = iMA(SymbolO,Periodi),26,0,MODE_EMA,PRICE_CLOSE,1);
Comment("Valore della media esponenziale: " + DoubleTOString(dM, 4));

NormalizeDouble

doublé NormalizeDouble(double value, int digits)

Questa funzione è un pò particolare poiché non converte una


variabile di un tipo in un altra ma semplicemente "arrotonda"
un numero in virgola mobile alla precisione desiderata (ovvero
al numero di decimali riportati come secondo argomento).

Parametri
Value Valore a virgola mobile.
Digits Precisione desiderata (0-8).

/ / N o r m a l i z z a z i o n e del p r e z z o d'ordine
OrderClose(OrderTicket(),OrderLots O,NormalizeDouble(Bid,4),3,Green);

StrToDouble

doublé StrToDouble(string value)

Questa funzione converte una stringa di testo in un numero a


virgola mobile. Attenzione che l'argomento deve essere una
rappresentazione di un numero, in caso contrario ritornerebbe
0.

Parametri
Value Stringa di testo contenente un numero decimale.

ouble dpart = StrToDouble("1,5");

Pagina 127
Da/nesi - Guida dì riferimento al linguaggio MQÌ.

StrToInteger

int StrTolnteger(string value)

Questa funzione converte una stringa di testo in un numero


intero. Attenzione che l'argomento deve essere una
rappresentazione di un numero, in caso contrario ritornerebbe
0.

Parametri
Value Stringa di testo contenente un numero intero.

int iPart = strToInteger("115");

StrToTime

datetime StrToTime(string value)

Questa utilissima funzione converte una stringa di testo in


formato "yyyy.mm.dd hh:mi" in un tipo datetime, che è un
intero ma rappresentante il numero di secondi passati dal 1
gennaio 1970.

Parametri
Value Stringa della data in formato"yyyy.mm.dd nhrmi".

datetime dtStart;
dStart = StrToTime("2010.4.2 18:53");
dStart = StrToTime{"18:53"); //Ritorna la data di oggi all'ora indicata
dStart = StrToTime("2010.4.2");//Ritorna il giorno all'ora attuale

Pagina 128
Dainesi - Guida di riferimento al linguaggio MQL

TimeToStr

string TimeToStr(datetime value, int mode=TIME_DATE | TIME_MINUTES)

Questa funzione converte una data in una stringa di testo


decisamente più comprensibile. Viene spesso usata per la
creazione di file di log. La data ritornata è nel formato
"yyyy.mm.dd hh:mi".

Parametri
Value Numero positivo di secondi passati dal 1 ° Gennaio
1970.
Mode Optional - Formato data preferito (uno o più dei
seguenti)

Formati ammessi
(nell'esempio la data è il 2 Maggio 2010 16:40 25")
TIME_DATE formato "yyyy.mm.dd" (2010.05.02)
TIME_MINUTES formato "hh:mi" (16:40)
TIME_SECONDS formato "hh:mi:ss" (16:40:25)

datetime dtclose;
dtclose = OrderCloseTimeO ;
Print("Ordine chiuso il " + TimeToStr(dtclose, TIME DATE ITIME_SECONDS) ;

Pagina 129
Dainesi - Guida di riferimento al (inguauio MQf.

Indicatori personalizzati

IndicatorBuffersO SetlndexBuffer() SetlndexStyle()


lndicatorCounted() SetlndexDrawBegin() SetLevelStyle()
IndicatorDigitsO SetlndexEmptyValue() SetLevelValue()
lndJcatorShortName() SetlndexLabelQ
SetlndexArrow() SetlndexShift()

Una delle caratteristiche più desiderate dagli utilizzatori delle


piattaforme di trading "grafico" è la capacità di crearsi i
propri indicatori o modificare quelli esistenti per sondare

Pagina 131
Dainesi - Guida di riferimento al linsua$$ìo MQÌ.

nuove strategie o semplicemente per adattare quelle


esistenti.
Il linguaggio MQL permette la creazione di nuovi indicatori e a
tal proposito presenta una serie di funzioni dedicate alla
gestione dei dati necessari alla creazione, elaborazione e
rappresentazione di indicatori personalizzati.
Per creare un indicatore è necessario impostare dei buffer di
dati, ovvero dei contenitori che conterranno i dati relativi ai
valori dell'indicatore (e dei suoi componenti16). Alla
piattaforma occorre poi indicare dove dovrà essere
rappresentato l'indicatore (se nella stessa finestra delle
quotazioni o in una separata) e come, in che forma, verrà
rappresentato (linea, tstogramma, freccia, ecc..) e con che
stile grafico. Inoltre, affinchè sia agevole la sua lettura, con
che nome apparire. Per adempiere a tutti questi compiti si
utilizzano le funzioni sopra elencate e che di seguito verranno
spiegate.
Per completezza espositiva occorre inoltre rammentare che
nel novero degli indicatori rientrano anche tutte quelle forme
di rappresentazione grafica estemporanea che mostrano sullo
schermo, tramite elementi grafici, particolari informazioni
che però non possono essere visualizzate per periodi anteriori
(es. una rappresentazione a forma tabellare di una serie di
indicatori di correlazione).

IndicatorBuffers

void lndicatorBuffers(int count)

Questo metodo alloca la memoria per I buffer usati dalle


elaborazioni dell'indicatore personalizzato. Il massimo
numero consentito è 8 e non può essere inferiore al numero
indicato con la proprietà indicator_buffers.

Un indicatore può essere semplice, in tal caso esporrà un singolo valore per ogni barra, o composto e in questo caso
ogni barra avrà più serie dati che rappresentano i valori dell'indicatore. La media è un indicatore semplice infatti l'unico
valore che mostra è quello del prezzo medio. L'ADX è un indicatore composto i cui valori esposti sono l'ADX e le sue
componenti direzionali (DI+ e DI-).
Pagina 132
Daìnesi - Guida di riferimento al ftnguaggjo MQ1.

Se dovessero rendersi necessari ulteriori buffer è sempre


possibile utilizzare degli array e puntare ad essi con I dati
contenuti in uno degli 8 buffer consentiti.
Un buffer è fondamentalmente un array dinamico i cui valori
sono statici tra una chiamata e l'altra e la cui disposizione
all'interno è inversa rispetto agli array tipici: l'ultimo
elemento (il più recente) è il primo mentre l'ultimo è il più
remoto (negli array di norma è l'opposto).

Parametri
Count Numero di Buffers a cui allocare memoria (8
al massimo).

//Esempio

#property indica tor_separ a te_window

Iproperty indicator_colorl DodgeBlue

extern int SMA = 20;


extern doublé Dev = 1.5;

doublé i n d _ b u f f e r ì [ ] ;
doublé i n d _ b u £ f e r 2 [ ] ;
doublé ind b u f f e r 3 [ ] ;

IndicatorBuffersO) ;

SetlndexStyle(O,DRAW_LIHE,STYLE_SOLID,31 ;
etlndexDrawBegin(O, SMA! ;
IndicatorDigits(2);

SetIndexBuffer(0,ind_bufferl);
SetlndexBuffer(1,ind_buffer2);
SetlndexBuffer{2,ind_buffer3);

IndicatorShortName ("Percent B(" + SMA + "

Pagina 133
Dainesi - Guida di riferimento al linguaggio

IndicatarCounted

int lndicatorCounted()

Questa funzione indica quante barre che non cambiano


dall'ultima chiamata all'esecuzione dell'indicatore
(dall'ultimo tick o cambiamanto). Spesso il valore ritornato è
zero in quanto molti indicatori basano i propri calcoli sulla
barra conclusa. Questa funzione viene utilizzata per
ottimizzare gli indicatori da parte del programmatore che li
ha creati.

int starti)

int limit;
int counted_bars=lndicatorCounted() ;

// ---- controllo errori


if (counted_bars<0) return(-l) ;

// ---- L'ultima barra, essendo in evoluzione, la si ricalcola.


if (counted_bars>0) counted_taars--;

limìt=Bars-counted_bars;

// ---- ciclo principale


for (int i=0; i< limit; i+

return(O);

IndìcatorDìsits

void lndicatorDigits(int digits)

Metodo che imposta il numero di decimali mostrati in


visualizzazione (non incide sui calcoli interni).

Pagina 134
Dainesi - Guida di riferimento al linguaggio MQ/.

Parametri
Digits Precisione, numero di posizioni dopo la virgola.

ftproperty ìndicator separate_window


tproperty indicator_buffers 1
ffproperty indicator_colorl DodgeBlue

extern int SMA = 20;


extern doublé Dev = 1.5;

doublé ind_bufferl[] ;
doublé ind_buffer2[] ;
doublé ind_buffer3[];

IndicatorBuffers(3);

SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,3) ;
SetlndexDrawBegìn(O, SMA);
IndicatorDigits(2);

SetlndexBuffer(O,ind_bufferl);
SetlndexBuffer(1,ind_buffer2);
SetlndexBuffer(2,ind_buffer3);

IndicatorShortNarae("Percent B(" + SMA + " + Dev + ")");

return(O);

Indica torShortName

void lndicatorShortName(stnng name)

Questo metodo imposta il nome dell'indicatore che verrà


mostrato nella finestra apposita affianco al grafico.

Parametri
Name Nome mostrato (non necessariamente uguale
al nome dell'indicatore).

Pagina 135
Dainesì - Guida di riferimento al linguaggio MQJ.

#property indicator_buf fers 1


ftproperty indicator_colorl DodgeBlue

extern int SMA = 20;


extern doublé Dev = 1.5;

doublé ind_bufferl[] ;
doublé ind_buf fer2 [] ;
doublé ind~buffer3 [] ;

IndicatorBuffers (3) ;

SetlndexStyle (O, DRAWJLINE, STYLE_SOLID, 3) ;


SetlndexDrawBegintO, SMA);
IndicatorDigits (2) ;

set!ndexBuffer(0,ind_bufferl);
SetlndexBuf fer (1, ind_buffer2) ;
SetIndexBuffer(2,ind_buffer3) ;

IndicatorShortNameC'Percent B(" + SMA + " a + Dev -f ")");

return {01 ;

SetlndexArrow

void SetlndexArrow(int index, int code)

Questo metodo imposta il codice della freccia che verrà


utilizzata dall'indicatore che disegna le linee come frecce
(alcuni indicatori mostrano punti di svolta e non valori
continui e quindi è richiesto loro di mostrarsi graficamente
come un simbolo a forma di freccia o similare). I codici
disponibili sono quelli contenuti nel set di font Wingdings a
corredo di ogni installazione di Windows.

Pagina 136
Dainesi • Guida di riferimento al /jnguaggio A1QÌ

Parametri
Index Indice cardinale del buffer contenente i dati. Deve
essere da O a 7.
Code Codice del simbolo del font Wingdings o una
costante facente parte di quelli seguenti:

Costante Valore

SYMBOLJHUMBSUP 67 polite in alto (4°).

SYMBOLTHUMBSDOWN 68 Pollice verso C?).

SYMBOLAP.ROWUP 241 Friìcda in a,to ( tf,.

SYMBOLARROWDOWN 242 Frteda In basso («•).

SYMBOLSTOPSIGN 251 5 t o p ( X).

SYMBOLj:HECKSIGN 252 vis,o ,/

//Esempio
SetIndexArrow{0, 217); //Imposta il simbolo A

Elenco dei simboli presenti nel set font Wingdings

Valore Simbolo Valore Simbolo Valore Simbolo Valore Simbolo Valore Simbolo
32 (vuoto) '7 «- 122 M 167 212
'8 t 123 168 a 213 ^
<SJ
'9 ffc 124 • 169 * 214 E>
10 P- 125 170 -*• 215
11 + -
>
126 171 * 216
12 0 127 D 172 * 217 t'
13 * 128 © 173 * 218 -f
14 * 129 © 174 * 219 C
15 * 130 ® 175 * 220 0
16 * 131 ® 176 t 221 0
17 t 132 ® 177 i 222 o
18 * 133 © 178 * 223 <-
19 * 134 © 179 « 224 ^
IO C 135 © 180 * 225 t

Pagina 137
Dainesi - Guida di riferimento al linguaggio MQL

47 *& 92 & 137 ® 182 * 227


48 n 93 e 138 ® 183 3 228
49 :' 94 T 139 O 184 ^ 229
50 • 95 & 140 O 185 -Ll 230
51 96 n 141 e 186 0 231
52 97 ss 142 e 187 C' 232
53 i-I 98 4 143 o 188 '.' 233
54 i 99 il 144 e 189 03 234
55 fi. 100 G 145 © 190 ••>• 235
56 ^ 101 m 146 o 191 ® 236
57 V 102 >f 147 o 192 lJl
' 237
56 » 103 !*> 148 © 193 (l
238
59 104 sa 149 ® 194 239
60 105 M 150 (.->! 195 <f 240
6i a 106 er 151 » 196 t 241
62 107 <& 152 sr> 197 ^ 242
63 «: 108 • 153 es 198 tf* 243
64 >* 109 O 154 A* 199 •*- 244

66 * 111 p 156
-^
201 <? 246
67 i 112 D 157 w 202 t 247

249
250
206
207

74
75
76

SetlndexBuffer

bool SetlndexBuffer(int index, doublé array[])

Questa funzione imposta I buffer per le singole linee


dell'indicatore. L'array indicato nel secondo parametro
contiene i dati elaborati del valori corrispondenti al set
indicato nel primo parametro. Se, ad esempio, il nostro

Pagina 138
Daìnesi - Guida di riferimento al linguaggio MQL

indicatore espone tre valori per ognuno di questi esisterà un


array che funge da buffer di memoria il quale deve essere
quindi collegato ai valori esposti. Se la funzione riesce
restituisce true, se fallisce ritorna false.
Per ottenere maggiori informazioni sull'errore incontrato si
suggerisce di utilizzare la funzione GetLastError().

Parametri
Index Indice della linea dell'indicatore. Da O a 7.
array[] Array che memorizza I valori calcolati
dell'indicatore.

doublé ExtBufferMedia[];
int initO
(
SetIndexBuffer{0, ExtBufferMedia); // imposta
dati

SetlndexDrawBegin

void SetlndexDrawBegin(int index, int begin)

Questo metodo imposta la prima barra dalla quale l'indicatore


inizia ad essere rappresentato. Le barre antecedenti questo
valore non mostreranno nessuna rappresentazione
dell'indicatore.
E' sempre meglio evitare di eccedere con questo valore per
cercare di risparmiare memoria, specie sui sistemi meno
dotati di risorse (ram e cpu).

Parametri
Index Indice del set di dati dell'indicatore. Da O a 7.
Begin Indice della prima barra dalla quale inizia la
rappresentazione dell'indicatore.

SMA - 20;
extern doublé Dev - 1.5;

Pagina 139
Dainesi - Guida di riferimento al /inguagg/o MQÌ-

double i n d _ b u f f e r ì [ ] ;
doublé i n d _ b u f f e r 2 [ ] ;
doublé ind__buffer3[] ;

//I Custom indicator initialization functio

int init(l
(

IndicatorBuffers(3);

SetlndexStyle(O,DRAW_LINE,STYLE^SOLID, 3);
SetlndexDrawBegin(O, SMA);
IndicatorDigits(2);

SetlndexBuffer(O,ind_bufferì);
SetIndexBuffer(l,ind_buffer2);
SetlndexBuffer(2, ìnd_buffer3);

IndicatorShortName ("Percent Bf" + SMA + " a + Dev + ")");

return(0);

SetlndexEmptyValue

void SetlndexEmptyValuefint index, doublé value)

Questo metodo imposta il valore assunto dalla serie dati


quando il suo valore è mancante. Se non diversamente
specificato il valore mostrato per gli elementi mancanti è
EMPTY_VALUE. I valori vuoti non vengono disegnati sulla
finestra grafico. Grazie a questa caratteristica è possibile
associare diversi colori ad una linea (o altra forma grafica)
dando continuità al disegno ma variando l'effetto cromatico.
Un esempio potrebbe essere un indicatore a istogramma che
cambia colore a seconda che sia in crescita progressiva,
crescita stabile, crescita in esaurimento, stabile, calo
progressivo, calo stabile o calo in esaurimento. In questo caso
si potrebbero usare 7 buffer e impostare loro un colore
diverso. Quando una di queste serie viene valorizzata le altre
sono impostate a Empty value così da non apparire
visualizzate e lasciare in evidenza il colore della sola serie
valida.
Pagina 140
Dainesi - Guida di riferimento al lì

Parametri
Index Serie dati. Da O a 7.
Value Nuovo valore per empty value.

//Impostazione al valore -1.000 di ogni elemento vuoto della terza serie


//dati
SetIndexEmptyValue(2,-1000);

SetlndexLabel

void SetlndexLabel(int index, string text)

Questo metodo imposta la descrizione della serie dati


all'interno della finestra dati.
Molto spesso si vedono indicatori personalizzati le cui serie
non sono nominate e per l'utilizzatore la comprensione
diventa difficile.
E' buona norma indicare il nome delle serie dati per
agevolarne la comprensione e la lettura.
Nella figura seguente si può osservare come l'indicatore delle
Bande di Bollinger esponga sue serie dati i cui valori sono
riportati nella finestra dati con tanto di descrizione
esauriente.

Parametri

Pagina 141
Dainesi - Guida di riferimento al (inguag$io MQJ.

Index Serie dati. Da O a 7.


Text Testo mostrato. NULL significa che I dati non
compariranno nella finestra dati.

//Es. Rifandoci all'immagine di cui sopra ...


SetlndexLabel (O, "Bands (" + iBBPeriods 4- ") Upper") ;

SetlndexShift

void SetlndexShift(int index, int shift)

Questo metodo imposta lo scostamento della serie dati. La


serie viene conteggiata dalla barra in esecuzione ma la sua
rappresentazione potrebbe essere "spostata". Numeri negativi
spostano nel futuro mentre quelli positivi nel passato (vedi ad
esempio Alli$ator e khimoku Kinko Hyo).

Parametri
Index Serie dati. Da O a 7.
Shift Scostamento di rappresentazione in barre.

set!ndexShift(0,Jawsshift);
SetIndexShift(l,TeethShift);
SetlndexShift(2,LipsShift);

SetlndexStyle

VOid SetlndexStyle(int Index, Int type, int style=EMPTY, int width=EMPTY,color


clr=CLR_NONE>

Questo metodo imposta un nuovo tipo, stile, ampiezza e


colore per una serie dati dell'indicatore.

Parametri

Pagina 142
Dainesi - Guida di riferimento al /jnguags'o MQL

Index Serie dati. Da O a 7.


Type Stile della forma. Deve essere una di quelle
permesse dalle costanti enumeratile Drawin$
shape styie.
Style Stile di disegno. Ad eccezione dello stile
STYLE_SOLID, tutti gli altri stili sono consentiti solo
con la larghezza 1. Lo stile è indicato con una delle
costanti enumerative Drawin$ shape style.
Il valore EMPTY indica nessun cambiamento di stile.
Width Larghezza della linea. I valori ammessi sono da 1 a
5 e EMPTY che significa nessun cambiamento.
Clr Colore della linea.

SetIndexStyle(3, DRAW_LIHE, STYLE_SOLID, 2, Red);

Drawing shape styie


Costante V
DRAWJJNE O Linea.
DRAW_SECnON 1 Segmento,

DRAW_HISTOGRAM 2 telegramma.

DRAW_ARROW 3 Freccia (symbols).


DRAW_2IGZAG 4 Segmenti a Zig Zag.

DRAW_NONE 12 No drawing.

Drawing slyle. Valido quando widlh= 1.

Costante Valore Descrizione

STYLE_SOLJD 0 Linea continua.

S7YLE_DASH 1 Linea tratteggiata.


STYLE_DOT 2 Linea puntinata.
STYLE.DASHDOT 3 La linea alterna tratti e punti.
STYLE_DASHDOTDOT 4 La linea alterna traiti e doppi punti.

Pagina 143
Dainesi - Guida di riferimento al (insuaggjo MQL

SetLevelStyle

void SetLevelStyle(int draw_style, int line_width, colar


clr=CLR_NONE)

Questo metodo imposta lo stile di disegno, l'ampiezza ed il


colore dei livelli dell'indicatore. I livelli sono delle linee
orizzontali che evidenziano particolari quote raggiunte
dall'indicatore (ad esempio i livelli di ipercomprato e
ipervenduto per un oscillatore o il livello di trend per un
indicatore di momentum).

Parametri
draw_style Stile di disegno. Ad eccezione di STYLE_SOLID,
tutti gli altri stili sono validi se la larghezza
rimane impostata a 1. Il valore deve
corrispondere ad una delle costanti
enumerative Shape style. Il valore EMPTY
indica che la linea non verrà disegnata.
line_width Larghezza della linea. Valori da 1 a 5. EMPTY
significa nessun cambiamento.
Clr Colore della linea.

//Imposta lo stile come una linea tratteggiata rossa


SatLevelStyle(STYLE_SOLID, 2, Red);

SetLevelValue

int SetLevelValue(int leve), doublé value)

Questa funzione un nuovo valore per il livello dell'indicatore


(ad esempio si porta a 30 il livello per l'ipervenduto dal
precedente 20).

Parametri
Level Indice del livello (da O a 31 essendo al
massimo 32 i livelli).

Pagina 144
Dainesi - Guida di riferimento al t/nguaggfo MQf.

Value Nuovo valore del livello.

//Imposta il secondo livello a 30


SetLevelValueU, 30) ;

Pagina 145
Dainesi - Guida di riferimento al linguaggio MQL

Funzioni di data e orario

CurTime() Minute() TimeHour()


Day() Month<) TimeMinuteO
DayOfWeek() SecondsQ TimeMonth()
DayOfYear() TimeDayj) TimeSeconds()
Hour() TimeDayOfWeekO TimeYear()
LocalTime() TimeDayOfYear() Year()

In questo capitolo verranno prese in considerazioni tutte


quelle funzioni che ci permettono di leggere, impostare e
manipolare I valori di data e orario.
Le date le troviamo in ogni barra poiché essa legata ad un
orario di apertura. Le date le troviamo in ogni ordine (data di
apertura e data di chiusura). Inoltre le date le vogliamo
impostare noi per porre dei vincoli orari alla nostra attività di
trading (spesso risulta conveniente operare solo quando i
mercati valutari sottostanti sono aperti).

Pagina 147
Dainesi - Guida di riferimento al linguaggio MQL

Ogni orario è in realtà un numero rappresentante la quantità


di secondi passati dalla mezzanotte del 31 Dicembre 1969,
ovvero le 0:00 del 1 ° Gennaio 1970.
CurTime

datetime CurTime()

Questa funzione ritorna l'orario rilevato sul server del broker.

if(CurTimeO-OrderOpenTìme()<360) r e t u r n ( O ) ;

Day

int Day()

Questa funzione ritorna il giorno corrente del mese.

if(Day()<5) return(O);

DayOfWeek

int DayOfWeek()

Questa funzione ritorna il giorno corrente della settimana


dove O rappresenta la domenica e 6 il sabato.

// sì scartano I weekend.
if(DayO£Week<>•-O [ I DayOfWeek<)=-6) return(O);

Pagina 148
Dajnesi - Guida di riferimento al //nguoggio MQÌ-

DayOfYear

int DayOfYearQ

Questa funzione ritorna il giorno corrente dell'anno inteso


come numero tra 1 e 365/6.

if (DayOfYearO-- 2 4 5 )
return(true);

Hour

int HourQ

Questa funzione ritorna l'ora corrente nel formato 0-23

bool is m siesta=false;
i f ( H o u r ( ) > - 1 2 I I Bour()<17)
is siesta=true;

LocalTime

datetime LocalTime()

Questa funzione ritorna l'ora corrente sul computer client. E'


utile per definire il differente fuso orario tra noi ed il server
del broker.

if(LocalTimeO-OrderOpenTime()<360) return(0);

Pagina 149
Dainesi - Guida di riferimento al linguaggio MQL

Minute

int Minute()

Questa funzione ritorna I minuti correnti (0,1,2,..59).

if(Minute()<=15)
return("first quarter");

Month

int Month()

Questa funzione ritorna il mese corrente considerando 1


Gennaio e 12 Dicembre.

if(Month()<=5)
r e t u r n ( " f ì r s t half of y e a r " ) ;

Secondi

int SecondsQ

Questa funzione restituisce I secondi correnti (0,1,2,..59).

if(Seconds()<=15)
return(0) ;

Pagina 150
Dainesi - Guida di riferimento al /inguaggio MQL

TimeDay

int TimeDay(datetime date)

Questa funzione restituisce il giorno del mese della data


passata come argomento.

Parametri
Date Data.

int d a y = T i m e D a y ( D ' 2 0 0 3 . 1 2 . 3 1 ' ) ;


// giorno 31

TìmeDayOfWeek

int TimeDayOfWeek(datetime date)

Questa funzione restituisce il giorno della settimana della


data passata come argomento, considerando O la domenica e
6 il sabato.

Parametri
Date Data.

int weekday=TiraeDayOfWeek(D'2004.11.2') ;
// il giorno è 2 - tuesday

TimeDayOfYear

int TimeDayOfYear(datetime date)

Questa funzione restituisce il giorno dell'anno della data


passata come argomento, il giorno è rappresentato dal
numero progressivo da 1 a 365/6.

Pagina 151
Dainesi - Guida dì ri/erimento al /inguaggro MQL

Parametri
Date Data.

Lnt day=TimeDayOfYear(CurTime());

TimeHour

int TimeHour(datetime lime)

Questa funzione restituisce l'ora della data passata come


argomento.

Parametri
Time Data.

Lnt h=TimeHour{CurTime());

TimeMinute

int TimeMinute(datetime time)

Questa funzione restituisce i minuti della data passata come


argomento.

Parametri
Time Data.

nt m=TimeMinute(CurTime()) ;

Pagina 152
Dainesi - Guida di riferimento al /jnguaggio MQi.

TimeMonth

int TimeMonth(datetime lime)

Questa funzione restituisce il mese della data passata come


argomento.

Parametri
Time Data.

TimeSeconds

int TimeSeconds(datetime lime)

Questa funzione restituisce i secondi della data passata come


argomento.

Parametri
Time Data.

int m=TimeSeconds (CurTime O ) ;

TimeYear

int TimeYear(datetime lime)

Questa funzione restituisce l'anno della data passata come


argomento. L'anno deve rientrare tra il 1970 ed il 2037.

Parametri
Time Data.

Pagina 153
Dainesi - Guida di riferimento al (inguoggjo

int y=TimeYear(CurTime());

Year

int Year()

Questa funzione restituisce l'anno corrente.

// return if date before 1 May 2002


if(Year<>==2002 SS Month()<5)
return(0);

Pagina 154
Dainesi - Guida di riferimento al (mguagsio MQL.

Funzioni di manipolazione dei file

FileClose() FileReadArrayO FileTell()


FileDelete() FileReadDoublef) FileWriteO
FileFlush() FileReadlnteger() FileWriteArrayO
FilelsEndingO FileReadNumberO FileWriteDoubleO
FilelsLineEndingO FileReadStrìngO FileWritelntegerO
FileOpen() FileSeek() FìleWriteStringO
FileOpenHistoryO FileSize()

In questo capitolo affronteremo le funzioni ed i metodi messi


a disposizione per leggere e scrivere file. Alle volte è
necessario dover scrivere su file per memorizzare dei dati che
è poi necessario rileggere (per mettersi al riparo, ad esempio,
da eventuali blackout) o semplicemente spedire. Altre volte
invece non dobbiamo limitarci alla MetaTrader come
creazione ed uso di informazioni perché potrebbe esser
necessario creare e mettere a disposizione delle informazioni
ad uso di programmi terzi che magari aggiornano delle
newsletter o siti dinamici contenenti pagine private dedicate
ai singoli clienti di un gestore. Le occasioni in cui è utile
leggere e scrivere su file sono veramente molte e elencarle
Pagina 155
Udinesi - Guida di riferimento al linguaggio MQÌ.

qui non è certo possibile anche se qualche spunto penso di


averlo suggerito.

FileClose

void FileClose(int handle)

Questo metodo chiude un file precedentemente aperto. Ogni


file aperto viene referenziato nel codice con un puntatore. Il
puntatore è il parametro handle, argomento del metodo
FileClose.

Parametri
Handle Puntatore al file, restituito dalla funzione
FileOpenQ

int hFìle = FileOpenC'pippo.csv", FILE_C3V|FILE_READ);


if (hFile >0)
{
// uso del file . . .
FileClose(hFile);
1

FileFlush

void FileFlush(int handle)

Questo metodo trasferisce tutti I dati memorizzati in memoria


su disco.

Parametetri
Handle Puntatore al file, restituito dalla funzione
FileOpen()

int taars_count=Bars;
int hFile = FUeOpen("pippo.csv",FILE_CSV|FILE_WRITE) ;

FileWrite (hFile, "#", "OPEN", "CLOSE", "HIGH", "LOW") ;


for (int i=0;i<bars_count,-i++) __
Pagina 156
Dainesì - Guida di riferimento al linguaggio MQ/.

FileWrite(hFile, i+1,open[i],dose[i] , High[l] , Low[i]};

FilaFlush(hFile);

for(int i=0;i<bars_count;i++)
FileWrite(hFile, i+1,open[i],Close[i],High[i], Low[i]);

FileClose(hFile);

FilelsEnding

bool FilelsEndingfint handle)

Questa funzione ritorna true se il puntatore è posizionato alla


fine del file, altrimenti ritorna false. Per informazioni più
dettagliate utilizzare la funzione GetLastErrorQ .

Parametri
Handle Puntatore al file, restituito dalla funzione
FileOpen()

if(FilelsEnding(hFile)-=true)

FileClose (hFile
return(false) ;

FilelsLineEnding

boot FilelsLineEnding(int handle)

Se il file aperto è di tipo sequenziale (file di testo CSV) questa


funzione ritorna true se il puntatore è posizionato alla fine
della linea, altrimenti ritorna false. E' molto utile questa
funzione quando si vuole esaminare ogni singola riga poiché
magari dobbiamo esaminare un file creato con una
determinata "mappatura".

Pagina 157
Dainesi - Guida di riferimento ai linguaggio MQL

Per informazioni più dettagliate utilizzare la funzione


GetLastErrorf) .

Parametri
Handle Puntatore al file, restituito dalla funzione
FileOpen()

if(FilelsLineEnding(hFile))

FileClose(hFile);
return(false);

FileOpen

int FileOpen(string filename, ìnt mode, int delimiterà;')

Questa funzione apre un file per l'input e/o l'output. Ritorna


un puntatore al file aperto. Se la chiamata fallisce (il file non
esiste, la path è sbagliata o il file è in uso da altra
applicazione in modalità esclusiva), il valore ritornato è
inferiore a 1.
Per informazioni più dettagliate utilizzare la funzione
GetLastError() .

Nota bene: I file possono essere aperti solo se contenuti nella


cartella terminal_dir\experts\files e sue sotto cartelle. Se si
desidera accedere a file posizionati in cartelle differenti
occorrerà appoggiarsi a chiamate di DLL esterne.

Parametri
Filename Nome del file, con qualunque estensione. Se
contenuto in una sottocartella è necessario
dichiararlo (es. "\cartella prova\pippo.txt").
Mode Modalità di aperura del file. La modalità può essere
una combinazione delle scelte seguenti: FILE_BIN,
FILE_CSV, FILE.READ, FILE_WRITE.

Pagina 158
Dainesì - Guida di riferimento ai linguaggio

Delimiter Carattere usato come delimitatorer per I file csv


(CSV - Comma Separated Values). Il simbolo
predefinito è ';'•

int hFile;
hFile = FileOpen("Pippo.csv",FILE_CSV|FILE_READ, ' ; '} ;
if{hFile <1)
(
printC'Non è stato possibile aprire Pippo.csv, codice di errore:
GetLastErrorO);
return (false! ;

FileOpenHistory

int FileOpenHistory(string filename, int mode, int delimiter=';')

Questa funzione apre file nella cartella history directory per


l'input e/o l'output. Returns a file nandle for thè opened file.
Se la chiameta fallisce (il file non esiste, la path è sbagliata o
il file è in uso da altra applicazione in modalità esclusiva), il
valore ritornato è inferiore a 1 .
Per informazioni più dettagliate utilizzare la funzione
GetLastError() .

Parametri
Filename Nome del file, con qualunque estensione. Se
contenuto in una sottocartella è necessario
dichiararlo (es. "\cartella prova\pippo.txt").
Mode Modalità di aperura del file. La modalità può essere
una combinazione delle scelte seguenti: FILE_BIN,
FILE_CSV, FILE_READ, FILE_WRITE.
Delimiter Carattere usato come delimitatorer per I file csv
(CSV - Comma Separated Values). Il simbolo
predefinito è ';'•

int hFile = FileOpenHistory("GBPUSDl440.HST",FILE_BIN|FILEJHRITE);

Pagina 159
Dainesi - Guida di riferimento al ftnguaggjo

Print ("Impossibile creare il file GBPUSD1440 .HST") ;


return (false) ;

// utilizzo del file


// ...
FileClose(hFile) ;

FileReadArray

int FileReadArray(int handle, objectft array[], int start, int count)

Questa funzione legge il numero di elementi indicati da un file


binario e li trasferisce in un array. Ritorna il numero di
elementi effettivamente letti.
Per informazioni più dettagliate utilizzare la funzione
GetLastError() .

Nota bene: Prima di ricevere I dati l'array deve essere


dimensionato a sufficienza per poterli contenere.

Parametri
Handle Puntatore al file, restituito dalla funzione
FileOpen().
array[] Array che ospiterà I dati letti.
Start Posizione di partenza per la memorizzazione
all'interno dell'array.
Count Numero di elementi da leggere.

int hFile;
doublé varray[10];
hFile -Fileopen("filena 3.dat", FILE_BIN|FILE_READ);
if(hFile >0)

FileReadArrayfhFile, varray, O, 10);


FileClose(hFile);

Pagina 160
Dainesì - Guida dì riferimento al fingi/aggio MQL

FileReadlnteger

int FileReadlnteger(int handle, int size=LONG_VALUE)

Questa funzione legge I numeri interi da un file binario a


partire dalla posizione corrente. Una volta eseguita il
puntatore si sposta all'elemento successivo. La misura
dell'intero può essere di 1, 2 o 4 byte. Se non specificato la
misura predefinita è 4 byte.
Per informazioni più dettagliate utilizzare la funzione
GetLastError().

Parametri
Handle Puntatore al file, restituito dalla funzione
FileOpen().
Size Dimensione dell'intero. Valori possibili:
CHAR_VALUE(1 byte), SHORT_VALUE(2 byte) o
LONG_VALUE(4 byte).

int hFile;
int value;
hFile = FileOpenf"Pippo.dat", FILE_BIN|FILE_READ);
if(hFile >0)
<
value-FileReadlnteger(hFile,SHORT_VALHE];
FileClose(hFile);

FileReadNumber

doublé FileReadNumberfint handle)

Questa funzione legge, dalla posizione corrente sino al


delimitatore di valore, un numero. Solo per file CSV.
Per informazioni più dettagliate utilizzare la funzione
GetLastError() .

Pagina 161
Dainesi - Guida di riferimento al frnguaggio MQL

Parametri
Handle Puntatore al file, restituito dalla funzione
FileOpen().

int hFile;
int value;
hFile =FileOpen("Pippo.csv", FILE__CSV, ';');
ifthFile >OI
)
value = FileReadNujnber (hFile) ;
FileClose(hFile);

FileReadStrins

string FileReadString(int handle, int length=0)

Questa funzione legge una stringa di testo dalla posizione


corrente. Si applica sia ai file CSV che binari. Per i file di
testo la stringa sarà ricercata sino al simbolo delimitatore
mentre per i file binari si leggeranno i caratteri indicati nel
secondo parametro.
Per informazioni più dettagliate utilizzare la funzione
Getl_astError() .

Parametri
Handle Puntatore al file, restituito dalla funzione
FileOpenq.
Length Numero di caratteri da leggere.

int hFile;
string str;
hFile - FileOpenC'Pìppo.csv", FILE_CSVI FILE__READ) ;
if(hFile >0)
f
str=FileReadString(hFile) ;
FileClose(hFile) ;

Pagina 162
Dainesi - Guida di riferimento al linguaggio MQf.

FileSeek

bool FileSeek(int handle, int offset, int orìgin)

Questa funzione muove il puntatore ad una specifica posizione


nel file. La funzione FileSeekQ sposta il puntatore associato
alla nuova posizione che è rappresentata dal punto di
partenza più l'offset indicato. L'operazione successiva che
verrà fatta sul file avverrà dalla nuova posizione. Se lo
spostamento ha successo la funzione ritorna TRUE, altrimenti
ritorna FALSE.
Per informazioni più dettagliate utilizzare la funzione
GetLastError() .

Parametri
Handle Puntatore al file, restituito dalla funzione
FileOpen().
Offset Offset in byte dall'origine.
Origin Posizione iniziale. I valori ammessi sono:
SEEK_CUR - Dalla posizione corrente
SEEK_SET - Dall'inizio
SEEK_END - Dalla fine del file

int hFile = FileopenC'pippo.csv", FILE_CSV| FILE_READ, ';');


if(hFile >0)
{
FileSeek(hFile, 5, SEEK_SET);
FileReadlnteger(hFile);
FileClose(hFile);
hFile =0;

FiteSize

int FileSize(int handle)

Questa funzione ritorna la dimensione del file in byte.

Parametri
Pagina 163
Dainesi - Guida dì riferimento al (inguagg/o MQL.

Handle Puntatore al file, restituito dalla funzione


FileOpen().

hFile - FileOpenC'Pippo.dat", FILE_BIN|FILE_READ);


if (hFile >0)
{
size = FileSize(hFile) ;
FrintC'La dimensione di Pippo.dat è ", size, " taytes");
FileClose(hFile);

FileWrite

int FileWrite(int handle, ... )

Questa funzione permette di scrivere all'interno del file CSV, i


caratteri delimitatori sono inseriti automaticamente. La
funzione ritorna il numero di caratteri scritti, o un numero
negativo se insorge un errore.

Parametri
Handle Puntatore al file, restituito dalla funzione
FileOpen().
Dati utente da scrivere nel file, separati da
virgole.

Nota bene: Numeri int e doublé sono automaticamente


convcrtiti in testo ma colori, dati datetime e valori booleani
non vengono convertiti automaticamente e verranno riportati
nella loro raffigurazione numerica intera.

int hFile;
datetime orderOpen=OrderOpenTirae O ;
hFile =FileOpen("filename", FILE_CSV|FILE_WRITE, ';');
iffhFile >0)

Pagina 164
Dainesi - Guida di riferimento al linguaggio MQL

FileWrite(hFile,Close[0],Open[0],High[0],Low[0],TiraeToStr(orderOpen
FileClose(hFile);

FileWriteArray

int FileWriteArray(int handle, object array[], int start, int count)

Questa funzione scrive il contenuto delimitato di un array


all'interno di un file binario. Arrays di int, bool, datetime e
colori saranno scritti come interi a 4 byte. Array doublé
saranno dimensionati a 8 byte con virgola mobile. Arrays di
testo saranno scritti come stringhe delimitate da carattere di
ritorno a capo e nuova linea (Carnose return and Line feed) il
cui simbolo binario è OD OA.
La funzione ritorna il numero di elementi scritti o un numero
negativo in caso di errore.

Parametri
Handle Puntatore al file, restituito dalla funzione
FileOpen().
array[] Array contenente i dati.
Start Indice di partenza all'interno dell'array.
Count Numero di elementi da scrivere.

int hFile;
doublé BaropenValues [10] ;

// copio le prime dieci barre nell'array


forfint i-0;i<10; i++)
BaropenValues [ i ] =0pen [ i ] ;

// trascrivo 1'array nel file


hFile = FileOpenC'Pìppo.dat", FILE_BINIFILE_WRITE);
if (hFile >0)
(
FileWriteArray(hFile, BaropenValues, 3, 7); // Inser
elementi
FileClose(hFile);

Pagina 165
Dainesi - Guida di riferimento al linsuagsio MQL

FileWriteDouble

int FileWriteDouble(int handle, doublé value, int size=DOUBLE_VALUE)

Questa funzione scrive dei valori doublé all'interno di un file


binario. La dimensione è FLOAT_VALUE, ovvero numeri in
virgola mobile a 4 byte, altrimenti possono essere numeri a
virgola mobile a 8 (DOUBLE_VALUE).

Parametri
Handle Puntatore al file, restituito dalla funzione
FileOpen().
Value Valore da scrivere.
Size Formato opzionale. Può essere uno dei due
seguenti:
DOUBLE_VALUE (8 bytes, default)
FLOAT_VALUE (4 bytes).

int hFile,-
doublé vari = 0.375;
hFile =FileOpen("Pippo.dat", FILE_BINIFILE_WRITE);
if (hFile <1)
{
Print("Impossibile aprire il file - ",GetLastError( I ) ;
return(0);
}
FileWriteDouble(hFile, vari, DOUBLE_VALUE);
//. . .
FileClose(hFile);

FileWritelnteger

int FileWritelnteger(int handle, int value, int size=LONG_VALUE)

Questa funzione scrive dei varori interi all'interno di un file


binario. Se la dimensione selezionata è SHORT_VALUE il valore
occuperà 2 byte, se si sceglie CHAR_VALUE occuperà 1 byte e

Pagina 166
Dainesi - Guida di riferimento al linguaggio MQL

se si sceglie LONG_VALUE occuperà 4 byte. La funzione


ritorna i bytes scritti.

Parametri
Handle Puntatore al file, restituito dalla funzione
FileOpen().
Value Valore da scrivere.
Size Formato ozionale della dimensione del valore. Può
essere uno dei seguenti valori:
CHAR_VALUE (1 byte),
SHORT_VALUE (2 byte),
LONG_VALUE (4 byte, default).

int value=10;
hFile -FileOpenC'Pippo.dat", FILE_BIN|FILE_»RITE);
ìf(hFile <1)
(
Print ("Impossibile aprire il file. Code: ", GetLastError ( ) ) ;
return (0) ;
1
FileWritelnteger(hFile, value, SHORT_VALUE);
//...
FileCloae(hFile);

FileWriteString

int FileWriteStringfint handle, string value, int length)

Questa funzione scrive del testo all'interno di un file binario a partire


dalla posizione corrente. Ritorna il contegio dei byte scritti.

Parametri
Handle Puntatore al file, restituito dalla funzione FileOpen().
Value Testo da inserire.
Length Lunghezza dei caratteri da scrivere.

int hFile;
string str="testo da inserire";
hFile =FileOpen("Pippo.bin", FILE_BINIFILE_WRITE)
if (hFile <1)

Pagina 167
Dainesi - Guida dì riferimento al linguaggio MQf.

FileWriteString(hl, str, 8);


FileClose(hFile);

Pagina 168
Daìnesi - Guida di riferimento al (inguaggio MQf.

/I
//I

Funzioni legate alle variabili


globali

GlobalVariableCheck() GlobalVariableSetOnCo
GlobalVarìableDel() ndition()
GlobalVariableGetO GlobalVariablesDeleteA
GlobalVariableSet() ll()

Le variabili "Globali" in MetaTrader sono variabili che


vengono condivise con tutti gli script, indicatori ed expert
advisor in esecuzione. I loro valori vengono gestiti
dall'applicazione terminal.exe che li mantiene in memoria
anche in caso di chiusura anomala della piattaforma. MQL
mette a disposizione sei funzioni in grado di creare,
modificare e cancellare queste variabili.

Pagina 169
Daìnesi - Guida di riferimento al Mnguaggio MQL

GlobalVariableCheck

bool GlobalVariableCheck(string name)

Questa funzione ritorna true se la variabile passata come


argomento esiste. Prima di creare una variabile globale è
infatti utile controllare se già esiste onde evitare errori.

Parametri
Name Nome della variabile globale.

// Controllo di esistenza
if(GlobalVariableCheck("MaxExposition")==false)
GlobalVariataleSet("MaxExposition ",10000) ;

GlobalVariableDel

bool GlobalVariableDel(string name)

Questa funzione cancella una variabile globale (è sempre


consigliato farlo per evitare sprechi inutili di memoria) e se
riesce ritorna true, in caso contrario ritorna false (perché
magari è in uso da un altro script).

Parametri
Name Nome della variabile globale.

// cancellazione della variabile "MaxExposition"


if(GlotaalVariableDel("MaxExposition " ) — f a l s e ) ;

Pagina 170
Dainesì - Guida di riferimento al (injuosgio MQL

Global VariableGet

doublé GlobalVariableGet(string name)

Questa funzione ritorna il valore memorizzato dalla variabile


globale passata come argomento.

Parametri
Name Nome della variabile globale.

doublé dExp = GlobalvariableGet("MaxExposition");


//Se la funzione genera un errore resetto il valore a zero
if(GetLastError()!=0) dExp = 0;

GlobalVariabteSet

datetime GlobalVariableSet(string name, doublé value)

Questa funzione imposta il valore della variabile globale. Se


non esiste viene creata automaticamente. Se la funzione ha
successo il valore di ritorno rappresenta la data e l'ora
dell'ultimo accesso al suo valore. Se la funzione non riesce ad
impostare il valore il valore ritornato è zero.

Parametri
Name Nome della variabile globale.
Value Valore numerico da impostare.

//Impostazione di un nuovo valore ad ogni barra


if (dLastModìfied < Time[0])
dLastModified = GlobalVariableSet ("MaxExposition", 9000) ;

Pagina 171
Dainesi - Guida di riferimento al /inguaggio MQÌ.

GlobalVariableSetOnCondition

bool GlobalVariableSetOnCondition(string name, doublé value, doublé


check_value)

Questa funzione imposta un nuovo valore per la variabile


globale se il terzo parametro equivale al valore corrente. Se
la variabile non è valorizzata la funzione ritorna false e il
valore ritornato dalla chiamata a GetLastError() ritorna
l'errore ERR_GLOBAL_VARIABLE_NOT_FOUND. Quando la
funzione ha successo il valore di ritorno è true. Altrimenti
sarà false.

Parametri
Name Nome della variabile globale.
Value Valore numerico da impostare.
check_value Valore da confrontare con l'attuale valore.

//Cambiamento condizionato di valore (se è 9000 lo modifico a 10000)


GlobalVariableSetOnCondition("MaxExposition",10000,9000);

GlobalVariablesDeleteAII

void GlobalVariablesDeleteAIIO

Questo metodo effettua una pulizia generale cancellando


tutte le variabili globali. L'esecuzione riesce sempre per cui
occorre fare molta attenzione onde evitare di recar danno a
script o expert di terze parti che fanno affidamento alle
variabili globali.

GlobalVariablesDeleteAIIO ;

Pagina 172
Dainesi - Guida di riferimento at lìnsuassio MQL

Funzioni matematiche e
trigonometriche

MathAbs() MathFloor() MathRound()


MathArccos() MathLog<) MathSin()
MathArcsin() MathMax() MathSqrt()
MathArctan() MathMin() MathSrand()
MathCeil() MathMod() MathTan()
MathCos() MathPow()
MathExp() MathRand()

Ogni linguaggio di programmazione che si rispetti offre al


programmatore delle funzioni preconfezionate di uso comune.
Tra queste troviamo le funzioni matematiche leggermente più
complesse delle mere addizioni, sottrazioni, divisioni e
moltiplicazioni e le funzioni trigonometriche che possono
essere d'aiuto nel calcolo delle posizioni nello spazio per il
disegno di oggetti grafici.

Pagina 173
Dainesi - Guida di riferimento al linguaggio MQL

MathAbs

doublé MathAbsfdouble value)

Questa funzione ritorna il valore assoluto del valore passato


come parametro. Per valore assoluto si intende il valore
privato del segno. Questa funzione ritorna molto utile quando
si vuoi testare se il prezzo è in un "intorno" di una quotazione
specifica. In questo caso si calcola la differenza "assoluta" tra
le due quotazioni.

Parametri
Value Valore numerico.

doublé dP = closetO];
doublé dA - IMA(Symbol(),Pe od(), AvPeriods, O, AvType, AvPrice, 0);
doublé dT = dP - dA;

//calcolo della distanza assoluta


if<MathAbs(dT)< 3*Point)Print("II prezzo è nell'intorno della media!"

MathArccos

doublé MathArccos(double x)

Questa funzione ritorna l'ArcoCoseno del valore passato come


argomento x nell'intervallo tra O e n radianti. Se x è minore di
-1 o più grande di 1, MathArccos Ritorna un valore indefinito.

La Funzione ARCOCOSENO restituisce I1 angolo dato il valore


ANGOLO = ARCOCOSENO(VALORE).
Pagina 174
Dainesi - Guida di riferimento al linguaggio MQÌ.

Si noti che la Distanza di P2 dall' Asse x e' un segmento


orientato e qualora P2 dovesse passare a sinistra dell' Asse x,
il valore del segmento diverrebbe negativo.
L' ARCOCOSENO accetta in entrata valori compresi
inclusivamente tra -1 e +1. e restituisce il valore di un Angolo
(usando gradi o Radianti a seconda del contesto).

Parametri
X Valore tra -1 e 1 di cui si vuole conoscerere
l'ArcoCoseno.

doublé x = 0.32696;
doublé y;

y = MathArcsin(x);
Print("Arcoseno di

y = MathArcos(x) ;
Print("Arcocoseno di ",x," = " ,y) ;
//Output: Arooseno di 0.326960 - 0.333085
//Output: Arcocoseno di 0.326960 = 1.237711

MathArcsin

doublé MathArcsin(double x)

Questa funzione calcola l'ArcoSeno del valore x passato come


argomento. X deve essere nell'intervallo tra -n/2 e n/2
radianti. Se x è meno di -1 o maggiore di 1, la funzione ritorna
un valore indefinito.

La Funzione ARCOSENO restituisce I' Angolo dato il valore


ANGOLO=ARCOSENO(VALORE). Si noti che la Distanza di P2
dall1 Asse y e' un Segmento Orientato e qualora P2 dovesse

Pagina 175
Dainesi - Guida di riferimento al lin$uas$io MQL

passare sotto ali1 Asse y, il valore del Segmento divverrebbe


negativo.
L ARCOSENO accetta in entrata valori compresi
inclusivamente tra -1 e +1. e restituisce il valore di un Angolo
(usando gradi o Radianti a seconda del contesto).

Parametri.
X Valore del quale si desidera calcolare l'arcoseno.

doublé x = 0.32696;
doublé y;

y - MathArcsin(x);
Print("Arcoseno di ",x," = ",y);

y = MathArcos (x) ;

//Output: Arcoseno di 0.326960 = 0.333085


//Output: Arcocoseno di 0.326960 = 1.237711

MathArctan

doublé MathArctan(double x)

La funzione ritorna l'arco tangente del valore x passato come


argomento. Se x è O, MathArctan ritorna 0. MathArctan ritorna
un valore per x nell'intervallo tra -n/2 e n/2
radianti.

La Funzione ARCOTANGENTE restituisce I' Angolo dato il valore


ANGOLO=ARCOTANGENTE(VALORE).

Pagina 176
Dainesi - Guida di riferimento al linsuassio MQL

Si noti che la Distanza di 12 dati' Asse y e' un Segmento


Orientato e qualora 12 dovesse passare sotto ali' Asse y, il
valore del Segmento divverrebbe negativo.
L' ARCOTANGENTE accetta in entrata valori compresi tra più e
meno infinito e restituisce il valore di un Angolo (usando gradi
o Radianti a seconda del contesto).

Parametri
X Un numero rappresentante una tangente.

doublé x = -8

y = MathArctan(x);
Print("L'arcotangente di ",x," è ",y);
//Output: L'arcotangente di -862.42 è -1.5696

MathCeil

doublé MathCeil(double x)

La funzione MathCeil ritorna un numero intero (senza decimali


quindi) rappresentante il più piccolo intero che è più grande o
equivalente al valore passato come parametro.
Occorre tenere sempre presente il segno del valore passato
per capire come opera questa funzione: se il numero è
negativo il valore di ritorno sarà un intero negativo pari al
valore assoluto della parte intera del parametro (es. se il
valore è -3.14 il valore ritornato sarà -3) mentre se il valore
passato è positivo il valore di ritorno sarà l'intero successivo
(es. se il valore passato è 3.14 il valore di ritorno sarà 4).
Tenere conto di questa caratteristica è molto importante
qualora si debba lavorare in modo speculare per ottenere
segnali di ingresso come nelle tecniche basate su indicatori
quali MACD, Bears e Bulls Power, ecc..

Parametri
X Valore numerico, anche frutto di un espressione.

Pagina 177
Dainesi - Guida di riferimento al linguaggio MQL

double poin;

ìf(Point ~ 0.00001) Poin = 0.0001;


else if (Point — 0.001) poin - 0.01;
else Poin - Point;

doublé y = (Ask-Bid)/poin;
doublé Slippage = MathCeil(y);

print("Lo Slippage con uno spread di " pips è pari a

/*Output:
Lo Slippage con uno spread di 1.6 pips è pari a 2
*/

MathCos

doublé MathCos(double value)

Questa funzione ritorna il coseno di uno specifico angolo


passato come argomento.

Supponiamo di avere un angolo orientato ( a ) con vertice nell


origine del piano (o) ed uno dei due lati (si) coincidente con
l'asse orizontale (x) del piano; tracciamo quindi una
Circonferenza di raggio unitario attorno al vertice dell'
angolo.
L' altro lato (s2) del nostro angolo inciderà' sulla circonferenza
di raggio unitario nel punto P2. A questo punto definiremo il
COSENO dell' angolo a come la distanza del punto P1 dall'asse
y del nostro piano.
Il rapporto tra la lunghezza di tale segmento ed il raggio del
cerchio tracciato sarà1 il COSENO dell' angolo.
Pagina 178
Dainesi - Guida di riferimento ai linguaggio MQÌ.

Si noti che la distanza di P2 dall'asse x e' un segmento


orientato e qualora P2 dovesse passare a sinistra dell'asse y, il
valore del segmento diverrebbe negativo.

Parametri
Value Un angolo misurato in radianti.

doublé pi = 3.1415926535;
doublé x, y;

x = pi/2;
y = MathSin(x);
Print|"Seno di ",x," è ",y);
y - MathCos(x) ;

Print("Coseno di ",x," è ",yì;


//Output: Seno di 1.5708 è 1
// Coseno di 1.5708 è O

MathExp

doublé MathExp(double d)

Questa funzione ritorna il valore del numero e elevato alla


potenza d. Su errore di overflow (ovvero qualora il valore
calcolato ecceda I limiti di memorizzazione della variabile) la
funzione ritorna O ad indicare infinito.
In matematica, e è una costante che, insieme a pi greco, è
tra le più importanti per via delle sue numerose applicazioni,
in modo particolare nell'ambito dell'analisi matematica.
Poiché è un irrazionale (e, in particolare, trascendente), non
è esprimibile come frazione o come numero decimale
periodico: la sua approssimazione con 55 cifre decimali è

2,71828 18284 59045 23536 02874 71352 66249 77572 47093


69995 95749 ...

Essa talvolta viene chiamata numero di Eulero in onore del


matematico svizzero Eulero, o più spesso costante di Nepero,

Pagina 179
Dainesi - Guida di riferimento al linguaggio MQL

in onore del matematico scozzese Nepero, colui che ha


introdotto i logaritmi.
Il numero di Nepero è collegato con la funzione esponenziale
che associa ad un numero reale x il numero dato dalla
potenza e", e con la funzione logaritmo naturale (la funzione
inversa dell'esponenziale). In particolare in maniera formale è
possibile definire e come il valore che la funzione
esponenziale e' assume in 1.

Parametri
O Un numero specificante la potenza.
I"
doublé x-2.302585093,y;
y=MathExp(x);
Print("I/ esponenziale di " + x + " è ",y);
//Output: L'esponenziale di 2.3026 è 10

MathFloor

doublé MathFloor(double x)

La funzione MathFloor ritorna un numero che rappresenta


l'intero più grande che è minore od equivalente al numero
passato in argomento.
Occorre tenere sempre presente il segno del valore passato
per capire come opera questa funzione: se il numero è
negativo il valore di ritorno sarà sarà l'intero assoluto
successivo (es. se il valore è -3.14 il valore ritornato sarà -4)
mentre se il valore passato è positivo il valore di ritorno sarà
l'intero precedente (es. se il valore passato è 3.14 il valore di
ritorno sarà 3).
Tenere conto di questa caratteristica è molto importante
qualora si debba lavorare in modo speculare per ottenere
segnali di ingresso come nelle tecniche basate su indicatori
quali MACD, Bears e Bulls Power, ecc..

Parametri
X Valore numerico.

Pagina 180
Dainesi - Guida di riferimento al /inguaggio A1QJ.

doublé Poin;

i f t P o i n t == 0.00001) Poin - 0.0001;


else if (Point == 0 . 0 0 1 ) Poin = 0.01;
else Poin = Point;

doublé y - ( H i g h [ 0 ] - L o w [ 0 ] ) / P o i n ;
doublé Range - MathFloor(y);

PrintC'Il Range della candela è di " + y + "pa pips"};

/*0utput:
ps
*/

MathLog

doublé MathLog(double x)

La funzione MathLog ritorna il logaritmo naturale del valore x.


Se x è negativo, il valore è indefinito. Se x è zero il valore di
ritorno è infinito.
Si definisce LOGARITMO di un Numero rispetto ad una base,
l'esponente a cui la base deve venire elevata per ottenere
tale numero.
Se il logaritmo è la potenza a cui elevare la base per ottenere
il numero, ne consegue che il numero è uguale alla base
elevata al logaritmo
Si definisce LOGARITMO NATURALE o LOGARITMO NEPERIANO
di un numero, l'esponente a cui la costante e (dove e è uguale
a 2,71828...) deve venire elevata per ottenere tale numero.

Parametri
X Valore per il quale deve essere trovato il logaritmo.

doublé x=9000.0,y;
y-MathLog(x) ;
PrintC'Log di " + x +" è " y) ;

Pagina 181
Dainesi - Guida dì riferimento al (inguaggio MQ/.

//Output: Logdi 9000 è 9.1049

MathMax

doublé MathMax(double valuel, doublé value2)

Questa funzione ritorna il valore massimo tra i due passati


come argomenti. Per ricercare il valore massimo tra tre
argomenti è possibile annidare due MathMax.

Parametri
valuel Primo valore numerico.
value2 Secondo valore numerico.

doublé dF = iMA(Symbol(),Period(), FastPeriods, O, FastType, FastPrice,


OS;
doublé dM = iMA(SymtaolO,Periodf), MedPeriods, O, MedType, MedPrice, 0);
doublé ds = iMA(Symbol O , Periodo , SlowPeriods, O, slowType, SlowPrice,
0);

//Maggiore delle due medie (Fast e Medium)


doublé dMax=MathMax(dF,dM) ;

//Maggiore delle tre medie


dMax=MathMax(dF,MathMax (dM,dS) ) ;

MathMin

doublé MathMin(doub!e valuel, doublé value2)

Questa funzione ritorna il valore minimo tra i due passati


come argomenti. Per ricercare il valore minimo tra tre
argomenti è possibile annidare due MathMin.

Parametri
valuel Primo valore numerico.
value2 Secondo valore numerico.

Pagina 182
Dainesi - Guida di riferimento al linguaggio MQf.

//Minore delle due medie {Fast


doublé dMax-M»thMin(dF,dM);

//Minore delle tre medie


dMax=MathMin(dF,MathMinldM,dS) ) ;

MathMod

doublé MathModfdouble value, doublé value2)

Questa funzione divide due numeri e ritorna il solo resto.


Ottima, ad esempio, per calcolare gli anni bisestili (l'anno
diviso quattro se ha resto pari a zero è bisestile).

Parametri
value Dividendo.
value2 Divisore.

doublé x=-10.0,y=3.0,z;
z=MathMod(x,y);
Printf'Il resto di ",x," / ",y," è
//Output: II resto di -10 / 3 è -1

MathPow

doublé MathPow(double base, doublé exponent)

Questa funzione ritorna il valore di un valore base elevato ad


una specifica potenza.

Pagina 183
Dainesi - Guida di riferimento al fingi/aggio A1QJL

Da notare che l'esponente è decimale ed è quindi possibile


calcolare sia le potenze che le radici ennesime di un numero:
si ricorda infatti che la radice cubica di un numero equivale al
numero stesso elevato a 1/3.

Parametri
Base Valore della base.
Exponent Valore dell'esponente.

doublé x=2.0,y=3.O,z;
z = MathPow(x,y);
Print(x," alla potenza di ",y," è ", z)
//Output: 2 alla potenza dì 3 è 8

//Calcolo della radice cubica


z = MathPow(27,1/3};
Print("La radice cubica di 27 è ", z);
//Output: La radice cubica di 27 è 3

MathRand

int MathRandQ

La funzione MathRand ritorna un numero intero random


(casuale) nell'intervallo tra O e Ox7fff (32767) che il limite
superiore dei numeri interi. Occorre utilizzare la funzione
MathSrand per innescare il generatore di numeri casuali.

MathSrand(LocalTime() } ;
// Display 10 numbers.
for (int i=0;i<10;i++ )
Print("random value ", MathRand());

Pagina 184
Dainesi - Guida di riferimento ai frnguaggio MQL

MathRound

doublé MathRound(double value)

Questa funzione ritorna il valore intero più vicino al numero


passato come argomento.
A differenza di MathCeil e MathFloor qui è importante il resto
della divisione intera. Se il resto è maggiore di 0,5 si andrà
all'intero superiore in caso contrario a quello inferiore senza
importanza per il segno del numero.

Parametri
Value Numero da arrotondare.

doublé y=MathRound (2.8) ;


Print ( "I/ arrotondamento di 2. è ",y);
y^MathRound {-2.4] ;
Print ("L' arrotondamento di -2 4 è ",y);
2.8 è 3
// L'arrotondamento di -2.4 è -2

MathSin

doublé MathSin(double value)

Questa funzione ritorna il Seno di un angolo specifico passato


come argomento.

Pagina 185
Dainesi - Guida di riferimento ai linguaggio MQjL

Supponiamo di avere un angolo orientato ( a ) con vertice nell


origine del piano (o) ed uno dei due lati (si ) coincidente con
l'asse orizontale (x) del piano; tracciamo quindi una
circonferenza di raggio unitario attorno al vertice dell' angolo.
L'altro lato (s2) del nostro angolo inciderà' sulla circonferenza
di raggio unitario nel punto P2. A questo punto definiremo il
SENO dell'angolo a come la distanza del punto P1 dall'asse x
del nostro piano.
Più' esattamente, il rapporto tra la lunghezza di tale
segmento ed il raggio del cerchio tracciato sarà' il SENO dell'
angolo. Nel nostro esempio tali valori coincidono poiché'
abbiamo posto il raggio della circonferenza essere uguale ad
uno .
Si noti che la distanza di P2 dall'asse x e' un segmento
orientato e qualora P2 dovesse passare sotto all'asse x, il
valore del segmento divverrebbe negativo.
Per la sua stessa natura, il SENO di un angolo può' solo
assumere valori compresi inclusivamente tra -1 e +1. Inoltre il
SENO degli angoli e' ciclico e si ripete costantemente dopo
ogni rotazione completa (angolo giro , 360°).

Parametri
Value Un angolo, misurato in radianti.

doublé pi-3.1415926535;
doublé x, y;

x-pì/2;
y=MathSin(x) ;
PrintC'Seno di ",x," è ",
y=MathCos(x) ;

Print("Coseno di ",x," è
//Output: Seno di 1.5708
// Coseno di 1.5708 è O

Pagina 186
Danesi - Guida dì riferimento ai (inguaggio MQL

MathSqrt

doublé MathSqrt(double x)

La funzione MathSqrt ritorna la radice quadrata di x. Se x è


negativa, MathSqrt ritorna un valore indefinito.

Parametri
X Numero positivo.

doublé result=MathSqrt(144);
PrintC'La radice quadrata di 144 è ", resulti;

MathSrand

void MathSrand(int seed)

II metodo MathSrand() imposta il punto di partenza per la


generazione di una serie dati intera casuale. Per
reinizializzare il "generatore" usare 1 come argomento del
metodo. Ogni altro valore per l'argomento seed imposta il
generatore ad un nuovo punto di partenza casuale. MathRand
recupera i dati generati. Chiamare MathRand dopo ogni
chiamata a MathSrand genera la stessa sequenza ottenibile
richiamando MathSrand con seed pari a 1.

Parameters
Seed Base per la generazione di numeri casuali.

MathSrand(LocalTime () ) ;
// Mostra 10 numeri,
forfint i=Q;i<10;i++ )
Print ("Valore casuale ", MathRand () ) ;

Pagina 187
Dainesì - Guida di riferimento al (rnguoggio MQL.

MathTan

doublé MathTan(double x)

La funzione MathTan ritorna il valore della tangente del


valore x. Se x è maggiore o uguale a 263, o minore o uguale a
-263, il risultato perderà significatività, nel qual caso il valore
di ritorno sarà indefinito.

Supponiamo di avere un angolo orientato a con vertice nell


origine del piano o ed uno dei due lati si coincidente con
l'asse orizontale del piano; tracciamo quindi una
circonferenza di raggio unitario attorno al vertice dell' angolo.
La retta t sarà' TANGENTE alla circonferenza e nel punto P1.
Indicato come 12 il punto di incontro tra tale retta tangente t
e I' altro lato s2 dell'angolo, si dira' TANGENTE dell' angolo a la
distanza del punto 12 dall'asse x.
Più' esattamente, il rapporto tra la lunghezza di tale
segmento ed il raggio del cerchio tracciato sarà' la TANGENTE
dell' angolo. Nel nostro esempio tali valori coincidono poiché'
abbiamo posto il raggio della circonferenza essere uguale ad
uno .

Si noti che la distanza di 12 dall'asse x e' un segmento


orientato e qualora 12 dovesse passare sotto all'asse x, il
valore del segmento divverrebbe negativo.
Per la sua stessa natura, la TANGENTE di un angolo può'
assumere qualsiasi valore compreso inclusivamente tra -
infinito e +infinito. Inoltre la TANGENTE degli angoli e' ciclica
e si ripete costantemente dopo ogni mezza rotazione
completa (angolo piatto , 180°).

Parametri
X Angolo in radianti.
Pagina 188
Dainesi - Guida di riferimento al linguaggio MQL

doublé pi = 3.1415926535;
doublé x,y;
x = MathTan(pi/4);
Print("Tangente di pi/4 è ",xl;
//Output: Tangente di 0.7856 è 1

Pagina 189
Dainesi - Guida di' riferimento al fingi/aggio MQ}.

Funzioni legate agli Oggetti

ObjectCreate() ObjectNameO
ObjectDeleteO ObjectsDeleteAIIO
ObjectDescriptionO ObjectSet()
ObjectFind() ObjectSetFiboDescriptionO
ObjectGet() ObjectSetTextO
ObjectGetFiboDescriptionO ObjectSetVisibilityO
ObjectGetShiftByValueO ObjectsRedraw
ObjectGetValueByShìftO ObjectsTotal()
ObjectGetVisibilityO ObjectType()
ObjectMove()

Gli oggetti17 sono rappresentati da tutte quelle figure che


possono essere disegnate all'interno di una finestra grafico.
Ognuno di questi oggetti è riconducibile ad una categoria e ad
un tipo. Ogni tipo di oggetto possiede proprietà specifiche che
possono essere impostate e modificate. Oggetti complessi

17
La dizione Oggetto non deve trarre in inganno i programmatori abituati ai paradigmi OOP
("Object Oriented Programming") in quanto trattasi di concetti differenti: qui si parla di "oggetti
grafici" e non istanze di classi generali.

Pagina 191
Dainesi - Guida di riferimento al linguaggio MQÌ,

possono essere il frutto della combinazione di più oggetti


"base".
Fondamentalmente la creazione e gestione degli oggetti
appartiene alla parte di programmazione dedicata alla
creazione degli indicatori, anche se nulla vieta che un Expert
Advisor generi anch'esso oggetti sul grafico.

ObjectCreate

bool ObjeCtCreate(string rame, int type, int window, datetime tirne!, doublé pricel,
datetime time2=0, doublé prìce2=0, datetime time3=0, doublé price3=0)

Questa funzione permette di creare un oggetto specificandone


il nome, il tipo e le coordinate iniziali nella finestra grafico
specificata. Il numero delle coordinate è vincolato al tipo di
oggetto. Una linea avrà due prezzi e due date mentre un
ellissi ne avrà otto (una data ed un prezzo per ognuna delle
quattro coordinate spazio temporali in cui è contenuto
l'ellissi). Se la creazione ha successo la funzione ritorna true
(in caso contrario ritorna false e si può analizzare l'errore con
la funzione GetLastError(). Sugli oggetti di tipo OBJ_LABEL la
prima coordinata è ignorata. Per impostare le coordinate
OBJPROP_XDISTANCE e OBJPROP_YDISTANCE per le etichette
utilizzare la funzione ObjectSetf).

Nota bene: ogni coordinata è formata da due parti: data e


prezzo. Infatti ogni grafico nell'asse orizzontale indica (a
data (anno, mese, giorno, ora e minuto) mentre l'asse
verticale indica le quotazioni (ecco perché è impossibile
calcolare la "pendenza" di un grafico in quanto i due assi
misurano unità di misura differenti e non paragonabili).
Gli oggetti con una sola coordinata, come ad esempio la linea
verticale (OBJ_VLINE) richiedono la coordinata relativa alla
data valorizzata e quella del prezzo impostata a 0.

Parametri
Marne Nome univoco dell'oggetto.
Type Tipo di oggetto. Può essere uno delle costanti
enumerative seguenti:
Pagina 192
Dainesi - Guida di riferimento al linguaggio MQL

Costante Val ; Descrizione


OBJ_VLINE O Linea verticale. Usa la data come prima coordinata.

OBJJHLINE 1 Linea orizzontale. Usa il prezzo come prima coordinata.


OBJ.JREND 2 Trend line. Usa 2 coordinate.

OBJJTRENDBYANGLE 3 Trend by angle. Usa 1 coordinata. Per impostare l'angolo della linea usare la
funzione Ob]ectSet().

OBJ_REGRESSION 4 Regressione. Usa la data come parti delle due coordinate.

OEU_CHANNEL 5 Canale. Usa 3 coordinate,


OBJ_STDDEVCHANNEL 6 Canale di deviazione standard. Usa la data come parti delle due coordinate.

OHLGANNUNE 7 Linea di Gann. Usa 2 coordinate, ma il prezzo della seconda coordinata è


ignorato.

OBJ_GANNFAN 8 Ventaglio di Gann. Usa 2 coordinate, ma il prezzo della seconda coordinata è


ignorato.

OBJ_GANNGR1D 9 Griglia di Gann. Usa 2 coordinate, ma il prezzo della seconda coordinata è


ignorato.

OBJ_FIBO 10 Ri traccia mento di Fibonacci. Usa 2 coordinate.

OBJ_FIBOTIME5 11 Rbonacci time zones. Uses 2 coordinates.


OBJ^FIBOFAN 12 Ventaglio di Fibonacci. Usa 2 coordinate.
OBJ_FIBOARC 13 Archi di Fibonacci. Usa 2 coordinate.

OBJ_EXPANSION 14 Espansioni di Fibonacci. Usa 3 coordinate.

OBJ_FIBOCHANNEL 15 Canale di Fibonacci. Usa 3 coordinate.

OBJ_RECTANGLE 16 Rettangolo. Usa 2 coordinate.

OBJ_TRIANGLE 17 Triangolo. Usa 3 coordinate.

OBJ_ELUPSE 18 Ellisse. Usa 2 coordinate.


OB3_PUCHFORK 19 Forchettone di Andrews. Usa 3 coordinate.
OBJ_CYCLES 20 Cicli. Usa 2 coordinate.
OBJ_TEXT 21 Casella di testo. Usa 1 coordinata.

OBJ_ARROW 22 Freccia. Usa 1 coordinata.


OBJJ.ABEL 23 Etichetta. Usa 1 coordinata in pixel.

Window Indice della finestra dove l'oggetto sarà aggiunto.


L'indice deve essere uguale o superiore a O e minore
del valore restituito dalla funzione WindowsTotal().
Tìmel Parte data del primo punto.
Pricel Parte prezzo del primo punto.
Time2 Parte data del secondo punto.
Price2 Parte prezzo del secondo punto.
Time3 Parte data del terzo punto.
PriceS Parte prezzo del terzo punto.

Pagina 193
Daìnesi - Guida di riferimento al linguaggio MQL

// nuovo oggetto di testo


if (!ObjectCreate("Nota", OBJ_TEXT, O, D'2009.02.20 12:30', 1.0045))

Print("errore: impossibile creare la casella di testo! Codice errore


#",GetLastError()) ;
return(O) ;

// nu
-f(!ObjectCreate("Etìchetta", OBJ^LABEL, O, O, 0)ì

Print("errore : non è possibile ire l'etichetta! Codice errore


#",GetLastError( ) ) ;
return(Q);

ObjectSet("Etichetta", OBJPROP_XDISTANCE, 200) ;


ObjectSet ("Etichetta", OBJPROE>_YDISTANCE, 100) ;

ObjectDelete

bool ObjectDelete(string name)

Questa funzione cancella un oggetto di testo il cui nome è


indicato nell'unico parametro. Se la funzione ha successo
ritorna true, altrimenti ritorna false.

Parametri
Name Nome dell'oggetto da cancellare.

Obj&ctDelete("Etichetta");

ObjectDescription

string ObjectDescription(string name)

Questa funzione ritorna la descrizione dell'oggetto. La


descrizione è una proprietà facoltativa che permete di
aggiungere del testo descrittivo all'oggetto che è possibile

Pagina 194
Dainesi - Guida di riferimento al (inguaggio MQ/-

visualizzare sul grafico solo se la proprietà "Mostra descrizioni


oggetto" della finestra è attivata.

D Gluteo senza connessione

0 Spostamento del grafia

0 Scotimento automatico
\-'} Mostra Apertura. Massimo, Minimo, Chiusura

p] Mostra Inea prezzo richiesta


D Fina itala uro a uno

D Pitia scala
[i] Mostra Gr^ia

D Mostra vdumi

Morir:i ascrizioni ogg~itu

[ OK ] [ Annulla | | Reset

Parametri
Marne Nome dell'oggetto.

// Riporto l'elenco degli oggetti su di un file


int handle, total;
string obj_narne, fname;
// nome del file
fname = "objlist_" + Symbol(};
handle = FileOpen(fname,FILE_CSV!FILE_WRITE);
if(handle!=false)
{
total=ObjectsTotal ( ) ;
f o r f i n t i=-;i<total;i++)
{
obj_narae=ObjectName(i);
FileWrite(handle,"Object " + obj_narae + " descriz
ObjectDescription(obj_name]);
}
FileClose(handle);

Pagina 195
Daìnesi - Guida di riferimento al (inguaggio MQL

ObjectFind

int ObjectFind(string name)

Questa funzione controlla se l'oggetto passato per nome in


argomento esiste o meno. Se non esiste il valore di ritorno
sarà -1 altrimenti viene riportato il valore dell'indice della
finestra che lo contiene (O è la finestra principale).

Parametri
Name Nome dell'oggetto ricercato.

//Se l'oggetto non c'è lo creo


if(objectFind("Fibo_l"]==-!) objectCreate(...);

ObjectGet

doublé ObjectGet(strìng name, int index)

Questa funzione recupera il valore della proprietà


dell'oggetto. La proprietà richiamata viene selezionata grazie
al parametro index che le ordina.

Parametri
Name Nome dell'oggetto.
Index Indice della proprietà dell'oggetto. Può essere
una delle proprietà elencate nelle relative
costanti di enumerazione.

color oldColor=ObjectGet("hlinel2", OBJPROP_COLOR);

Pagina 196
Dainesi - Guida di riferimento al linguaggio MQj.

Costante Valore Tipo Descrizione

OBJPROPJTME1 0 datetirne Imposta/ottiene il valore della data della prima coordinata.


OBJPROP_PRICE1 1 doublé Imposta/ottiene il valore del prezzo della prima coordinata.

OB3PROP_TIME2 2 datetìme Imposta/ottiene il valore delia data della seconda coordinata.


OBJPROP_PR1CE2 3 doublé Imposta/ottiene il valore del prezzo della seconda coordinata.

OBJPROP_TIME3 4 datetìme Imposta/ottiene il valore della data della terza coordinata.


OBJPROP_PRICE3 5 doublé Imposta/ottiene il valore del prezzo della terza coordinata,

OBJPROP_COLOR 6 color Imposta/ottiene il colore dell'oggetto.

OBJPROP_STYLE 7 int Imposta/ottiene lo stile della linea dell'oggetto tra i tipi seguenti
STYLE SOLID, STYLE DASH, STYLE DOT, STYLE DASHOOT,
STYLE_OASHDOTOOT.
OBJPROP_WIDTH 8 int Imposta/ottiene lo spessore della linea. I valori possibili vanno da 1
a 5.
OBJPROP_BACK 9 bool Imposta/ottiene un valore booteano per definire se l'oggetto è di
sfondo o è "solido".
OBJPROP_RAY 10 bool Imposta/ottiene un valore booleano per definire l'estensione
dell'oggetto.

OBJPROP_ELLIPSE 11 bool Imposta/ottiene un valore booleano per endere ellittici gli archi di
Flbonacci.

OBJPROP_SCALE 12 doublé Valore Doublé per impostare/recuperare la scala dell'oggetto.

OBJPROP_ANGLE 13 doublé Valore Doublé per impostare/recuperare l'angolo dell'oggetto.

OBJPROP_ARROWCODE 14 int Valore intero per impostare/recuperare ìl codice dell'oggetto freccia.


OBJPROP_TIMEFRAMES 15 int Valore (o combinazione dì valori) per impostare/recuperare i
tirneframe di visibilità dell'oggetto.
OBJPROPJDEVIATION 16 doublé Valore Doublé per i m posta re/ recupe rare la deviazione dell'oggetto
"Standard deviation".

OBJPROP_FONTSIZE 100 int Valore intero per impostare/recuperare la dimensione del font di un
oggetto di testo.

OBJPROP_CORNER 101 int Valore intero per impostare/recuperare un angolo fisso di una
etichetta. Deve essere un valore da 0 a 3.
OBJPROP_XDISTANCE 102 int Valore intero per impostare/recuperare la coordinata X dell'oggetto
in pixeis.
OB3PROP_YDISTANCE 103 int Valore intero per impostare/recuperare la coordinata Y dell'oggetto
in plxels.

OBJPROP_FIBOLEVELS 200 int Valore intero per impostare/recuperare il numero di livelli di


Fibonacci. Il valore può andare da 0 a 32.
OBJ PROP_LEVELCOLOR 201 color Valore Color per i m posta re/ recupera re il colore delta linea di livello.
OBJPROPJ.EVELSTYLE 202 int Costante per impostare/recuperare lo stile della linea di livello. Può
essere uno dei seguenti: STYLE SOLID, STYLEJ3ASH, STYLE DOT,
STYLE_DASHDOT, STYLE_DASHDOTDOT.
OBJPROP_LEVELWIDTH 203 int Valore intero per i m posta re/ recupera re la larghezza della linea di
livello. Il valore deve essere da 1 a 5.
OBJPROP_RRSTLEVEL+ r, 210+n int Valore intero per impostare/recuperare I livelli di Fìbonacci con
indice n. L'indice n può essere da O (numero di livelli -1), ma non
maggiore di 31.

Pagina 197
Odi/lesi - Guida di riferimento al (inguaggio MQL

ObjectGetFiboDescription

string ObjectGetFiboDescription(string name, int index)

Questa funzione ritorna la descrizione del livello di Rbonacci.


Il numero dei livelli dipende dal tipo di oggetto. Il numero
massimo di livelli è 32.

Parametri
Name Nome dell'oggetto.
Index Indice del livello di Fibonacci.

ObjectGetShiftByValue

int ObjectGetShiftByValue(string name, doublé value)

Questa funzione calcola e ritorna l'indice della barra per il


prezzo indicato. Il calcolo avviene assumendo le due
coordinate. Si applica alle trendline.

Parametri
Name Nome dell'oggetto.
Value Valore del prezzo.

int shi£t=ObjectGetShiftByValue("TrendDiPrimavera", 1.34);

Pagina 198
Dainesi - Guida di riferimento al linguaggio MQL

ObjectGetVatueByShift

doublé ObjectGetValueByShift(string name, int shift)

Questa funzione calcola e ritorna il prezzo per la barra


indicata.

Parametri
Name Nome dell'oggetto
Shift Indice della barra.

doublé price=Object(3etValueByShift("TrendDiPrimavera ", 2 3 ) ;

ObjectMove

bool ObjectMove(string name, int point, datetime timel, doublé


price!)

Questa funzione sposta un oggetto sul grafico, con riferimento


ad uno dei suoi punti caratteristici. Gli oggetti possono avere
da uno a tre punti in relazione alla categoria di appartenenza.
Se la funzione ha successo ritorna true, se fallisce ritorna
false.

Parametri
Name Nome dell'oggetto.
Point Indice delle coordinate da spostare.
timel Nuovo valore di data.
pricel Nuovo valore di prezzo.

ObjectMove{"TrendDIPrimavera ", 1, D ' 2 0 0 5 . 0 2 . 2 5 1 2 : 3 0 ' , 1 . 2 3 4 5 ) ;

Pagina 199
Dainesì - Guida dì riferimento al (inguoggìo

ObjectName

string ObjectName(int Index)

Questa funzione ritorna il nome dell'oggetto richiamato


tramite il suo indice.

Parametri
Index Indice dell'oggetto sul grafico. L'indice deve essere
compreso tra O e ObjectsTotal() - 1.

string name;
forfint i=0;i<obj_total;i+-t-)

name=objectName (i) ;
Print{i,"Il nome dell'oggetto è

ObjectsDeleteAII

int ObjectsDeleteAII(int window, int type=EMPTY)

Qui di uno specifico tipo ed una specifica finestra dal grafico.


Il valore di ritorno è il conteggio degli oggetti rimossi.

Parametri
Window Indice della finestra ove rimuovere gli oggetti.
L'indice deve essere maggiore o uguale a O e
minore del valore ritornato dalla funzione
WindowsTotalf).
Type Opzionale. Tipo oggetto da cancellare. Questo
valore può essere una della costanti di
enumerazioni riportate più sopra (vedi
ObjectCreate). Se viene indicato il valore EMPTY si
considerano tutti I tipi di oggetto.

Pagina 200
Dainesi - Guida di riferimento al linsuassio MQL

ObjectsDeleteAll(2, OBJ_HLINE); // re
from window
3 (Index 2).

ObjectSet

bool ObjectSet(string name, int index, doublé value)

Questa funzione permette di cambiare il valore di una


proprietà dell'oggetto passato. Se la funzione ha successo il
valore di ritorno sarà true, altrimenti sarà false.

Parametri
Name Nome dell'oggetto.
Index Indice della proprietà dell'oggetto. Può essere
una delle costanti enumerative delle proprietà
dell'oggetto.
Value Nuovo valore della proprietà.

// Spostamento della prima coordinata all'ultima barra


ObjectSet("TrendUNO", OBJPROPJTIME1, Time[OJ);

ObjectSet("FiboUNO", OBJPROP_FIRSTLEVEL+1, 1.234);

// Impostazione della visibilità dell'oggetto. Solo sul 15M e HI


ObjectSet("ObjectUNO", OBJPROP_TIMEFRAMES, OBJ_PERIOD_M15 I
OBJ PERIOD HI) ;

ObjectSetFiboDescription

bool ObjectSetFiboDescriptionfstring name, int index, string text)

Questa funzione assegna una nuova descrizione ad un livello di


Fibonacci. Il numero dei livelli dipende dal tipo di oggetto. Il
numero massimo di livelli non può superare i 32.
Pagina 201
Dainesi - Guida di riferimento al /inguaggjo

Parametri
Name Nome dell'oggetto.
Index Indice del livello di Fibonacci (0-31 ).
Text Nuova descrizione da assegnare al livello Fibonacci.

ObjectSetFiboDescriptionC'MyFiboObject,2,"Second l i n e " ) ;

ObjectSetText

bool ObjeCtSetTeXt(string name, strini text, Int font.size, string font=NULL,color


text_color=CLR_NONE)

Questa funzione imposta una descrizione dell'oggetto. Se la


funzione ha successo il valore di ritorno è true, altrimenti sarà
false.

Parametri
Name Nome dell'oggetto.
Text Testo della descrizione.
font_size Dimensione del Font.
Font Nome del Font.
text_color Colore del testo (ove rappresentato sul grafico).

ObjectSetText("text_object", "Hello world!", 10, "Times New Roman",


Green) ;

ObjectsTotal

int ObjectsTotal()

Questa utilissima funzione ritorna il numero totale di oggetti


sul grafico.

Pagina 202
Dainesi - Guida di riferimento al (inguaggio A10J.

int obj_total=objectsTotal O ;
string name;
for(int i=0;i<obj_total;i++)
{
name=ObjectName(i);
Print(i,"Il nome dell'oggetto #",i," è " + name);

ObjectType

int ObjectType(string name)


Questa funzione ritorna il tipo a cui appartiene l'oggetto in
argomento. Il valore di ritorno è una costante enumerativa del
tipo di oggetto.

Parametri
Name Nome dell'oggetto.

if(objactTypeC'lineaDUE")!=OBJ_HLINE) r e t u r n ( O ) ;

Pagina 203
Dainesi • Guida di riferimento al linguaggio MQL

C-i i ii
Variabili predefinite

Ask Digits Point


Bars High Time
Bid Low Volume
Close Open

All'interno di ogni linguaggio ci sono delle parole definite


token. Alcuni di questi token sono gli elementi comuni di ogni
linguaggio di programmazione, ovvero quelle parole che
definiscono i controlli di flusso. Altri token sono invece
specifici per la natura del linguaggio. In MQL esistono dei
token per definire degli elementi tipici delle quotazioni. Essi
si riferiscono al solo grafico in essere. Se si volesse leggere la
quotazione di un altro strumento finanziario o riferita ad un
diverso Urne frame occorrerebbe utilizzare altre funzioni
specifiche.
Pagina 205
Dainesi - Guida di riferimento al /frigi/aggio MQL

Ask

doublé Ask

Rappresenta il prezzo richiesto dai venditori (Ask) in altri


contesti definito anche "Lettera".

if (IRSI (HULL, 0, 14,PRICE_CLOSE,0)>75)

OrderClose (OrderTicket O , OrderLots O ,Ask, 3, Red) ;


return;

Bars

int Bars
Numero di barre presenti sul grafico.

int counter=l;
f o r t i n t i=l;i<=Bars;i++)

Print(Closeti-ll);

Od

doublé Bid

Rappresenta il prezzo offerto dai compratori (Bid) in altri


contesti definito anche "Denaro".

if (IRSI (NULL, 0, 14, PRICE_CLOSE, 0X25)

OrderClose (OrderTicket ( ) , OrderLots ( ) ,


return;

Pagina 206
Dainesi - Guida di riferimento al //nguaggjo MQ/.

dose

doublé Close[]
Questa variabile è un puntatore ad un array modimensionale
(ovvero un elenco) che memorizza il prezzo di chiusura della
barra. Il prezzo corrente è dato dal Close dell'elemento 0.
L'elemento 1 rappresentra la barra precedente e così via.
L'elemeto richiamato va racchiuso tra due parentesi quadre.

int handle, bars=Bars;


handle=FileOperi("file.csv",FILE_CSV|FILE_WRITE,';');
if(handle>0)
{
// Scrivo il titolo delle colonne
FileWrite(handle, "Time;Open;High;Low;Close;Volume");
// Scrivo I dati
for(int i=0; i<bars; i++)
FileWrite(handle, T i r a s t i ] , O p e n [ i ] , H i g h [ i ] , L o w [ i ] , close[i],
Volume[i]);
FileClose(handle);
1

Digits

int Digits

Questa variabile rappresenta il numero di decimali che


vengono proposti per lo strumento finanziario corrente.

P r i n t ( D o u b l e T o S t r ( C l o s e [ i - 1 ] , Digits))

High

doublé High[]

Pagina 207
Dainesi - Guida di riferimento ai linguaggio MQt

Questa variabile è un puntatore ad un array modimensionale


(ovvero un elenco) che memorizza il prezzo massimo della
barra. L'indice dell'elemeto richiamato va racchiuso tra due
parentesi quadre.

int handle, taars=Bars;


handle^FileOpen("file.csv",FILE__CSV|FILE_WRITE, ' ; ' ) ;
if(handle>0)
{
// Scrivo il titolo delle colonne
FileWrite(handle, "Tirae;Open;High;Low;Close;Volume");
// Scrivo I dati
f o r d n t i-0; i<bars; i + + )

Volume[i]);
FileClose (handle) ;

Low

doublé Low[]

Questa variabile è un puntatore ad un array modimensionale


(ovvero un elenco) che memorizza il prezzo minimo della
barra. L'indice dell'elemeto richiamato va racchiuso tra due
parentesi quadre.

int handle, bars^Bars;


handle-FileOpen("file.csv",FILE^CSVIFILE_WRITE,';');
if(handle>0)
<
// Scrivo il titolo delle colonne
FileWrite (handle, "Time;Open;High;Low,-close;Volume") ;
// Scrivo I dati
f o r ( i n t 1=0; i<bars; i++)
FileWrite(handle, l i m e l i ] , O p e r i l i ] , H i g h [ i ] , L o w [ i ] , C l o s e l i ] ,
Volume[i]);
FileClose(handle);

Pagina 208
Dainesì - Guida di riferimento al linguaggio MQL

Open

doublé Open[]

Questa variabile è un puntatore ad un array modimensionale


(ovvero un elenco) che memorizza il prezzo di apertura della
barra. L'indice dell'elemeto richiamato va racchiuso tra due
parentesi quadre.

int handle, bars=Bars;


handle-FileOpen("file.csv", FILE_CSVIFILE_WRITE, ' ; ' i ;
if (handleX)}
(
// Scrivo il titolo delle colonne
FileWrite{handle, "Time;Open;High;Low;Close;Volume");
// Scrivo I dati
fordnt i=0; i<bars; i+ + )
FileWrite(handle, Tiraefi], Open[i], High[i], Low[i], Close[i],
Volume [i] ) ;
FileClose(handle);

Point

doublé Point

Questa variabile rappresenta l'entità del punto per lo


strumento finanziario rappresentato. Il Punto non è il Pip,
anche se in alcune circostanze i due valori possono coincidere
è bene ricordarsi la differenza. A causa degli spread anche
frazionali, in termini di pips, spesso i broker forniscono le
quotazioni con un numero maggiore di decimali rispetto al
normale. In questo caso il punto, che rappresenta la più
piccola variazione possibile del prezzo, differisce dal Pip.
Quando il punto ed il Pip differiscono si è soliti sostituire la
variabile di sistema Point con un "surrogato" da usare in sua
vece che rappresenta invece il Pip. Questa sostituzione
diventa importante quando gli stop degli ordini vengono
gestini in Pips.

Pagina 209
Dainesi - Guida di riferimento al (rnguaggio A1Q/.

if (Point == 0.00001) Poin = 0.0001;


else if (Point == 0.001) Poin = 0.01;
else Poin = Point;
/*
La riga seguente, in caso di Pip diverso dal punto imposterebbe un take
profìt
di soli 5 Pipa !
*/
OrderSend(Symbol(),OP_BUY,Lots,Ask,3,O,Ask+50*Point,Red);
//Qui lo stop sarebbe corretto in ogni caso
OrderSendtSymbol(),OP_BUY,Lots,Ask,3,O,Ask+50*Poin,Red);

Time
datetime Tìme[]

Questa variabile è un puntatore ad un array modimensionale


(ovvero un elenco) che memorizza la data di apertura della
barra. L'indice dell'elemeto richiamato va racchiuso tra due
parentesi quadre.
Il valore Datetime rappresenta il numero di secondi passati
dalle 00:00 del 1 ° Gennaio 1970.

int handle, bars=Bars;


handle=FileOpen("file.csv",FILE_CSV|FILE_WRITE,';');
if (handle>0)
{
// Scrivo il titolo delle colonne
FileWrite(handle, "Time;Open;High;Low;Close;Volume");
// Scrivo I dati
for(int 1=0; i<bars; i++)
FileWrite {handle, Time [i] , Open[i] , Hlgh[i] , Low[i] , dose [i],
Volume[i]);
FileClose{handle);

Pagina 210
Dainesi - Guida di riferimento al Unqua^ìo MQL

Volume

doublé Volumef]

Questa variabile è un puntatore ad un array modimensionale


(ovvero un elenco) che memorizza il volume degli scambi in
ogni barra. L'indice dell'elemeto richiamato va racchiuso tra
due parentesi quadre.
Occorre prestare attenzione a due avvertenze. In primis
occorre ricordare che i volumi esposti non sono
rappresentativi della globalita del mercato ma solo dei volumi
percepiti dal broker (i volumi generati dai propri clienti e da
quelli movimentati dai propri partner). Secondariamente
occorre ricordare che i volumi sono espressi in decine di lotti
interi.

int handle, bars=Bars;


handle=FileOpen("file.csv",FILE_csv|FILE_WRITE, ';');
if(handle>0)
1
// Scrivo il titolo delle colonne
FileWrite(handle, "Time;Open;High;Low;Close;Volume");
// Scrivo I dati

FileWrite(handle,Time[i],0pen[i],High[i],Low[i],close[

FileClose (handle) ;

Pagina 211
Dainesi - Guida di riferimento ai lin$uassio MQL

Costanti enumerative

In programmazione ogniqualvolta si vuole che l'utilizzo di una


funzione/metodo sia vincolato all'uso di valori determinati si
ricorre all'utilizzo delle costanti enumerative che hanno in sé
un doppio vantaggio: impiegano solo i valori determinati e la
loro descrizione è esplicativa del significato per la quale è
creata.
Di seguito vedrete vari raggruppamenti di costanti suddivise
per ambito di utilizzo. Alcune possono avere lo stesso valore
ma è importante che il programmatore ne capisca l'uso grazie
alla loro descrizione.

Prezzi applicati

Queste costanti definiscono il prezzo utilizzato all'interno


delle funzioni/metodi.

Constant Value Description

PRICEJXOSE O Close price.

PRÌCE_OPEN 1 Open price.

PRICE_HIGH 2 High price.

PRICEJ.OW 3 Low price.

Pagina 213
Dainesi - Guida di riferimento al /inguaggio MQL

PRICE_MEDIAN 4 Median prjce, (high+low)/2.


PRICE_TYPIO\L 5 Typical price, (hìgfi+low+close)/3.
PRICE_WEIGHTED 6 Weighted dose price, (high+low+dose+close)/4.

Forme disegnate

Queste costanti vengono utilizzate dalla funzione


SetlndexStyle().

Costante Valore Descriptìort


DRAW_LINE O Drawing line.
DRAW_SECnON 1 Drawing sections.
DRAW_HISTOGRAM 2 Drawing histogram.
DRAW_ARROW 3 Drawing arrows (symbofs).
DRAW_ZIGZAG 4 Drawing sections between even and odd indicator buffers.
DRAW_NONE 12 No drawing.

Costante Valore Descriptìon


STYLE_SOL!D O The pen is solìd.
STYLE_DASH 1 The pen is dashed.
STYLE_DOT 2 The pen is dotted.
STYLE_DASHDOT 3 The pen has alternating dashes and dote.
STYLE_DA5HDOTDOT 4 The pen has alternating dashes and doublé dots.

Codici di errore

L'uso della funzione GetLastErrorQ permette di ottenere un


codice di errore che può essere confrontato con le seguenti
costanti. Le costanti di errore sono definite nel file
stderror.mqh. Per stampare/scrivere un messaggio di testo si
può usare la funzione ErrorDescriptionQ definita nella libreria
stdlib.mqh.

^include <stdlib.mqh>
void SendMyMessage(string text)

int check;
SendMail("Oggetto del messaggio", text);

Pagina 214
Dainesi - Guida di riferimento al iìn^ua^io MQL

check=GetLastError();
if(check !=ERR_NO_MQLERROR)
Print("Impossibile inviare i:
;rror:",ErrorDescription(check));

Codici di errore ritornati dal server del broker.

Costante ire Description

ERR_NO_ERROR No error returned.


ERR_NO_RESULT No error returned, but thè result is unknown.

ERR_COMMON_ERROR Common error.


ERR_I NVALID_TRADE_PARAMETERS Invalid trade para mete rs.
ERR_SERVER_BUSY Trade server is busy.

ERR_OLD_VERSION Old version of thè client terminal.


ERR_NO_CONNECTION No connection wtth trade server.

ERR_NOT_ENOUGH_RIGHTS Not enough rights.

ERR_TOO_FREQUENT_REQUESTS J Too frequent requests.

ERR_MAI_FUNCTIONAL_TRADE ! Malfunctional trade operation.

ERR_ACCOUNT_DISABLED i Account dìsabìed.


ERRJNVALIDJVCCOUNT > Invalid account.

ERR_TRADE_TIMEOUT Trade timeout.

ERR_INVALID_PRICE Invalid price.

ERR_.INVALID_STOPS Invalid stops.

ERR_INVALID_TRADE_VOLUME Invalid trade volume.

ERR_MARKET_CLOSED Market is closed.


ERR_TRADE_DISABLED Trade is disabled.
ERR_NOT_ENOUGH_MONEY Not enough money.
ERRJ>RICE_CHANGED Price changed.

ERR_OFF_QUOTES Off quotes.

ERR_BROKER_BUSY Broker is busy.


ERR_REQUOTE Requote.
ERR_ORDER_LOCKED Order is locked.

ERR_i.ONG_POSITION5_ONLY_ALLOWED Long positi ons only allowed.

ERR_TOO_MANY_REQUEST5 Too many requests.

ERR_TRADE_MODIFY_DENIED Modification denied because order too ciose to market.


ERR_TRADE_CONTEXT_BUSY Trade context is busy.
ERR_TRADE_EXPtRATION_DENIED Expirations are denied by broker.

ERR_TRADE_TOO_MANY_ORDERS The amount of open and pending orders has reached thè limit
set by thè broker.

Pagina 215
Danesi - Guida di riferimento al /inguaggio MQf.

ERR_TRADE_H EDGE_PROHIBITED 149 An attempi to open a position opposite to thè existing one
when hedging is disabted.
ERR_JRADE_PROHIBITED_BY_FIFO 150 An attempi to dose a position contravening thè FIFO rule.

Codici dì errore MQL4 a run tìme.

Costante Valori Descriptìon


ERR_NOJ4QLERROR 4000 No errar.
ERR_WRONG_FUNCTTON_POINTER 4001 Wrong function pointer.
ERR_ARRAY_INDEX_OUT_OF_RANGE 4002 Array index is out of range.

ERR_NO_MEMORY_FOR_CALL_STACK 4003 No memory for function cali stack.


ERR_RECURS!VE_STACK_OVERFLOW 4004 Recursive stack overflow,
ERR_NOT_ENOUGH_STACK_FOR_PARAM 4005 Not enough stack for parameter.
ERR_NO_MEMORY_FOR_PARAM_STR]NG 4006 No memory for parameter string.
ERR_NO_MEMORY_FOR_TtMP_STRING 4007 No memory for ternp string.

ERR_NOT_INmALIZED_STRlNG 4008 Not initialized string.


ERR_NOT_INrnALIZED_ARRAYSTRlNG 4009 Not initialized string in array.
ERR_NO_MEMORY_FOR_ARRAYSTRING 4010 No rnemory for array string.

ERR_TOO_LONG_STRING 4011 Too long string.


ERR..REMAINDER_FROM_ZERO_DIVIDE 4012 Remainder from zero divìde.
ERR_ZERO_DIV1DE 4013 Zero divide,
ERR_UNKNOWN_COMMAND 4014 Unknown command.
ERR_WRONG_JUMP 4015 Wrong jump (never generated errar).

ERR_NOT_INITIAL1ZED_ARRAY 4016 Not initialized array.

ERR_DLL_CALI_S_NOT_ALLOWED 4017 DLL calls are not allowed.


ERR_CANNOT_LOAD_UBRARY 4018 Cannot load library.
ERR_CANNOT_CALL_FUNCnON 4019 Cannot cali function.
ERR_E)CrERNAL_CALLS_NOT_ALLOWED 4020 Expert function calls are not allowed.
ERR_NO_MEMORY_FOR_RETURNED_STR 4021 Not enough memory for temp string returned from function.
ERR_SYSTEM_BUSY 4022 System is busy (never generated errar).

ERRJNVAQD_FUNCnON_PARAMSCNT 4050 Invalld function pararneters count.


ERRJNVALID_FUNCT]ON_PARAMVALUE 4051 Invalid function parameter value.
ERR_STRING_FUNCTIONJNTERNAL 4052 String function internai errar.

ERR_SOME_ARRAY_ERROR 4053 Some array error.

ERR_INCORRECT_SERIESARRAY_USING 4054 Incorrect series array uslng.


ERR,CUSTOM_INDICATOR_ERROR 4055 Custom indicator error.
ERRJNCOMPATIBLE^ARRAYS 4056 Arrays are incompatible.
ERR_GLOBAL_VARIABLES_PROCESSING 4057 Global variables processing error.
ERR_GLOBAL_VARIABLE_NOT_FOUND 4058 Global variable not found.

Pagina 216
Dainesi - Guida di riferimento al fingi/aggio

ERR_FUNC_NOT_ALLOWED_IN_TESTING 4059 Function is not alìowed in testing mode.

ERR_FUNCnON_NOT_CONFIRMED 4060 Function is not confirmed.


ERR_SEND_MAIL_ERROR 4061 Send rnail error.

ERR_STRINGJ>ARAMETER_EXPECTED 4062 String parameter expected.

ERR_INTEGER_PARAMETER_EXPECTED 4063 Integer parameter expected.


ERR_DOUBLE_PARAMETER_EXPECTED 4064 Doublé parameter expected.

ERR_ARRAY_AS_PARAMETER_EXPECTED 4065 Array as parameter expected.

ERR_HISTORY_WILL_UPDATED 4066 Requested history data in updating state.

ERR_TRADE_ERROR 4067 Some error in trading function.

ERR_END_OF_FILE 4099 End of file.

ERR_SOME_FILE_ERROR 4100 Some file error.

ERR_WRONG_FILE_NAME 4101 Wrong file name.


ERR_TOO_MANY_OPENED_FILES 4102 Too rnany opened files.

ERR_CANNOT_OPEN_FILE 4103 Cannot open file.

ERR_INCOMPATIBLE_FILEACCESS 4104 Incompatible access to a file.


ERR_NO_ORDER_SELECTED 4105 No orderselected.

ERRJJNKNOWN_SYMBOL 4106 Unknown symbol.

ERRJNVALID_PRICE_PARAM 4107 Invalid prìce.

ERR_INVALID_TICKET 4108 Invalid ticket.

ERR_TRADE_NOT_ALLOWED 4109 Trade is not alìowed. Enable checkbox "Allow live trading" il
thè expert properties.

ERR_LONGS_NOT_ALLOWED 4110 Longs are not alìowed. Check thè expert properties.

ERR_SHORTS_NOT_ALLOWED 4111 Shorts are not alìowed. Check thè expert properties.

ERR_OBJECT_ALREADY_EXISTS 4200 Object exists already.


ERR^UNKNOWN_OBJECT_PROPERTY 4201 Unknown object property.

ERR_OBJECT_DOES_NOT_EXIST 4202 Object does not exist.


ERR_UNKNOWN_OBJECT_TYPE 4203 Unknown object type.
ERR_NO_OBJECT_NAME 4204 No object name.

ERR_OBJECT_COORDINATES_ERROR 4205 Object coordinates errar.


ERR_NO_SPECIFIED_SUBWINDOW 4206 No specified subwindow.
ERR_SOME_OBJECT_ERROR 4207 Some errar in object function.

Serie dati Ichimoku Kinko Hyo

Costante Val Description

MODE_TENKANSEN 1 Tenkan-sen.

MODE_KDUNSEN 2 Kijun-sen.

MODE_SENKOUSPANA 3 Senkou Span A.


MODE_SENKOUSPANB 4 Senkou Span B.
MODE_CHINKOUSPAN 5 Chinkou Span.

Pagina 217
Dainesi - Guida di riferimento al linguaggio A1Q/.

Identificatori delle linee degli indicatori.

Identificatori utilizzati in iMACD(), iRVIf) e iStochastic().

Costante Valore
MODE_MAIN O Base indicator line.
MODE_SIGNAL 1 Signal line,

Identificatori usati con ÌADXQ.

Costante Valore Description


MODE_MAIN O Base indicator line.
MODE^PLUSDI 1 +DI indicator line.
MODEJ-1INUSDI 2 -DI indicator line.

Identificatori utilizzati con iBands(),


iEnvelopes(),iEnvelopesOnArray(), iFractals() e ìGatorf).

Costante Valore
MODE_UPPER 1 Upper line.
MODE_LOWER 2 Lower line.

Informazioni del mercato

Identificatori utilizzati dalla funzione Marketlnfo() per


estrarre informazioni inerenti lo strumento finanziario del
grafico.

Costante Valore Description


MOOE_LOW 1 Low day price.
MODEJ-IIGH 2 High day price.
MODE_TIME 5 The last incoming tick time (last known server tirne).
MODE_BID 9 Last incoming bid price. For thè current syrnbol, it is stored in thè
predefined variable Bid

Pagina 218
Dainesi - Guida di riferimento al linguaggio MQ}.

Last incoming ask price. Far thè current symboi, it is stored in thè
predefined variatale Ask
MODE_POINT Point size in thè quote currency. Por thè current symboi, it is stored in
thè predefined variatole Point
MODEJ3IG1TS Count of digìts after decimai point in thè symboi prices. Por thè current
symboi, it ts stored in thè predefined variable Digits
MODE_SPREAD Spread value in points.
MODE_STOPLEVEL Stop level in points.
MODE_LOTSIZE Lot size in thè base currency.
MODE_TICKVALUE Tick value in thè deposit currency.
MODE_TICKSIZE Tìck size in thè quote currency.
MODE_SWAPLONG Swap of thè long position.
MODE_SWAPSHORT Swap of thè short position.
MODE_STARTING Market starting date (usually used for futures),
MODE_EXPIRATTON Market expiration date (usually used for futures).
MODE_TRADEALLOWEO Trade is allowed for thè symboi.
MODE_MINLOT Minimum permitted amount of a lot.
MODE_LOTSTEP Step for changing lots.
MODE_MAXLOT Maximum permitted amount of a tot.
MODE_SWAPTYPE Swap calculation method. O - in points; 1 - in thè symboi base currency;
2 - by interest; 3 - in thè margin currency.
MODE_PROFTTCALCMODE Profit calculation mode. O - Forex; 1 - CFD; 2 - Futures.
MODE_MARGINCALCMODE 28 Margin calculation mode. O - Forex; 1 - CFD; 2 - Futures; 3 - CFD for
indices.
MODE_MARGININIT 29 Initial marginrequirementsfor i lot.
MODE_MARGINMAINTENANCE 30 Margin to maintain open positions calculated for 1 lot.
MODE_MARGINHEDGED 31 Hedged margin calculated for 1 lot.
MODE_MARGINREQUIREO 32 Free margin required to open 1 lot for buying.
MODE_FREEZELEVEL 33 Order freeze level in points. If thè execution price ties within thè range
defìned by thè freeze level, thè order cannot be rnodifìed, cancelled or
closed.

Codici di ritorno delle MessageBox

Questi identificatori individuano I codici di ritorno della


funzione MessageBoxQ.
Se è stato premuto il tasto Annulla la funzione ritorna il
valore IDCANCEL anche se è stato premuto il tasto ESC. Se la
finestrella della message box non ha il bottone Annulla la
pressione di ESC non avrà effetti.

Pagina 219
Dainesì - Guida dì riferimento al (inguagjio MOJ.

Nota bene: I codici di ritorno della MessageBox sono definiti


nella libreria WinUser32.mqh.

Costante Valore Descrizione

IOOK 1 OK button was selected.

IDCANCEL 2 Cancel button was selected.


IDABORT 3 Abort button was selected.
IDRETRY 4 Retry button was selected.

1DIGNORE 5 Ignore button was selected.


IDYES 6 Yes button was selected.

IDNO 7 No button was selected.


IDTRYAGAIN 10 Trv Again button was selected.
IDCONTINUE 11 Continue button was selected.

Caratteristiche delie MessageBox

Le costanti enumerative utilizzate per le proprietà della


funzione MessageBox definiscono contenuti e caratteristiche
della casella di dialogo. Questi valori possono anche essere
una combinazione di più costanti.

Nota bene: / codici di ritorno deità MessageBox sono definiti


nella libreria WinUser32.mqh. Per indicare quali pulsanti
mostrare nella messale box, specificare una delle seguenti
costanti.

Costante Valore Descrizione


MB_OK 0x00000000 The message box contains one push button: OK. This is thè default
MB_OKCANCEL 0x00000001 The message box contains two push buttons: OK and Cancel.

MB_ABORTRETRYIGNORE 0x00000002 The message box contains three push buttons: Abort, Retry, and
Ignora.
MB_YESNOCANCEL 0x00000003 The message box contains three push buttons: Yes, No, and Cancel.
MB_YESNO 0x00000004 The message box contains two push buttons: Yes and No.

MB_RETRYCANCEL 0x00000005 The message box contains two push buttons: Retry and Canee!.
MB_CANCELTRYCONTINUE 0x00000006 Windows 2000: The message box contains three push buttons: Canee
Try Again, Continue. Use this message box type instead of
MB_ABORTRETRY1GNORE.

Per mostrare un icona nella message box, utilizzare una delle


seguenti costanti.
Pagina 220
Dainesi - Guida di riferimento al /insuaggio MQL

Costante Valore Descrlption


MB_ICONSTOP, 0x00000010 A stop-sign icon appears in thè message box.
MBJCONERROR,
MBJCONHAND
MBJCONQUESTION 0x00000020 A question-mark icon appears in thè message box.
MB_ICONEXCLAMAT10N, 0x00000030 An exdamation-point icon appears in thè message box.
MBJCONWARNING
MB ICONINFORMATION, 0x00000040 An icon consistine of a lowercase letter i in a circle appears m thè
MBJCONASTERISK message box.

Per indicare il pulsante predefinito utilizzare una delle


seguenti costanti.

MBJJEFBUTTONl 0x00000000 The first button is thè default button. MB_DEFBUTTON1 is thè default unless
MB_DEFBUTTON2, M8_DEFBUTTON3, or MB_DEFBUTTON4 is specified.
MB_DEFBLnTON2 0x00000100 The second button is thè default button.
MB_DEFBt/TTON3 0x00000200 The third button is thè default button.
MB_DEFBUTTON4 0x00000300 The fourth button is thè default button.

Costanti utilizzate con le medie mobili

Le medie mobili utilizzate con gli indicatori seguenti


iAlligator(), iEnvelopesQ, iEnvelopesOnArray, iForcef),
iGator(), ÌMA(), iMAOnArray(), iStdDev(), iStdDevOnArrayf),
iStochastic() utilizzano le seguenti costanti per definire I
valori delle proprie caratteristiche:

Costante Valore
MODE^SMA O Simple moving average,
MODE_EMA 1 Exponential moving average,
MODE_SMMA 2 Smoothed moving average,
MODE_LWMA 3 Linear weighted moving average.

Costanti per la definizione delle proprietà degli oggetti

II valore dell'indice utilizzato con gli oggetti attraverso le


funzioni ObjectGetQ e ObjectSet() può assumere uno dei
seguenti valori:
Pagina 221
Dainesi • Guida di riferimento ai linguaggio MQf.

Costante Valore TYpe Descrizione

OBJPROP_TIME1 0 datetìme Datetìme value to set/get first coordinate lime part.

OBJPROP_PRICE1 1 doublé Doublé value to set/get first coordinate price part.


OBJPROP_TIME2 2 datetime Datetime value to set/get second coordinate time part.

OBJPROPJ1RICE2 3 doublé Doublé value to set/get second coordinate price part.


OBJPROP_HME3 4 datetime Datetime value to set/get third coordinate tirne part.
OBJPROP_PRICE3 5 doublé Doublé value to set/get third coordinate price part,

OBJPROP_COLOR 6 color Color value to set/get object color.

OBJPROP_STYLE 7 int Value is one of STYLE SOUD, STYLE_DASH, STYLE_DOT,


STYLE_DASHDOT, STYLE_DASHDOTDOT constante to set/get
object line style.
OBJPROP_WIDTH 8 int Integer value to set/get object line width. Can be from 1 to 5,

OBJPROP_BACK 9 bool Boolean value to set/get background drawing flag for object.

OBJPROP_RAY 10 bool Boolean value to set/get ray flag of object.

OBJPROP^ELLJPSE 11 bool Boolean value to set/get ellipse flag for fibo arcs.

OBJPROP_SCALE 12 doublé Doublé value to set/get scaie object property.

OBJPROP.ANGLE 13 doublé Doublé value to set/get angle object property in degrees.


OBJ PROP_ARROWCODE 14 int Integer value or arrow enumeration to set/get arrow code object
property.
OBJPROP_TIMEFRAMES 15 int Value can be one or combination (bttwise addition) of object
visibility constante to set/get timeframe object property.
OBJPROP_DEVIATION 16 doublé Doublé value to set/get devìation property for Standard deviation
objects.

OBJPROP_FQNTSIZE 100 int Integer value to set/get font size for text objects.
OB3PROP_CORNER 101 int Integer value to set/get anchor corner property for label objects.
Must be from 0-3.

OBJPROP_XDISTANCE 102 int Integer value to set/get anchor X distance object property in pixels.
OBJPROP_YDISTANCE 103 int Integer value is to set/get anchor Y distance object property in
pixels.

OBJPROP_FIBOLEVELS 200 int Integer value to set/get Fibonacci object level count. Can be from O
to32.
OBJPROP_LEVELCOLOR 201 color Color value to set/get object level line color.
OBJPROP_LEVELSTYLE 202 int Value is one of STYLE_SOLJD, STYLE_DASH, STYLE_DOT,
STYLE_DASHDOT, STYl_E_DASHDOTDOT constante to set/get
object level line style.
OBJPROPJ-EVELWIDTH 203 int Integer value to set/get object level line width. Can be from 1 to 5.
OBJPROP_FIRSTLEVEL+/7 210+n int Integer value to set/get thè value of Fibonacci object level with
index /7. Index n can be from O (nurnber of levels -i), but not iarger
than 31.

Pagina 222
Dainesi - Guida di riferimento al /injuass/o MQL

Costanti per la definizione del tipo di oggetto

Le seguenti costanti vengono utilizzate con le funzioni


ObjectCreateQ, ObjectsDeleteAU() e ObjectType{). Ogni
oggetto, a seconda del tipo, può utilizzare fino a tre valori.

Valore Description

OBJJ/LINE 0 Vertical line. Uses time part of first coordinate.


OBJ_HLJNE 1 Horizontal line. Uses price part of first coordinate.

OBJ_JR£ND 2 Trend line. Uses 2 coordinates.


OBJ_TRENDBYANGLE 3 Trend by angle. Uses 1 coordinate. To set angle of line use ObjectSetQ function.
OBJ_REGRESSION 4 Regression. Uses time parts of firsl two coordinates.

OBJ_CHANNEL 5 Channel. Uses 3 coordinates.

OBJ_STODEVCHANNEL 6 Standard deviation channel. Uses tirne parts of first two coordinates.

OBJ_GANNLJNE 7 Gann line. Uses 2 coordinate, but price part of second coordinate ignored.

OBJ_GANNFAN 8 Gann fan, Uses 2 coordinate, but price part of second coordinate ignored.

OBJ_GANNGRID 9 Gann grid. Uses 2 coordinate, but price part of second coordinate ignored.

O&LFIBO 10 Fibonacci retracement. Uses 2 coordinates.

OBJ_FIBQTIME5 11 Fibonacci tirne zones. Uses 2 coordinates.

OBJ_FIBOFAN 12 Fibonacci fan. Uses 2 coordinates.

OBJ_F!BOARC Fibonacci arcs. Uses 2 coordinates.

OBJ_EXPANSION Fibonacci expansions. Uses 3 coordinates.

OBJ_FIBOCHANNEL Fibonacci channel. Uses 3 coordinates.

OBJ_RECTANGLE Rectangle. Uses 2 coordinates.

OBJ.TRIANGLE 17 Triangle. Uses 3 coordinates.

OBJ.ELLIPSE Ellipse. Uses 2 coordinates.

OBJ_PITCHFORK Andrews pitchfork. Uses 3 coordinates.


OBJ.CYCLES Cycles. Uses 2 coordinates.

OBJ_TEXT Text. Uses 1 coordinate.

OBJ_ARROW Arrows. Uses 1 coordinate.

OBUABEL Text label. Uses 1 coordinate in pixels.

Costanti per la visibilità degli oggetti

Time frame nei quali l'oggetto potrebbe essere mostrato.


Usate con la funzione ObjectSet() per impostare la proprietà
OBJPROP_TIMEFRAMES.

Pagina 223
Dainesi - Guida di riferimento al linguaggio MQj.

Constant Value Description


OBJ_PERIOD_M1 0x0001 Object shown is only on I-minute charts.
OBJ_PERIOD_M5 0x0002 Object shown is only on 5-minute charts.

OBJ_PERIOD_M15 0x0004 Object shown is only on 15-rninute charts.


OBJ_PERIOD_M30 0x0008 Object shown is only on 30-minute charts.

OBJ_PERIOO_H1 0x0010 Object shown is only on 1-hotir charts.


OBJ_PERIOD_H4 0x0020 Object shown is only on 4-hour charts.
OB3_PER!OD_D1 0x0040 Object shown is only on daily charts.
OB]_PERIOD_W1 0x0080 Object shown is only on weekly charts.
OBJ_PER10D_MN1 0x0100 Object shown is only on monthly charts.

OBJ_ALL_PERIODS OxOlFF Object shown is on ali timeframes.


NULI O Ooject shown is on ali timeframes.
EMPTY -1 Hidden object on ali timeframes.

Codici predefiniti dette frecce

Costante Valore

SYMBOUJHUMBSUP 67 Thumb

SYMBOL_THUMBSDOWN 68 Thumb

SYMBOL_ARROWUP 241 Amw u

5YMBOL_ARROWDOWN 242 A

SYMBOL_STOPSIGN 251 st

SYMBOL.CHECKSIGN 252 ch

Codici speciali per frecce che puntano il prezzo e la data.

Costante Valore Description

Upwards arrow with tip rightwards ( \ ).

Downwards arrow with tip rightwards ( L}.

Left pointing triangle ( ^ ).

4 En Dash symbol (-).

SYMBOL_LEFTPRICE 5 Left sided price label.


SYMBOL_RIGHTPRICE 6 Right sided price label.

Pagina 224
udinesi - Guida di riferimento al frnguaggfo MQ}-

Identifìcatori dette serie in array

Serie utilizzate con le funzioni ArrayCopySerìes{), Highest() e


Lowest().

Costante Valore Description


MODE_OPEN O Open price.
MODE^LOW 1 Low price.
MODEJHIGH 2 High price.
MODE_CLOSE 3 Close price.
MODE_VOLUME 4 Volume, used in iLowest() and ìHighestQ functions.
MODE_TIME 5 Bar open tirne, used in ArrayCopySeries() funrtion.

Costanti spedati

Queste costanti vengono utilizzate per definire lo stato di


determinate variabili o parametri.

Costante Va I uè Description
NULI O Indicates empty state of thè string.
EMPTY -1 Indicates empty state of thè parameter.
EMPTY_VALUE Ox7FFFFFFF Default custom indicator empty value.
CLR_NONE OxFFFFFFFF Indicates empty state of colors.
WHOLE_ARRAY O Used with array functions. Indicates that ali array elements will be processed.

Costoni/ enumerative dei Time frame

Costante Valore
PERIOD_M1 1 1 minute.
PERIOD_M5 5 5 minutes.
PERIOD_M15 15 15 rninutes.
PERIOD_M30 30 30 minutes.
PERIOD_H1 60 1 hour.
PERIOD_H4 240 4 hour.
PERIODAI 1440 Daily.
PERIOD_W1 10080 Weekly.

Pagina 225
Dainesi - Guida di riferimento al fingi/aggio MQL

PERIOD_MN1 43200 Monthly.

O (zero) O Timeframe used on thè chart.

Costanti relative all'operatività di trading

Queste costanti vengono usate con la funzione OrderSend{).

Constant Valore i
OP_BUY 0 Buying posttion.
OP.SELL 1 Selling position.

OP_BUYLIMIT 2 Buy limit pending position.

OP.SELLLIMIT 3 Sell limit pending position.

OP_BUYSTOP 4 Buy stop pending position.


OP.SELLSTOP 5 Sell stop pending position.

Codici di ritorno per l'evento Uninitialize

Questi codici vengono ritornati dalla funzione


UninitializeReason().

Valore Description

0 Script finished its execution independently.

REASON_REMOVE 1 Expert removed from chart.

REASON_RECOMPILE 2 Expert recompiled.

REASONJUARTCHANGE 3 symboi or timeframe changed on thè chart.


REASON_CHARTCLOSE 4 Chart dosed.

REASON_PARAMETERS 5 Inputs parameters was changed by user.

REASON_ACCOUNT 6 Other account activated.

Pagina 226
Daìnesi - Guida dì riferimento al (inguoggio MQL

Sìmboli Wingàings

Questi codici vengono utilizzati per gli oggetti freccia (Arrow).

32 X 33 X 34 •V 35 (^./^ 36 O 37 ea 38

s 39 S 40 (S> 41 H 42 m 43 E9 44 0D 45

^D 46 & 47 a 48 & 49 i 50 I 51
i 52

i 53 1 54 A 55 jì 56 ia 57 e 58 59

Q 60 H 61 © 62 4f 63 ìs. 64 8 65 I 66

Ì9 67 5 68 "«3 69 c^= 70 i 71 $ 72 5 73

© 74 © 75 ® 76 «- 77 S 78 Fi 79 80

± 81 o 82
*
83
*
84 t 85 U- 86 ^
t 87

* 88 $ 89 O 90 C 91 A 92 & 93
T 94

K 95 II 96 s 97 98
11 99 .Q 100
"I 101

X1
O
102

109


103

110
SE
a
104

111
5

D
M 105

112
er
a
106

113
<^a 107

114

«
108

115


116 • 117 *
M 118 • 119 s 120 Q 121 3€ 122

® 123 * 124 125


n 126 D 127 © 128 ® 129

© 130 o 131 ® 132 © 133 © 134 © 135 ® 136

O 137 ® 138 0 139 O 140 e 141 e 142 O 143

0 144 @ 145 o 146 © 147 © 148 © 149 C3 150

sa 151 JO 152 O3 153 fy» 154 °^> 15S •*» 156 <^v 157

158 • 159 • 160 O 161 0 163 0 163 © 164

® 165 O 166 • 167 a 168 A 169 + 170


*
171

* 172 173
*
174 * 175
*
176 * 177 •*• 178

H 179 $ 180 O 181 * 182 O 183 © 184 ! 185

© 186 © 187 cn 188 © 189 © 190 © 191 © 192

© 193 © 194 <P 195 196 % 197 è 198 <fe 199

£ 200 £ 201 ^> 202 ^


X 203 H 204
P 205 IR 206

& 207
sJ 208 K> 209 (X 210 £T 211 212 <s 213

E> 214 < 215 216 A 217 V 218


^
C 219 s 220

O 221 o 222 ^ 223 -> 224 t 22S vi/ 226 K 227

71 228 k: 229 ^ 230 «- 231 •» 232


t 233 * 234

R 335 TP 236 ^
tf Z37 238 o 239 c> 240 •o- 241

5 242 O 243 0 244


^ 245 <? 246 t? 247 248
a 249 a 250 X 251 ^
y 252 B 253 0 254
^3
ffl 255

Pagina 227
Dainesi - Guida di riferimento al linguaggio MQL

Costanti dei colori Web

Pagina 228
Dainesi - Guida di riferimento al linguaggio MQf.

-* i

Funzioni di manipolazione delle


stringhe di testo

StringConcatenateO StringLen() StringTrimLeft()


StringFind() StringSetChar() StringTrimRight()
StringGetCharf) StringSubstr()

Le funzioni che verranno descritte in questo capitolo


permettono di leggere, modificare e confrontare stringhe di
testo che solitamente ritroviamo nei commenti, nelle
descrizioni degli strumenti finanziari tradati o nei file di testo
che vengono creati o importati dai trading System.
Spesso si utilizzano i commenti delle operazioni per
contraddistinguere ordini generati da trading System
differenti o differenti segnali all'interno dello stesso trading
System. La capacità di leggere ed analizzare i commenti
permette quindi di gestire meglio l'evoluzione "post-
apertura" degli ordini. Va peraltro ricordato che il commento

Pagina 229
Dainesi - Guida di riferimento al Imsuaggio MQÌ-

di un ordine che viene "partizionato" cambia in un commento


standard generato dalla piattaforma (es. "from #350657875")
che ne vanifica l'analisi.

S tr/ngConca iena te

string StringConcatenate( )

Questa funzione unisce varie stringhe passate come


argomento. Ognuna di queste stringhe può essere il frutto di
una funzione o variabile oltre che essere una semplice stringa.
Il risultato della funzione è una stringa. L'unica limitazione
riguardante i parametri è rappresentata dal fatto che non si
possono passare degli array. I parametri numerici di tipo
doublé vengono convcrtiti nella loro rappresentazione
testuale corredati di una precisione a 4 decimali. Per evitare i
decimali o impostarne il numero è possibile utilizzare la
funzione DoubleToStr(). I dati booleani, le date ed I colori
vengono convcrtiti in testo rappresentando I loro
corrispondenti valori numerici. Per convertire una data ad un
valore più consono alla lettura si utilizzi la funzione di
conversione TimeToStr() .
La funzione StringConcatenateQ esegue la funzione molto più
velocemente che non una concatenazione effettuata con
l'operatore +.

Parametri
Qualsiasi valore separato da virgole.

string text;
text=stringConcatenate("II margine utilizzabile è ", AccountFreeMargin()
"I/ ora attuale è ", TimeToStr(CurTime O));
Print{text);

Pagina 230
Dainesi - Guida di riferimento al /inguassio MQL

StrinsFind

int StringFind(string text, string matched_text, int start=0)

Questa funzione ricerca la prima Decorrenza del testo cercato


nella stringa passata a partire dalla posizione specificata o, in
assenza di questa, dal principio..

Parametri
Text Stringa di testo dentro la quale effettuare la
ricerca.
matched_text Testo da ricercare.
Start Posizione di partenza della ricerca.

string text = "sdQuickScalper LONG";


int index = StringFind(text, "LONG", 0);
if <index!-0)
Print ("Ordine buy!");

StringGetChar

int StrìngGetChar(string text, int pos)

Questa funzione ritorna il codice del carattere in una


specifica posizione in una stringa di testo.

Parametri
Text Stringa dove sarà ricercato il carattere.
Pos Posizione, con base di partenza zero, dove sarà
ricercato il carattere.

int char_code - stringGetchar{"abcdefgh", 3);


// II terzo carattere è 'e' il cui codice è 99

Pagina 231
Dainesì - Guido dì riferimento al (inguaggjo MQÌ-

StringLen

int StringLen(string text)

Questa funzione ritorna la lunghezza della stringa di testo.

Parametri
Text Stringa da misurare.

if (StringLenfstr) <5) r e t u m ( O ) ;

StringSetChar

string StringSetChar(string text, int pos, int value)

Questa funzione ritorna una stringa di testo a cui è stato


sostituito un carattere in una specifica posizione.

Parametri
Text Stringa dove verrà sostituito il carattere.
Pos Posizione ove avverrà la sostituzione. Sono
ammesse posizioni da O a StringLen()-1.
Value Nuovo carattere espresso in codice ASCII.

string str="sdMultiNet Entry K LONG";


string 3trl-StringSetChar(str, 18, 'H');
// strl è " sdMultiNet Entry H LONG "

StringSubstr

string StringSubstrfstring text, int start, int count=EMPTY)

Questa funzione estrae una sottostringa da una stringa di


testo, partenda da una data posizione per n caratteri ove
Pagina 232
Dainesi - Guida di riferimento al (inguasgio MQL

specificato (dalla posizione di partenza sino alla fine se non


specificato).

Parametri
Text Stringa dalla quale estrarre la sottostringa.
Start Posizione di partenza per l'estrazione.
Count Lunghezza della sottostringa.

string text="The quick brown dog jumps over thè lazy fox";
string substr=StringSubstr(text, 4, 5);
// subtracted string is "quick" word

StringTrimLeft

string StringTrimLeft(string text)

Questa funzione ritorna la stringa in argomento priva degli


spazi a sinistra. Per spazi si intendono anche I caratteri new
line e tab.

Parametri
Text Stringa da compattare a sinistra.

string strl=" Hello world ";


string str2=StringTrimLeft(str);
// after trimming thè str2 variatale will be "Hello World

StrinsTrimRisht

string StringTrìmRight(string text)

Questa funzione ritorna la stringa in argomento priva degli


spazi a destra. Per spazi si intendono anche I caratteri new
line e tab.

Pagina 233
Dainesi - Guida di riferimento al fingi/aggio MQf.

Parametri
Text Stringa da compattare a destra.

string str2=StringTrimRightfstr);
// a f t e r triraming thè str2 variable will be " Hello World"

Pagina 234
Dainesi - Guida di riferimento al linguaggio MQf.

Indicatori di analisi tecnica

Gli indicatori sono particolari valori o serie di valori estratti


dall'elaborazione dei dati elementari delle quotazioni. La loro
interpretazione permette di arrivare a delle scelte di trading
(astensione, apertura, mantenimento o chiusura delle
posizioni).
Molte delle funzioni racchiuse in questo insieme sono
particolarmente famose, altre un po' meno. E' comunque
importante sottolineare come l'assenza di questo o
quell'indicatore possa essere colmata dalla creazione della
stessa in MQL e dal suo richiamo tramite la generica funzione
iCustom().

Pagina 235
Dalnesi - Guida di riferimento al /jnguaggro MOJ.

Accelera tor/Decelera tor

doublé iAC(string symboi, int timeframe, int shift)

Oscillatore di Bill Williams Accelerator/Decelerator.

MI i

i ' I ,,,|||"'-II|-Ì--I||,. "M,

Parametri
Symbol Simbolo dello strumento finanziario sul quale
calcolare il valore dell'indicatore (NULL significa
il simbolo corrente).
Timeframe Time frame (utilizzare le costanti enumerative dei
lime frame)
Shift Offset della barra su cui effettuare il calcolo.

doublé result=iAC(NULI,, O, 1);

Accumulazione/Distribuzione

doublé iAD(strìng symboi, int timeframe, int shift)

Indicatore Accumulazione/Distribuzione di Larry Williams.


Pagina 236
Dainesi - Guida di riferimento al ìinguassio MQl

Parametri
Symbol Simbolo dello strumento finanziario sul quale
calcolare il valore dell'indicatore (NULL significa
il simbolo corrente).
Timeframe Time frame (utilizzare le costanti enumerative dei
lime frame)
Shift Offset della barra su cui effettuare il calcolo.

doublé result=iAD(NULL, O, I } ;

Indicatore Alligator

doublé ÌAIIlgatOr(string symbol, int timeframe, int jaw_period, int jaw_shift, int
teeth_period, int teeth_shift, int lips_period, int lips_shift, int ma_method, int applied_price, int
mode, int shift)

Pagina 237
Daìnesi - Guida di riferimento al fingi/aggio MQL

Parametri
Symbol Simbolo dello strumento finanziario sul quale
calcolare il valore dell'indicatore (NULL
significa il simbolo corrente).
Timeframe Time frame (utilizzare le costanti
enumerative dei time frame)
jaw_period Jaw periodi.
jaw_shift Jaw line shift.
teeth_period Teeth periodi.
teeth_shift Teeth line shift.
lips_period Lips periodi.
lips_shift Lips line shift.
ma_method MA metodo. Deve essere una delle costanti
definite per I metodi legati al calcolo delle
medie.
applied_price Prezzo applicato.
Mode Source of data. It can be any of thè following
values:
MODE_GATORJAW - Gator Jaw (blue) balance line,
MODE_GATORTEETH - Gator Teeth (red) balance line,
MODE_GATORLIPS - Gator Lips (green) balance line.
Shift Offset della barra su cui effettuare il calcolo.

PRICE_MEDIAN,
MODE_GATORJAW, 1);

Pagina 238
Dainesi - Guida di riferimento al linguaggio MQL

Average Directional Movement Index

doublé ÌADX(string Symbol, int timeframe, ìnt perìod, int applied_price, int mode.inl:
shift)

ADX o Average Directional Movement Index. Calcola un indice


che denota la presenza o assenza di trend ed analizza il
movimento scindendolo nelle due componenti direzionali in
modo da indicare la direzione. Il valore ritornato rappresenta
uno dei tre valori ricavabili impostando opportunamente il
parametro mode.

Ht, Jf

Parametri
Symbol Simbolo dello strumento finanziario sul quale
calcolare il valore dell'indicatore (NULL significa
il simbolo corrente).
Timeframe Time frame (utilizzare le costanti enumerative dei
time frame)
Period Lunghezza, in periodi, dell'indicatore.
applied_price Prezzo utilizzato per il calcolo.
Mode Uno dei valori calcolati dall'indicatore. E' grazie a
questo parametro che si decide se calcolare il
valore dell'ADX, del DI+ o del DI-. Utilizzare solo
le costanti enumerative dedicate ali'ADX.
Shift Offset della barra su cui effettuare il calcolo.

Pagina 239
Dainesi - Guida di riferimento al linguaggio MQI.

doublé dADXO = ÌADX{NULL, 0 14, PRICE CLOSE ,MODE MAIN, 0) ;


doublé dADXl = ÌADX{NULL, 0 14, PRICE CLOSE,MODE MAIH, 1} ;
doublé dDXP = ÌADX(NULL, 0 14, PRICE CLOSE,MODE PLUSDI, 0} ;
doublé dDXM = ÌADX(NULL,0 14, PRICE CLOSE,MODE MINUSDI, 0) ;

if (dADXO>dADXl && dADXO>25 && dDXP>dDXM) Print ("Trend a salire ! " ) ;


return (0) ;

Average True Range

doublé iATR(string symboi, int timeframe, int period, int shift)

L'ATR o Average True Range calcola la volatilità media di uno


strumento finanziario, intesa come distanza media tra gli
estremi di due barre contigue includendo eventuali gap. E' un
indicatore utilissimo che si usa molto per adattare in modo
automatico gli stop al "carattere" dello stumento tradato.

Parametri
Symbol Simbolo dello strumento finanziario sul quale
calcolare il valore dell'indicatore (NULL significa
il simbolo corrente).
Timeframe Time frame (utilizzare le costanti enumerative dei
time frame)
Period Lunghezza, in periodi, dell'indicatore.
Shift Offset della barra su cui effettuare il calcolo.

Pagina 240
Dainesi - Guida di riferimento al (inguagg/o MQ/.

//Calcolo dello Stop Loss quale multiplo della volatilità a 3


periodi(ATRI
doublé SL - 1ATH(NULL,0,3,1)*3.3;
OrderSend(Symbol O,OP_BUY,1.0,Ask,3,Ask-SL,0,"",0,0,Greenì;

Awesome

doublé iAO(string symboi, int timeframe, int shift)

Oscillatore Awesome di Bill Williams.

Parametri
Symbol Simbolo dello strumento finanziario sul quale
calcolare il valore dell'indicatore (NULL significa
il simbolo corrente).
Timeframe Time frame (utilizzare le costanti enumerative dei
lime frame)
Shift Offset della barra su cui effettuare il calcolo.

doublé vai - ÌAO(NULL, O, 2 ) ;

Pagina 241
Dainesi - Guida di riferimento al linsuasgio MQL

Bears Power

doublé ÌBearsPowerfstrins symboI, int timeframe, int perìod, int applied_price,int


shift)

Indicatore Bears Power.

Parametri
Symbol Simbolo dello strumento finanziario sul quale
calcolare il valore dell'indicatore (NULI
significa il simbolo corrente).
Timeframe Time frame (utilizzare le costanti
enumeratile dei time frame)
Period Lunghezza, in periodi, dell'indicatore.
applied_price Prezzo utilizzato per il calcolo.
Shift Offset della barra su cui effettuare il calcolo.

doublé vai = ÌBearsPower(HULL, O, 13, PRICE_CLOSE, 01 ;

Bande di Bollinger

doublé ÌBands(string symboI, int timeframe, int perìod, int deviation, int bands_shift, int
applied_price, int mode, int shift)

Pagina 242
Dainesi - Guida di riferimento al (inguoggio MQL

Bande di Bollinger. Questo indicatore è un utilissimo


strumento di analisi e di tendenza. I valori restituiti, a
seconda del valore passato nell'argomento mode,
rappresentano la posizione delle bande e della mediana.

Parametri
Symbol Simbolo dello strumento finanziario sul quale
calcolare il valore dell'indicatore (NULL
significa il simbolo corrente).
Timeframe Time frame (utilizzare le costanti
enumerative dei time frame)
Period Lunghezza, in periodi, dell'indicatore.
Deviation Deviation.
bands_shift Scostamento temporale.
applied_price Prezzo utilizzato per il calcolo.
Mode Uno dei valori calcolati dall'indicatore.
Usare solo le costanti enumerative delle
Bande di Bollinger.
Shift Offset della barra su cui effettuare il
calcolo.

//Calcolo dei valori della banda superiore, mediana e inferiore di


//Bollinqe
doublé BBS = iBands (NULL,0 20, 2,0,PRICE CLOSE,MODE UPPER, 0 ) ;
doublé BBM = iBands (NULL,0 20, 2,0,PRICE CLOSE,MODE MAIN,0);
doublé BEI = iBands (NULL, 0 20,2,0,PRICE CLOSE,MODE LOWER,0);

Pagina 243
Dainesi - Guida di riferimento al fingi/aggio MOJ.

Nota bene: la funzione iBands, così come l'indicatore a


corredo del terminale tra g(; indicatori standard sembra non
funzionare propriamente qualora si specifichi una deviazione
standard con decimali (es. 1.5). Si consiglia quindi di far
riferimento all'indicatore personalizzato Band (che sebbene
sia annoverato nel terminale tra gli indicatori personalizzati
è a corredo di ogni installazione della Metatrader) che invece
funziona correttamente.

Bande di Bollinger su una serie dati

doublé ÌBandsOnArray(double array[], int total, fnt period, doublé devlation,


int bands_shift, int mode, int shift)

Questa funzione calcola le Bande di Bollinger di un indicatore


e ritorna il valore della serie richiamata.

Pagina 244
Dainesi - Guida di riferimento al linguaggio MQj.

Parametri
array[] Array della serie storica dei dati.
total Numero di elementi da prendere in
considerazione.
Period Lunghezza, in periodi, dell'indicatore.
Deviation Deviation.
bands_shift Scostamento temporale.
applied_price Prezzo utilizzato per il calcolo.
Mode Uno dei valori calcolati dall'indicatore.
Usare solo le costanti enumerative delle
Bande di Bollinger.
Shift Offset della barra su cui effettuare il
calcolo.

if(iBandsOnArray(ExtBuffer,total,2,0,MODE_LOWER,0)>Low[0]) return(0);

Bulls Power

doublé ÌBullsPower(string symboi, int timeframe, int perìod, int applied_prìce,int


shift)

Indicatore Bulls Power.

Pagina 245
Dainesi - Guida di riferimento al lìn$uas$io MQL

ìlt

Parametri
Symbol Simbolo dello strumento finanziario sul
quale calcolare il valore dell'indicatore
(NULL significa il simbolo corrente).
Timeframe Time frame (utilizzare le costanti
enumerative dei time frame)
Period Lunghezza, in periodi, dell'indicatore.
applied_price Prezzo utilizzato per il calcolo.
Shift Offset della barra su cui effettuare il
calcolo.

doublé vai - iBullsPower (NULL, O, 13, PRICE_CLOSE, 0) ;

Commodities Channel Index

doublé iCCI(string symboi, int timeframe, int perìod, int


applied_price, int shift)

Indicatore Commodity channel index (CCI).

Pagina 246
Doinesi - Guida di riferimento al linguaggio MQL

Parametri
Symbol Simbolo dello strumento finanziario sul
quale calcolare il valore dell'indicatore
(NULL significa il simbolo corrente).
Timeframe Time frame (utilizzare le costanti
enumeratile dei Urne frame)
Period Lunghezza, in periodi, dell'indicatore.
applied_price Prezzo utilizzato per il calcolo.
Shift Offset della barra su cui effettuare il
calcolo.

if(iCCI(NULL,O,12,0)>iCCI(NULL,0,20,0)) return (0);

Commodities Channel Index su una serie dati

doublé iCCIOnArray(double array[], int total, int period, int


shift)
Questa funzione ritorna il Commodity channel index di una
serie dati (quindi anche di un indicatore) e ritorna il valore.

Pagina 247
Dainesi - Guida di riferimento al linguaggio MQL

'l|ltt(H

Parametri
arrayf] Array della serie storica dei dati.
total Numero di elementi da prendere in
considerazione.
Period Lunghezza, in periodi, dell'indicatore.
Shift Offset della barra su cui effettuare il calcolo.

if(iCCIOnArrayfExtBuffer, total,12,0)>ÌCCI(NULL,O,20,PRICE_OPEN, 0 ) )
return(O);

Indicatore personalizzato

doublé <Custom(string symboi, int tlmeframe, string name, ... , int


mode, int shift)

Questa funzione permette di utilizzare gli indicatori


personalizzati, ovvero tutti quegli indicatori creati da terze
parti (anche noi stessi). Dato che ogni indicatore potrebbe
non avere gli stessi parametri ecco che si è creata una
funzione dirichiamodove i primi tre parametri e gli ultimi
due sono fissi mentre ai parametri personalizzati è stato
riservato il posto centrale dove devono essere inseriti nello
stesso ordine di come appaiono nella finestra sul terminale.
Da notare che per poter restituire un valore l'indicatore

Pagina 248
Dajnesì - Guida di riferimento al /insuaggio MQL

personalizzato deve esporre almeno una serie dati (non si


possono utilizzare indicatori "puntuali" che disegnano oggetti
grafici riguardanti il solo dato corrente).

Parametri
Symbol Simbolo dello strumento finanziario sul quale
calcolare il valore dell'indicatore (NULI
significa il simbolo corrente).
Timeframe Time frame (utilizzare le costanti
enumerative dei lime frame)
Name Nome file dell'indicatore personalizzato,
senza l'estensione.
Parametri dell'indicatore separati da virgole.
Mode Serie dati di ritorno. Deve essere un numero
tra O e 7 (ogni indicatore espone un massimo
di 8 serie dati).
Shift Offset della barra su cui effettuare il
calcolo.

//Lettura dei quattro valori dell'indicatore riportato in figura


doublé OsMA - iCustom(NULL, O, "sdOsMA Color ZeroLag",12,26,9,O,0);
doublé Vali = iCusto»(NHLL, O, "sdOsMA Color ZeroLag",12,26,9,1,0);

Pagina 249
Dainesi - Guida di riferimento ai linguaggio A1QL

doublé Val2 = iCustomfNULL, O, "sdOsHA Colar ZeroLag",12,26,9,2, 01 ;


doublé Val3 = iCustom(NULL, O, "sdOsMA Coler ZeroLag",12,26,9,3,0);

Print("OsMA = " + OsMA + " VI = Vali + " V2 + Val2 + " V3 = " +


Val3) ;

Indicatore di DeMarker.

doublé iDeMarker(strin§ symboi, int timeframe, int period, int shift)

Parametri
Symbol Simbolo dello strumento finanziario sul quale
calcolare il valore dell'indicatore (NULL significa
il simbolo corrente).
Timeframe Time f rame (utilizzare le costanti enumerative dei
lime frame)
Period Lunghezza, in periodi, dell'indicatore.
Shift Offset della barra su cui effettuare il calcolo.

doublé vai = iDeMarker(NULL, O, 13, 1);

Pagina 250
Dainesì - Guida di riferimento al tinguaggjo MQÌ.

Envelope

doublé ÌEnvelOpeS(string symboi, int timeframe, int ma_period, int ma_method,


int ma_shift, int applied_price, doublé deviation, int mode, int shift)

Indicatore per il calcolo delle Envelope.

Parametri
Symbol Simbolo dello strumento finanziario sul
quale calcolare il valore dell'indicatore
(NULL significa il simbolo corrente).
Timeframe Time frame (utilizzare le costanti
enumerative dei time frame)
ma_period Lunghezza, in periodi, dell'indicatore.
ma_method Metodo utilizzato per il calcolo della
media. Deve corrispondere ad una delle
costanti enumerative relativi alle medie.
ma_shift Scostamento della media.
applied_price Prezzo utilizzato per il calcolo.
Deviation Deviazione.
Mode Uno dei valori calcolati dall'indicatore.
Usare solo le costanti enumerative delle
Envelope.
Shift Offset della barra su cui effettuare il
calcolo.

doublé vai;
vai = iEnvelopes(NULL, O,13,MODE_SMA,10,PRICE_CLOSE, O.2,MODEJJPPER,0);

Pagina 251
Dainesi - Guida di riferimento al (inguags/o MQÌ.

Envelope su una serie dati

doublé ÌEnvelOpesOnArray(double array[], int total, int ma_period, int


ma_method, int ma_shift, doublé deviation, int mode, int shift)

Questa funzione calcola le Envelope su una serie dati passata


in argomento.

Parametri
array[] Serie dati sulla quale calcolare il valore
dell'indicatore.
total Numero di elementi da utilizzare.
ma_period Lunghezza, in periodi, dell'indicatore.
ma_method Metodo utilizzato per il calcolo della
media. Deve corrispondere ad una delle
costanti enumerative relativi alle medie.
ma_shift Scostamento della media.
applied_price Prezzo utilizzato per il calcolo.
Deviation Deviazione.
Mode Uno dei valori calcolati dall'indicatore.
Usare solo le costanti enumerative delle
Envelope.
Shift Offset della barra su cui effettuare il
calcolo.

doublé vai ;
vai - iEnvelopesOnArray(ExtBuffer, O, 13, MODE_SMA, 0.2, MODE_UPPER,O);

Pagina 252
Dainesi - Guida di riferimento al linguaggio MQL

Indicatore Farce.

doublé ÌForce(string symboi, int timeframe, int perìod, int ma.method,


int applied_price, int shift)

Parametri
Symbol Simbolo dello strumento finanziario sul
quale calcolare il valore dell'indicatore
(NULL significa il simbolo corrente).
Timeframe Time frame (utilizzare le costanti
enumerative dei time frame)
perìod Lunghezza, in periodi, dell'indicatore.
ma_method Metodo utilizzato per il calcolo della
media. Deve corrispondere ad una delle
costanti enumerative relativi alle medie.
applied_price Prezzo utilizzato per il calcolo.
Shift Offset della barra su cui effettuare il
calcolo.

doublé vai - iForce(NULL, O, 13,MODE_SMA,PRICE_CLOSE,0);

Pagina 253
Daìnesì - Guida di riferimento al (inguaggio MQL

Indicatore Frettale.

doublé iFractals(string symboi, int timeframe, int mode, int shift)

Parametri
Symbol Simbolo dello strumento finanziario sul quale
calcolare il valore dell'indicatore (NULI significa
il simbolo corrente).
Timeframe Time frame (utilizzare le costanti enumerative dei
time frame)
Mode Serie dati dell'indicatore. Usare solo le costanti
enumerative dedicate.
Shift Offset della barra su cui effettuare il calcolo.

doublé vai = iPractals(NULL, O, MODE UPPER,0);

Pagina 254
Dainesi - Guida di riferimento al linguaggio MQf.

Oscillatore Gator

doublé ÌGator(string symboi, int timeframe, int jawjjeriod, int jaw_shift,


int teeth_period, int teeth_shift, int lips_period, int lips^shift,
int ma_method, int applìed_price, int mode, int shift)

Parametri
Symbol Simbolo dello strumento finanziario sul quale
calcolare il valore dell'indicatore (NULL
significa il simbolo corrente).
Timeframe Time frame (utilizzare le costanti
enumerative dei time frame)
jaw_period Jaw periodi.
jaw_shift Jaw line shift.
teeth_period Teeth periodi.
teeth_shift Teeth line shift.
lips_period Lips periodi.
lips_shift Lips line shift.
ma_method MA metodo. Deve essere una delle costanti
definite per I metodi legati al calcolo delle
medie.
applied_price Prezzo applicato.
Mode Serie dati dell'indicatore. Usare solo le
costanti enumerative dedicate.
Shift Offset della barra su cui effettuare il calcolo.

Pagina 255
Dainesi - Guida di riferimento al linguaggio MQf.

double j ;
j = iGator(NULL,0,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN,MODE_UPPER, 1);

Indicatore Ichimoku Kinko Hyo

doublé ÌlchÌmoku(string symbol, int timeframe, int tenkan_sen, int kijun_sen,


int senkou_span_b, int mode, int shift)

Parametri
Symbol Simbolo dello strumento finanziario sul
quale calcolare il valore dell'indicatore
(NULI significa il simbolo corrente).
Timeframe Time frame (utilizzare le costanti
enumerative dei lime frame)
tenkan_sen Tenkan Sen.
kijun_sen Kijun Sen.
senkou_span_b Senkou SpanB.
Mode Serie dati dell'indicatore. Usare solo le
costanti enumerative dedicate.
Shift Offset della barra su cui effettuare il
calcolo.

doublé tenkan_sen = ilchimoku(NULL, O, 9, 26, 52, MODE_TENKANSEN, 1);

Pagina 256
Doinesi - Guida dì riferimento al fìngi/aggio MQ/.

Market Facilitation

doublé iBWMFI(string symboi, int timeframe, int shift)

Indicatore riportante l'indice di Bill Williams Market


Facilitation.

IODUSDJH1 0.7717» 0.772701

t'M.11
1 l! l
Jl \ 'Hi
tt\|Ul| H
V'Hilh ,,11
1 Ini,, r 1 1, 1 ,t "1 ! ,
i" I' , i,' 1 wtiit'Aij
i 1 llihil*' '' 'I11 i

ili n hi 1 1 i li! 1 1 Ì.I..I.I l.l

Parametri
Symbol Simbolo dello strumento finanziario sul quale
calcolare il valore dell'indicatore (NULL significa
il simbolo corrente).
Timeframe Time frame (utilizzare le costanti enumerative dei
time frame)
Shift Offset della barra su cui effettuare il calcolo.

doublé vai - iBHMFI (NtJLL, O, 0 ) ;

Pagina Z57
Dainesi - Guida di riferimento al linguaggio MQL

Momentum

doublé ÌMomentUm(string symbol, int tìmeframe, int period, int applied_price, int
shift)

Parametri
Symbol Simbolo dello strumento finanziario sul
quale calcolare il valore dell'indicatore
(NULL significa il simbolo corrente).
Timeframe Time frame (utilizzare le costanti
enumerative dei lime frame)
applied_price Prezzo applicato.
Shift Offset della barra su cui effettuare il
calcolo.

if(iMomentura(NULL,O,12,PRICE_CLOSE,0)>iMomentura (NULL,0,20,PRIGE_CLOSE,0])
return(0);

Pagina 258
Dainesi - Guida di riferimento al /inguasgio MQÌ.

Momentum su una serie dati

doublé iMomentumOnArray(double array[], int total, int period, int


shift)

Questa funzione applica il Momentus su di una serie passata


come argomento.

Parametri
array[] Serie dati sulla quale calcolare il valore
dell'indicatore.
total Numero di elementi da utilizzare.
period Lunghezza, in periodi, dell'indicatore.
Shift Offset della barra su cui effettuare il calcolo.

if (iMomentumOnArray(mybuffer, 100,12, 0) >iNoraentumOnArray (mubuf fer, 100,20,


1)
return(O);

Pagina 259
Dainesi - Guida di riferimento ai linsuassio MQL

Indicatore Money flow index.

doublé iMFI(string symboi, int timeframe, int perìod, int shift)

Parametri
Symbol Simbolo dello strumento finanziario sul quale
calcolare il valore dell'indicatore (NULL significa
il simbolo corrente).
Timeframe Time frame (utilizzare le costanti enumerative dei
time frame)
period Lunghezza, in periodi, dell'indicatore.
Shift Offset della barra su cui effettuare il calcolo.

if (U4FI(NOLL,0,14,0)>iMFI(NULL,0,14,D) return(O);

Pagina 260
Dainesì - Guida dì riferimento at linguaggio MQt

Media mobile

doublé ÌMA(string syrnbol, int timeframe, int period, int ma_shift, int ma_method,
(nt applied_price, int shift)

Questo è sicuramente l'indicatore più diffuso e utilizzato in


tutta l'analisi tecnica. Le caratteristiche di ogni media sono la
lunghezza (period), il prezzo utilizzato (applied_price) e la
metodica di calcolo (ma_method).

Parametri
Symbol Simbolo dello strumento finanziario sul quale
calcolare il valore dell'indicatore (NULL
significa il simbolo corrente).
Timeframe Time frame (utilizzare le costanti
enumerative dei time frame)
period Lunghezza, in periodi, dell'indicatore.
ma_shift Scostamento dell'indicatore
ma_method MA metodo. Deve essere una delle costanti
definite per I metodi legati al calcolo delle
medie.
applied_price Prezzo applicato.
Shift Offset della barra su cui effettuare il calcolo.

AlligatorJawsBuffer[i] = ÌMA{NULL,O,13,8,MODE_SMMA,PRICE_MEDIAH,i);

Pagina 261
Dainesi - Guida di riferimento al fingi/aggio MQÌ.

Media mobile di una serie dati

doublé ÌMAOnArray(double array[], int total, int period, int ma_shift, int ma_method, int
shift)

Questa funzione calcola la media mobile di una serie passata


in argomento.

Parametri
array[] Serie dati sulla quale calcolare il valore
dell'indicatore.
total Numero di elementi da utilizzare,
period Lunghezza, in periodi, dell'indicatore.
ma_shift Scostamento dell'indicatore
ma_method MA metodo. Deve essere una delle costanti
definite per I metodi legati al calcolo delle
medie.
applied_price Prezzo applicato.
Shift Offset della barra su cui effettuare il calcolo.

doublé macurrent - iMAOnArray(ExtBuffer,0,5, 0,MODE_LWMA,0);


doublé raacurrentslc • = iMAOnArrayfExtBuffer,O,10,0,MODE_LWMA,0);
doublé maprev - iMAOnArrayfExtBuffer,0,5,0,MODE_LWMA,1);
doublé maprevslow - iMAOnArray(ExtBuffer,O,10,0,MODE_LWMA,1);

if(raaprev<maprevslow && raac irrent>=macurrentslow)


Alert("Incrocio a salire");

Pagina 262
Dairtesi • Guida di riferimento MQA

Media mobile di un oscillatore

doublé ÌOsMA(string syrnbol, int timeframe, ìnt fast_ema_period, int


slow_ema_period,int signaLperiod, int applied_prìce, int shift)

Questa funzione calcola la media mobile di un oscillatore.

Parametri
Symbol Simbolo dello strumento finanziario sul
quale calcolare il valore dell'indicatore
(NULL significa il simbolo corrente).
Timeframe Time frame (utilizzare le costanti
enumerative dei Urne frame)
fast_ema_period Numero di periodi della media veloce.
slow_ema_period Numero di periodi della media lenta.
signal_period Numero di periodi della media di
segnale.
applìed_price Prezzo applicato.
Shift Offset della barra su cui effettuare il
calcolo.

if(iOsMA(NULL, 0,12,26, 9, PRICE_OPEN,1)>ÌOSMA(NULL,0,12,26,9,PRICE_OPEN,0))


return(0);

Pagina 263
Dcànesi • Guida dì riferimento al linguassio MQL

MACD o Movìng averages convergence/d/vergence

doublé ÌMACD(string symboi, int timeframe, int fast_ema_period, int slow_ema_j>eriod,


int signal_period, int applied_price, int mode, int shift)

Parametri
Symbol Simbolo dello strumento finanziario sul
quale calcolare il valore dell'indicatore
(NULL significa il simbolo corrente).
Timeframe Time frame (utilizzare le costanti
enumerative dei lime frame)
fast_ema_period Numero di periodi della media veloce.
slow_ema_period Numero di periodi della media lenta.
signal_period Numero di periodi della media di
segnale.
applied_price Prezzo applicato.
Mode Serie dati dell'indicatore. Usare solo le
costanti enumerative dedicate.
Shift Offset della barra su cui effettuare il
calcolo.

doublé dValue = ÌMACD(NULL,O,12,26,9,PRICE_CLOSE,MODE_MAIN,0);


doublé dSignal = ÌMACD(NULL,O,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);

if(dValue > dSignal) return(O);

Pagina 264
Dainesi - Guida di riferimento al io MQL

Indicatore On Balance Volume.

doublé iOBV(string symboi, int timeframe, int applied_price, int


shift)

Parametri
Symbol Simbolo dello strumento finanziario sul quale
calcolare il valore dell'indicatore (NULL
significa il simbolo corrente).
Timeframe Time frame (utilizzare le costanti
enumerative dei time frame)
applied_price Prezzo applicato.
Shift Offset della barra su cui effettuare il
calcolo.

doublé vai = ÌOEVfNULL, O, PRICE_CLOSE, I};

Pagina 265
Dainesi - Guida dì riferimento al linguaggio

indicatore Parabolic Stop And Reverse (SAR)

doublé iSAR(string symboi, int timeframe, doublé step, doublé


maximum, int shift)

Parametri
Symbol Simbolo dello strumento finanziario sul quale
calcolare il valore dell'indicatore (NULL significa
il simbolo corrente).
Timeframe Time frame (utilizzare le costanti enumerative dei
time frame)
Step Incremento (generalmente 0.02).
Maximum Massimo valore (generalmente 0.2).
Shift Offset della barra su cui effettuare il calcolo.

i f ( i S A R ( N U L L , O , 0 . 0 2 , 0 . 2 , 0 ) > close[0]) return(O);

Pagina 266
Dainesi - Guida di riferimento al //nguaggio MQL

Indicatore dell'indice di forza relativa RSI

doublé iRSI(string symboi, void timeframe, int period, int


applied_price, int shift)

Parametri
Symbol Simbolo dello strumento finanziario sul quale
calcolare il valore dell'indicatore (NULL
significa il simbolo corrente).
Timeframe Time frame (utilizzare le costanti
enumerative dei time frame)
period Lunghezza, in periodi, dell'indicatore.
applied_price Prezzo applicato.
Shift Offset della barra su cui effettuare il
calcolo.

Lf(IRSI(NULL,0,14,PRICE_CLOSE,0)>iRSI(NULL,0,14,PRICE_CLOSE, 1))
ceturn(0);

Pagina 267
Danesi - Guida di riferimento al linguaggio MQL

Indicatore di forza relativa di una serie dati

doublé iRSIOnArray(double array[], int total, int period, int shift)

Questa funzione calcola l'RSI su una serie dati passata in


argomento.

Parametri
array[] Serie dati sulla quale calcolare il valore
dell'indicatore.
total Numero di elementi da utilizzare.
period Lunghezza, in periodi, dell'indicatore.
Shift Offset della barra su cui effettuare il calcolo.

Lf(iRSIOnBuffer(ExtBuffer,1000,14,0)>iRSI(HULL,0,14,PRICE_CLOSE, 1))
return(O);

Pagina 268
Dainesi - Guida di riferimento al linguaggio MQ/.

Indicatore dell'indice Relative V/gor

doublé iRVI(string symboi, int timeframe, int perìod, int mode, int
shift)

Parametri
Symbol Simbolo dello strumento finanziario sul quale
calcolare il valore dell'indicatore (NULL significa
il simbolo corrente).
Timeframe Time frane (utilizzare le costanti enumerative dei
time frame)
period Lunghezza, in periodi, dell'indicatore.
Mode Serie dati dell'indicatore. Usare solo le costanti
enumerative dedicate.
Shift Offset della barra su cui effettuare il calcolo.

doublé vai - ÌRVI(NULL, O, 10,MODE_MAIN,0);

Pagina 269
Dainesi - Guida di riferimento al linguaggio MQL

Deviazione standard

doublé ÌStdDeV(string symbol, int timeframe, int ma_period, int ma_method, int ma_shift, int
applied_price, int shift)

Parametri
Symbol Simbolo dello strumento finanziario sul quale
calcolare il valore dell'indicatore (NULL
significa il simbolo corrente).
Timeframe Time frame (utilizzare le costanti
enumerative dei time frame)
ma_period Periodi della media.
ma_method MA metodo. Deve essere una delle costanti
definite per I metodi legati al calcolo delle
medie.
ma_shift Scostamento della media.
applied_price Prezzo applicato.
Shift Offset della barra su cui effettuare il calcolo.

doublé vai - iStdDev(NULL,0,10,MODE_EMR,O, PRICE_CLOSE,0);

Pagina 270
Dai/lesi - Guida di riferimento al linguaggio MQ1_

Deviazione standard di una serie dati

doublé ÌStdDevOnArray(double array[], <nt total, int ma_perìod, Int ma_method,


int ma_shift, int shift)

Questa funzione calcola la deviazione standard su una serie


dati.

Parametri
array[] Serie dati passata.
total Elementi da utilizzare.
ma_period Periodi della media.
ma_method MA metodo. Deve essere una delle costanti
definite per I metodi legati al calcolo delle
medie.
ma_shift Scostamento della media.
applied_price Prezzo applicato.
Shift Offset della barra su cui effettuare il calcolo.

doublé vai = iStdDevOnArray{ExtBuffer, 100,10,MODE_EMA, O,0);

Pagina 271
Dainesi - Guida di riferimento al linguaggio MQL

Oscillatore Stocastico.

doublé ÌStOChastÌC(string symboi, int timeframe, int %Kperiod, int %Dperiod, int
slowing,int method, int price_field, int mode, int shift)

Parametri
Symbol Simbolo dello strumento finanziario sul quale
calcolare il valore dell'indicatore (NULI significa
il simbolo corrente).
Timeframe Time frame (utilizzare le costanti enumerative
dei time frame)
%Kperiod %K periodi della linea veloce.
%Dperiod %D periodi della linea lenta.
Slowing Valore di rallentamento.
Method Metodo utilizzato per il calcolo della media
mobile.
price_field Prezzi utilizzati per il calcolo dell'indicatore.
Possono essere uno dei due seguenti: O -
Low/High o 1 - Close/Close.
Mode Serie dati dell'indicatore. Usare solo le costanti
enumerative dedicate.
Shift Offset della barra su cui effettuare il calcolo.

doublé dSTv = istochastic(NULL,O,5,3,3,MODE_SMA,0,MODE_MAIN,0);


doublé dSTs = istochastic(NULL,O,5,3,3,MODE SMA,0,MODE SIGNAL,OI;

Pagina 272
Daìnesi - Guida di riferimento al linguaggio MQL

i£(dSTv>dSTs)return(0| ;

Indicatore %r di Larry William

doublé iWPR(string symboi, int timeframe, int period, int shift)

Parametri
Symbol Simbolo dello strumento finanziario sul quale
calcolare il valore dell'indicatore (NULL significa
il simbolo corrente).
Timeframe Time frame (utilizzare le costanti enumerative dei
time frame)
period Lunghezza, in periodi, dell'indicatore.
Shift Offset della barra su cui effettuare il calcolo.

if(ÌWPR(NULL,0,14,01>ÌWPR(NULL, 0,14,1)) return(0) ;

Pagina 273
Dainesi - Guida di riferimento al (inguaggjo MQL

Serie temporali

iBars() iLow() iHighest()


iBarShiftO iOpen() iLowest()
iClose() iTime()
iHigh() iVolumeO

In un linguaggio dedicato alla creazione di trading System,


come lo è MQL, esistono degli array (serie di dati) che
memorizzano i valori delle quotazioni e quindi di ogni singola
candela. Il timeframe regola la "capienza" dei dati raccolti in
ogni singola barra il che la rende differente da candele
contemporanee ma di differente range temporale (ad esempio
la barra attuale sul minuto è differente dall'attuale sull'ora).
Ogni candela incorpora quattro dati di prezzo (apertura,
chiusura, massimo e minimo), l'ora di inizio e i volumi
scambiati.
E' interessante notare come la barra O è quella attuale (quella
in formazione) e condivide con tutte le barre dei diversi
timeframe il valore del Close (essendo l'ultimo prezzo
scambiato). La barra precedente (quella che si è appena
conclusa) è la barra 1 e così via. Nei backtest può tornare
utile considerare le barre future che assumono una

Pagina 275
Dainesi - Guida di riferimento al linguaggio MQ/.

numerazione negativa (-1 per la prossima barra oltre l'attuale


e così via).

iBars

int iBars(string symboi, int timeframe)

Questa funzione ritorna il numero di candele presenti sullo


specifico grafico. Sembrerebbe questa funzione un duplicato
della variabile interna Bars ma in realtà la iBars può essere
utilizzata per interrogare altri strumenti finanziari (altri time
frame) e recuperare il numero di dati disponibili.

Parametri
Symbol Simbolo dello strumento finanziario sul quale
calcolare il valore dell'indicatore (NULI
significa il simbolo corrente).
Timeframe Time frame (utilizzare le costanti enumerative
dei time frame)

sMsg = sMsg + " sul medesimo TF ci sono " + iBars {"EURGBP", 0) + " barre

sMsg = sMsg + " EURGBP e " + iBars ( "EURCHF", 0 ) + " barre su EURCHF";
Gomme nt(sMsg);

iBarShift

int iBarShift(string symboi, int timeframe, datetime time, bool


exact=false)

Questa funzione ritorna la distanza, dalla barra attuale, della


candela contenente l'orario passato in argomento. Se l'orario
non trova corrispondenze ritornerà -1, in caso contrario, se il
parametro exact è impostato su false, verrà restituito il
valore più vicino.

Pagina 276
Dainesi - Guida di riferimento al linguaggio MQÌ.

Parametri
Symbol Simbolo dello strumento finanziario sul quale
calcolare il valore dell'indicatore (NULL significa
il simbolo corrente).
Timeframe Time frame (utilizzare le costanti enumerative dei
lime frame)
Time Valore ricercato (orario di apertura di barra).
Exact Modalità di ritorno valore in mancanza di
corrispondenza precisa, false - iBarShift ritorna il
valore più vicino, true - iBarShift ritorna -1.

datetime some_time-D ' 2 0 0 4 . 0 3 . 2 1 1 2 : 0 0 ' ;


int shift=iBarShift("EUROUSD",PERIOD_M1,some_tirae);
PrintC'shift of bar with open tirae "/TimeToStr(some_

iClose

doublé iClose(string syrnbol, int timeframe, int shift)

Questa funzione restituisce il valore di chiusura della barra


indicata nell'argomento shift, nel timeframe e strumento
finanziario selezionati. Se lo storico è vuoto la funzione
ritorna 0.

Parametri
Symbol Simbolo dello strumento finanziario sul quale
calcolare il valore dell'indicatore (NULL
significa il simbolo corrente).
Timeframe Time frame (utilizzare le costanti enumerative
dei time frame)
Shift Offset della barra su cui effettuare il calcolo.

doublé dHd = iHlgh(NULL,O,01 ;


doublé dHf - ÌHiqh("GBPCHF",O,0);
doublé dLd = iLow(NULL, O, 0) ;
doublé dLf = iLow("GBPCHF",O,O);
doublé dOd = iOpen(NULL,O, 0) ;
doublé dof = iOpen("GBPCHF",O, 0);
doublé dcd = iClose(NULL, O, O);

Pagina 277
Dainesi - Guida di riferimento al (j'nguagjj/o MQj.

doublé dCf = iClose("GBPCHF",O,0);


doublé dVd = iVolume(NULL,O,0);
doublé dVf = iVolurae("GBPCHF",O,0];

string sMsg;
sMsg = Symbol() + " Open: " + dOd + " High: " + dHd + " Low: " + dCd;
sMsg = sMsg + " Close: " + dCd + "\n";
sMsg = SMsg + "GBPCHF Open: " + dOf + " High: " + dHf + " Low: " + dCf;
sMsg = sMsg + " Close: " + dCf + "\n";
sMsg = sMsg + "Orario inizio barra: " + TimeToStr(iTime(NULL,O,0));

Corament(sMsg);

doublé iHigh(string symbol, int timeframe, int shift)

Questa funzione restituisce il valore del massimo della barra


indicata nell'argomento shift, nel timeframe e strumento
finanziario selezionati. Se lo storico è vuoto la funzione
ritorna 0.

Parametri
Symbol Simbolo dello strumento finanziario sul quale
calcolare il valore dell'indicatore (NULL
significa il simbolo corrente).
Timeframe Time frame (utilizzare le costanti enumerative
dei lime frame)
Shift Offset della barra su cui effettuare il calcolo.

doublé dHd - iHigh(HDLL, O,0);


doublé dHf = iHigh("GBPCHF", O, 0) ;
doublé dLd = iLow(NULL,O, 0);
doublé dLf - iLow("GBPCHF",O,0);
doublé dOd = iOperi (NULL, O, 0) ;
doublé dOf = iOpen("GBPCHF",O, 0) ;
doublé dCd = iClose (NULL,O,0);
doublé dcf = iClose("GBPCHF",O,0);
doublé dvd = iVolume(NULL,O,0);
doublé dVf = iVolume("GBPCHF", O, 0) ;

string sMsg;
sMsg = Symbol O Open: " + dOd High:

Pagina 278
Dainesi - Guida di riferimento al linguassio MQ/.

SMsg = sMsg + " dose: " + dCd + "\n"


SMsg = SMsg + "GBPCHF Open: " + dof + " High: " + dfif + " Low: " + dCf;
SMsg = sMsg + " dose: " + dCf + "\n"
sMsg = sMsg + "orario inizio barra: " + TimeToStr(iTime(NULL,O, 0 ) ) ;

Comment(SMsg);

iLow

doublé iLow(string symbol, int timeframe, int shift)

Questa funzione restituisce il valore del minimo della barra


indicata nell'argomento shift, nel timeframe e strumento
finanziario selezionati. Se lo storico è vuoto la funzione
ritorna 0.

Parametri
Symbol Simbolo dello strumento finanziario sul quale
calcolare il valore dell'indicatore (NULI
significa il simbolo corrente).
Timeframe Time frame (utilizzare le costanti enumerative
dei time frame)
Shift Offset della barra su cui effettuare il calcolo.

doublé dHd = iHigh(HULL, 0, 0) ;


doublé dHf = iHigh( "GBPCHF", 0,0);
doublé dLd = iLow(NULL,0, 0) ;
doublé dLf = iLow ("GBPCHF", 0,0) ;
doublé dOd = iOpen(HULL,0,0) ;
doublé dOf = iOpen ("GBPCHF", 0,0);
doublé dCd - iClose<NULL,0,0);
doublé dCf - iClose ("GBPCHF", 0,0) ;
doublé dVd = ÌVolume(NULL,0,0) ;
doublé dvf = i Volume! "GBPCHF", 0, 0) ;

string sMsg;
sMsg = SyrabolO -t- " Open: " + dOd + " High: " + dHd + " Low: " + dCd;
sMsg = sMsg + " Close: " + dCd + "\n";
sMsg - sMsg + "GBPCHF Open: " + dOf + " High: " + dHf + " Low: " + dCf;
sMsg = sMsg + " Close: " + dCf + "\n";
sHsg = sMsg + "Orario inizio barra: " 4- TimeToStr (iTirae (HULL, 0, 0) ) ;

Comment (sMsg) ;

Pagina 279
Dainesi - Guida di riferimento al linguassio MQL

iOpen

doublé Ì0pen(string symboi, int timeframe, int shift)

Questa funzione restituisce il valore di apertura della barra


indicata nell'argomento shift, nel timeframe e strumento
finanziario selezionati. Se lo storico è vuoto la funzione
ritorna 0.

Parametri
Symbol Simbolo dello strumento finanziario sul quale
calcolare il valore dell'indicatore (NULL
significa il simbolo corrente).
Timeframe Time frame (utilizzare le costanti enumerative
dei time frame)
Shift Offset della barra su cui effettuare il calcolo.

doublé dHd = iHigh{NULL,0, 0) ;


doublé dHf = iHigh("GBPCHF",Q, 0) ;
doublé dLd = iLow(NULL,0, 0) ;
doublé dLf = ÌLow( "GBPCHF", 0,0] ;
doublé dOd = iOpen(HULL, 0,0) ;
doublé dOf = iOpen ( "GBPCHF", 0, 0) ;
doublé dCd - iClose (NULL,0, 0) ;
doublé dCf = iClose ("GBPCHF", 0,0) ;
doublé dVd = iVolume (NULL,0, 0) ;
doublé dVf = i Volume ( "GBPCHF", 0, 0 );

string sMsg
sMsg = Symbol() + " Open: " + dOd + " High: " + dHd + " Low: " + dCd;
sMsg = sMsg + " Close: " + dCd + "\n";
SMsg = sMsg + "GBPCHF Open: " + dOf + " High: " + dHf + " Low: " + dCf;
sMsg = sMsg + " Close: " + dCf + "\n";
SMsg = sMsg + "Orario inizio barra: " + TimeToStr (iTime (NULL, 0, 0) ) ;

Comment (sMsg);

Pagina 280
Dainesi - Guida dì riferimento ai /jnguaggio MQL

iTime

datetime iTime(string symboi, int timeframe, int shift)

Questa funzione restituisce la data e orario di apertura della


barra indicata nell'argomento shift, nel timeframe e
strumento finanziario selezionati. Se lo storico è vuoto la
funzione ritorna 0.

Parametri
Symbol Simbolo dello strumento finanziario sul quale
calcolare il valore dell'indicatore (NULL
significa il simbolo corrente).
Timeframe Time frame (utilizzare le costanti enumerative
dei time frame)
Shift Offset della barra su cui effettuare il calcolo.

doublé dHd - iHigh(BOLL,O,0);


doublé dHf = iHigh("GBPCHF",O,0);
doublé dLd = iLow(NULL,O,0);
doublé dLf = iLow("GBPCHF",O,O);
doublé dod = iopen(NULL,O,0);
doublé dof = iopen("GBPCHF",O,0);
doublé dcd = iClose(NULL,O,0);
doublé dcf = iClose("GBPCHF",O,O);
doublé dvd = iVolurae(NULL,O,0);
doublé dVf = i Volume ("GBPCHF", O, 0) ,-

string sMsg;
sMsg = Symbol O + " Open: " + dod + " High: " + dHd + " Low: " + dcd;
sMsg = SMsg + " dose: " + dcd + "\n";
SMsg = sMsg + "GBPCHF Open: " + dof + " High: " + dHf + " Low: " + dcf;
sHsg = sMsg + " dose: " 4- dCf + "\n";
SMsg = sMsg + "Orario inìzio barra: " + TimeTOStr(iTime(HULL,0,0| ) ;

Comment(sMsg);

Pagina 281
Dainesì - Guida dì riferimento at finguasg/o MQL

i Volume

doublé ìVolume(stnng symbol, int timeframe, int shift)

Questa funzione restituisce il volume degli scambi della barra


indicata nell'argomento shift, nel timeframe e strumento
finanziario selezionati. Se lo storico è vuoto la funzione
ritorna 0.

Parametri
Symbol Simbolo dello strumento finanziario sul quale
calcolare il valore dell'indicatore (NULI
significa il simbolo corrente).
Timeframe Time frame (utilizzare le costanti enumerative
dei time frame)
Shift Offset della barra su cui effettuare il calcolo.

doublé dHd = ÌHigh(NULL,O,0);


doublé dHf = iHigh("GBPCHF",Q,0);
doublé dLd = iLow(NULL,O,O);
doublé dLf = iLow("GBPCHF",0,0);
doublé dOd = iOpen(NULL,O,0);
doublé dOf = iOpen("GBPCHF",O,0);
doublé dCd - iClose(NULL,O,0);
doublé dCf = iClose ("GBPCHF",0,0);
doublé dVd = iVolume(NULL,O,0);
doublé dVf = iVolume("GBPCHF",O,0);

string sMsg;
sMsg = Symbol () + " Open: " + dOd. + " High: " + dHd + " Low: " + dCd;
sMsg = sMsg + " Close: " + dCd + "\n";
sMsg = sMsg + "GBPCHF Open: " + dOf + " High: " + dHf + " Low: " + dCf;
sMsg = sMsg + " Close: " + dCf + "\n";
sMsg = 3Msg + "Orario inizio barra: " + TimeToStr(iTime(NULL,O,0));

Comment(sMsg);

Pagina 282
Dainesi - Guida di riferimento ai lin$uasgio MQL

ìH/g/iest

int ÌHÌgheSt(string syrnbol, int timeframe, int type, int count=WHOLE_ARRAY, int
start=0)

Questa funzione restituisce l'indice della barra, all'interno


dell'intervallo indicato, contenente il massimo riferito al tipo
di prezzo indagato.

Parametri
Symbol Simbolo dello strumento finanziario sul quale
calcolare il valore dell'indicatore (NULI
significa il simbolo corrente).
Timeframe Time frame (utilizzare le costanti enumerative
dei time frame)
Snift Offset della barra su cui effettuare il calcolo.
Type Identificatico della serie storica dei prezzi.
Deve essere una delle costanti relative alla
funzione.
Count Ampiezza in barre dell'intervallo preso in
considerazione (partendo dalla barra di
partenza verso il passato).
Start Posizione della barra più recente dell'intervallo
da esaminare.

doublé vai;

// calcolo del massimo contenuto in un intervallo di 20 candele partendo


// da 5 barre fa.
vai - High[iHighest(NULL,0,MODE_HIGH, 20, 4 ) ] ;

Pagina 283
Dainesi - Guida dì riferimento al linguaggio MQL

iLowest

int iLowest(string symboi, int timeframe, int type, int


count=WHOLE_ARRAY, int start=0)

Questa funzione restituisce l'indice della barra, all'interno


dell'intervallo indicato, contenente il minimo riferito al tipo
di prezzo indagato.

Parametri
Symbol Simbolo dello strumento finanziario sul quale
calcolare il valore dell'indicatore (NULI
significa il simbolo corrente).
Timeframe Time frame (utilizzare le costanti enumeratile
dei time frame)
Shift Offset della barra su cui effettuare il calcolo.
Type Identificatico della serie storica dei prezzi.
Deve essere una delle costanti relative alla
funzione.
Count Ampiezza in barre dell'intervallo preso in
considerazione (partendo dalla barra di
partenza verso il passato).
Start Posizione della barra più recente dell'intervallo
da esaminare.

doublé vai - Low[iLowest(HOLL, 0 , M O D E _ L O W , 1 0 , 1 0 ) ] ;

Pagina 284
Dainesi - Guida di riferimento al (inguaggio MQL

)
Funzioni di Trading

OrdersHistoryTotalO OrderLotsO OrderStopLossQ


OrderClose() OrderMagicNumber() OrdersTotal()
OrderCloseByO OrderModifyO OrderSwap()
OrderClosePrice() OrderOpenPrice() OrderSymbol()
OrderCloseTimeQ OrderOpenTimeO OrderTakeProfitO
OrderCom ment() OrderPrint() OrderTicket()
OrderCommission() OrderProfit() OrderType()
OrderDelete() OrderSelect()
OrderExpìrationQ OrderSend()

In questo capitolo entriamo nel vivo delle funzionalità


prettamente legate al trading, ovvero tutte quelle funzioni
che servono per inviare gli ordini a mercato e leggerne o
modificarne le caratteristiche.
Alcune di queste funzioni sono dispositive (invio modifica,
cancellazione e chiusura di un ordine) mentre altre sono
informative ("leggono" le caratteristiche dell'ordine).
Pagina 285
Dfl/nesi - Guida di riferimento al fingi/aggio MQJ.

A questo proposito è bene rendersi conto di cosa sia un


ordine, come si invia e capire l'importanza di alcune sue
caratteristiche.
Innanzitutto è bene precisare che ci sono due tipologie di
ordine: quelli a mercato o diretti e quelli pendenti o ad
esecuzione differita.
I primi sono inviati a mercato per un apertura immediata ed è
importante che il prezzo indicato per la loro esecuzione sia
quello di mercato o simile entro una tolleranza indicata in
pips di slippage18. I secondi sono ordini la cui esecuzione è
condizionata al passaggio del prezzo per una certa quotazione
("trigger price" ovvero il prezzo di esecuzione designato) che
deve distare dal prezzo corrente almeno quanto è il valore
esposto dal broker sotto la voce "stop level"'9.
A differenza degli ordini a mercato, gli ordini pendenti
possono contenere una scadenza, ovvero un limite temporale
oltre il quale se l'ordine non è stato aperto avviene la sua
rimozione automatica.
Da notare che gli ordini diretti "transitano" per il broker e
vanno a mercato immediatamente mentre gli ordini pendenti
"stazionano" sui server del broker sino al verificarsi di una
delle due condizioni di termine: apertura o cancellazione.
Un concetto, spesso difficile da comprendere agli inizi, è che
un ordine per essere esaminato deve essere selezionato. Per
selezionare un ordine occorre richiamarlo per il suo ordine
cardinale (la sua posizione in elenco nel portafoglio ordini) o
per il suo identificativo univoco attribuito dal broker (il
ticket): questo avviene utilizzando la funzione OrderSelect.

OrdersHistoryTotal

int OrdersHìstoryTotalO

Questa funzione ritorna il numero totale di ordini visibili nello


storico. Attenzione che il risultato di questa funzione

18 Per Slippage si intende lo "slittamento" del prezzo eseguito con riferimento al prezzo indicato nell'ordine. Tale
scostamento è dovuto all'estrema velocità degli scambi che muovono il prezzo dell'Ask e Bid tra l'invio e l'esecuzione
dell'ordine.
19
Lo Stop level è una distanza, espressa in punti (attenzione all'eventuale differenza dai pips!), a cui ogni ordine
condizionato deve distare dal prezzo di mercato. Tale distanza vale sia per gli ordini pendenti che per la distanza degli
stop (da qui il nome) quali take profit e stop loss dal prezzo di apertura, o in fase di modifica dal prezzo di mercato.
Pagina 286
Dainesi - Guida di riferimento al //nguaggio MQL

potrebbe non essere quello che ci si aspetta: in fase di


backtest tutto funziona come dovrebbe ma in reale il numero
ritornato è vincolato dagli eventuali filtri che l'utente imposta
sulla finestra dello storico. E' infatti possibile limitare la
visibilità agli ordini storici di un periodo personalizzato,
escludendo dal computo ordini antecedenti. Prima di usare
questa funzione tenete sempre a mente questo limite.

// conta degli < long, short e lo


int iLong;
int iShort;
doublé dLong;
doublé dShort;

for(int i=0;i< OrdersHistoryTotal();i++)

OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)

if(OrderType()==OP_BUY); {iLong++;dLong = dLong + OrderProfit();}


if(OrderType()==OP_SELL); {iShort++;dShort = dShort +
OrderProfit();}

string msg = "Profitto medio long: " + DoubleToStr(dLong/iLong,2);


msg = msg + " short: " + DoubleToStr(dShort/iShort,2);

Comment(msg);

OrderClose

bool OrderClose(int ticket, doublé lots, doublé price, int slippage.color


Color=CLR_NONE)

Questa funzione chiude un ordine aperto e riporta l'esito


della chiusura: true per chiusura riuscita e close in tutti gli
altri casi.

Parametri
Ticket Numero univoco di riconoscimento dell'ordine.
Questo numero è assegnato dal broker dopo la sua
apertura e/o modifica.
Lots Numero di lotti (o frazioni) da chiudere. Se il
volume indicato è inferiore alla dimensione
Pagina 287
Dainesi • Guida di riferimento al (inguaggio AlQt

dell'ordine aperto si avrà una chiusura parziale.


Attenzione affinchè si rispettino i vincoli relativi ai
volumi minimi ammessi.
Price Prezzo di chiusura definito.
Slippage Valore massimo dello slippage, in punti, ammesso.
Coler Colore della freccia che sul grafico evidenzierà il
punto di chiusura. Se il colore non è indicato o è
impostato su CLR_NONE la freccia non verrà
disegnata sul grafico.

if(dMACDv < dMACDS)

OrderClose(OrderTicket() , OrderLotsO, Bid, 3, Green);


return(0);

OrderCloseBy

bool OrderCloseBy(int ticket, int opposite, color Color=CLR_NOKE)

Questa funzione chiude un ordine con un altro di segno


opposto. Se la funzione ha successo il valore di ritorno è true
altrimenti sarà false.
Attenzione all'uso di questa funzione poiché dal 26 luglio
2009 (data dove ho sperimentato sui miei conti l'accaduto)
tale funzionalità non è supportata dai broker di tipo STP ed
ECN. Questa funzione nasce con l'intento di agevolare gli stop
and reverse facendo risparmiare uno spread grazie all'uso di
soli tre passassi anziché quattro nella chiusura dei due ordini
(apertura, apertura doppia contraria e chiusura finale contro
apertura, chiusura, apertura e chiusura finale), ma in pratica
è fonte di numerosi grattacapi e perdite economiche non
indifferenti (ad ogni tick si cerca di chiudere un ordine
aprendone uno opposto ma in realtà il primo rimane aperto
ed il secondo si ripete sino ad esaurire il margine e
conseguente sell-out20 da parte del broker). Al posto

Con il termine "Sell-out" si definisce quella pratica che prevede la chiusura automatica, da parte del broker, di tutte le
posizioni detenute dal cliente che abbia eroso più del 70% del margine disponibile. La misura percentuale può variare
da broker a broker ma è comunque giustifata dalla necessità di tutelarsi dagli "scoperti" che altrimenti si genererebbero
in caso di sbalzi improvvisi delle quotazioni.
Pagina 288
Dainesi - Guida di riferimento al linsuaqsio MQL

dell'utilizzo di questa funzione consiglio vivamente la


chiusura e riapertura classica.

Parametri
Ticket Identificativo dell'ordine in chiusura.
apposite Identificativo dell'ordine che chiude. Entrambi
gli ordini devono già essere aperti (la chiusura
è infatti un solo atto "amministrativo")
Colar Colore della freccia che sul grafico evidenzierà il
punto di chiusura. Se il colore non è indicato o è
impostato su CLR_NONE la freccia non verrà
disegnata sul grafico.

if(dMACDv < dMACDS)

ìnt iPrevOrders = OrderTicket{)!


int iNewOrder = OrderSendfNULL,OP_SELL,orderLotsO*2,
Ask, 3,0,0,"",0,O,Red);

OrderCloseBy{iPrevOrder, iNewOrder);

return(0);

OrderClosePrice

doublé OrderClosePrice()

Questa è una funzione informativa che ritorna il prezzo di


apertura dell'ordine selezionato. L'ordine deve quindi esser
prima selezionato tramite la funzione OrderSelect() ed è
altrettanto ovvio che l'ordine deve essere un ordine chiuso e
quindi contenuto nell'elenco degli ordini storici.

OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);


Print ("Prezzo di chiusura ordine #" + OrderTicket O + ":
", OrderClosePrice ( ) ) ;

Pagina 289
Dainesi - Guida di riferimento al lin$uassio MQL

OrderCloseTime

datetime OrderCloseTìmeQ

Questa funzione ritorna l'orario di chiusura dell'operazione


selezionata. Ovviamente ci si riferisce ad un ordine chiuso o
cancellato.

if(OrderSelect(10,SELECT_BY_POS,MODE_HISTORY)--true)
{
datetime ctm=OrderOpenTiraeO ;
if(ctra>0) print("Prezzo di apertura 10 ", ctm);
ctm = OrderCloseTime ( ) ;
if(ctm>0} Print("Close time for thè order 10 ", ctm);
}
else
Print("OrderSelect failed error code i s " , G e t L a s t E r r o r ( ) ) ;

OrderComment

string OrderComment()

Questa funzione ritorna il contenuto del commento associato


all'operazione selezionata. Attenzione a non fare troppo
affidamento al contenuto del commento in quanto questo
cambia qualora avvenga una chiusura per parti.

OrderSafetySend(NULL,OP_BHY,2,Ask,3,SL,0,"sdMulti 7 LONG",12,0,Green);

forfint i=0;i<OrdersTotall) ;i++)


{
OrderSelect (i, SELECT_BY_POS) ;
if(OrderComment0=="sdMulti 7 LONG")
FaiQualcosaO ;
else
Print("Ordine non riconosciuto: " + OrderCommentO);

Pagina 290
Dai/lesi - Guida di riferimento al linguaggio MQt-

OrderCommission

doublé OrderCommission()

Questa funzione ritorna il valore delle commissioni applicate


sull'operazione selezionata. Le commissioni sono
normalmente applicate dai broker ECN o dai broker presso i
quali si è stati introdotti da un Introducer Broker (in questo
caso la commissione rappresenta la remunerazione
dell'lntroducer Broker).

doublé dCom = OrderCommission ( ) ;


doublé dLot = OrderLots {) ;
if (dCom>0 ) Print ( "Applicata una cor
missione di " + dCom/dLot + " x
lotto") ;

OrderDelete

bool OrderDelete(int ticket)

Questa funzione cancella un ordine pendente (per gli ordini


aperti utilizzare la OrderClose). Se la funzione ha successo
ritorna true altrimenti false.

Parametri
Ticket Identificativo univoco dell'ordine.

i f(Volume[1]>Volume[2]+Volurae[3])

OrderDelete(OrderTicket());
return(0);

Pagina 291
Dainesi - Guida di riferimento Ql linguaggio MQL

OrderExpiration

datetime OrderExpiration()

Questa funzione ritorna la data e ora di scadenza dell'ordine


pendente selezionato. Tutti gli ordini a mercato e quelli
aperti hanno impostato a zero questa proprietà.

OrderSelect(i, SELECT_BY_POS);
if(OrderExpiration O !=0)

print("L'ordine scadrà il " + TimeTostr(OrderExpiration()));

OrderLots

doublé OrderLotsQ

Questa funzione ritorna la dimensione attuale, in lotti,


dell'ordine selezionato.

doublé dCom = OrderCortimission ( ) ;


doublé dLot = OrderLots();
if(dCom>0)Prìnt("Applicata una commissione di dCom/dLot +
lotto");

OrderMagicNumber

int OrderAAagicNumberO

Questa funzione recupera un numero intero, chiamato per


l'appunto MagicNumber (che di magico non ha proprio nulla),
che solitamente viene inserito nell'ordine per rivendicarne la
paternità strategica.
Come potrebbe un trading System gestire solo gli ordini
generati da lui senza confondersi con tutti gli altri ordini in
Pagina 292
Dainesi - Guida di riferimento al linsuassio MQL

portafoglio ? Ecco l'introduzione del MagicNumber che funge


da identificativo (quasi fosse un centro di costo parlando in
modo ragioneristico) che dovrebbe21 rendere riconducibile
ogni ordine alla sua strategia (trading System).

//funzione che restituisce il numero di ordini aperti


int OpenedOrders( 1

int i;
int Tot=0;
for{i=Q;i<OrdersTotal();i++)

OrderSelect(i,SELECT_BY_P03);
if OrderSymbol() == Symbol(] ss OrderMagicNumber(1 == MagicNumber)
Tot++;
}
return (Tot);

OrderModify

bool OrderModìfy(int ticket, doublé price, doublé stoploss, doublé takeprofit,


datetime expiration, color arrow_color=CLR_NONE)

Questa funzione permette di modificare un ordine già inviato


a mercato o sul server del broker. Se l'ordine è già aperto
sarà possibile modificare solo gli stop (stop loss e take profit)
se invece fosse un ordine pendente ancora ineseguito sarà
possibile modificarne anche la scadenza ed il prezzo di
ingresso. Se la modifica ha successo la funzione ritorna true,
false in caso negativo.
La OrderModify viene solitamente utilizzata nelle funzioni di
trailing stop e nell'inserimento degli stop dopo l'invio degli
ordini a mercato tramite broker STP o ECN.

Parametri
Ticket Ticket dell'ordine da modificare.
Price Nuovo prezzo di ingresso (solo per ordini
pendenti).
21
II condizionale è d'obbligo poiché due o più trading System potrebbero utilizzare, per coincidenza, lo stesso
MagicNumber ingenerando confusione e gestioni anomale degli ordini. Un trading System professionale dovrebbe
sempre dare la possibilità al suo utilizzatoro di poter variare il valore di tale proprietà.
Pagina 293
Dainesi - Guida di riferimento al (inguagg/o A1Q/.

Stoploss Nuovo stop loss.


Takeprofit Nuovo take profit.
Expiration Nuova scadenza dell'ordine (solo per ordini
pendenti).
arrow_color Colore della freccia che identifica l'ordine
sul grafico. Se è omesso o è O o CLR_NONE la
freccia non verrà disegnata.

if(OrderStopLoss O <Bid-Point*TrailingStop)
orderModifyforderTicketO,OrderOpenPrice(1,Bid-
point*TrailingStop,0,0,Blue);

OrderOpenPrice

doublé OrderOpenPrice()

Questa funzione ritorna il prezzo di apertura dell'ordine


selezionato.

for(i=0;i<OrdersTotal();i++)
(
OrderSelect(i,SELECT_BY_POS);
if OrderSymtaol() — SymbolO && OrderMagicNumber() == MagicNumbe
if(OrderType()==OP_BUY ss OrderOpenPrice()< Bid)
Print("Ordine in profitto.");

OrderOpenTime

datetitne OrderOpenTime()

Questa funzione ritorna la data e ora di apertura dell'ordine


selezionato.

Pagina 294
Dainesi - Guida di riferimento al linguaggio MQL

if(OrderOpenTime()<Time[0] )
Print("I/ordine non è stato aperto sulla barra corrente");

OrderPrìnt

void OrderPrintQ

Questa funzione permette di inviare i dati dell'ordine


all'interno del log del terminale.

sdProva.raq4
Copyright © 2010, SD Studio Dainesi
http://www.sdStudìoDainesi.com

#property copyright "Copyright © 2010, SD Studio Dainesi"


#property link "http: //www. sd3tudioDainesi.com"

//| script program start function

int start ()

for (int i=0;i<OrdersTotal (} ;i+

OrderSelect (i, SELECT_JBY_POS) ;


OrderPrint ( ) ;

/* Di seguito un esempio di output su un ordine di 2 lotti senza stop su


EURGBF

2010.09.29 11:44:48 sdProva EURGBP,M15: #41926833 2010.09.29 10:44 buy


2.00 EURGBP 0.86000 0.00000 0.00000 0.85973 0.00 0.00 -85.43 O

OrderProfit

doublé OrderProfitQ
Pagina 295
Dai/lesi - Guida di riferimento al linguaggio MQf.

Questa funzione restituisce il profitto o la perdita in moneta


di conto dell'ordine selezionato. Per gli ordini aperti
rappresta il risultato istantaneo mentre per gli ordini storici è
l'esito definitivo (per gli ordini pendenti vale sempre zero).

doublé dResult;

for(int i=0;i<ordersTotalO;i++)
{
OrderSelect(i,SELECT_BY_POS);
if(OrderSymbolO " SymbolO && OrderMagicNumber() == MagicNumber);
dResult = dResult + OrderProfit();

if(dResult>0)

else

OrderSelect

bool OrderSelectfint index, int select, int pool=MODE_TRADES)

Questa importantissima funzione è la quella che ci permette


di selezionare un ordine, sia esso storico o attuale, estratto
per posizione o per ticket.
Attenzione che la validità della selezione effettuata con
questa funzione è globale. Questo significa che una
OrderSelect effettuata in una funzione richiamata da una
routine principale cambia l'ordine correntemente selezionato
anche nella principale.

Parametri
Index Indice dell'ordine o suo ticket (la valenza viene decisa
dal secondo parametro).
Select Tipologia di selezione. Deve essere una delle due
seguenti:
SELECT_BY_POS - indice nell'elenco del portafoglio
ordini
Pagina 296
Dainesi - Guida di riferimento al linguaggio MQL

SELECT_BY_TICKET - ticket dell'ordine


Pool Optional, indica l'insieme nel quale vengono estratti
gli ordini. Usato insieme al parametro SELECT_BY_POS
può avere uno dei due seguenti valori:
MODE_TRADES (default)- l'ordine viene selezionato
dall'insieme degli ordini attivi (a mercato e
pendenti).
MODE_HISTORY - l'ordine viene estratto dallo storico
mostrato dal portafoglio ordini storici presente nel
terminale22.

//Selezione di un ordine attivo per il suo indice


OrderSelect(12, SELECT_BY_PQS);

//Oppure
OrderSelect{14, SELECT_BY_POS, MODEJTRADES);

//Selezione di un ordine storico per il suo indice


OrderSelect (2, SELECT_BY__POS, MODE_HISTORY) ;

//Selezione di un ordine attivo per il suo ticket


OrderSelect(41926833, SELECT BY TICKET);

OrderSend

Int OrderSend(string symboi, int cmd, doublé volume, doublé price, int slippage,
doublé stoploss, doublé takeprofit, string comment=NULL, int magic=0,
datetime expiration=0, color arrow_color=CLR_NONE)

Questa funzione fondamentale permette di inviare un ordine,


sia esso pendente o diretto. Il suo valore di ritorno rappresnta
il ticket restituito dal server del broker. Se l'invio fallisce il
valore di ritorno è -1.
Attenzione! Con broker ECN e STP l'ordine a mercato non
può essere inviato corredato degli stop. Questi potrebbero
causare il rifiuto dell'esecuzione o, peggio, l'esecuzione
dell'ordine sprovvisto di stop. Per arginare questo problema

22
Attenzione che se nel portafoglio ordini storici è stato applicato un filtro di visibilità questo influenzerà l'azione della
OrderSelect.
Pagina 297
Dainesi - Guida di riferimento al fingi/aggio MQL

si consiglia di creare una funzione analoga alla OrderSend che


spezza in due l'esecuzione dell'ordine: prima invia l'ordine
senza stop e successivamente lo modifica con la OrderModify
inserendo gli stop.

Parametri
Symbol Simbolo dello strumento tradato.
Cmd Tipo di operazione da compiere. Tale
operazione deve essere una di quelle
enumerate nelle costanti apposite.
Volume Dimensione dell'ordine in lotti.
Price Prezzo di esecuzione.
Slippage Massimo slippage consentito per ordini a
mercato.
Stoploss Stop loss.
Takeprofit Take profit.
Comment Commento all'ordine. La lunghezza massima è
di 32 caratteri.
Magie Magie number. Identificatore di trading System.
Expiration Scadenza dell'ordine espressa come numero di
secondi dal 1 gennaio 1970 (solo per ordini
pendenti).
arrow_color Colore della freccia utilizzata per
contrassegnare sul grafico l'apertura della
posizione. Se il valore viene omesso o ha valore
CLR_NONE la freccia non verrà disegnata.

datetime dtExp = Time[0]+Period()*6


doublé SL = StopLossO;
double TP = TakeProfit();
doublé SetSS - SetupShortstop ( );
doublé SetLS = SetupLongStop ( ) ;
doublé SetSL = SetupShortLimitO ;
doublé SetLL = SetupLongLìmit O ;

//Ordine LOHG a mercato


OrderSendfSymtaol() ,OP_BUY, Lots, Ask, 3, SL, TP, "sdLong M", 123, O,
Green);

//Ordine SHORT a mercato


OrderSendfSymbol(),OP_SELL, Lots, Bid, 3, SL, TP, 'sdshort M", 123, O,
Red) ;

Pagina 298
Dainesi - Guida di riferimento al linsuassìo MQL

//Ordine LONG pendente stop


OrderSend(Symbol O,OP_BUYSTOP,Lots,SetLS,3,SL,TP,"sdLong
S", 123,dtExp,Green);

//Ordine SHORT pendente stop


OrderSend(Symbol O,OP_SELLSTOP,Lots,setss,3,SL,TP,"sdshort
S",123,dtExp,Red);

//Ordine LONG pendente limit


orderSend(Symbol(I ,OP_BUYLIMIT,L
L",123,dtExp,Green);

//Ordine SHORT pendente limit


OrderSendtSymbol O,OP_SELLLIMIT,Lots,SetSL,3,SL,TP,"sdshort
L",123,dtExp,Red);

OrderStopLoss

doublé OrderStopLoss()

Questa funzione recupera il valore dello stop loss per l'ordine


selezionato.

PrintC'Lo stop loss è posizionato a ", OrderStopLoss O);

OrdersTotal

int OrdersTotalQ

Questa interessante funzione ritorna il numero totale degli


ordini presenti nel portafoglio ordini attivi, ovvero quelli
aperti e quelli pendenti. Occorre tenere presente che
l'insieme degli ordini ha base zero, ovvero il primo ordine
dell'insieme possiede indice zero mentre l'ultimo ha indice
OrdersTotal()-1.
Attenzione! Se si utilizza il risultato di questa funzione per
ciclare l'insieme degli ordini ed eventualmente chiuderne
qualcuno è bene applicare un ciclo for inverso in quanto il
valore restituito dalla OrdersTotalQ ad ogni chiusura
cambierebbe invalidando il ciclo.
Pagina 299
Dainesi - Guida di riferimento at linsuasgio MOJ.

//Ciclo per azioni informative


for(int i=0;i<OrdersTotal() ;i++

OrderSelect(i, SELECT_BY_POS);
//fai qualcosa

//Per l'eventuale chiusura preferire un ciclo inverso


for(int i - OrdersTotal()-l;i>=0;i--)

OrderSelect(i, SELECT_BY_POS);
if (DevoChiudere (orderTicket (} ) ==true) Orderdose (...);

OrderSwap

doublé OrderSwap()

Questa funzione ritorna il valore degli interessi di rollover


(swap interest) applicati dal broker sulle transazioni in leva.
Tale interesse equivale al differenziale dei tassi LIBOR delle
due valute coinvolte nel contratto forex, a cui è aggiunto il
markup del broker.
Attenzione! Nei backtest questo valore viene sempre omesso
ma nella realtà, per operazioni di durata considerevole, lo
swap può assumere molta importanza.

PrintC'L'interesse Swap dell'ordine #", OrderTicket O,


",OrderSwap()) ;

OrderSymboI

string OrderSymbol()

Questa funzione ritorna la stringa di testo che descrive lo


strumento finanziario tradato.

Pagina 300
Daìnesi - Guida di riferimento al tinsuaggio MQf.

doublé dResult;

for(int i=0;i<OrdersTotal(];i++)
{
OrderSelect(i,SELECT_BY_POS);
ìf(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber);
dResult = dResult + OrderProfìt();

if(dResult>0)
Print("Profitto.");
else
Print("Perdita.");

OrderTakeProfit

doublé OrderTakeProfit()

Questa funzione recupera il take profit dell'ordine


selezionato.

for(int i=0;i<OrdersTotal();!++]
f
OrderSelect(i,SELECT_BY_POS);
if(OrderSyrabol() == Symbol() && OrderMagicHumber() == MagicNumber);
{
if(OrderStopLoss()==0)StopLossChecker();
if(OrderTakeProfit()==0)TakeProfitChecker(];

OrderTicket

int OrderTicketO

Questa funzione restituisce il ticket dell'ordine selezionato.

iOrder=OrderTicket() -,

Pagina 301
Darnesj - Guida di riferimento al ljnsuas$io

OrderType

int OrderType()

Questa funzione identifica il tipo di ordine selezionato,


valore deve essere uno dei seguenti:

OP_BUY buy
OP_SELL sell
OP_BUYLIMITbuy limit
OP_BUYSTOP buy stop
OP_SELLLIMIT sell limit
OP_SELLSTOP sell stop

for(int i-0;i<OrdersTotal(1,-i-n-)
(
OrderSelect(i,SELECT_BY_POS);
if(OrderSymbol() — SymbolO && OrderMagicNumber{) == MagicNumber);
I
if(OrderType{)==OP_BUY)LongTrailing ();
if(OrderType()==OP_SELL)SellTrailing ();

Pagina 302
Comesi - Guida di riferimento al linguaggio MQ/.

Funzioni di gestione finestre

HideTestlndicatorsO WindowPriceOnDropped()
Periodo WindowPriceMax()
RefrashRates() WindowPriceMin()
Symbol() WindowOnDropped()
WindowBarsPerChart() WindowRedraw()
WindowExpertName() WindowScreenShot()
WindowFind() WindowTimeOnDropped()
WindowFirstVisibleBarO WindowsTotal()
WindowHandle() WindowXOnDropped()
WindowIsVisible WindowYOnDropped()

Le funzioni di gestione delle finestre sono un gruppo di funzioni native


molto utili per identificare l'ambiente in cui devono operare indicatori
e trading system. Si pensi ad esempio alla necessità di sapere su quale
strumento stiamo operando e su quale timeframe l'utente ha
Pagina 303
Dainesi - Guida di riferimento al ìinsuassio MQjL

impostato il grafico. Grazie a questo insieme di funzioni queste


informazioni sono facilmente reperibili. Non solo, abbiamo anche la
possibilità, utile soprattutto per chi crea indicatori, di identificare
quante e quali sono le finestre aperte (si pensi alle sottofinestre),
quante barre sono visibili e tra queste individuarne gli eccessi, oltre
alla "chicca" di poterne salvare una visione in un file per gli utilizzi del
caso (si pensi ad un'applicazione che deve spedire ai clienti lo
screenshot del contesto operativo nel quale si è aperta o chiusa un
operazione di trading).

Hide Testlndica tors

void HideTestlndicators(bool bidè)

Questo metodo imposta la visibilità o meno degli indicatori a


fine test.

Parametri
Hide True se si vogliono visualizzare, false in caso si
vogliano tenere nascosti. La visibilità viene definita
di volta in volta come nell'esempio seguente:

HideTestlndicatorsftrue);
MaCurrent=iMA(NULL,0,56,0,MODE_EMA,PRICE_CLOSE,0);
MaPrevious=iMA(NULL, 0,56,0,MODE_EMA,PRICE_CLOSE,1);
HideTestlndicators(false);

Period

int Periodo

Questa utilissima funzione ritorna il timeframe del grafico.


Risulta utilissima quando si vogliono ricavare valori delle
quotazioni o degli indicatori per differenti timeframe.

Pagina 304
Dainesi - Guida di riferimento al lìnguassio MQJ.

//Autoregolazione del filtro ATR


switch (Periodo )

case PERIODAMI: {MìnATR15M = MinATR15M/3;break


case PERIOD_M5: jMinATR15M = MìnATR15M/2,-break
case PERIOD_M30: {MinATRISM = MìnATR15M*2;break
case PERIODAMI: {MinATRISM = MinATRl5M*3;break
case PERIOD_H4: {MinATRISM = MinATR15M*5;break
case PERIODACI: {MinATRISM = MinATR15M*10;brea
case PERIODAMI: {MìnATRISM = MinATR15M*50;brea
case PERIODAMI: {MinATR15M = MinATR15M*200;bre
default:break;

RefreshRates

bool RefreshRatesQ

Questa funzione aggiorna i dati delle variabili predefinite e


delle serie dati delle quotazioni. Questo metodo è utile
quando si deve inviare un ordine dopo aver fatto eseguire dei
calcoli che hanno tenuto impegnato il processore per
parecchio tempo (secondi). Se l'aggiornamento ha successo il
valore di ritorno è true, altrimenti sarà false.

Symbol

string Symbol()

Questa funzione ritorna una stringa di testo con la descrizione


dello strumento finanziario rappresentato nel grafico.

for(int i=OrdersTotal()-l;i>=0;i—]

OrderSelect (i, SELECT_BY__POS) ;


if (OrderSymbol()==Symbol() s& OrderMagicNumber()==MagicNumber)
{
//Gestione ordini

Pagina 305
Dainesi - Guida di riferimento al (inguaggio MOJ.

WindowBarsPerChart

int WindowBarsPerChart()

Questa funzione restituisce il numero di barre visibili sulla


finestra grafico.

int iTotBars = WindowBarsPerChart(];

WindowExpertName

int WindowExpertNameO

Questa funzione ritorna il nome dell'expert, dello script o


dell'indicatore personalizzato dal quale la funzione è invocata
(in pratica è una funzione che ritorna il nome del
"container").

ent(WindowExpertName{) + " su " + Symbol O);

WindowFìrstVisibleBar

int WindowFirstVisibleBarO

Questa funzione ritorna l'indice della prima barra visibile


all'estrema sinistra della finestra del grafico. Attenzione! Non
si tratta della prima barra presente nel grafico ma della prima
barra visibile nella finestra, se si scorre a sinistra questo
valore cambia così come cambia se comprimiamo la visuale.
Pagina 306
Dainesi - Guida di riferimento al linguaggio MQL

string sMsg = "Range visibile: dal " +


TimeToStr(WindowFirstVisibleBar());
sMsg - sMsg + " al " + TimeToStr(Time[0]);
Comment(SMsg);

WindowTimeOnDropped

datetime WindowTimeOnDropped()

Questa particolare funzione ritorna la data e l'ora


corrispondente al punto in cui è stato rilasciato, tramite "drag
and drop" uno script o un expert advisor (non funziona con gli
indicatori).

Doublé dDropPrice = WindowsPriceOnDroppedi);


datetime dtDropTirae = windowsTimeonDropped();

ObjectCreate("Dropped price line", OBJ_HLINE, O, drop_priceì ;


Objectcreate("Dropped tirae line", OBJ_VLINE, O, drop_time);

WindowFind

int WindowFind(str ing name)

Questa funzione ritorna l'indice della finestra ove è contenuto


un indicatore corrispondente al nome passato in argomento.
Se non si trova corrispondenza il valore di ritorno è -1.
Considerando che prima di apparire gli indicatori eseguono la
funzione init() è bene evitare ricerche ricorsive che darebbero
esito negativo in fase di inizializzazione.

Pagina 307
Daìnesi - Guida di riferimento al (inguaggio MQJ-

Parametri
Name Nome breve dell'indicatore.

nt iwindow = WindowFindt"MAGO(12,26,9)");

WindowHandle

int WindowHandle(string symboi, int timeframe)

Questa funzione ritorna l'handle della finestra contenente il


grafico del simbolo con il timeframe selezionato. Se la
finestra non è aperta ritorna 0.

Parametri
Symbol Simbolo dello strumento finanziario.
Timeframe Time frame. Può essere uno di quelli elencati
nelle apposite costanti enumerative.

Lnt iHandle - WindowHandle("GBPUSD",PERICO MI);

WindowIsVisibte

bool WindowlsVisible(int index)

Questa funzione restituisce true se la sottofinestra del


grafico, il cui indice è il parametro, è visibile, altrimenti
restituisce false.

Parametri
Index Indice della sottofinestra del grafico.

Pagina 308
Dainesj - Guida di riferimento al (insuoggio MQL

int maywin = WindowFind("MyMACD");


if(maywin>-l SS WindowIsVisible(maywin)==true)
Print("La finestra di MyMACD è visibile");
else
PrintC'La finestra di MyMACD non c'è o non è visibile ");

WindowOnDropped

int WindowOnDropped()

Questa funzione ritorna l'indice della finestra nella quale è


stato rilasciato, per drag and drop un expert advisor, un
indicatore o uno script. Valido solo per inserimenti tramite il
mouse.

if (WindowOnDropped ( | ! =0 )

principale !");
return(false);

WindowsPriceMax

doublé WindowsPriceMax(int index=0)

Questa funzione ritorna il valore massimo contenuto nella


specifica finestra (O è il grafico principale).

WindowPriceMin

doublé WindowPriceMin(int index=0)

Questa funzione ritorna il valore minimo contenuto nella


specifica finestra (O è il grafico principale).
Pagina 309
Dainesì - Guida di riferimento al linsuaggio MQÌ-

WindowRedraw

void WindowRedrawQ

Questo metodo forza l'aggiornamento del grafico. Utile


quando si sono modificate delle proprietà degli oggetti sul
grafico.

WindowScreenShot

bool WindowScreenShot(string filename, int size_x, int size_y, int


start_bar=-1, int chart_scale=-1, int chart_mode=-1)

Questa funzione salva su file GIF uno screenshot del grafico le


cui coordinate sono definite dai parametri. La funzione
ritorna false in caso di insuccesso.
Il salvataggio avviene nella cartella terminal_dir\experts\files
(terminal_dir\tester\files in caso di backtest) o loro
sottocartelle.
Parmetri
Filename Nome del file di salvataggio (inserire anche
l'estensione .gif).
size_x Larghezza in pixel.
size_y Altezza in pixel.
start_bar Indice della prima barra visibile nello
screenshot. Se il valore è zero verrà utilizzata
la prima barra visibile. Se non si inserisce il
valore o si immette un numero negativo il file
verrà generato includendo le barre indicate.
chiariscale Scala orizzontale del grafico. Può essere un
valore compreso tra O e 5. Se non si imposta o
se si usa un valore negativo verrà utilizzata la
compressione corrente.
chart_mode Tipo di grafico. Può essere uno dei tre tipi
consentiti: CHART_BAR (O grafico a barre),
CHART_CANDLE (1 grafico a candele
giapponesi), CHART_LINE (2 grafico a linea

Pagina 310
Dainesi - Guida di riferimento ai linguaggio MQL

basata sui prezzi di chiusura). In caso di


mancanza di valore o valori negativi verrà
utilizzata la modalità corrente.

//Creazione di un immagine di 1000x400 pixel


bool esito = Windowscreenshot("Provashot4.gif",1000,400,0,O,I);

if (esito==true) PrintC'FILE GENERATO");

WindowsTotal

int WindowsTotalQ

Questa funzione ritorna il numero totale delle finestre


presenti sul grafico.

Print("Windows count = ", WindowsTotal());

WìndowXOnDropped

int WindowXOnDroppedQ

Questa funzione ritorna la coordinata x in pixels di dove è


stato rilasciato l'expert o lo script sul grafico.

Print("Coordinate del rilascio: x:",windowXOnDropped()," y:


",WindowYOnDropped());

WindowYOnDropped

int WindowYOnDropped()
Pagina 311
Dainesi - Guida di riferimento al linguaggio MQÌ-

Questa funzione ritorna la coordinata y in pixels di dove è


stato rilasciato l'expert o lo script sul grafico.

Pagina 312
Dainesi - Guida dì riferimento at /jnguag$io MQL

Appendice A

stderror.mqh

IL file stderror.mqh permette di utilizzare delle costanti


enumerative molto esplicative per poter gestire i messaggi di
errore.

//I stderror.mqh
//I Copyright © 2004-2005, MetaQuotes Software Corp.
//| http://www.raetaquotes.net/

// errors returned from trade server


ttdefine ERR_NO_ERROR O
ttdefine ERR_NO_RESULT 1
fdefine ERR_COMMON_ERROR 2
ttdefine ERR_INVALID_TRADE_PARAMETERS 3
ttdefine ERR_SERVER_BUSY 4
ttdefine ERR_OLD_VERSION 5
ttdefine ERR_NO_CONNECTION 6
ttdefine ERR_NOT_ENOUGH_RIGHTS 7
ttdefine ERRJTOO_FREQUENT_REQUESTS 8
Idefine ERR_MALFUNCTIONALJTRADE 9
ttdefine ERR_ACCQUNT_DISABLED 64
ttdefine ERR_INVALID_ACCOUNT 65
ttdefine ERRJTRADEJTIMEOUT 128
Idefine ERR_INVALID__PRICE 129
ttdefine ERR_INVALID_STOPS 130
ttdefine ERR_INVALIDJTRADE_VOLUME 131
Idefine ERR__MARKET_CLOSED 132
ttdefine ERR_TRADE_DISABLED 133
ttdefine ERR_NOT_ENOUGH_MONEY 134
ttdefine ERR_PRICE_CHAHGED 135
Idefine ERR_OFF_QUOTES 136
ttdefine ERR_BROKER_BUSY 137
ttdefine ERR_REQUOTE 138
Idefine ERR_ORDER_LOCKED 139
ttdefine ERR_LONG_POSITIONS_ONLY_ALLOWED 140
ttdefine ERR_TOO_MANY_REQUESTS 141
ttdefine ERR_TRADE_MODIFY_DENIED 145
ttdefine ERR_TRADE_CONTEXT_BUSY 146
// mq!4 run time errors
ttdefine ERR_NO_HQLERROR 4000
Idefine ERR_WRONG_FUNCTION_POINTER 4001
ttdefine ERR_ARRAY_INDEX_OUT__OF_RAHGE 4002
ttdefine ERR_NO_MEMORY_FOR_FUNCTION_CALL_STACK 4003
Idefine ERR RECURSIVE STACK OVERFLOW 4004

Pagina 313
Dainesi - Guida di riferimento al linguaggio MQj.

Idefine ERR_NOT_ENOUGH_STACK_FOR_PARAMETER 4005


#define ERR_NO_MEMORY_FOR_PARAMETER_STRING 4006
Idefine ERR_NO_MEMORY_FOR_TEMP_STRING 4007
Idefine ERR_NOT_INITIALIZED___STRING 4008
Idefine ERR_NOT_INITIALIZED_ARRAYSTRING 4009
Idefine ERR_NO_MEMQRY_FOR_ARRAYSTRING 4010
Idefine ERRJTOO_LONG_STRING 4011
Idefine ERR_REMAINDER_FROM_ZERO_DIVIDE 4012
Idefine ERR_ZERO_DIVIDE 4013
Idefine ERR_UNKNOWN_COMMAND 4014
Idefine ERR_WROHG_JUMP 4015
Idefine ERR_NOT_INITIALIZED_ARRAY 4016
ftdefine ERR_DLL_CALLS_NOT_ALLOWED 4017
tdefine ERR_CANNOT_LOAD_LIBRARY 4018
#define ERR_CANHOT_CALL_FUNCTION 4019
#define ERR_EXTERNAL_EXPERT_CALLS_NOT_ALLOWED 4020
#define ERR_NOT__ENOUGH_MEMORY_FOR_RETURNED_STRING 4021
#define ERR_SYSTEM_EUSY 4022
ftdefìne ERR_IHVALID_FUNCTIOH_PARAMETERS__COUNT 4050
tdefine ERR_INVALID_FUNCTION_PARAMETER_VALUE 4051
ttdefine ERR_STRING_FUNCTION_IHTERNAL_ERROR 4052
ttdefine ERR_SOME_ARRAY_ERROR 4053
ttdefine ERR_INCORRECT_SERIES_ARRAY_USING 4054
Idefine ERR_CUSTOM_INDICATOR_ERROR 4055
Idefine ERR_INCOMPATIBLE_ARRÀYS 4056
tdefine ERR_GLOBAL_VARIABLES_PROCESSING__ERROR 4057
#define ERR_GLOBAL_VARIABLE_NOT_FOUND 4058
ttdefine ERR_FUNCTION_NOT_ALLOWED_INJTESTING_MODE 4059
#define ERR_FUNCTION_NOT__CONFIRMED 4060
#define ERR_SEND_MAIL_ERROR 4061
Idefine ERR_STRING_PARAMETER_EXPECTED 4062
Idefine ERR_IHTEGER_PARAMETER_EXPECTED 4063
Idefine ERR_DOUBLE_PARAMETER_EXPECTED 4064
ttdefine ERR_ARRAY_AS_PARAMETER__EXPECTED 4065
Idefine ERR_HISTORY__WILL_UPDATED 4066
ttdefine ERR__END_OF_FILE 4099
#define ERR_SOME_FILE_ERROR 4100
Idefine ERR_WROHG_FILE_NAME 4101
Idefine ERR_TOO_MAHY_OPENED_FILES 4102
Idefine ERR_CANNOT_OPEN_FILE 4103
#define ERR_INCOMPATIBLE_ACCESS_TO_FILE 4104
#define ERR_NO__ORDER_SELECTED 4105
#define ERR_UNKNOWNJ3YMBOL 4106
ttdefine ERR_INVALID_PRICE_PARAM 4107
#define ERR_INVALID_TICKET 4108
#define ERR_TRADE_HOT_ALLOWED 4109
ftdefìne ERR_LONGS HOT_ALLOWED 4110
ftdefine ERR_SHORTS_NOT_ALLOWED 4111
tdefine ERR_OBJECT_ALREADY_EXISTS 4200
ttdefine ERR_UNKNOWN_OBJECT_PROPERTY 4201
#define ERR_OBJECT_DOES_NOT_EXIST 4202
ttdefine ERR_UNKNOWN__OBJECT_TYPE 4203
Idefine ERR_NO_OBJECT_NAME 4204
Idefine ERR_OBJECT_COORDINATES_ERROR 4205
Idefine ERR NO SPECIFIED SUBWINDOW 4206

Pagina 314
Dainesi - Guida di riferimento al frnguaggio MQL

stdlìb.mqh

Un altra librerìa che è possibile includere è la stdlib.mqh che


contiene alcune funzioni dì conversione e confronto.

//| stdlib.mqh |
//I Copyright © 2004, MetaQuotes Software Corp.
//| http://www.metaquotes.net/ |

#import "stdlib.ex4"
string ErrorDescription(int error_code);
int RGB(int red_value,int green_value,int blue_value);
bool CompareDoubles(doublé numberl,doublé number2);
string DoubleToStrMorePrecision(doublé number,int precision);
string IntegerToHexString(int integer_number);

WinUser32.mqh

Un altra libreria molto utile è la WinUser32.mqh che permette


di accedere a molte funzioni di Windows.

// | WinUser32 .mqh |
//I Copyright © 2004, MetaQuotes
// | http: //www.raetaquotes . net/ |

ttdefine copyright "Copyright © 2004, MetaQuotes Software Corp."


#define link "http: //www.metaquotes .net/"
fimport "user32 .dll"
// ---- messages
int SendMessageAfint hWnd, int Msg, int wParara,int IParara) ;
int SendNotifyMessageAfint hWnd, int Msg, int wParara, int IParam) ;
int PostMessageA(int hWnd, int Msg, int wParam, int IParam);
void keybd_event (int bVk,int bScan,int dwFlags,int dwExtralnfo) ;
void mouse_event (int dwFlags,int dx, int dy, int dwData,int dwExtralnfo);
// ---- Windows
int FindWindowA (string IpClassName , string IpWindowHame) ;
int SetWindowTextA(int hWnd, string IpString) ;
int GetWindowTextAfint hWnd, string IpString, int nMaxCount) ;
int GetWindowTextLengthA(int hWnd} ;
int GetWindow (int hWnd, int uCmd) ;
int UpdateWindow(int hWnd) ;
int EnableWindow(int hWnd, int bEnable) ;
int DestroyWindow(int hWnd) ;
int ShowWindow(int hWnd, int nCmdShow) ;

Pagina 315
Dainesi - Guida di riferimento al linguaggio MQ/_

int SetActiveWindow(int hWnd);


int AnimateWindow(int hWnd,int dwTime,int dwFlags);
int FlashWindowfìnt hWnd,int dwFlags /*blnvert*/);
int CloseWindow(int hWnd);
int MoveWindowfint hWnd,int X,int Y, int nWidth,int nHeight,int taRepaint);
int SetWindowPos(int hWnd,int hWndlnsertAfter ,int X,int Y,int ex, int
cy,int uFlags);
int IsWindowVisible(int hWnd);
int Islconic(int hWnd);
int IsZoomedfint hWnd);
int SetFocus(int hWnd);
int GetFocus();
int GetActiveWindowO ;
int IsWindowEnabledfint hWnd);
// miscelaneouse
int MessageBoxA(int hWnd ,string IpText,string IpCaption,int uType);
int MessageBoxExA(int hWnd ,string IpText,string IpCaption,int uType, int
wLanguageld);
int MessageBeep(int uType);
int GetSystemMetrics(int nIndex);
int ExitWindowsExfint uFlags,int dwReserved);
int SwapMouseButton (int fSwap);
ftimport
// window Messages
tfdefine WM_NULL 0x0000
tdefine WM_CREATE 0x0001
tfdefine WM_DESTROY 0x0002
ftdefine WM_MOVE 0x0003
ttdefine WH_SIZE 0x0005
tdefine WM_ACTIVATE 0x0006
tdefine WM_SETFOCUS 0x0007
tdefine WM_KILLFOCUS 0x0008
tdefine WM_ENABLE OxOOOA
Idefine WM_SETREDRAW OxOOOB
Idefine WM_SETTEXT OxOOOC
#define WM_GETTEXT OxOOOD
ttdefine WM_GETTEXTLENGTH OxOOOE
#define WM_PAINT OxOOOF
#define WM_CLOSE 0x0010
Idefine WM_QUERYENDSESSION 0x0011
#define WM_QUIT 0x0012
#define WM_QUERYOPEN 0x0013
tdefine WM_ERASEBKGND 0x0014
tdefine WM_SYSCOLORCHANGE 0x0015
tdefine WM_ENDSESSION 0x0016
tdefine WM_SHOWWINDOW 0x0018
#define WM_WININICHANGE OxOOlA
#define WM_SETTINGCHANGE OxOOlA // WM_WININICHANGE
#define WM_DEVMODECHANGE OxOOlB
tdefìne WH_ACTIVATEAPP OxOOlC
#define WM_FONTCHANGE OxOOlD
ttdefine WM_TIMECHANGE OxOOlE
#define WM_CAHCELMODE OxOOlF
#define WM_SETCURSOR 0x0020
#define WM_MOUSEACTIVATE 0x0021
tfdefine WM CHILDACTIVATE 0x0022

Pagina 316
Dainesi - Guido di riferimento al linguaggio MQL

Idefine WM_QUEUESYNC 0x0023


Idefine WM_GETMINMAXINFO 0x0024
Idefine WM_PAINTICON 0x0026
Idefine WM_ICONERASEBKGND 0x0027
Idefine WM_NEXTDLGCTL 0x0028
Idefine WM_SPOOLERSTATUS Ox002A
Idefine WM_DRAWITEM Ox002B
Idefine WM_MEASUREITEM Ox002C
Idefine WM_DELETEITEM Ox002D
Idefine WM_VKEYTOITEM Ox002E
Idefine WM_CHARTOITEM Ox002F
Idefine WM_SETFONT 0x0030
Idefine WM_GETFONT 0x0031
Idefine WM_SETHOTKEY 0x0032
Idefine WM_GETHOTKEY 0x0033
Idefine WM_QUERYDRAGICON 0x0037
Idefine WM_COMPAREITEM 0x0039
Idefine WM_GETOBJECT Ox003D
Idefine WM_COMPACTING 0x0041
Idefine WM_WINDOWPOSCHANGING 0x0046
Idefine WM_WINDOWPOSCHANGED 0x0047
Idefine WH_COPYDATA Ox004A
Idefine WM_CANCELJOURNAL Ox004B
Idefine WM_NOTIFY Ox004E
Idefine WM_INPUTLANGCHANGEREQUEST 0x0050
Idefine WM_INPUTLANGCHANGE 0x0051
Idefine WM_TCARD 0x0052
Idefine WM_HELP 0x0053
Idefine WM_USERCHANGED 0x0054
Idefine WMJMOTIFYFORMAT 0x0055
Idefine WM_CONTEXTMENU Ox007B
Idefine WM_STYLECHANGING Ox007C
Idefine WM_STYLECHANGED Ox007D
Idefine WM_DISPLAYCHANGE Ox007E
Idefine WM_GETICON Ox007F
Idefine WM_SETICON 0x0080
Idefine WM_NCCREATE 0x0081
Idefine WM_NCDESTROY 0x0082
Idefine WMJJCCALCSIZE 0x0083
Idefine WM_NCHITTEST 0x0084
Idefine WM_NCPAINT 0x0085
Idefine WM_NCACTIVATE 0x0086
Idefine WM_GETDLGCODE 0x0087
Idefine WM_SYNCPAINT 0x0088
Idefine WM_NCMOUSEMOVE OxOOAO
Idefine WM_NCLBUTTONDOWN 0x0OAl
Idefine WM_NCLBUTTONUP OxOOA2
Idefine WM_NCLBUTTONDBLCLK OxOOA3
Idefine WM_NCRBUTTONDOWN OxOOA4
Idefine WM_NCRBUTTONUP OxOOAS
Idefine WM_NCRBUTTONDBLCLK OxOOA6
Idefine WM_NCMBUTTONDOWN OxOOA7
Idefine WM_NCMBUTTONUP OxOOAS
Idefine WMJtfCMBUTTONDBLCLK OxOOA9
Idefine WM_KEYFIRST 0x0100
Idefine WM KEYDOWN 0x0100

Pagina 317
Dainesi - Guida di riferimento al (inguaggf'o MQf.

fdefine WM_KEYUP 0x0101


fdefine WM_CHAR 0x0102
fdefine WM_DEADCHAR 0x0103
fdefine WM_SYSKEYDOWN 0x0104
fdefine WM_SYSKEYUP 0x0105
fdefine WM_SYSCHAR 0x0106
fdefine WM_SYSDEADCHAR 0x0107
fdefine WM_KEYLAST 0x0108
fdefine WM_INITDIALOG 0x0110
fdefine WM_COMMAND 0x0111
fdefine WM_SYSCOMMAND 0x0112
fdefine WM_TIMER 0x0113
fdefine WM_HSCROLL 0x0114
fdefine WM_VSCROLL 0x0115
fdefine WM_INITMEHU 0x0116
fdefine WM_INITMENUPOPUP 0x0117
fdefine WM_MENUSELECT OxOllF
fdefine WM_MENUCHAR 0x0120
fdefine WM_ENTERIDLE 0x0121
fdefine WM_MENURBUTTONUP 0x0122
fdefine WM_MENUDRAG 0x0123
fdefine WM_MENUGETOBJECT 0x0124
fdefine WM_UNINITMENUPOPUP 0x0125
fdefine WM_MENUCOMMAND 0x0126
fdefine WM_CTLCOLORMSGBOX 0x0132
fdefine WM_CTLCOLOREDIT 0x0133
fdefine WM_CTLCOLORLISTBOX 0x0134
fdefine WM_CTLCOLORBTN 0x0135
fdefine WM__CTLCOLORDLG 0x0136
fdefine WM_CTLCOLORSCROLLBAR 0x0137
ftdefìne WM_CTLCOLORSTATIC 0x0138
ttdefine WM_MOUSEFIRST 0x0200
fdefine WM_MOUSEMOVE 0x0200
fdefine WM_LBUTTONDOWN 0x0201
fdefine WM_LBUTTONUP 0x0202
fdefine WM_LBUTTONDBLCLK 0x0203
fdefine WM_RBUTTONDOWN 0x0204
fdefine WM_RBUTTONUP 0x0205
fdefine WM_RBUTTONDBLCLK 0x0206
fdefine WM_MBUTTONDOWN 0x0207
fdefine WM_MBUTTONUP 0x0208
fdefine WM_MBUTTONDBLCLK 0x0209
fdefine WM_PARENTNOTIFY 0x0210
fdefine WM_ENTERMENULOOP 0x0211
fdefine WM_EXITMENULOOP 0x0212
fdefine WM_NEXTMENU 0x0213
fdefine WM_SIZING 0x0214
fdefine WM_CAPTURECHANGED 0x0215
fdefine WM MOVING 0x0216
fdefine WM^DEVICECHAKGE 0x0219
#define WM_MDICREATE 0x0220
fdefine WM_MDIDESTROY 0x0221
#define WM_MDIACTIVATE 0x0222
#define WM_MDIRESTORE 0x0223
ttdefine WM_MDINEXT 0x0224
ttdefine WM MDIMAXIMIZE 0x0225

Pagina 318
Dainesi - Guida di riferimento al (inguaggio MQJL

#define WM_MDITILE 0x0226


#define WM_MDICASCADE 0x0227
Idefine WM_MDIICONARRANGE 0x0228
#define WM_MDIGETACTIVE 0x0229
Idefine WM_MDISETMENU 0x0230
Idefine WMJSNTERSIZEMOVE 0x0231
Idefine WM_EXITSIZEMOVE 0x0232
Idefine WM_DROPFILES 0x0233
#define WM_MDIREFRESHMENU 0x0234
Idefine WM_MOUSEHOVER Ox02Al
Idefine WM_MOUSELEAVE Ox02A3
#define WH_CUT 0x0300
Idefine WM_COPY 0x0301
Idefine WM_PASTE 0x0302
Idefine WM_CLEAR 0x0303
#define WM_UNDO 0x0304
Idefine WM_RENDERFORMAT 0x0305
Idefine WM_RENDERALLFORMATS 0x0306
#define WM_DESTROYCLIPBOARD 0x0307
tdefine WH_DRAWCLIPBOARD 0x0308
Idefine WM_PAINTCLIPBOARD 0x0309
ttdefine WM_VSCROLLCLIPBOARD Ox030A
tdefine WM_SIZEGLIPBOARD Ox030B
ttdefine WM_ASKCBFORMATNAME 0x0300
Idefine WM_CHANGECBCHAIN Ox030D
Idefine WM_HSCROLLCLIPBOARD Ox030E
Idefine WM_QUERYNEWPALETTE OxOSOF
Idefine WM_PALETTEISCHANGING 0x0310
Idefine WM_PALETTECHANGED 0x0311
Idefine WM_HOTKEY 0x0312
Idefine WM_PRINT 0x0317
Idefine WM_PRINTCLIENT 0x0318
Idefine WM_HANDHELDFIRST 0x0358
Idefine WM_HANDHELDLAST Ox035F
Idefine WM_AFXFIRST 0x0360
Idefine WM_AFXLAST Ox037F
Idefine WM_PENWINFIRST 0x0380
Idefine WM_PENWINLAST Ox038F
Idefine WM_APP 0x8000
// keytad_event routines
Idefine KEYEVENTF_EXTENDEDKEY 0x0001
Idefine KEYEVENTF_KEYUP 0x0002
// mouse_event routines
Idefine MOUSEEVEHTF_MOVE 0x0001 // mouse move
Idefine MOUSEEVENTF_LEFTDOWN 0x0002 // left button down
Idefine MOUSEEVENTF_LEFTUP 0x0004 // left button Up
Idefine MOUSEEVENTF_RIGHTDOWN 0x0008 // right button down
Idefine MOUSEEVENTF_RIGHTUP 0x0010 // right button up
Idefine MOUSEEVENTF_MIDDLEDOWH 0x0020 // middle button down
Idefine MOUSEEVENTF_MIDDLEUP 0x0040 // middle button up
Idefine MOUSEEVENTF_WHEEL 0x0800 // wheel button rolled
Idefine MOUSEEVENTF_ABSOLUTE 0x8000 // absolute move
// GetSystemMetrics() codes
Idefine SM_CXSCREEN O
Idefine SM_CYSCREEN 1
Idefine SM CXVSCROLL 2

Pagina 319
Dainesi - Guida di riferimento ai /Jnguagg/o MQf.

tdefine SH CYHSCROLL 3
fdefine SM CYCAPTION 4
fdefine SM CXBORDER 5
idefine SM CYBORDER 6
tfdefine SM CXDLGFRAME 7
#def ine SM CYDLGFRAME 8
tdefine SM CYVTHUMB 9
ttdefine SM CXHTHUMB 10
tdefine SM CXICON 11
#def ine SM CYICON 12
ttdefine SM CXCURSOR 13
#def ine SM CYCURSOR 14
ttdefine SM CYMENU 15
#def ine SM CXFULLSCREEN 16
#define SM CYFULLSCREEH 17
#def ine SM CYKANJIWIHDOW 18
ttdefine SM MOUSEPRESENT 19
#def ine SM CYVSCROLL 20
ttdefine SM CXHSCROLL 21
ttdefine SM DEBUG 22
ttdefine SM^SWAPBUTTON 23
ttdefine SM RESERVED1 24
ttdefine SM RESERVED2 25
#define SM RESERVED3 26
#define SM RESERVED4 27
tdefine SM CXMIN 28
#define SM CYMIN 29
tdefine SM CXSIZE 30
tdefine SM CYSIZE 31
tdefine SM CKFRAME 32
Idefine SM CYFRAME 33
ttdefine SM CXMINTRACK 34
ttdefine SM CYMIHTRACK 35
fdefine SM CXDOUBLECLK 36
tdefine SM CYDOUBLECLK 37
#define SM CXICONSPACIHG 38
tfdefine SM CYICOHSPACING 39
tfdefine SM MENUDROPALIGNMEKT 40
ifdefine SM PENWINDOWS 41
ttdefine SM DBCSENABLED 42
tfdefine SM CMOUSEBUTTONS 43
ttdefine SM SECURE 44
#define SM CXEDGE 45
ttdefine SM CYEDGE 46
#define SM CXMIHSPACING 47
#define SM CYMINSPACING 48
#define SM CXSMICON 49
tdefine SM CYSMICON 50
tdefine SM CYSMCAPTION 51
#define SM CXSMSIZE 52
tdefine SM CYSMSIZE 53
tdefine SM CXMENUSIZE 54
tdefine SM CYMENUSIZE 55
tdefine SM ARRANGE 56
tdefine SM CXMINIMIZED 57
tdefine SM CYMINIMIZED 58

Pagina 320
Dainesi - Guida di riferimento al linguaggio MQ].

ttdefine SM_CXMAXTRACK 59
ttdefine SM_CYMAXTRACK 60
ttdefine SM_CXMAXIMIZED 61
ttdefine SM_CYMAXIMIZED 62
ttdefine SM_NETWORK 63
ttdefine SM_CLEANBOOT 67
ttdefine SM_CXDRAG 68
ttdefine SM_CYDRAG 69
ttdefine SM_SHOWSOUNDS 70
#define SM_CXMENUCHECK 71 // Use instead of
GetMenuCheckMarkDimensions()!
ttdefine SM_CYMENUCHECK 72
ttdefine SM_SLOWMACHINE 73
ttdefine SM_MIDEASTENABLED 74
ttdefine SM_MOUSEWHEELPRESEHT 75
ttdefine SM_XVIRTUALSCREEN 76
#define SM_YVIRTUALSCREEN 77
ttdefine SM_CXVIRTUALSCREEN 78
ttdefine SM_CYVIRTUALSCREEN 79
ttdefine SM_CMONITORS 80
ttdefine SM_SAMEDISPLAYFORMAT 81
// GetWindowO Constants
ttdefine GW_HWNDFIRST O
ttdefine GW_HWHDLAST 1
ttdefine GW_HWHDNEXT 2
ttdefine GW_HWHDPREV 3
ttdefine GW_OWNER 4
ttdefine GW_CHILD 5
// AnimateWindow{) Commands
ttdefine AW_HOR_POSITIVE 0x00000001
tdefine AW_HOR_NEGATIVE 0x00000002
ttdefine AW_VER_POSITIVE 0x00000004
ttdefine AW_VER_NEGATIVE 0x00000008
ttdefine AW_CENTER 0x00000010
ttdefine AW_HIDE 0x00010000
ttdefine AW_ACTIVATE 0x00020000
ttdefine AW_SLIDE 0x00040000
ttdefine AW_BLEND 0x00080000
// MessageBoxO Flags
ttdefine MB_OK 0x00000000
ttdefine MB_OKCAHCEL 0x00000001
ttdefine MB_ABORTRETRYIGNORE 0x00000002
ttdefine MBJfESNOCANCEL 0x00000003
ttdefine MB_YESNO 0x00000004
ttdefine MB_RETRYCANCEL 0x00000005
ttdefine MB_ICOHHAHD 0x00000010
ttdefine MB_ICONQUESTION 0x00000020
ttdefine MB_ICONEXCLAMATION 0x00000030
ttdefine MB_ICONASTERISK 0x00000040
ttdefine MB_USERICOH 0x00000080
ttdefine MB_ICOHWARHING MB_ICONEXCLAMATION
ttdefine MB_ICONERROR MB_ICOHHAHD
ttdefine MB_ICONINFORMATION HB_ICONASTERISK
ttdefine MB_ICOHSTOP MB_ICONHAND
ttdefine MB^DEFBUTTONl 0x00000000
ttdefine MB DEFBOTTON2 0x00000100

Pagina 321
Dainesi • Guida di riferimento al (inguaggio MQf.

#define MB_DEFBUTTON3 0x00000200


tdefine MB_DEFBUTTON4 0x00000300
ttdefine MB_APPLMODAL 0x00000000
#define MB_SYSTEMMODAL 0x00001000
tdefine MB_TASKMODAL 0x00002000
tdefine MB_HELP 0x00004000 // Help Button
ttdefine MB_NOFOCUS 0x00008000
#define MB_SETFOREGROUHD 0x00010000
#define MB_DEFAULT_DESKTOP_ONLY 0x00020000
fdefine MB_TOPMOST 0x00040000
fdefine MB_RIGHT 0x00080000
tdefìne MB_RTLREADING 0x00100000
// Dialog Box Command IDs
tdefine IDOK 1
#define IDCANCEL 2
tdefine IDABORT 3
#define IDRETRY 4
tdefine IDIGHORE 5
tdefine IDYES 6
#define IDNO 7
#define IDCLOSE 8
tdefine IDHELP 9

$tdlib.mq4

Quella che segue è una libreria a corredo di MetaTrader che


espone alcune interessanti funzioni. Una libreria, a differenza
di un file di inclusione, è e rimane un file separato anche in
fase di esecuzione (è infatti un file compilato ex4 separato).
E' essenziale, affinchè possa essere compilata come libreria,
che contenga la linea di codice seguente che ne identifica la
natura di librerìa:

ttproperty library

Library

// | stdlìb.mq4
//I Copyright © 2004, MetaQuotes Software Corp.
//| http://www.metaquotes.net/

tproperty copyright "Copyright © 2004, MetaQuotes Software Corp,


tproperty link "http://www.metaquotes.net/"
tproperty library

Pagina 322
Dainesi - Guida di riferimento al linguaggio MQL

int i n i t ( )

P r i n t ( " I n i t function defined as feature sample"};

int deinit()

Print("Deinit function defined as feature sample too");

*/

case 0:

break;
>e 2: error_string="coramon error";
break;
case 3: error_string="invalid trade parameters";
break;
case 4 : error_string="trade server is busy";
break;
case 5: error_string="old version of thè client terminal"
ìak;
case 6: error_string="no connection with trade server";
break;
case 7: error_strìng="not enough rights";
break;
case 8 : error_string="too frequent requests";
break;
case 9: error_string="malfunctional trade operation";
break;

break;
case 65 : error_string="invalid account";
break;

break;

break;

break;

break;

break;

oreak;
•e 134: error_string="not enough money"

Pagina 323
Dainesi - Guida di riferimento al (ìnguaggio MQL.

break;
case 135 : error_string="price changed";
break;
case 136: error_string="off quotes";
break;
case 137: error_string="broker is busy";
break;
case 138 : error_strìng="requote";
break;
case 139: error_string="order is locked";
break;
case 140: error_string="long positions only allowed";
break;
case 141: error_string="too many requests";
break;
case 145: error_string="modlfication denied because order too dose to
market" ,-
break;

break;
// mq!4 errors
case 4 0 0 0 : error_string="no e r r o r " ;
break;
case 4001: error_string="wrong function pointer";
break;
case 4002: error_string="array index is out of range";
break;
case 4003: error_strìng="no raemory for function cali stack";
break;
case 4004 : error_string="recursive stack overflow";
break;

break;
case 40
break;
case 40
break;
case 40
break;

break;

break;

break;
case 4012:
break;

break;
case 4014 : error_string="unknown command";
break;
case 4015: error_string="wrong jump (never generated error)";
break;
case 4016: error_string="not ìnitialized array";
break;
case 4017: error_string="dll cal^ls are not allowed";

Pagina 324
Dainesi - Guida di riferimento al linguaggio MQL

"cannot load library";

"cannot cali function";

"expert function calls are not allowed";

"not enough meraory for temp string returned from

"System is busy (never generated error)";

"invalid function parameters count";

"invalid function parameter value";

"string function internai error";

"some array error";

break;
case 4055: error string= "custom indicator error";
break;
case 4056: error string- "arrays are incompatible";
break;
case 4057: er ror_str ing- "glotaal variables processing error";
break;
case 4058: error_string^ "global variable not found";
break;
case 4059: error_stririg- "function is not allowed in testing mode";
break;
case 4060: error_string^ "function is not confirmed";
break;
case 4061: error_string^ "send mail error";
break;
case 4062: error_string= "string parameter expected";
break;
case 4063: error_string= "integer parameter expected";
break;
case 4064: error_string= "doublé parameter expected";
break;
case 4065: error_string^ "array as parameter expected";
:ak;
case 4066: error_string= "requested history data in update state";
reak;
case 4099: error_string= "end of file";
ak;
case 4100: error_string= "some file error";
iak;
case 4101: error_string= "wrong file name";
.reak;
case 4102: error_string^ "too many opened files";
:ak;
case 4103: error_string= "cannot open file";
break;
case 4104: error_string= "incompatible access to a file";

Pagina 325
DainesJ - Guida di riferimento al linguaggio MQL

break;
case 4105 : error_string="no order selected";
break;
case 4106: error_string="unknown symbol";
break;
case 4107: error__string="invalid price parameter for trade function"
break;
case 4108 : error_strìng="invalid ticket";
break;
case 4109 : error__string=" trade is not allowed";
break;
case 4110: error_string="longs are not allowed";
break;
case 4111: error_string="shorts are not allowed";
break;
case 4200 : error_strìng="object is already exist" ,-
break;
case 4201: error_string="unknown object property";
break;
case 4202 : error_string="object is not exist";
break;
case 4203: error_string="unknown object type";
break;
case 4204: error_string="no object name";
break;
case 4205: error_string="otaject coordinates error";
break;
case 4206 : error_string="no specified subwindow";
break;
default: error_string="unknown error";

return(error_string);
}
//+
//| convert red, green and blue values to color |

int RGB(int red_value,int green__value,int blue_value)

// check pararaeters
if(red_value<0) red_value=0;
if(red_value>255) red_value=255;
if(green_value<0) green_value=0;
if (green__value>255) green_value=255;
if(blue_value<0) blue_value-0;
if(blue_value>255) blue_value=255;
//
green_value«=8 ;
talue_value«=16;
return (red_value+green_value-*-blue__value) ;

//I right comparison of 2 doubles

bool CompareDoubles(doublé numberl,doublé number2)

Pagina 326
Dainesi - Guida di riferimento al linsuass'o MQf.

if(NormalizeDouble(numberl-number2,8)==0) return(true);
else r e t u r n ( f a l s e ) ;

/ / I up to 16 digits after decimai point I


/ / +------------------------------------------------------------------+
string DoubleToStrMorePrecìsion (doublé nuraber,ìnt precisioni
t
doublé rem, integer, integer2 ;
doublé DecimalArray[17]={ 1.0, 10.0, 100.0, 1000.0, 10000.0, 100000.0,
1000000.0,
10000000.0, 100000000.0,
1000000000.0, 10000000000.0, 100000000000.0,
10000000000000.0, 100000000000000.0,
1000000000000000.0, 1000000000000000.0,
10000000000000000.0 } ;
string intstring, remstring, retstring;
bool ìsnegative=false;
int rem2;
// ----
if (precision<0) precisioni;
f (precision>16) precision=16;
/ ----
doublé p=DecimalArray [precisioni ;
if (number<0 . 0 ) { isnegative=true; number=-number; }
nteger=MathFloor (number) ;
rem=MathRound ( fnumber-integer) *p) ;
remstring="";
for (int i=0; i<precision; i + + )
{
integer2=MathFloor (rem/10) ;
i2=NormalizeDouble (rera~integer2*10, 0 ) ;
remstring=rem2+rerastring;
i=integer2;

intstring=DoubleToStr (integer, O ) ;
if (isnegative) retstring="-"+int string;
else retstring=intstring;
if (precision>0) retstring=retstring+" . "+remstring;
return (retstring) ;

//I convert integer to string contained input's hexadecimal notation


/+
tring IntegerToHexString(int integer_nuraber)

tring hex_string="OOOOOOOQ";
int value, shift=28;
// Print("Parameter for integerHexToString is ",integer_number);

for (int i=0; i<8; i++)

Pagina 327
DoJnesj - Guida di riferimento al linguaggio MQL

II
return(hex_string);
1

Pagina 328
Dainesi - Guida di riferimento al ftnguaggio MQj.

Indice
--;45 Awesome; 241
#define; 34 Bande di Bollinger; 242
ttimport; 72; 75 Bars; 206
«include; 75 Bears Power; 242
#property; 74 Bid; 206
%r; 273 blocco; 35; 54
++;45 bool; 24; 68
Accelerator/Decelerator; 236 break; 56; 59
AccountBalance; 77 Bulls Power; 245
AccountCompany; 78 CamelCase; 30
AccountCredit; 78 case; 56
AccountCurrency; 79 CCI; 246
AccountEquity; 80 CharToStr; 120
AccountFreeMargin; 80 ciclo; 58
AccountLeverage; 81 ciclo for; 58
AccountMargin; 81 ClientTerminalName; 99
AccountName; 82 dose; 207
AccountNumber; 83 Codici di errore; 214
AccountProfit; 84 color; 68
Accumulazione/Distribuzione; 236 Color; 25
ADX; 239 Comment; 100
Alert; 98 commento; 36
Alligator; 237 Commodities Channel Index; 246
AND; 48 CompanyName; 99
annidamento; 53 continue; 59
array; 32; 69 conversione; 119
Array; 85 costanti; 34
ArrayBsearch; 86 CurTime; 148
ArrayCopy; 87 data e orario; 147
ArrayCopyRates; 87 datetirne; 68
ArrayCopySeries; 89 DayOfWeek; 148
ArrayDimension; 90 DayOfYear; 149
ArrayGetAsSeries; 90 Definire una variabile; 67
Arraylnitialize; 91 Definizione di funzione; 61
ArraylsSeries; 91 deinit; 65
ArrayMaximum; 92 Deinit; 41
ArrayRange; 93 DeMarker; 250
ArrayResize; 93 Deviazione standard; 270
ArraySetAsSeries; 94 Digits; 207
ArraySize; 95 doublé; 68
ArraySort; 95 Doublé; 21
ASCII; 120 DoubleToStr; 126
Ask; 206 Envelope; 251
assegnazione; 20 extern; 71
ATR; 240 file; 155
Average Directional Movement Index; FileClose; 156
239 FileFlush; 156
Average True Range; 240 FilelsEnding; 157

Pagina 329
Dainesi - Guida di riferimento al (inguasgjo MQÌ-

FilelsLineEnding; 157 init; 65


FileOpen; 158 Init; 40
FileOpenHistory; 159 inizializzare una variabile; 67
FileReadArray; 160 Inizializzazione; 54
FileReadlnteger; 161 int; 68
FileReadNumber; 161 Integer; 19
FileReadString; 162 iOpen; 280
FileSeek; 163 IsConnected; 103
FileSize; 163 IsDemo; 103
FileWrite; 164 IsDllsAllowed; 104
FileWriteArray; 165 IsLibrariesAllowed; 104
FileWriteDouble; 166 IsStopped; 105
FileWritelnteger; 166 IsTesting; 105
FileWriteString; 167 IsTradeAllowed; 106
for; 57 istruzione; 35
Force; 253 iTime; 281
Frattale; 254 (Volume; 282
funzioni; 36 l'operatore di precompilazione; 34
funzioni di manipolazione degli array; 33 Literals; 28
funzioni matematiche; 173 LocalTìme; 149
funzioni native; 42 Low; 208
Gator; 255 MACD;264
gestione delle finestre; 303 Market Facilitation; 257
GetLastError; 101 Marketlnfo; 106
GetTickCount; 102 MatnAbs; 174
giorno corrente; 148 MathArccos; 174
GlobalVariableCheck; 170 MathArcsin; 175
GlobalVariableDel; 170 MathArctan; 176
GlobalVariableGet; 171 MathCeil; 177
GlobalVariablesDeleteAll; 172 MathCos; 178
GlobalVariableSet; 171 MathExp; 179
GlobalVariableSetOnCondition; 172 MathFloor; 180
HideTestlndicators; 102; 304 MathLog; 181
High; 207 MathMax; 182
Hour; 149 MathMin; 182
iBars; 276 MathMod; 183
iBarShift; 276 MathPow; 183
Ichimoku Kinko Hyo; 256 MathRand; 184
iClose; 277 MathRound; 185
iCustom; 248 MathSin; 185
IF; 55 MathSqrt; 187
iHigh; 278 MathSrand; 187
iHighest; 283 MathTan; 188
iLow; 279 Media mobile; 261
iLowest; 284 MessageBox; 108
IndicatorBuffers; 132 MetaEditor; 12
IndicatorCounted; 134 MFI; 260
IndicatorDigits; 134 Minute; 150
indicatori; 131 Momentum; 258
IndicatorShortName; 135 Money flow index; 260
indicizzazione; 50 Month; 150

Pagina 330
Dainesi - Guida di riferimento al (inguaggio MQL

Moving averages OrderSymbol; 300


convergence/divergence; 264 OrderTakeProfit; 301
negazione; 47 OrderTicket; 301
NormalizeDouble; 127 OrderType; 302
NOT; 47 ordini; 285
notazione ungherese; 30 Parabolic Stop And Reverse; 266
ObjectCreate; 192 parametri; 37
ObjectDelete; 194 passaggio dei parametri; 62
ObjectDescription; 194 Period; 111; 304
ObjectFind; 196 PlaySound; 111
ObjectGet; 196 Point; 209
ObjectGetFiboDescription; 198 precedenza tra operatori; 50
ObjectOetShiftByValue; 198 preprocessore; 73
ObjectGetValueByShift; 199 Print; 112
ObjectMove; 199 RefreshRates; 113; 305
ObjectName; 200 Relative Vigor; 269
ObjectsDeleteAU; 200 return; 37; 60
ObjectSet; 201 routine; 40
ObjectSetFiboDescription; 201 RSI; 267
ObjectSetText; 202 SAR; 266
ObjectsTotal; 202 scheletro di un trading System; 40
ObjectType; 203 Scope; 70
OBV; 265 Seconds; 150
oggetti; 191 SendMail; 113
On Balance Volume; 265 serie di dati; 275
Open; 209 ServerAddress; 114
operazioni di assegnazione; 46 SetlndexArrow; 136
operazioni di bitwise; 48 SetlndexBuffer; 138
Operazioni di confronto; 47 SetlndexDrawBegin; 139
OR; 48 SetlndexEmptyValue; 140
OrderClose; 287 SetlndexLabel; 141
OrderCloseBy; 288 SetlndexShift; 142
OrderClosePrice; 289 SetlndexStyle; 142
OrderCloseTime; 290 SetLevelStyle; 144
OrderComment; 290 SetLevelValue; 144
OrderCommission; 291 Sleep;115
OrderDelete; 291 start; 41; 65
OrderExpiration; 292 Storie; 70
OrderLots; 292 stderror.mqh; 313
OrderMagicNumber; 292 stdlib.mq4; 322
OrderModify; 293 stdlib.mqh; 315
OrderOpenPrice; 294 Stocastico; 272
OrderOpenTime; 294 string; 68
OrderPrint; 295 String; 22
OrderProfit; 295 StringConcatenate; 230
OrderSelect; 296 StringFind; 231
OrderSend; 297 StringGetChar; 231
OrdersHistoryTotal; 286 StringLen; 232
OrderStopLoss; 299 StringSetChar; 232
OrdersTotal; 299 StringSubstr; 232
OrderSwap; 300 StringTrimLeft; 233

Pagina 331
Dainesi - Guida di riferimento al linguaggio MQL

StringTrimRight; 233 visibilità; 67; 70


StrToDouble; 127 void; 62
StrToInteger; 128 Volume; 211
StrToTime; 128 while; 57
Switch; 56 WindowBarsPerChart; 306
Symbol; 116; 305 WindowExpertName; 306
Time; 210 WindowFind; 307
TimeDay; 151 WindowFirstvisibleBar; 306
TimeDaydfWeek; 151 WindowHandle; 308
TimeDayOfYear; 151 WindowIsVisible; 308
TimeHour; 152 WindowOnDropped; 309
TimeMinute; 152 WindowPriceMin; 309
TimeMonth; 153 WindowRedraw; 310
TimeSeconds; 153 WindowScreenShot; 310
TimeToStr; 129 WindowsPriceMax; 309
TimeYear; 153 WindowsTotal; 311
tipi di variabile; 18 WindowTimeOnDropped; 307
token; 15; 44 WindowXOnDropped; 311
UninitializeReason; 116 WindowYOnDropped; 311
variabile derivata; 68 Wingdings;137;227
variabili; 18 WinUser32.mqh;315
variabili "Globali"; 169 Year; 154
vettori; 69

Pagina 332
© Copyright 2010 Daniele Livio Dainesi

Responsabile della pubblicazione Daniele Livio Dainesi

Libro pubblicato dall'autore

Stampato in Italia presso Crornografìca Roma S.r.I., Roma,


per Gruppo Editoriale L'Espresso S.p.A.

L'autore è un utente del sito

ilmiolibro.it