Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
MQL5
per il terminale client MetaTrader 5
Content
MQL5 Riferimento 68
1 Le basi del linguaggio
................................................................................................. 70
Sintassi ............................................................................................................................71
Commenti......................................................................................................................... 72
Identificatori
......................................................................................................................... 73
Parole riservate
......................................................................................................................... 74
Tipi di Dati ............................................................................................................................76
Tipi Integer......................................................................................................................... 77
Tipi Char, Short,................................................................................................................
Int e Long 78
Costanti Carattere
................................................................................................................ 82
Tipo Datetime................................................................................................................ 86
Tipo Colore ................................................................................................................ 87
Tipo Bool ................................................................................................................ 88
Enumerazioni................................................................................................................ 89
Tipi Reali (double,
.........................................................................................................................
float) 91
Tipo Stringa......................................................................................................................... 96
Strutture,.........................................................................................................................
Classi e Interfacce 97
Oggetto .........................................................................................................................
Array Dinamico 124
Typecasting
......................................................................................................................... 125
Tipo Void.........................................................................................................................
e Costante NULL 130
Tipi definiti
.........................................................................................................................
dall'utente 131
Puntatori.........................................................................................................................
agli Oggetti 141
Riferimento.
.........................................................................................................................
Il Modifier & e la parola chiave this 144
Operazioni............................................................................................................................146
ed Espressioni
Espressioni
......................................................................................................................... 147
Operazioni
.........................................................................................................................
Aritmetiche 148
Operazioni
.........................................................................................................................
di Assegnazione 149
Operazioni
.........................................................................................................................
di Assegnazione 150
Operazioni
.........................................................................................................................
Booleani 151
Operazioni
.........................................................................................................................
bit per bit 153
Altre Operazioni
......................................................................................................................... 156
Regole di.........................................................................................................................
Precedenza 160
Operatori ............................................................................................................................162
Operatore
.........................................................................................................................
Composto 164
Operatore
.........................................................................................................................
Espressione 165
Operatore
.........................................................................................................................
Return 166
Operatore
.........................................................................................................................
Condizionale if-else 167
Operatore
.........................................................................................................................
Ternario ?: 168
Operatore
.........................................................................................................................
Switch 170
Operatore
.........................................................................................................................
Ciclico While 172
Operatore
.........................................................................................................................
Ciclico for 173
Operatore
.........................................................................................................................
Ciclico do while 175
Operatore
.........................................................................................................................
Break 176
Operatore
.........................................................................................................................
Continue 177
Operatore
.........................................................................................................................
new di Creazione Oggetto 178
Operatore
.........................................................................................................................
Cancellatore Oggetto delete 180
Funzioni ............................................................................................................................181
Chiamate.........................................................................................................................
di funzione 183
Passaggio.........................................................................................................................
di Parametri 184
L'overloading
.........................................................................................................................
di funzioni 187
Operazione
.........................................................................................................................
Overloading 190
Descrizione
.........................................................................................................................
delle Funzioni Esterne 204
Esportazione
.........................................................................................................................
di funzioni 206
Funzioni .........................................................................................................................
di Gestione degli Eventi 207
Variabili ............................................................................................................................219
Variabili .........................................................................................................................
locali 222
Parametri .........................................................................................................................
Formali 224
Variabili .........................................................................................................................
Statiche 226
Variabili .........................................................................................................................
Globali 228
Variabili .........................................................................................................................
di Input 229
Variabili .........................................................................................................................
Esterne 236
Inizializzazione
.........................................................................................................................
delle Variabili 237
Visibilità.........................................................................................................................
Ambito(_*scope) e Durata delle Variabili(_*lifetime) 239
Creazione .........................................................................................................................
ed Eliminazione di oggetti 241
............................................................................................................................244
Preproc essore
Sostituzione
.........................................................................................................................
Macro (#define) 246
Proprietà.........................................................................................................................
del programma (#property) 249
Includere.........................................................................................................................
Files (# include) 257
Funzioni .........................................................................................................................
di Importazione (#import) 258
Conditional
.........................................................................................................................
Compilation (#ifdef, #ifndef, #else, #endif) 261
............................................................................................................................263
Programmazione Ad Oggetti
Incapsulamento
.........................................................................................................................
ed estensibilità dei Tipi 265
Ereditarietà
......................................................................................................................... 268
Polimorfismo
......................................................................................................................... 273
L' Overload
......................................................................................................................... 277
Funzioni .........................................................................................................................
Virtuali 278
I Membri.........................................................................................................................
Statici di una classe 282
Templates.........................................................................................................................
di Funzioni 286
Templates.........................................................................................................................
delle Classi 290
Classi Astratte
......................................................................................................................... 295
............................................................................................................................297
Namespac es
2 Costanti, Enumerazioni
.................................................................................................
e Strutture 300
Costanti del............................................................................................................................301
Grafic o
Tipi di Eventi
.........................................................................................................................
del Grafico 302
Timeframes.........................................................................................................................
del Grafico 310
Proprietà.........................................................................................................................
Grafico 312
Posizionamento
.........................................................................................................................
Costanti 320
Rappresentazione
.........................................................................................................................
Grafico 321
Esempi di.........................................................................................................................
Lavoro con il grafico Chart 323
............................................................................................................................381
Costanti Oggetti
Tipi di oggetti
......................................................................................................................... 382
OBJ_VLINE ................................................................................................................ 384
OBJ_HLINE ................................................................................................................ 389
OBJ_TREND ................................................................................................................ 394
OBJ_TRENDB................................................................................................................
Y ANGLE 401
OBJ_C Y CLES................................................................................................................ 407
OBJ_ARROWED ................................................................................................................
_LINE 413
OBJ_C HANNEL ................................................................................................................ 419
OBJ_STDDEVC ................................................................................................................
HANNEL 426
OBJ_REGRESSION ................................................................................................................ 433
OBJ_PITC HFOR ................................................................................................................
K 439
OBJ_GANNLINE ................................................................................................................ 447
OBJ_GANNFAN ................................................................................................................ 454
OBJ_GANNGRID ................................................................................................................ 461
OBJ_FIBO ................................................................................................................ 468
OBJ_FIBOTIMES ................................................................................................................ 475
OBJ_FIBOFAN ................................................................................................................ 482
OBJ_FIBOARC ................................................................................................................ 489
OBJ_FIBOC H................................................................................................................
ANNEL 496
OBJ_EX PANSION ................................................................................................................ 504
OBJ_ELLIOTWAVE5................................................................................................................ 512
Costanti.........................................................................................................................
di tipo numerico 799
Codici del
.........................................................................................................................
Motivo di DeInizializzazione 802
Controllo.........................................................................................................................
del Puntatore Oggetti 804
Altre costanti
......................................................................................................................... 805
............................................................................................................................809
Strutture Dati
Struttura.........................................................................................................................
del Tipo Data 810
Struttura.........................................................................................................................
dei parametri di Input 811
Struttura.........................................................................................................................
Dati dello Storico 812
Struttura.........................................................................................................................
del Depth of Market 813
Struttura.........................................................................................................................
Richiesta di Trade 814
Struttura.........................................................................................................................
di Risultati di Richiesta Controllo 828
Struttura.........................................................................................................................
di un Risultato di Richiesta di Trade 829
Struttura.........................................................................................................................
di una Transazione di Trade 833
Struttura.........................................................................................................................
per i Prezzi Correnti 841
Economic.........................................................................................................................
Сalendar structures 843
............................................................................................................................848
I c odic i di Errore e di Avvertenza
Codici di.........................................................................................................................
Ritorno del Trade Server 849
Avvisi del.........................................................................................................................
compilatore 853
Errori di .........................................................................................................................
compilazione 857
Errori di .........................................................................................................................
Runtime 871
............................................................................................................................886
Costanti Input/Output
Flags di Apertura
.........................................................................................................................
File 887
Proprietà.........................................................................................................................
File 890
Posizione.........................................................................................................................
In-File 892
L'uso di una
.........................................................................................................................
tabella Codici 893
MessageBo .........................................................................................................................
x 894
3 Programmi MQL5
................................................................................................. 896
Esec uzione............................................................................................................................897
dei Programmi
............................................................................................................................905
Trade Permission
............................................................................................................................909
Eventi Terminale Client
Risorse ............................................................................................................................913
............................................................................................................................925
Chiamata delle funzioni importate
............................................................................................................................927
Errori di Runtime
............................................................................................................................928
Testare Strategie di Trading
4 Variabili predefinite
................................................................................................. 954
_AppliedTo............................................................................................................................955
_Digits ............................................................................................................................957
_Point ............................................................................................................................958
_LastError ............................................................................................................................959
_Period ............................................................................................................................960
_RandomSeed............................................................................................................................961
_StopFlag ............................................................................................................................962
_Symbol ............................................................................................................................963
............................................................................................................................964
_UninitReason
_IsX 64 ............................................................................................................................965
5 Funzioni Comuni
................................................................................................. 966
Alert ............................................................................................................................968
............................................................................................................................969
Chec kPointer
Comment ............................................................................................................................971
............................................................................................................................973
CryptEnc ode
............................................................................................................................975
CryptDec ode
DebugBreak............................................................................................................................976
............................................................................................................................977
ExpertRemove
GetPointer ............................................................................................................................979
............................................................................................................................983
GetTic kCount
............................................................................................................................984
GetTic kCount64
GetMic rosec............................................................................................................................985
ondCount
MessageBox............................................................................................................................987
............................................................................................................................988
PeriodSec onds
PlaySound ............................................................................................................................989
Print ............................................................................................................................990
PrintFormat............................................................................................................................992
............................................................................................................................998
ResetLastError
............................................................................................................................999
Resourc eCreate
............................................................................................................................1001
Resourc eFree
............................................................................................................................1002
Resourc eReadImage
............................................................................................................................1003
Resourc eSave
............................................................................................................................1004
SetReturnError
............................................................................................................................1005
SetUserError
Sleep ............................................................................................................................1006
............................................................................................................................1007
TerminalClose
............................................................................................................................1009
TesterStatistic s
TesterStop............................................................................................................................1010
............................................................................................................................1011
TesterDeposit
............................................................................................................................1012
TesterHideIndic ators
............................................................................................................................1014
TesterWithdraw al
............................................................................................................................1015
TranslateKey
ZeroMemory............................................................................................................................1016
6 Funzioni di Array
................................................................................................. 1017
............................................................................................................................1019
ArrayBsearc h
ArrayCopy............................................................................................................................1023
............................................................................................................................1028
ArrayCompare
ArrayFree............................................................................................................................1029
............................................................................................................................1038
ArrayGetAsSeries
............................................................................................................................1041
ArrayInitialize
ArrayFill ............................................................................................................................1043
............................................................................................................................1045
ArrayIsDynamic
............................................................................................................................1047
ArrayIsSeries
............................................................................................................................1049
ArrayMaximum
............................................................................................................................1060
ArrayMinimum
ArrayPrint............................................................................................................................1071
ArrayRange............................................................................................................................1074
............................................................................................................................1075
ArrayResize
............................................................................................................................1078
ArrayInsert
............................................................................................................................1081
ArrayRemove
............................................................................................................................1083
ArrayReverse
............................................................................................................................1085
ArraySetAsSeries
ArraySize ............................................................................................................................1088
ArraySort............................................................................................................................1090
ArraySw ap............................................................................................................................1095
7 Funzioni di Conversione
................................................................................................. 1097
............................................................................................................................1099
CharToString
............................................................................................................................1100
CharArrayToString
............................................................................................................................1101
CharArrayToStruc t
............................................................................................................................1102
Struc tToCharArray
............................................................................................................................1103
ColorToARGB
............................................................................................................................1105
ColorToString
............................................................................................................................1106
DoubleToString
............................................................................................................................1107
EnumToString
............................................................................................................................1109
IntegerToString
............................................................................................................................1110
ShortToString
............................................................................................................................1111
ShortArrayToString
............................................................................................................................1112
TimeToString
............................................................................................................................1113
NormalizeDouble
............................................................................................................................1115
StringToCharArray
© 2000-2021, MetaQuotes Ltd
7 Content
............................................................................................................................1116
StringToColor
............................................................................................................................1117
StringToDouble
............................................................................................................................1118
StringToInteger
............................................................................................................................1119
StringToShortArray
............................................................................................................................1120
StringToTime
............................................................................................................................1121
StringFormat
8 Funzioni Matematiche
................................................................................................. 1125
MathAbs ............................................................................................................................1127
............................................................................................................................1128
MathArc c os
MathArc sin............................................................................................................................1129
MathArc tan............................................................................................................................1130
............................................................................................................................1131
MathArc tan2
............................................................................................................................1132
MathClassify
MathCeil ............................................................................................................................1134
MathCos ............................................................................................................................1135
MathExp ............................................................................................................................1136
MathFloor............................................................................................................................1137
MathLog ............................................................................................................................1138
MathLog10............................................................................................................................1139
MathMax ............................................................................................................................1140
MathMin ............................................................................................................................1141
MathMod ............................................................................................................................1142
MathPow ............................................................................................................................1143
MathRand ............................................................................................................................1144
MathRound............................................................................................................................1145
MathSin ............................................................................................................................1146
MathSq rt ............................................................................................................................1147
MathSrand............................................................................................................................1148
MathTan ............................................................................................................................1151
............................................................................................................................1152
MathIsValidNumber
MathExpm1 ............................................................................................................................1153
MathLog1p............................................................................................................................1154
............................................................................................................................1155
MathArc c osh
............................................................................................................................1156
MathArc sinh
............................................................................................................................1157
MathArc tanh
MathCosh ............................................................................................................................1158
MathSinh ............................................................................................................................1159
MathTanh ............................................................................................................................1160
MathSw ap............................................................................................................................1161
9 Funzioni Stringa
................................................................................................. 1162
StringAdd ............................................................................................................................1164
............................................................................................................................1166
StringBufferLen
............................................................................................................................1167
StringCompare
StringConc............................................................................................................................1169
atenate
StringFill ............................................................................................................................1170
StringFind............................................................................................................................1171
............................................................................................................................1172
StringGetCharac ter
StringInit ............................................................................................................................1173
StringLen ............................................................................................................................1174
............................................................................................................................1175
StringSetLength
............................................................................................................................1176
StringReplac e
............................................................................................................................1177
StringReserve
............................................................................................................................1179
StringSetCharac ter
StringSplit............................................................................................................................1181
............................................................................................................................1183
StringSubstr
StringToLow............................................................................................................................1184
er
............................................................................................................................1185
StringToUpper
............................................................................................................................1186
StringTrimLeft
© 2000-2021, MetaQuotes Ltd
8 Content
............................................................................................................................1187
StringTrimRight
10 Data ed Ora ................................................................................................. 1188
............................................................................................................................1189
TimeCurrent
............................................................................................................................1190
TimeTradeServer
TimeLoc al............................................................................................................................1191
TimeGMT ............................................................................................................................1192
............................................................................................................................1193
TimeDaylightSavings
............................................................................................................................1194
TimeGMTOffset
............................................................................................................................1195
TimeToStruc t
............................................................................................................................1196
Struc tToTime
11 Informazioni.................................................................................................
account 1197
............................................................................................................................1198
Ac c ountInfoDouble
............................................................................................................................1199
Ac c ountInfoInteger
............................................................................................................................1201
Ac c ountInfoString
12 Verifica Stato................................................................................................. 1202
............................................................................................................................1203
GetLastError
IsStopped ............................................................................................................................1204
............................................................................................................................1205
UninitializeReason
............................................................................................................................1206
TerminalInfoInteger
............................................................................................................................1207
TerminalInfoDouble
............................................................................................................................1208
TerminalInfoString
............................................................................................................................1209
MQLInfoInteger
............................................................................................................................1210
MQLInfoString
Symbol ............................................................................................................................1211
Period ............................................................................................................................1212
Digits ............................................................................................................................1213
Point ............................................................................................................................1214
13 Gestione degli
.................................................................................................
Eventi 1215
OnStart ............................................................................................................................1217
OnInit ............................................................................................................................1220
OnDeinit ............................................................................................................................1223
OnTic k ............................................................................................................................1226
............................................................................................................................1232
OnCalc ulate
OnTimer ............................................................................................................................1236
OnTrade ............................................................................................................................1239
............................................................................................................................1244
OnTradeTransac tion
............................................................................................................................1250
OnBookEvent
............................................................................................................................1253
OnChartEvent
OnTester ............................................................................................................................1260
............................................................................................................................1267
OnTesterInit
............................................................................................................................1274
OnTesterDeinit
............................................................................................................................1275
OnTesterPass
14 Market Info ................................................................................................. 1276
............................................................................................................................1278
SymbolsTotal
............................................................................................................................1279
SymbolExist
............................................................................................................................1280
SymbolName
............................................................................................................................1281
SymbolSelec t
............................................................................................................................1282
SymbolIsSync hronized
............................................................................................................................1283
SymbolInfoDouble
............................................................................................................................1285
SymbolInfoInteger
............................................................................................................................1287
SymbolInfoString
............................................................................................................................1289
SymbolInfoMarginRate
............................................................................................................................1290
SymbolInfoTic k
............................................................................................................................1291
SymbolInfoSessionQuote
............................................................................................................................1292
SymbolInfoSessionTrade
............................................................................................................................1293
MarketBookAdd
............................................................................................................................1294
MarketBookRelease
............................................................................................................................1295
MarketBookGet
15 Calendario Economico
................................................................................................. 1296
............................................................................................................................1297
CalendarCountryById
............................................................................................................................1299
CalendarEventById
............................................................................................................................1302
CalendarValueById
............................................................................................................................1305
CalendarCountries
............................................................................................................................1307
CalendarEventByCountry
............................................................................................................................1309
CalendarEventByCurrenc y
............................................................................................................................1311
CalendarValueHistoryByEvent
............................................................................................................................1314
CalendarValueHistory
............................................................................................................................1317
CalendarValueLastByEvent
............................................................................................................................1322
CalendarValueLast
16 Accesso alle Timeseries
.................................................................................................
ed Indicatori 1327
Direzione ............................................................................................................................1332
di Indic izzazione negli Array, Buffers e TimeSeries
............................................................................................................................1336
Organizzazione di Ac c esso ai Dati
............................................................................................................................1346
SeriesInfoInteger
Bars ............................................................................................................................1348
............................................................................................................................1351
BarsCalc ulated
............................................................................................................................1353
Indic atorCreate
............................................................................................................................1356
Indic atorParameters
............................................................................................................................1358
Indic atorRelease
CopyBuffer ............................................................................................................................1360
CopyRates............................................................................................................................1365
CopyTime............................................................................................................................1369
CopyOpen............................................................................................................................1372
CopyHigh ............................................................................................................................1375
CopyLow ............................................................................................................................1379
CopyClose............................................................................................................................1382
............................................................................................................................1385
CopyTic kVolume
............................................................................................................................1389
CopyRealVolume
CopySpread ............................................................................................................................1392
CopyTic ks............................................................................................................................1396
............................................................................................................................1402
CopyTic ksRange
iBars ............................................................................................................................1404
iBarShift ............................................................................................................................1405
iClose ............................................................................................................................1408
iHigh ............................................................................................................................1410
iHighest ............................................................................................................................1412
iLow ............................................................................................................................1413
iLow est ............................................................................................................................1415
iOpen ............................................................................................................................1416
iTime ............................................................................................................................1418
............................................................................................................................1420
iTic kVolume
iRealVolume............................................................................................................................1422
iVolume ............................................................................................................................1424
iSpread ............................................................................................................................1426
17 Simboli Personalizzati
................................................................................................. 1428
............................................................................................................................1430
CustomSymbolCreate
............................................................................................................................1432
CustomSymbolDelete
............................................................................................................................1433
CustomSymbolSetInteger
............................................................................................................................1434
CustomSymbolSetDouble
............................................................................................................................1435
CustomSymbolSetString
............................................................................................................................1436
CustomSymbolSetMarginRate
............................................................................................................................1437
CustomSymbolSetSessionQuote
............................................................................................................................1438
CustomSymbolSetSessionTrade
............................................................................................................................1439
CustomRatesDelete
............................................................................................................................1440
CustomRatesReplac e
............................................................................................................................1441
CustomRatesUpdate
CustomTic............................................................................................................................1442
ksAdd
CustomTic............................................................................................................................1444
ksDelete
CustomTic............................................................................................................................1445
ksReplac e
............................................................................................................................1447
CustomBookAdd
18 Operazioni col
.................................................................................................
Grafico 1450
............................................................................................................................1453
ChartApplyTemplate
............................................................................................................................1456
ChartSaveTemplate
ChartWindow............................................................................................................................1461
Find
............................................................................................................................1463
ChartTimePric eToX Y
............................................................................................................................1464
ChartX Y ToTimePric e
ChartOpen............................................................................................................................1466
ChartFirst ............................................................................................................................1467
ChartNext............................................................................................................................1468
ChartClose............................................................................................................................1469
ChartSymbol............................................................................................................................1470
ChartPeriod............................................................................................................................1471
ChartRedraw............................................................................................................................1472
............................................................................................................................1473
ChartSetDouble
............................................................................................................................1474
ChartSetInteger
............................................................................................................................1476
ChartSetString
............................................................................................................................1478
ChartGetDouble
............................................................................................................................1480
ChartGetInteger
............................................................................................................................1482
ChartGetString
............................................................................................................................1484
ChartNavigate
ChartID ............................................................................................................................1487
ChartIndic............................................................................................................................1488
atorAdd
ChartIndic............................................................................................................................1492
atorDelete
ChartIndic............................................................................................................................1495
atorGet
ChartIndic............................................................................................................................1497
atorName
ChartIndic............................................................................................................................1498
atorsTotal
ChartWindow............................................................................................................................1499
OnDropped
............................................................................................................................1500
ChartPric eOnDropped
............................................................................................................................1501
ChartTimeOnDropped
............................................................................................................................1502
ChartX OnDropped
............................................................................................................................1503
ChartY OnDropped
............................................................................................................................1504
ChartSetSymbolPeriod
............................................................................................................................1505
ChartSc reenShot
19 Funzioni di Trade
................................................................................................. 1508
OrderCalc............................................................................................................................1511
Margin
OrderCalc............................................................................................................................1512
Profit
OrderChec............................................................................................................................1513
k
OrderSend............................................................................................................................1514
............................................................................................................................1519
OrderSendAsync
............................................................................................................................1530
PositionsTotal
............................................................................................................................1531
PositionGetSymbol
............................................................................................................................1532
PositionSelec t
............................................................................................................................1533
PositionSelec tByTic ket
............................................................................................................................1534
PositionGetDouble
............................................................................................................................1535
PositionGetInteger
............................................................................................................................1537
PositionGetString
............................................................................................................................1538
PositionGetTic ket
............................................................................................................................1539
OrdersTotal
............................................................................................................................1540
OrderGetTic ket
OrderSelec............................................................................................................................1542
t
............................................................................................................................1543
OrderGetDouble
............................................................................................................................1544
OrderGetInteger
© 2000-2021, MetaQuotes Ltd
11 Content
............................................................................................................................1545
OrderGetString
............................................................................................................................1546
HistorySelec t
............................................................................................................................1548
HistorySelec tByPosition
............................................................................................................................1549
HistoryOrderSelec t
............................................................................................................................1550
HistoryOrdersTotal
............................................................................................................................1551
HistoryOrderGetTic ket
............................................................................................................................1553
HistoryOrderGetDouble
............................................................................................................................1554
HistoryOrderGetInteger
............................................................................................................................1557
HistoryOrderGetString
............................................................................................................................1558
HistoryDealSelec t
............................................................................................................................1559
HistoryDealsTotal
............................................................................................................................1560
HistoryDealGetTic ket
............................................................................................................................1563
HistoryDealGetDouble
............................................................................................................................1564
HistoryDealGetInteger
............................................................................................................................1567
HistoryDealGetString
20 Segnali di Trade
................................................................................................. 1568
............................................................................................................................1569
SignalBaseGetDouble
............................................................................................................................1570
SignalBaseGetInteger
............................................................................................................................1571
SignalBaseGetString
............................................................................................................................1572
SignalBaseSelec t
............................................................................................................................1573
SignalBaseTotal
............................................................................................................................1574
SignalInfoGetDouble
............................................................................................................................1575
SignalInfoGetInteger
............................................................................................................................1576
SignalInfoGetString
............................................................................................................................1577
SignalInfoSetDouble
............................................................................................................................1578
SignalInfoSetInteger
............................................................................................................................1579
SignalSubsc ribe
............................................................................................................................1580
SignalUnsubsc ribe
21 Funzioni di Rete
................................................................................................. 1581
............................................................................................................................1583
Soc ketCreate
............................................................................................................................1586
Soc ketClose
............................................................................................................................1589
Soc ketConnec t
............................................................................................................................1593
Soc ketIsConnec ted
............................................................................................................................1594
Soc ketIsReadable
............................................................................................................................1597
Soc ketIsWritable
............................................................................................................................1598
Soc ketTimeouts
............................................................................................................................1599
Soc ketRead
............................................................................................................................1603
Soc ketSend
............................................................................................................................1607
Soc ketTlsHandshake
............................................................................................................................1608
Soc ketTlsCertific ate
............................................................................................................................1612
Soc ketTlsRead
............................................................................................................................1616
Soc ketTlsReadAvailable
............................................................................................................................1617
Soc ketTlsSend
............................................................................................................................1618
WebRe q uest
SendFTP ............................................................................................................................1621
SendMail ............................................................................................................................1622
............................................................................................................................1623
SendNotific ation
22 Variabili Globali
.................................................................................................
del Terminale 1624
............................................................................................................................1625
GlobalVariableChec k
............................................................................................................................1626
GlobalVariableTime
............................................................................................................................1627
GlobalVariableDel
............................................................................................................................1628
GlobalVariableGet
............................................................................................................................1629
GlobalVariableName
............................................................................................................................1630
GlobalVariableSet
............................................................................................................................1631
GlobalVariablesFlush
............................................................................................................................1632
GlobalVariableTemp
............................................................................................................................1633
GlobalVariableSetOnCondition
............................................................................................................................1634
GlobalVariablesDeleteAll
............................................................................................................................1635
GlobalVariablesTotal
23 Funzioni con.................................................................................................
i File 1636
............................................................................................................................1639
FileSelec tDialog
............................................................................................................................1642
FileFindFirst
FileFindNext............................................................................................................................1644
............................................................................................................................1646
FileFindClose
FileIsExist ............................................................................................................................1648
FileOpen ............................................................................................................................1651
FileClose ............................................................................................................................1654
FileCopy ............................................................................................................................1655
FileDelete............................................................................................................................1658
FileMove ............................................................................................................................1660
FileFlush ............................................................................................................................1662
............................................................................................................................1664
FileGetInteger
FileIsEnding............................................................................................................................1667
............................................................................................................................1669
FileIsLineEnding
............................................................................................................................1674
FileReadArray
FileReadBool............................................................................................................................1676
............................................................................................................................1679
FileReadDatetime
............................................................................................................................1682
FileReadDouble
............................................................................................................................1685
FileReadFloat
............................................................................................................................1688
FileReadInteger
FileReadLong............................................................................................................................1692
............................................................................................................................1695
FileReadNumber
............................................................................................................................1700
FileReadString
............................................................................................................................1702
FileReadStruc t
FileSeek ............................................................................................................................1706
FileSize ............................................................................................................................1709
FileTell ............................................................................................................................1711
FileWrite ............................................................................................................................1714
............................................................................................................................1717
FileWriteArray
............................................................................................................................1720
FileWriteDouble
............................................................................................................................1723
FileWriteFloat
............................................................................................................................1725
FileWriteInteger
............................................................................................................................1728
FileWriteLong
............................................................................................................................1730
FileWriteString
............................................................................................................................1733
FileWriteStruc t
FileLoad ............................................................................................................................1736
FileSave ............................................................................................................................1738
FolderCreate............................................................................................................................1740
FolderDelete............................................................................................................................1743
FolderClean ............................................................................................................................1746
24 Indicatori Personalizzati
................................................................................................. 1749
............................................................................................................................1753
Stili Indic atore negli Esempi
DRAW _NONE
......................................................................................................................... 1761
DRAW _LINE
......................................................................................................................... 1764
DRAW _SECTION
......................................................................................................................... 1768
DRAW _H.........................................................................................................................
ISTOGRAM 1772
DRAW _H.........................................................................................................................
ISTOGRAM2 1776
DRAW _ARROW
......................................................................................................................... 1780
DRAW _Z.........................................................................................................................
IGZAG 1785
DRAW _FILLING
......................................................................................................................... 1790
DRAW _BARS
......................................................................................................................... 1795
DRAW _CANDLES
......................................................................................................................... 1801
DRAW _COLOR
.........................................................................................................................
_LINE 1808
DRAW _COLOR
.........................................................................................................................
_SECTION 1813
DRAW _COLOR
.........................................................................................................................
_HISTOGRAM 1819
© 2000-2021, MetaQuotes Ltd
13 Content
DRAW _COLOR
.........................................................................................................................
_HISTOGRAM2 1824
DRAW _COLOR
.........................................................................................................................
_ARROW 1829
DRAW _COLOR
.........................................................................................................................
_ZIGZAG 1835
DRAW _COLOR
.........................................................................................................................
_BARS 1840
DRAW _COLOR
.........................................................................................................................
_CANDLES 1847
Connec tion............................................................................................................................1854
betw een Indic ator Properties and Func tions
............................................................................................................................1857
SetIndexBuffer
............................................................................................................................1860
Indic atorSetDouble
............................................................................................................................1864
Indic atorSetInteger
............................................................................................................................1868
Indic atorSetString
............................................................................................................................1871
PlotIndexSetDouble
............................................................................................................................1872
PlotIndexSetInteger
............................................................................................................................1876
PlotIndexSetString
............................................................................................................................1877
PlotIndexGetInteger
25 Oggetti Grafici
................................................................................................. 1880
............................................................................................................................1882
Ob jec tCreate
Ob jec tName............................................................................................................................1886
............................................................................................................................1887
Ob jec tDelete
............................................................................................................................1888
Ob jec tsDeleteAll
Ob jec tFind............................................................................................................................1889
............................................................................................................................1890
Ob jec tGetTimeByValue
............................................................................................................................1891
Ob jec tGetValueByTime
Ob jec tMove............................................................................................................................1892
............................................................................................................................1893
Ob jec tsTotal
............................................................................................................................1894
Ob jec tSetDouble
............................................................................................................................1898
Ob jec tSetInteger
............................................................................................................................1901
Ob jec tSetString
............................................................................................................................1903
Ob jec tGetDouble
............................................................................................................................1905
Ob jec tGetInteger
............................................................................................................................1907
Ob jec tGetString
TextSetFont ............................................................................................................................1909
TextOut ............................................................................................................................1912
TextGetSize ............................................................................................................................1916
26 Indicatori Tecnici
................................................................................................. 1917
iAC ............................................................................................................................1920
iAD ............................................................................................................................1925
iADX ............................................................................................................................1930
iADX Wilder............................................................................................................................1935
iAlligator ............................................................................................................................1940
iAMA ............................................................................................................................1947
iAO ............................................................................................................................1952
iATR ............................................................................................................................1957
iBearsPow............................................................................................................................1962
er
iBands ............................................................................................................................1967
............................................................................................................................1973
iBullsPow er
iCCI ............................................................................................................................1978
iChaikin ............................................................................................................................1983
iCustom ............................................................................................................................1988
iDEMA ............................................................................................................................1992
iDeMarker............................................................................................................................1997
iEnvelopes............................................................................................................................2002
iForc e ............................................................................................................................2008
iFrac tals ............................................................................................................................2013
iFrAMA ............................................................................................................................2018
iGator ............................................................................................................................2023
iIc himoku ............................................................................................................................2030
iBWMFI ............................................................................................................................2037
iMomentum ............................................................................................................................2042
© 2000-2021, MetaQuotes Ltd
14 Content
iMFI ............................................................................................................................2047
iMA ............................................................................................................................2052
iOsMA ............................................................................................................................2057
iMACD ............................................................................................................................2062
iOBV ............................................................................................................................2068
iSAR ............................................................................................................................2073
iRSI ............................................................................................................................2078
iRVI ............................................................................................................................2083
iStdDev ............................................................................................................................2088
iStoc hastic............................................................................................................................2093
iTEMA ............................................................................................................................2099
iTriX ............................................................................................................................2104
iWPR ............................................................................................................................2109
iVIDyA ............................................................................................................................2114
iVolumes ............................................................................................................................2119
27 Lavorare con.................................................................................................
i risultati di ottimizzazione 2124
FrameFirst............................................................................................................................2125
............................................................................................................................2126
FrameFilter
FrameNext............................................................................................................................2127
............................................................................................................................2128
FrameInputs
FrameAdd............................................................................................................................2129
............................................................................................................................2130
ParameterGetRange
............................................................................................................................2133
ParameterSetRange
28 Funzioni Eventi
................................................................................................. 2135
............................................................................................................................2136
EventSetMillisec ondTimer
............................................................................................................................2137
EventSetTimer
............................................................................................................................2138
EventKillTimer
............................................................................................................................2139
EventChartCustom
29 Lavorare con.................................................................................................
OpenCL 2145
............................................................................................................................2147
CLHandleType
............................................................................................................................2148
CLGetInfoInteger
............................................................................................................................2151
CLGetInfoString
............................................................................................................................2154
CLContextCreate
............................................................................................................................2155
CLContextFree
CLGetDevic............................................................................................................................2156
eInfo
............................................................................................................................2161
CLProgramCreate
............................................................................................................................2165
CLProgramFree
............................................................................................................................2166
CLKernelCreate
............................................................................................................................2167
CLKernelFree
............................................................................................................................2168
CLSetKernelArg
............................................................................................................................2169
CLSetKernelArgMem
............................................................................................................................2170
CLSetKernelArgMemLoc al
............................................................................................................................2171
CLBufferCreate
............................................................................................................................2172
CLBufferFree
............................................................................................................................2173
CLBufferWrite
............................................................................................................................2174
CLBufferRead
CLExec ute............................................................................................................................2175
............................................................................................................................2177
CLExec utionStatus
30 Lavorare con.................................................................................................
i database 2178
............................................................................................................................2182
DatabaseOpen
............................................................................................................................2184
DatabaseClose
............................................................................................................................2185
DatabaseImport
............................................................................................................................2187
DatabaseExport
............................................................................................................................2189
DatabasePrint
............................................................................................................................2194
DatabaseTableExists
............................................................................................................................2195
DatabaseExec ute
............................................................................................................................2207
DatabasePrepare
............................................................................................................................2216
DatabaseReset
............................................................................................................................2222
DatabaseBind
............................................................................................................................2227
DatabaseBindArray
............................................................................................................................2232
DatabaseRead
............................................................................................................................2233
DatabaseReadBind
............................................................................................................................2237
DatabaseFinalize
............................................................................................................................2238
DatabaseTransac tionBegin
............................................................................................................................2243
DatabaseTransac tionCommit
............................................................................................................................2244
DatabaseTransac tionRollbac k
............................................................................................................................2245
DatabaseColumnsCount
............................................................................................................................2246
DatabaseColumnName
............................................................................................................................2247
DatabaseColumnType
............................................................................................................................2248
DatabaseColumnSize
............................................................................................................................2249
DatabaseColumnText
............................................................................................................................2250
DatabaseColumnInteger
............................................................................................................................2251
DatabaseColumnLong
............................................................................................................................2252
DatabaseColumnDouble
............................................................................................................................2253
DatabaseColumnBlob
31 Lavorare con.................................................................................................
DirectX 2254
............................................................................................................................2256
DX ContextCreate
............................................................................................................................2257
DX ContextSetSize
............................................................................................................................2258
DX ContextGetSize
............................................................................................................................2259
DX ContextClearColors
............................................................................................................................2260
DX ContextClearDepth
............................................................................................................................2261
DX ContextGetColors
............................................................................................................................2262
DX ContextGetDepth
............................................................................................................................2263
DX BufferCreate
............................................................................................................................2264
DX TextureCreate
............................................................................................................................2271
DX InputCreate
............................................................................................................................2272
DX InputSet
............................................................................................................................2273
DX ShaderCreate
............................................................................................................................2274
DX ShaderSetLayout
............................................................................................................................2275
DX ShaderInputsSet
............................................................................................................................2276
DX ShaderTexturesSet
DX Draw ............................................................................................................................2277
............................................................................................................................2278
DX Draw Indexed
............................................................................................................................2279
DX PrimiveTopologySet
............................................................................................................................2280
DX BufferSet
............................................................................................................................2281
DX ShaderSet
............................................................................................................................2282
DX HandleType
DX Release............................................................................................................................2283
32 Integrazione ................................................................................................. 2284
............................................................................................................................2285
MetaTrader per Python
initialize......................................................................................................................... 2291
login ......................................................................................................................... 2293
shutdown ......................................................................................................................... 2296
version......................................................................................................................... 2297
last _error
......................................................................................................................... 2299
account.........................................................................................................................
_info 2301
terminal.........................................................................................................................
_info 2304
symbols.........................................................................................................................
_total 2307
symbols.........................................................................................................................
_get 2308
symbol_.........................................................................................................................
info 2311
symbol_.........................................................................................................................
info_tick 2315
symbol_.........................................................................................................................
select 2317
market _.........................................................................................................................
book _add 2321
market _.........................................................................................................................
book _get 2322
market _.........................................................................................................................
book _release 2325
© 2000-2021, MetaQuotes Ltd
16 Content
copy _rates
.........................................................................................................................
_from 2326
copy _rates
.........................................................................................................................
_from_pos 2330
copy _rates
.........................................................................................................................
_range 2333
copy _ticks
.........................................................................................................................
_from 2336
copy _ticks
.........................................................................................................................
_range 2339
orders _.........................................................................................................................
total 2342
orders _.........................................................................................................................
get 2343
order _calc
.........................................................................................................................
_margin 2346
order _calc
.........................................................................................................................
_profit 2349
order _check
......................................................................................................................... 2352
order _send
......................................................................................................................... 2356
positions.........................................................................................................................
_total 2361
positions.........................................................................................................................
_get 2362
history _.........................................................................................................................
orders _total 2365
history _.........................................................................................................................
orders _get 2367
history _.........................................................................................................................
deals _total 2370
history _.........................................................................................................................
deals _get 2372
33 Libreria Standard
................................................................................................. 2376
Matematic............................................................................................................................2377
he
Statistiche
......................................................................................................................... 2378
Caratteristiche
................................................................................................................
statistiche 2381
MathMean ........................................................................................................... 2382
MathVariance ........................................................................................................... 2383
MathSkewness ........................................................................................................... 2384
MathKurtosis ........................................................................................................... 2385
MathMoments ........................................................................................................... 2386
MathMedian ........................................................................................................... 2387
MathStandardDeviation
........................................................................................................... 2388
MathAverageDeviation
........................................................................................................... 2389
Distribuzione ................................................................................................................
Normale 2390
MathProbabilityDensityNormal
........................................................................................................... 2394
MathCumulativeDistributionNormal
........................................................................................................... 2396
MathQuantileNormal
........................................................................................................... 2398
MathRandomNormal
........................................................................................................... 2400
MathMomentsNormal
........................................................................................................... 2401
Distribuzione ................................................................................................................
Log-normale 2402
MathProbabilityDensityLognormal
........................................................................................................... 2406
MathCumulativeDistributionLognormal
........................................................................................................... 2408
MathQuantileLognormal
........................................................................................................... 2410
MathRandomLognormal
........................................................................................................... 2412
MathMomentsLognormal
........................................................................................................... 2413
La distribuzione
................................................................................................................
beta 2414
MathProbabilityDensityBeta
........................................................................................................... 2418
MathCumulativeDistributionBeta
........................................................................................................... 2420
MathQuantileBeta
........................................................................................................... 2422
MathRandomBeta
........................................................................................................... 2424
MathMomentsBeta
........................................................................................................... 2425
Distribuzione ................................................................................................................
beta non centrale 2426
MathProbabilityDensityNoncentralBeta
........................................................................................................... 2430
MathCumulativeDistributionNoncentralBeta
........................................................................................................... 2432
MathQuantileNoncentralBeta
........................................................................................................... 2434
MathRandomNoncentralBeta
........................................................................................................... 2436
MathMomentsNoncentralBeta
........................................................................................................... 2437
Distribuzione ................................................................................................................
gamma 2438
MathProbabilityDensityGamma
........................................................................................................... 2442
MathCumulativeDistributionGamma
........................................................................................................... 2444
MathQuantileGamma
........................................................................................................... 2446
MathRandomGamma
........................................................................................................... 2448
MathMomentsGamma
........................................................................................................... 2449
Distribuzione
................................................................................................................
del Chi-quadrato 2450
MathProbabilityDensityChiSquare
........................................................................................................... 2454
MathCumulativeDistributionChiSquare
........................................................................................................... 2456
MathQuantileChiSquare
........................................................................................................... 2458
MathRandomChiSquare
........................................................................................................... 2460
MathMomentsChiSquare
........................................................................................................... 2461
Distribuzione
................................................................................................................
chi-quadrato non centrale 2462
MathProbabilityDensityNoncentralChiSquare
........................................................................................................... 2466
MathCumulativeDistributionNoncentralChiSquare
........................................................................................................... 2468
MathQuantileNoncentralChiSquare
........................................................................................................... 2470
MathRandomNoncentralChiSquare
........................................................................................................... 2472
MathMomentsNoncentralChiSquare
........................................................................................................... 2473
Distribuzione
................................................................................................................
Esponenziale 2474
MathProbabilityDensityE
...........................................................................................................
x ponential 2478
MathCumulativeDistributionE
...........................................................................................................
x ponential 2480
MathQuantileE
...........................................................................................................
x ponential 2482
MathRandomE ...........................................................................................................
x ponential 2484
MathMomentsE...........................................................................................................
x ponential 2485
Distribuzione-F
................................................................................................................ 2486
MathProbabilityDensityF
........................................................................................................... 2490
MathCumulativeDistributionF
........................................................................................................... 2492
MathQuantileF
........................................................................................................... 2494
MathRandomF ........................................................................................................... 2496
MathMomentsF........................................................................................................... 2497
Distribuzione-F
................................................................................................................
noncentrale 2498
MathProbabilityDensityNoncentralF
........................................................................................................... 2502
MathCumulativeDistributionNoncentralF
........................................................................................................... 2504
MathQuantileNoncentralF
........................................................................................................... 2506
MathRandomNoncentralF
........................................................................................................... 2508
MathMomentsNoncentralF
........................................................................................................... 2509
Distribuzione-T
................................................................................................................ 2510
MathProbabilityDensityT
........................................................................................................... 2514
MathCumulativeDistributionT
........................................................................................................... 2516
MathQuantileT
........................................................................................................... 2518
MathRandomT ........................................................................................................... 2520
MathMomentsT........................................................................................................... 2521
Distribuzione-T
................................................................................................................
non centrale 2522
MathProbabilityDensityNoncentralT
........................................................................................................... 2526
MathCumulativeDistributionNoncentralT
........................................................................................................... 2528
MathQuantileNoncentralT
........................................................................................................... 2530
MathRandomNoncentralT
........................................................................................................... 2532
MathMomentsNoncentralT
........................................................................................................... 2533
Distribuzione
................................................................................................................
Logistica 2534
MathProbabilityDensityLogistic
........................................................................................................... 2538
MathCumulativeDistributionLogistic
........................................................................................................... 2540
MathQuantileLogistic
........................................................................................................... 2542
MathRandomLogistic
........................................................................................................... 2544
MathMomentsLogistic
........................................................................................................... 2545
Distribuzione
................................................................................................................
di Cauchy 2546
MathProbabilityDensityCauchy
........................................................................................................... 2550
MathCumulativeDistributionCauchy
........................................................................................................... 2552
MathQuantileCauchy
........................................................................................................... 2554
MathRandomCauchy
........................................................................................................... 2556
MathMomentsCauchy
........................................................................................................... 2557
Distribuzione
................................................................................................................
uniforme 2558
MathProbabilityDensityUniform
........................................................................................................... 2562
MathCumulativeDistributionUniform
........................................................................................................... 2564
MathQuantileUniform
........................................................................................................... 2566
MathRandomUniform
........................................................................................................... 2568
MathMomentsUniform
........................................................................................................... 2569
Distribuzione
................................................................................................................
di Weibull 2570
MathProbabilityDensityWeibull
........................................................................................................... 2574
MathCumulativeDistributionWeibull
........................................................................................................... 2576
MathQuantileWeibull
........................................................................................................... 2578
MathRandomWeibull
........................................................................................................... 2580
MathMomentsWeibull
........................................................................................................... 2581
Distribuzione
................................................................................................................
binomiale 2582
MathProbabilityDensityBinomial
........................................................................................................... 2585
MathCumulativeDistributionBinomial
........................................................................................................... 2587
MathQuantileBinomial
........................................................................................................... 2589
MathRandomBinomial
........................................................................................................... 2591
MathMomentsBinomial
........................................................................................................... 2592
Distribuzione
................................................................................................................
binomiale negativa 2593
MathProbabilityDensityNegativeBinomial
........................................................................................................... 2596
MathCumulativeDistributionNegativeBinomial
........................................................................................................... 2598
MathQuantileNegativeBinomial
........................................................................................................... 2600
MathRandomNegativeBinomial
........................................................................................................... 2602
MathMomentsNegativeBinomial
........................................................................................................... 2603
Distribuzione
................................................................................................................
geometrica 2604
MathProbabilityDensityGeometric
........................................................................................................... 2608
MathCumulativeDistributionGeometric
........................................................................................................... 2610
MathQuantileGeometric
........................................................................................................... 2612
MathRandomGeometric
........................................................................................................... 2614
MathMomentsGeometric
........................................................................................................... 2615
Distribuzione
................................................................................................................
ipergeometrica 2616
MathProbabilityDensity
...........................................................................................................
Hypergeometric 2620
MathCumulativeDistribution
...........................................................................................................
Hypergeometric 2622
MathQuantile...........................................................................................................
Hypergeometric 2624
MathRandom ...........................................................................................................
Hypergeometric 2626
MathMoments ...........................................................................................................
Hypergeometric 2627
Distribuzione
................................................................................................................
di Poisson 2628
MathProbabilityDensityPoisson
........................................................................................................... 2632
MathCumulativeDistributionPoisson
........................................................................................................... 2634
MathQuantilePoisson
........................................................................................................... 2636
MathRandomPoisson
........................................................................................................... 2638
MathMomentsPoisson
........................................................................................................... 2639
Subfunzioni................................................................................................................ 2640
MathRandomNon
...........................................................................................................
Zero 2645
MathMoments ........................................................................................................... 2646
MathPowInt ........................................................................................................... 2647
MathFactorial
........................................................................................................... 2648
MathTrunc........................................................................................................... 2649
MathRound........................................................................................................... 2650
MathArctan2 ........................................................................................................... 2652
MathGamma ........................................................................................................... 2654
MathGammaLog........................................................................................................... 2655
MathBeta ........................................................................................................... 2656
MathBetaLog ........................................................................................................... 2657
MathBetaIncomplete
........................................................................................................... 2658
MathGammaIncomplete
........................................................................................................... 2659
MathBinomialCoefficient
........................................................................................................... 2660
MathBinomialCoefficientLog
........................................................................................................... 2661
MathHypergeometric2F2
........................................................................................................... 2662
MathSequence........................................................................................................... 2663
MathSequenceByCount
........................................................................................................... 2664
MathReplicate
........................................................................................................... 2665
MathReverse
........................................................................................................... 2666
MathIdentical
........................................................................................................... 2667
MathUnique........................................................................................................... 2668
MathQuickSortAscending
........................................................................................................... 2669
MathQuickSortDescending
........................................................................................................... 2670
MathQuickSort
........................................................................................................... 2671
MathOrder........................................................................................................... 2672
MathBitwiseNot
........................................................................................................... 2673
MathBitwiseAnd
........................................................................................................... 2674
MathBitwiseOr
........................................................................................................... 2675
MathBitwise
...........................................................................................................
X or 2676
MathBitwiseShiftL
........................................................................................................... 2677
MathBitwiseShiftR
........................................................................................................... 2678
MathCumulativeSum
........................................................................................................... 2679
MathCumulativeProduct
........................................................................................................... 2680
MathCumulativeMin
........................................................................................................... 2681
MathCumulativeMa
...........................................................................................................
x 2682
MathSin ........................................................................................................... 2683
MathCos ........................................................................................................... 2684
MathTan ........................................................................................................... 2685
MathArcsin........................................................................................................... 2686
MathArccos........................................................................................................... 2687
MathArctan........................................................................................................... 2688
MathSinPi ........................................................................................................... 2689
MathCosPi ........................................................................................................... 2690
MathTanPi ........................................................................................................... 2691
MathAbs ........................................................................................................... 2692
MathCeil ........................................................................................................... 2693
MathFloor ........................................................................................................... 2694
MathSqrt ........................................................................................................... 2695
MathEx p ........................................................................................................... 2696
MathPow ........................................................................................................... 2697
MathLog ........................................................................................................... 2698
MathLog2 ........................................................................................................... 2699
MathLog10........................................................................................................... 2700
MathLog1p........................................................................................................... 2701
MathDifference
........................................................................................................... 2702
MathSample........................................................................................................... 2704
MathTukeySummary
........................................................................................................... 2707
MathRange........................................................................................................... 2708
MathMin ........................................................................................................... 2709
MathMax ........................................................................................................... 2710
MathSum ........................................................................................................... 2711
MathProduct
........................................................................................................... 2712
MathStandardDeviation
........................................................................................................... 2713
MathAverageDeviation
........................................................................................................... 2714
MathMedian........................................................................................................... 2715
MathMean ........................................................................................................... 2716
MathVariance
........................................................................................................... 2717
MathSkewness
........................................................................................................... 2718
MathKurtosis
........................................................................................................... 2719
MathEx pm1........................................................................................................... 2720
MathSinh ........................................................................................................... 2721
MathCosh ........................................................................................................... 2722
MathTanh ........................................................................................................... 2723
MathArcsinh
........................................................................................................... 2724
MathArccosh
........................................................................................................... 2725
CTrapezoidMembershipFunction
........................................................................................................... 2782
X1 ........................................................................................................... 2784
X2 ........................................................................................................... 2784
X3 ........................................................................................................... 2785
X4 ........................................................................................................... 2785
GetValue ........................................................................................................... 2786
CTriangularMembershipFunction
........................................................................................................... 2787
X1 ........................................................................................................... 2789
X2 ........................................................................................................... 2789
X3 ........................................................................................................... 2790
ToNormalMF ........................................................................................................... 2790
GetValue ........................................................................................................... 2790
C Z_ShapedMembershipFunction
........................................................................................................... 2792
A ........................................................................................................... 2794
B ........................................................................................................... 2794
GetValue ........................................................................................................... 2795
IMembershipFunction
........................................................................................................... 2796
GetValue ........................................................................................................... 2796
Fuzzy systems
................................................................................................................
rules 2797
CMamdaniFuzzyRule
........................................................................................................... 2798
Conclusion........................................................................................................... 2799
Weight ........................................................................................................... 2799
CSugenoFuzzyRule
........................................................................................................... 2800
Conclusion........................................................................................................... 2801
CSingleCondition
........................................................................................................... 2802
Not ........................................................................................................... 2802
Term ........................................................................................................... 2803
Var ........................................................................................................... 2803
CConditions ........................................................................................................... 2805
ConditionsList
........................................................................................................... 2805
Not ........................................................................................................... 2806
Op ........................................................................................................... 2806
CGenericFuzzyRule
........................................................................................................... 2808
Conclusion........................................................................................................... 2808
Condition ........................................................................................................... 2809
CreateCondition
........................................................................................................... 2809
Fuzzy systems
................................................................................................................
variables 2811
CFuzzyVariable
........................................................................................................... 2812
AddTerm ........................................................................................................... 2813
GetTermByName
........................................................................................................... 2813
Max ........................................................................................................... 2813
Min ........................................................................................................... 2814
Terms ........................................................................................................... 2814
Values ........................................................................................................... 2815
CSugenoVariable
........................................................................................................... 2816
Functions ........................................................................................................... 2816
GetFuncByName
........................................................................................................... 2817
Values ........................................................................................................... 2817
Fuzzy terms................................................................................................................ 2818
MembershipFunction
........................................................................................................... 2819
Fuzzy systems
................................................................................................................ 2820
Mamdani system
........................................................................................................... 2821
AggregationMethod
........................................................................................................... 2821
Calculate ........................................................................................................... 2822
DefuzzificationMethod
........................................................................................................... 2822
EmptyRule ........................................................................................................... 2822
ImplicationMethod
........................................................................................................... 2822
Output ........................................................................................................... 2823
OutputByName
........................................................................................................... 2823
ParseRule ........................................................................................................... 2823
Rules ........................................................................................................... 2824
Sugeno system
........................................................................................................... 2825
Calculate ........................................................................................................... 2825
CreateSugenoFunction
........................................................................................................... 2826
EmptyRule ........................................................................................................... 2827
Output ........................................................................................................... 2827
OutputByName
........................................................................................................... 2827
ParseRule ........................................................................................................... 2827
Rules ........................................................................................................... 2828
OpenCL ............................................................................................................................2829
BufferCreate
......................................................................................................................... 2831
BufferFree
......................................................................................................................... 2832
BufferFromArray
......................................................................................................................... 2833
BufferRead
......................................................................................................................... 2834
BufferWrite
......................................................................................................................... 2835
Ex ecute......................................................................................................................... 2836
GetConte .........................................................................................................................
xt 2837
Get Kernel
......................................................................................................................... 2838
Get KernelName
......................................................................................................................... 2839
GetProgram
......................................................................................................................... 2840
Initialize
......................................................................................................................... 2841
KernelCreate
......................................................................................................................... 2842
KernelFree
......................................................................................................................... 2843
SetArgument
......................................................................................................................... 2844
SetArgumentBuffer
......................................................................................................................... 2845
SetArgumentLocalMemory
......................................................................................................................... 2846
SetBuffersCount
......................................................................................................................... 2847
Set KernelsCount
......................................................................................................................... 2848
Shutdown ......................................................................................................................... 2849
SupportDouble
......................................................................................................................... 2850
Basic Class............................................................................................................................2851
COb jec t
Prev ......................................................................................................................... 2852
Prev ......................................................................................................................... 2853
Nex t ......................................................................................................................... 2854
Nex t ......................................................................................................................... 2855
Compare ......................................................................................................................... 2856
Save ......................................................................................................................... 2858
Load ......................................................................................................................... 2860
Type ......................................................................................................................... 2862
Collezione............................................................................................................................2863
Dati
CArray ......................................................................................................................... 2864
Step ................................................................................................................ 2866
Step ................................................................................................................ 2867
Total ................................................................................................................ 2868
Available ................................................................................................................ 2869
Max ................................................................................................................ 2870
IsSorted ................................................................................................................ 2871
SortMode ................................................................................................................ 2872
Clear ................................................................................................................ 2873
Sort ................................................................................................................ 2874
Save ................................................................................................................ 2875
Load ................................................................................................................ 2876
CArrayChar
......................................................................................................................... 2877
Reserve ................................................................................................................ 2880
Resize ................................................................................................................ 2881
Shutdown ................................................................................................................ 2882
CArrayInt
......................................................................................................................... 2954
Reserve ................................................................................................................ 2957
Resize ................................................................................................................ 2958
Shutdown ................................................................................................................ 2959
Add ................................................................................................................ 2960
AddArray ................................................................................................................ 2961
AddArray ................................................................................................................ 2962
Insert ................................................................................................................ 2964
InsertArray................................................................................................................ 2965
InsertArray................................................................................................................ 2966
AssignArray................................................................................................................ 2968
AssignArray................................................................................................................ 2969
Update ................................................................................................................ 2971
Shift ................................................................................................................ 2972
Delete ................................................................................................................ 2973
DeleteRange ................................................................................................................ 2974
At ................................................................................................................ 2975
CompareArray ................................................................................................................ 2977
CompareArray ................................................................................................................ 2978
InsertSort ................................................................................................................ 2979
Search ................................................................................................................ 2980
SearchGreat ................................................................................................................ 2981
SearchLess................................................................................................................ 2982
SearchGreatOrEqual
................................................................................................................ 2983
SearchLessOrEqual
................................................................................................................ 2984
SearchFirst................................................................................................................ 2985
SearchLast................................................................................................................ 2986
SearchLinear ................................................................................................................ 2987
Save ................................................................................................................ 2988
Load ................................................................................................................ 2990
Type ................................................................................................................ 2992
CArrayLong
......................................................................................................................... 2993
Reserve ................................................................................................................ 2996
Resize ................................................................................................................ 2997
Shutdown ................................................................................................................ 2998
Add ................................................................................................................ 2999
AddArray ................................................................................................................ 3000
AddArray ................................................................................................................ 3001
Insert ................................................................................................................ 3003
InsertArray................................................................................................................ 3004
InsertArray................................................................................................................ 3005
AssignArray................................................................................................................ 3007
AssignArray................................................................................................................ 3008
Update ................................................................................................................ 3010
Shift ................................................................................................................ 3011
Delete ................................................................................................................ 3012
DeleteRange ................................................................................................................ 3013
At ................................................................................................................ 3014
CompareArray ................................................................................................................ 3016
CompareArray ................................................................................................................ 3017
InsertSort ................................................................................................................ 3018
Search ................................................................................................................ 3019
SearchGreat ................................................................................................................ 3020
SearchLess................................................................................................................ 3021
SearchGreatOrEqual
................................................................................................................ 3022
SearchLessOrEqual
................................................................................................................ 3023
SearchFirst................................................................................................................ 3024
SearchLast................................................................................................................ 3025
CRedBlackTreeNode
.........................................................................................................................
<T> 3316
Value ................................................................................................................ 3317
Parent ................................................................................................................ 3318
Left ................................................................................................................ 3319
Right ................................................................................................................ 3320
Color ................................................................................................................ 3321
IsLeaf ................................................................................................................ 3322
CreateEmptyNode
................................................................................................................ 3323
CLinkedListNode
.........................................................................................................................
<T> 3324
List ................................................................................................................ 3325
Nex t ................................................................................................................ 3326
Previous ................................................................................................................ 3327
Value ................................................................................................................ 3328
C KeyValuePair
.........................................................................................................................
<TKey,TValue> 3329
Key ................................................................................................................ 3330
Value ................................................................................................................ 3331
Clone ................................................................................................................ 3332
Compare ................................................................................................................ 3333
Equals ................................................................................................................ 3334
HashCode ................................................................................................................ 3335
CArrayList
.........................................................................................................................
<T> 3336
Capacity ................................................................................................................ 3338
Count ................................................................................................................ 3339
Contains ................................................................................................................ 3340
TrimEx cess................................................................................................................ 3341
TryGetValue ................................................................................................................ 3342
TrySetValue................................................................................................................ 3343
Add ................................................................................................................ 3344
AddRange ................................................................................................................ 3345
Insert ................................................................................................................ 3346
InsertRange ................................................................................................................ 3347
CopyTo ................................................................................................................ 3348
BinarySearch ................................................................................................................ 3349
Index Of ................................................................................................................ 3350
LastIndex Of ................................................................................................................ 3351
Clear ................................................................................................................ 3352
Remove ................................................................................................................ 3353
RemoveAt ................................................................................................................ 3354
RemoveRange ................................................................................................................ 3355
Reverse ................................................................................................................ 3356
Sort ................................................................................................................ 3357
C HashMap.........................................................................................................................
<TKey,TValue> 3358
Add ................................................................................................................ 3360
Count ................................................................................................................ 3361
Comparer ................................................................................................................ 3362
Contains ................................................................................................................ 3363
Contains Key ................................................................................................................ 3364
ContainsValue ................................................................................................................ 3365
CopyTo ................................................................................................................ 3366
Clear ................................................................................................................ 3367
Remove ................................................................................................................ 3368
TryGetValue ................................................................................................................ 3369
TrySetValue................................................................................................................ 3370
C HashSet.........................................................................................................................
<T> 3371
Add ................................................................................................................ 3373
Count ................................................................................................................ 3374
Contains ................................................................................................................ 3375
Comparer ................................................................................................................ 3376
SetUnicode................................................................................................................ 3502
SetCommon................................................................................................................ 3503
Open ................................................................................................................ 3504
Close ................................................................................................................ 3505
Delete ................................................................................................................ 3506
IsEx ist ................................................................................................................ 3507
Copy ................................................................................................................ 3508
Move ................................................................................................................ 3509
Size ................................................................................................................ 3510
Tell ................................................................................................................ 3511
Seek ................................................................................................................ 3512
Flush ................................................................................................................ 3513
IsEnding ................................................................................................................ 3514
IsLineEnding ................................................................................................................ 3515
FolderCreate ................................................................................................................ 3516
FolderDelete ................................................................................................................ 3517
FolderClean................................................................................................................ 3518
FileFindFirst ................................................................................................................ 3519
FileFindNex................................................................................................................
t 3520
FileFindClose ................................................................................................................ 3521
CFileBin......................................................................................................................... 3522
Open ................................................................................................................ 3524
WriteChar ................................................................................................................ 3525
WriteShort................................................................................................................ 3526
WriteInteger ................................................................................................................ 3527
WriteLong ................................................................................................................ 3528
WriteFloat ................................................................................................................ 3529
WriteDouble ................................................................................................................ 3530
WriteString................................................................................................................ 3531
WriteCharArray................................................................................................................ 3532
WriteShortArray
................................................................................................................ 3533
WriteIntegerArray
................................................................................................................ 3534
WriteLongArray................................................................................................................ 3535
WriteFloatArray
................................................................................................................ 3536
WriteDoubleArray
................................................................................................................ 3537
WriteObject ................................................................................................................ 3538
ReadChar ................................................................................................................ 3539
ReadShort ................................................................................................................ 3540
ReadInteger ................................................................................................................ 3541
ReadLong ................................................................................................................ 3542
ReadFloat ................................................................................................................ 3543
ReadDouble................................................................................................................ 3544
ReadString ................................................................................................................ 3545
ReadCharArray ................................................................................................................ 3546
ReadShortArray................................................................................................................ 3547
ReadIntegerArray
................................................................................................................ 3548
ReadLongArray ................................................................................................................ 3549
ReadFloatArray................................................................................................................ 3550
ReadDoubleArray
................................................................................................................ 3551
ReadObject................................................................................................................ 3552
CFileTx t......................................................................................................................... 3553
Open ................................................................................................................ 3554
WriteString................................................................................................................ 3555
ReadString ................................................................................................................ 3556
Stringhe ............................................................................................................................3557
CString ......................................................................................................................... 3558
Str ................................................................................................................ 3560
Len ................................................................................................................ 3561
IsShowScaleTop................................................................................................................ 3968
IsShowScaleBottom
................................................................................................................ 3969
IsShowGrid................................................................................................................ 3970
IsShowDescriptors
................................................................................................................ 3971
IsShowPercent ................................................................................................................ 3972
VScaleMin ................................................................................................................ 3973
VScaleMax ................................................................................................................ 3974
NumGrid ................................................................................................................ 3975
DataOffset................................................................................................................ 3976
DataTotal ................................................................................................................ 3977
DrawDescriptors
................................................................................................................ 3978
DrawData ................................................................................................................ 3979
Create ................................................................................................................ 3980
AllowedShowFlags
................................................................................................................ 3981
ShowLegend ................................................................................................................ 3982
ShowScaleLeft ................................................................................................................ 3983
ShowScaleRight................................................................................................................ 3984
ShowScaleTop ................................................................................................................ 3985
ShowScaleBottom
................................................................................................................ 3986
ShowGrid ................................................................................................................ 3987
ShowDescriptors
................................................................................................................ 3988
ShowValue ................................................................................................................ 3989
ShowPercent ................................................................................................................ 3990
LegendAlignment
................................................................................................................ 3991
Accumulative ................................................................................................................ 3992
VScaleParams ................................................................................................................ 3993
DescriptorUpdate
................................................................................................................ 3994
ColorUpdate ................................................................................................................ 3995
ValuesCheck ................................................................................................................ 3996
Redraw ................................................................................................................ 3997
DrawBackground................................................................................................................ 3998
DrawLegend ................................................................................................................ 3999
DrawLegendVertical
................................................................................................................ 4000
DrawLegend ................................................................................................................
Horizontal 4001
CalcScales ................................................................................................................ 4002
DrawScales................................................................................................................ 4003
DrawScaleLeft ................................................................................................................ 4004
DrawScaleRight................................................................................................................ 4005
DrawScaleTop ................................................................................................................ 4006
DrawScaleBottom
................................................................................................................ 4007
DrawGrid ................................................................................................................ 4008
DrawChart................................................................................................................ 4009
C HistogramChart
......................................................................................................................... 4010
Gradient ................................................................................................................ 4015
BarGap ................................................................................................................ 4016
BarMinSize................................................................................................................ 4017
BarBorder ................................................................................................................ 4018
Create ................................................................................................................ 4019
SeriesAdd ................................................................................................................ 4020
SeriesInsert ................................................................................................................ 4021
SeriesUpdate ................................................................................................................ 4022
SeriesDelete ................................................................................................................ 4023
ValueUpdate ................................................................................................................ 4024
DrawData ................................................................................................................ 4025
DrawBar ................................................................................................................ 4026
GradientBrush ................................................................................................................ 4027
CLineChart
......................................................................................................................... 4028
Filled ................................................................................................................ 4033
ScalePPB......................................................................................................................... 4102
ShowO H.........................................................................................................................
LC 4103
ShowLineBid
......................................................................................................................... 4104
ShowLineAsk
......................................................................................................................... 4105
ShowLastLine
......................................................................................................................... 4106
ShowPeriodSep
......................................................................................................................... 4107
ShowGrid......................................................................................................................... 4108
ShowVolumes
......................................................................................................................... 4109
ShowOb.........................................................................................................................
jectDescr 4110
ShowDateScale
......................................................................................................................... 4111
ShowPriceScale
......................................................................................................................... 4112
ColorBackground
......................................................................................................................... 4113
ColorForeground
......................................................................................................................... 4114
ColorGrid
......................................................................................................................... 4115
ColorBarUp
......................................................................................................................... 4116
ColorBarDown
......................................................................................................................... 4117
ColorCandleBull
......................................................................................................................... 4118
ColorCandleBear
......................................................................................................................... 4119
ColorChartLine
......................................................................................................................... 4120
ColorVolumes
......................................................................................................................... 4121
ColorLineBid
......................................................................................................................... 4122
ColorLineAsk
......................................................................................................................... 4123
ColorLineLast
......................................................................................................................... 4124
ColorStopLevels
......................................................................................................................... 4125
VisibleBars
......................................................................................................................... 4126
WindowsTotal
......................................................................................................................... 4127
WindowIsVisible
......................................................................................................................... 4128
Window.........................................................................................................................
Handle 4129
FirstVisibleBar
......................................................................................................................... 4130
WidthInBars
......................................................................................................................... 4131
WidthInPi
.........................................................................................................................
x els 4132
HeightInPi
.........................................................................................................................
x els 4133
PriceMin......................................................................................................................... 4134
PriceMa.........................................................................................................................
x 4135
Attach ......................................................................................................................... 4136
FirstChart
......................................................................................................................... 4137
Nex tChart
......................................................................................................................... 4138
Open ......................................................................................................................... 4139
Detach ......................................................................................................................... 4140
Close ......................................................................................................................... 4141
BringToTop
......................................................................................................................... 4142
EventOb.........................................................................................................................
jectCreate 4143
EventOb.........................................................................................................................
jectDelete 4144
IndicatorAdd
......................................................................................................................... 4145
IndicatorDelete
......................................................................................................................... 4146
IndicatorsTotal
......................................................................................................................... 4147
IndicatorName
......................................................................................................................... 4148
Navigate......................................................................................................................... 4149
Symbol ......................................................................................................................... 4150
Period ......................................................................................................................... 4151
Redraw......................................................................................................................... 4152
GetInteger
......................................................................................................................... 4153
SetInteger
......................................................................................................................... 4154
GetDouble
......................................................................................................................... 4155
SetDouble
......................................................................................................................... 4156
GetString
......................................................................................................................... 4157
SetString
......................................................................................................................... 4158
SetSymbolPeriod
......................................................................................................................... 4159
ApplyTemplate
......................................................................................................................... 4160
ScreenShot
......................................................................................................................... 4161
WindowOnDropped
......................................................................................................................... 4162
PriceOnDropped
......................................................................................................................... 4163
TimeOnDropped
......................................................................................................................... 4164
X OnDropped
......................................................................................................................... 4165
Y OnDropped
......................................................................................................................... 4166
Save ......................................................................................................................... 4167
Load ......................................................................................................................... 4168
Type ......................................................................................................................... 4169
............................................................................................................................4170
Grafic i Sc ientific i
GraphPlot
......................................................................................................................... 4171
CAx is ......................................................................................................................... 4175
AutoScale ................................................................................................................ 4177
Min ................................................................................................................ 4178
Max ................................................................................................................ 4179
Step ................................................................................................................ 4180
Name ................................................................................................................ 4181
Color ................................................................................................................ 4182
ValuesSize ................................................................................................................ 4183
ValuesWidth ................................................................................................................ 4184
ValuesFormat ................................................................................................................ 4185
ValuesDateTimeMode
................................................................................................................ 4186
ValuesFunctionFormat
................................................................................................................ 4187
ValuesFunctionFormatCBData
................................................................................................................ 4189
NameSize ................................................................................................................ 4190
ZeroLever ................................................................................................................ 4191
DefaultStep................................................................................................................ 4192
Max Labels ................................................................................................................ 4193
MinGrace ................................................................................................................ 4194
Max Grace ................................................................................................................ 4195
SelectAx isScale
................................................................................................................ 4196
CColorGenerator
......................................................................................................................... 4197
Nex t ................................................................................................................ 4198
Reset ................................................................................................................ 4199
CCurve......................................................................................................................... 4200
Type ................................................................................................................ 4203
Name ................................................................................................................ 4204
Color ................................................................................................................ 4205
X Max ................................................................................................................ 4206
X Min ................................................................................................................ 4207
Y Max ................................................................................................................ 4208
Y Min ................................................................................................................ 4209
Size ................................................................................................................ 4210
PointsSize ................................................................................................................ 4211
PointsFill ................................................................................................................ 4212
PointsColor................................................................................................................ 4213
Get X ................................................................................................................ 4214
Get Y ................................................................................................................ 4215
LinesStyle ................................................................................................................ 4216
LinesIsSmooth................................................................................................................ 4217
LinesSmoothTension
................................................................................................................ 4218
LinesSmoothStep
................................................................................................................ 4219
LinesEndStyle................................................................................................................ 4220
LinesWidth................................................................................................................ 4221
HistogramWidth
................................................................................................................ 4223
CustomPlotCBData
................................................................................................................ 4224
CustomPlotFunction
................................................................................................................ 4225
PointsType................................................................................................................ 4229
StepsDimension................................................................................................................ 4230
TrendLineCoefficients
................................................................................................................ 4231
TrendLineColor................................................................................................................ 4232
TrendLineVisible
................................................................................................................ 4233
Update ................................................................................................................ 4235
Visible ................................................................................................................ 4237
CGraphic......................................................................................................................... 4238
Create ................................................................................................................ 4241
Destroy ................................................................................................................ 4242
Update ................................................................................................................ 4243
ChartObjectName
................................................................................................................ 4244
ResourceName ................................................................................................................ 4245
X Ax is ................................................................................................................ 4246
Y Ax is ................................................................................................................ 4247
GapSize ................................................................................................................ 4248
BackgroundColor
................................................................................................................ 4249
BackgroundMain................................................................................................................ 4250
BackgroundMainSize
................................................................................................................ 4251
BackgroundMainColor
................................................................................................................ 4252
BackgroundSub ................................................................................................................ 4253
BackgroundSubSize
................................................................................................................ 4254
BackgroundSubColor
................................................................................................................ 4255
GridLineColor ................................................................................................................ 4256
GridBackgroundColor
................................................................................................................ 4257
GridCircleRadius
................................................................................................................ 4258
GridCircleColor
................................................................................................................ 4259
GridHasCircle ................................................................................................................ 4260
GridAx isLineColor
................................................................................................................ 4261
HistoryNameWidth
................................................................................................................ 4262
HistoryNameSize
................................................................................................................ 4263
HistorySymbolSize
................................................................................................................ 4264
Tex tAdd ................................................................................................................ 4265
LineAdd ................................................................................................................ 4266
CurveAdd ................................................................................................................ 4267
CurvePlot ................................................................................................................ 4270
CurvePlotAll ................................................................................................................ 4271
CurveGetByInde................................................................................................................
x 4272
CurveGetByName................................................................................................................ 4273
CurveRemoveByInde
................................................................................................................
x 4274
CurveRemoveByName
................................................................................................................ 4275
CurvesTotal ................................................................................................................ 4276
MarksToAx isAdd
................................................................................................................ 4277
MajorMarkSize ................................................................................................................ 4278
FontSet ................................................................................................................ 4279
FontGet ................................................................................................................ 4280
Attach ................................................................................................................ 4281
CalculateMa................................................................................................................
x MinValues 4282
Height ................................................................................................................ 4283
IndentDown................................................................................................................ 4284
IndentLeft ................................................................................................................ 4285
IndentRight................................................................................................................ 4286
IndentUp ................................................................................................................ 4287
Redraw ................................................................................................................ 4288
ResetParameters
................................................................................................................ 4289
ScaleX ................................................................................................................ 4290
ScaleY ................................................................................................................ 4291
SetDefaultParameters
................................................................................................................ 4292
SignalPeriod........................................................................................................... 4633
Applied ........................................................................................................... 4634
Create ........................................................................................................... 4635
Main ........................................................................................................... 4636
Type ........................................................................................................... 4637
CiRSI ................................................................................................................ 4638
MaPeriod ........................................................................................................... 4640
Applied ........................................................................................................... 4641
Create ........................................................................................................... 4642
Main ........................................................................................................... 4643
Type ........................................................................................................... 4644
CiRVI ................................................................................................................ 4645
MaPeriod ........................................................................................................... 4647
Create ........................................................................................................... 4648
Main ........................................................................................................... 4649
Signal ........................................................................................................... 4650
Type ........................................................................................................... 4651
CiStochastic................................................................................................................ 4652
Kperiod ........................................................................................................... 4654
Dperiod ........................................................................................................... 4655
Slowing ........................................................................................................... 4656
MaMethod ........................................................................................................... 4657
PriceField ........................................................................................................... 4658
Create ........................................................................................................... 4659
Main ........................................................................................................... 4660
Signal ........................................................................................................... 4661
Type ........................................................................................................... 4662
CiTriX ................................................................................................................ 4663
MaPeriod ........................................................................................................... 4665
Applied ........................................................................................................... 4666
Create ........................................................................................................... 4667
Main ........................................................................................................... 4668
Type ........................................................................................................... 4669
CiWPR ................................................................................................................ 4670
CalcPeriod........................................................................................................... 4672
Create ........................................................................................................... 4673
Main ........................................................................................................... 4674
Type ........................................................................................................... 4675
Volume .........................................................................................................................
Indicators 4676
CiAD ................................................................................................................ 4677
Applied ........................................................................................................... 4679
Create ........................................................................................................... 4680
Main ........................................................................................................... 4681
Type ........................................................................................................... 4682
CiMFI ................................................................................................................ 4683
MaPeriod ........................................................................................................... 4685
Applied ........................................................................................................... 4686
Create ........................................................................................................... 4687
Main ........................................................................................................... 4688
Type ........................................................................................................... 4689
CiOBV ................................................................................................................ 4690
Applied ........................................................................................................... 4692
Create ........................................................................................................... 4693
Main ........................................................................................................... 4694
Type ........................................................................................................... 4695
CiVolumes ................................................................................................................ 4696
Applied ........................................................................................................... 4698
Create ........................................................................................................... 4699
TradeModeDescription
................................................................................................................ 4827
TradeEx ecution
................................................................................................................ 4828
TradeEx ecutionDescription
................................................................................................................ 4829
SwapMode ................................................................................................................ 4830
SwapModeDescription
................................................................................................................ 4831
SwapRollover3days
................................................................................................................ 4832
SwapRollover3daysDescription
................................................................................................................ 4833
MarginInitial................................................................................................................ 4834
MarginMaintenance
................................................................................................................ 4835
MarginLong................................................................................................................ 4836
MarginShort ................................................................................................................ 4837
MarginLimit................................................................................................................ 4838
MarginStop................................................................................................................ 4839
MarginStopLimit
................................................................................................................ 4840
TradeTimeFlags
................................................................................................................ 4841
TradeFillFlags
................................................................................................................ 4842
Digits ................................................................................................................ 4843
Point ................................................................................................................ 4844
TickValue ................................................................................................................ 4845
TickValueProfit
................................................................................................................ 4846
TickValueLoss................................................................................................................ 4847
TickSize ................................................................................................................ 4848
ContractSize ................................................................................................................ 4849
LotsMin ................................................................................................................ 4850
LotsMax ................................................................................................................ 4851
LotsStep ................................................................................................................ 4852
LotsLimit ................................................................................................................ 4853
SwapLong ................................................................................................................ 4854
SwapShort ................................................................................................................ 4855
CurrencyBase ................................................................................................................ 4856
CurrencyProfit
................................................................................................................ 4857
CurrencyMargin
................................................................................................................ 4858
Bank ................................................................................................................ 4859
Description................................................................................................................ 4860
Path ................................................................................................................ 4861
SessionDeals ................................................................................................................ 4862
SessionBuyOrders
................................................................................................................ 4863
SessionSellOrders
................................................................................................................ 4864
SessionTurnover
................................................................................................................ 4865
SessionInterest
................................................................................................................ 4866
SessionBuyOrdersVolume
................................................................................................................ 4867
SessionSellOrdersVolume
................................................................................................................ 4868
SessionOpen ................................................................................................................ 4869
SessionClose ................................................................................................................ 4870
SessionAW ................................................................................................................ 4871
SessionPriceSettlement
................................................................................................................ 4872
SessionPriceLimitMin
................................................................................................................ 4873
SessionPriceLimitMa
................................................................................................................
x 4874
InfoInteger................................................................................................................ 4875
InfoDouble ................................................................................................................ 4876
InfoString ................................................................................................................ 4877
NormalizePrice
................................................................................................................ 4878
COrderInfo
......................................................................................................................... 4879
Ticket ................................................................................................................ 4882
TimeSetup ................................................................................................................ 4883
TimeSetupMsc ................................................................................................................ 4884
OrderType................................................................................................................ 4885
TypeDescription
................................................................................................................ 4886
OrderModify................................................................................................................ 5011
OrderDelete................................................................................................................ 5012
PositionOpen
................................................................................................................ 5013
PositionModify
................................................................................................................ 5014
PositionClose
................................................................................................................ 5015
PositionCloseBy
................................................................................................................ 5016
Buy ................................................................................................................ 5017
Sell ................................................................................................................ 5018
BuyLimit ................................................................................................................ 5019
BuyStop ................................................................................................................ 5021
SellLimit ................................................................................................................ 5022
SellStop ................................................................................................................ 5023
Request ................................................................................................................ 5024
RequestAction
................................................................................................................ 5025
RequestActionDescription
................................................................................................................ 5026
RequestMagic
................................................................................................................ 5027
RequestOrder
................................................................................................................ 5028
RequestSymbol
................................................................................................................ 5029
RequestVolume
................................................................................................................ 5030
RequestPrice
................................................................................................................ 5031
RequestStopLimit
................................................................................................................ 5032
RequestSL ................................................................................................................ 5033
RequestTP ................................................................................................................ 5034
RequestDeviation
................................................................................................................ 5035
RequestType................................................................................................................ 5036
RequestTypeDescription
................................................................................................................ 5037
RequestTypeFilling
................................................................................................................ 5038
RequestTypeFillingDescription
................................................................................................................ 5039
RequestTypeTime
................................................................................................................ 5040
RequestTypeTimeDescription
................................................................................................................ 5041
RequestEx piration
................................................................................................................ 5042
RequestComment
................................................................................................................ 5043
RequestPosition
................................................................................................................ 5044
RequestPositionBy
................................................................................................................ 5045
Result ................................................................................................................ 5046
ResultRetcode
................................................................................................................ 5047
ResultRetcodeDescription
................................................................................................................ 5048
ResultDeal ................................................................................................................ 5049
ResultOrder................................................................................................................ 5050
ResultVolume
................................................................................................................ 5051
ResultPrice................................................................................................................ 5052
ResultBid ................................................................................................................ 5053
ResultAsk ................................................................................................................ 5054
ResultComment
................................................................................................................ 5055
CheckResult................................................................................................................ 5056
CheckResultRetcode
................................................................................................................ 5057
CheckResultRetcodeDescription
................................................................................................................ 5058
CheckResultBalance
................................................................................................................ 5059
CheckResultEquity
................................................................................................................ 5060
CheckResultProfit
................................................................................................................ 5061
CheckResultMargin
................................................................................................................ 5062
CheckResultMarginFree
................................................................................................................ 5063
CheckResultMarginLevel
................................................................................................................ 5064
CheckResultComment
................................................................................................................ 5065
PrintRequest
................................................................................................................ 5066
PrintResult................................................................................................................ 5067
FormatRequest
................................................................................................................ 5068
FormatRequestResult
................................................................................................................ 5069
CTerminalInfo
......................................................................................................................... 5070
Build ................................................................................................................ 5072
IsConnected ................................................................................................................ 5073
IsDLLsAllowed ................................................................................................................ 5074
IsTradeAllowed ................................................................................................................ 5075
IsEmailEnabled ................................................................................................................ 5076
IsFtpEnabled ................................................................................................................ 5077
Max Bars ................................................................................................................ 5078
CodePage ................................................................................................................ 5079
CPUCores ................................................................................................................ 5080
MemoryPhysical ................................................................................................................ 5081
MemoryTotal ................................................................................................................ 5082
MemoryAvailable................................................................................................................ 5083
MemoryUsed ................................................................................................................ 5084
Is X 64 ................................................................................................................ 5085
OpenCLSupport ................................................................................................................ 5086
DiskSpace ................................................................................................................ 5087
Language ................................................................................................................ 5088
Name ................................................................................................................ 5089
Company ................................................................................................................ 5090
Path ................................................................................................................ 5091
DataPath ................................................................................................................ 5092
CommonDataPath ................................................................................................................ 5093
InfoInteger................................................................................................................ 5094
InfoString ................................................................................................................ 5095
............................................................................................................................5096
Moduli Strategia
Classi base
.........................................................................................................................
per Ex pert Advisors 5099
CEx pertBase ................................................................................................................ 5100
InitPhase ........................................................................................................... 5103
TrendType........................................................................................................... 5104
UsedSeries........................................................................................................... 5105
EveryTick ........................................................................................................... 5106
Open ........................................................................................................... 5107
High ........................................................................................................... 5108
Low ........................................................................................................... 5109
Close ........................................................................................................... 5110
Spread ........................................................................................................... 5111
Time ........................................................................................................... 5112
TickVolume........................................................................................................... 5113
RealVolume........................................................................................................... 5114
Init ........................................................................................................... 5115
Symbol ........................................................................................................... 5116
Period ........................................................................................................... 5117
Magic ........................................................................................................... 5118
ValidationSettings
........................................................................................................... 5119
SetPriceSeries
........................................................................................................... 5120
SetOtherSeries
........................................................................................................... 5121
InitIndicators
........................................................................................................... 5122
InitOpen ........................................................................................................... 5123
Init High ........................................................................................................... 5124
InitLow ........................................................................................................... 5125
InitClose ........................................................................................................... 5126
InitSpread ........................................................................................................... 5127
InitTime ........................................................................................................... 5128
InitTickVolume
........................................................................................................... 5129
InitRealVolume
........................................................................................................... 5130
PriceLevelUnit
........................................................................................................... 5131
StartIndex........................................................................................................... 5132
CompareMagic........................................................................................................... 5133
CEx pert ................................................................................................................ 5134
Init ........................................................................................................... 5139
Magic ........................................................................................................... 5140
InitSignal ........................................................................................................... 5141
InitTrailing........................................................................................................... 5142
InitMoney ........................................................................................................... 5143
InitTrade ........................................................................................................... 5144
Deinit ........................................................................................................... 5145
OnTickProcess
........................................................................................................... 5146
OnTradeProcess
........................................................................................................... 5147
OnTimerProcess
........................................................................................................... 5148
OnChartEventProcess
........................................................................................................... 5149
OnBookEventProcess
........................................................................................................... 5150
Max Orders........................................................................................................... 5151
Signal ........................................................................................................... 5152
ValidationSettings
........................................................................................................... 5153
InitIndicators
........................................................................................................... 5154
OnTick ........................................................................................................... 5155
OnTrade ........................................................................................................... 5156
OnTimer ........................................................................................................... 5157
OnChartEvent........................................................................................................... 5158
OnBookEvent ........................................................................................................... 5159
InitParameters
........................................................................................................... 5160
DeinitTrade........................................................................................................... 5161
DeinitSignal........................................................................................................... 5162
DeinitTrailing
........................................................................................................... 5163
DeinitMoney ........................................................................................................... 5164
DeinitIndicators
........................................................................................................... 5165
Refresh ........................................................................................................... 5166
Processing........................................................................................................... 5167
SelectPosition
........................................................................................................... 5169
CheckOpen........................................................................................................... 5170
CheckOpenLong
........................................................................................................... 5171
CheckOpenShort
........................................................................................................... 5172
OpenLong ........................................................................................................... 5173
OpenShort ........................................................................................................... 5174
CheckReverse........................................................................................................... 5175
CheckReverseLong
........................................................................................................... 5176
CheckReverseShort
........................................................................................................... 5177
ReverseLong ........................................................................................................... 5178
ReverseShort........................................................................................................... 5180
CheckClose........................................................................................................... 5182
CheckCloseLong
........................................................................................................... 5183
CheckCloseShort
........................................................................................................... 5184
CloseAll ........................................................................................................... 5185
Close ........................................................................................................... 5186
CloseLong ........................................................................................................... 5187
CloseShort ........................................................................................................... 5188
CheckTrailingStop
........................................................................................................... 5189
CheckTrailingStopLong
........................................................................................................... 5190
CheckTrailingStopShort
........................................................................................................... 5191
TrailingStopLong
........................................................................................................... 5192
TrailingStopShort
........................................................................................................... 5193
CheckTrailingOrderLong
........................................................................................................... 5194
CheckTrailingOrderShort
........................................................................................................... 5195
TrailingOrderLong
........................................................................................................... 5196
TrailingOrderShort
........................................................................................................... 5197
CheckDeleteOrderLong
........................................................................................................... 5198
CheckDeleteOrderShort
........................................................................................................... 5199
DeleteOrders........................................................................................................... 5200
DeleteOrder ........................................................................................................... 5201
DeleteOrderLong
........................................................................................................... 5202
DeleteOrderShort
........................................................................................................... 5203
LotOpenLong ........................................................................................................... 5204
LotOpenShort........................................................................................................... 5205
LotReverse........................................................................................................... 5206
PrepareHistoryDate
........................................................................................................... 5207
HistoryPoint........................................................................................................... 5208
CheckTradeState
........................................................................................................... 5209
WaitEvent ........................................................................................................... 5210
NoWaitEvent ........................................................................................................... 5211
TradeEventPositionStopTake
........................................................................................................... 5212
TradeEventOrderTriggered
........................................................................................................... 5213
TradeEventPositionOpened
........................................................................................................... 5214
TradeEventPositionVolumeChanged
........................................................................................................... 5215
TradeEventPositionModified
........................................................................................................... 5216
TradeEventPositionClosed
........................................................................................................... 5217
TradeEventOrderPlaced
........................................................................................................... 5218
TradeEventOrderModified
........................................................................................................... 5219
TradeEventOrderDeleted
........................................................................................................... 5220
TradeEventNotIdentified
........................................................................................................... 5221
TimeframeAdd........................................................................................................... 5222
TimeframesFlags
........................................................................................................... 5223
CEx pertSignal
................................................................................................................ 5224
BasePrice ........................................................................................................... 5227
UsedSeries........................................................................................................... 5228
Weight ........................................................................................................... 5229
PatternsUsage
........................................................................................................... 5230
General ........................................................................................................... 5231
Ignore ........................................................................................................... 5232
Invert ........................................................................................................... 5233
ThresholdOpen
........................................................................................................... 5234
ThresholdClose
........................................................................................................... 5235
PriceLevel........................................................................................................... 5236
StopLevel ........................................................................................................... 5237
TakeLevel ........................................................................................................... 5238
Ex piration ........................................................................................................... 5239
Magic ........................................................................................................... 5240
ValidationSettings
........................................................................................................... 5241
InitIndicators
........................................................................................................... 5242
AddFilter ........................................................................................................... 5243
CheckOpenLong
........................................................................................................... 5244
CheckOpenShort
........................................................................................................... 5245
OpenLongParams
........................................................................................................... 5246
OpenShortParams
........................................................................................................... 5247
CheckCloseLong
........................................................................................................... 5248
CheckCloseShort
........................................................................................................... 5249
CloseLongParams
........................................................................................................... 5250
CloseShortParams
........................................................................................................... 5251
CheckReverseLong
........................................................................................................... 5252
CheckReverseShort
........................................................................................................... 5253
CheckTrailingOrderLong
........................................................................................................... 5254
CheckTrailingOrderShort
........................................................................................................... 5255
LongCondition
........................................................................................................... 5256
ShortCondition
........................................................................................................... 5257
CMoneyFix edLot
................................................................................................................ 5375
Lots ........................................................................................................... 5377
ValidationSettings
........................................................................................................... 5378
CheckOpenLong
........................................................................................................... 5379
CheckOpenShort
........................................................................................................... 5380
CMoneyFix edMargin
................................................................................................................ 5381
CheckOpenLong
........................................................................................................... 5382
CheckOpenShort
........................................................................................................... 5383
CMoneyFix edRisk
................................................................................................................ 5384
CheckOpenLong
........................................................................................................... 5385
CheckOpenShort
........................................................................................................... 5386
CMoneyNone................................................................................................................ 5387
ValidationSettings
........................................................................................................... 5388
CheckOpenLong
........................................................................................................... 5389
CheckOpenShort
........................................................................................................... 5390
CMoneySizeOptimized
................................................................................................................ 5391
DecreaseFactor
........................................................................................................... 5393
ValidationSettings
........................................................................................................... 5394
CheckOpenLong
........................................................................................................... 5395
CheckOpenShort
........................................................................................................... 5396
Pannelli e ............................................................................................................................5397
Dialoghi
CRect ......................................................................................................................... 5399
Left ................................................................................................................ 5400
Top ................................................................................................................ 5401
Right ................................................................................................................ 5402
Bottom ................................................................................................................ 5403
Width ................................................................................................................ 5404
Height ................................................................................................................ 5405
SetBound ................................................................................................................ 5406
Move ................................................................................................................ 5407
Shift ................................................................................................................ 5408
Contains ................................................................................................................ 5409
Format ................................................................................................................ 5410
CDateTime
......................................................................................................................... 5411
MonthName................................................................................................................ 5413
ShortMonthName
................................................................................................................ 5414
DayName ................................................................................................................ 5415
ShortDayName ................................................................................................................ 5416
DaysInMonth ................................................................................................................ 5417
DateTime ................................................................................................................ 5418
Date ................................................................................................................ 5419
Time ................................................................................................................ 5420
Sec ................................................................................................................ 5421
Min ................................................................................................................ 5422
Hour ................................................................................................................ 5423
Day ................................................................................................................ 5424
Mon ................................................................................................................ 5425
Y ear ................................................................................................................ 5426
SecDec ................................................................................................................ 5427
SecInc ................................................................................................................ 5428
MinDec ................................................................................................................ 5429
MinInc ................................................................................................................ 5430
HourDec ................................................................................................................ 5431
HourInc ................................................................................................................ 5432
DayDec ................................................................................................................ 5433
DayInc ................................................................................................................ 5434
MonDec ................................................................................................................ 5435
MonInc ................................................................................................................ 5436
OnMouseUp................................................................................................................ 5498
OnDragStart ................................................................................................................ 5499
OnDragProcess................................................................................................................ 5500
OnDragEnd................................................................................................................ 5501
DragObjectCreate
................................................................................................................ 5502
DragObjectDestroy
................................................................................................................ 5503
CWndOb.........................................................................................................................
j 5504
OnEvent ................................................................................................................ 5506
Tex t ................................................................................................................ 5507
Color ................................................................................................................ 5508
ColorBackground
................................................................................................................ 5509
ColorBorder................................................................................................................ 5510
Font ................................................................................................................ 5511
FontSize ................................................................................................................ 5512
ZOrder ................................................................................................................ 5513
OnObjectCreate
................................................................................................................ 5514
OnObjectChange
................................................................................................................ 5515
OnObjectDelete
................................................................................................................ 5516
OnObjectDrag ................................................................................................................ 5517
OnSetTex t ................................................................................................................ 5518
OnSetColor................................................................................................................ 5519
OnSetColorBackground
................................................................................................................ 5520
OnSetFont ................................................................................................................ 5521
OnSetFontSize................................................................................................................ 5522
OnSet ZOrder ................................................................................................................ 5523
OnDestroy ................................................................................................................ 5524
OnChange ................................................................................................................ 5525
CWndContainer
......................................................................................................................... 5526
Destroy ................................................................................................................ 5528
OnEvent ................................................................................................................ 5529
OnMouseEvent ................................................................................................................ 5530
ControlsTotal................................................................................................................ 5531
Control ................................................................................................................ 5532
ControlFind................................................................................................................ 5533
Add ................................................................................................................ 5534
Delete ................................................................................................................ 5535
Move ................................................................................................................ 5536
Shift ................................................................................................................ 5537
Id ................................................................................................................ 5538
Enable ................................................................................................................ 5539
Disable ................................................................................................................ 5540
Show ................................................................................................................ 5541
Hide ................................................................................................................ 5542
MouseFocus................................................................................................................
Kill 5543
Save ................................................................................................................ 5544
Load ................................................................................................................ 5545
OnResize ................................................................................................................ 5546
OnActivate................................................................................................................ 5547
OnDeactivate ................................................................................................................ 5548
CLabel ......................................................................................................................... 5549
Create ................................................................................................................ 5554
OnSetTex t ................................................................................................................ 5555
OnSetColor................................................................................................................ 5556
OnSetFont ................................................................................................................ 5557
OnSetFontSize................................................................................................................ 5558
OnCreate ................................................................................................................ 5559
OnShow ................................................................................................................ 5560
OnHide ................................................................................................................ 5561
CCheckBo
.........................................................................................................................
x 5783
Create ................................................................................................................ 5789
OnEvent ................................................................................................................ 5790
Tex t ................................................................................................................ 5791
Color ................................................................................................................ 5792
Checked ................................................................................................................ 5793
Value ................................................................................................................ 5794
CreateButton ................................................................................................................ 5795
CreateLabel ................................................................................................................ 5796
OnClickButton................................................................................................................ 5797
OnClickLabel ................................................................................................................ 5798
CCheckGroup
......................................................................................................................... 5799
Create ................................................................................................................ 5805
OnEvent ................................................................................................................ 5806
AddItem ................................................................................................................ 5807
Value ................................................................................................................ 5808
CreateButton ................................................................................................................ 5809
OnVScrollShow................................................................................................................ 5810
OnVScrollHide................................................................................................................ 5811
OnScrollLineDown
................................................................................................................ 5812
OnScrollLineUp
................................................................................................................ 5813
OnChangeItem ................................................................................................................ 5814
Redraw ................................................................................................................ 5815
RowState ................................................................................................................ 5816
CRadioButton
......................................................................................................................... 5817
Create ................................................................................................................ 5819
OnEvent ................................................................................................................ 5820
Tex t ................................................................................................................ 5821
Color ................................................................................................................ 5822
State ................................................................................................................ 5823
CreateButton ................................................................................................................ 5824
CreateLabel ................................................................................................................ 5825
OnClickButton................................................................................................................ 5826
OnClickLabel ................................................................................................................ 5827
CRadioGroup
......................................................................................................................... 5828
Create ................................................................................................................ 5834
OnEvent ................................................................................................................ 5835
AddItem ................................................................................................................ 5836
Value ................................................................................................................ 5837
CreateButton ................................................................................................................ 5838
OnVScrollShow................................................................................................................ 5839
OnVScrollHide................................................................................................................ 5840
OnScrollLineDown
................................................................................................................ 5841
OnScrollLineUp
................................................................................................................ 5842
OnChangeItem ................................................................................................................ 5843
Redraw ................................................................................................................ 5844
RowState ................................................................................................................ 5845
Select ................................................................................................................ 5846
CSpinEdit
......................................................................................................................... 5847
Create ................................................................................................................ 5853
OnEvent ................................................................................................................ 5854
MinValue ................................................................................................................ 5855
Max Value ................................................................................................................ 5856
Value ................................................................................................................ 5857
CreateEdit................................................................................................................ 5858
CreateInc ................................................................................................................ 5859
CreateDec ................................................................................................................ 5860
OnClickInc ................................................................................................................ 5861
OnClickDec................................................................................................................ 5862
OnChangeValue ................................................................................................................ 5863
CDialog ......................................................................................................................... 5864
Create ................................................................................................................ 5866
OnEvent ................................................................................................................ 5867
Caption ................................................................................................................ 5868
Add ................................................................................................................ 5869
CreateWhiteBorder
................................................................................................................ 5870
CreateBackground
................................................................................................................ 5871
CreateCaption ................................................................................................................ 5872
CreateButtonClose
................................................................................................................ 5873
CreateClientArea
................................................................................................................ 5874
OnClickCaption................................................................................................................ 5875
OnClickButtonClose
................................................................................................................ 5876
ClientAreaVisible
................................................................................................................ 5877
ClientAreaLeft................................................................................................................ 5878
ClientAreaTop ................................................................................................................ 5879
ClientAreaRight
................................................................................................................ 5880
ClientAreaBottom
................................................................................................................ 5881
ClientAreaWidth
................................................................................................................ 5882
ClientAreaH................................................................................................................
eight 5883
OnDialogDragStart
................................................................................................................ 5884
OnDialogDragProcess
................................................................................................................ 5885
OnDialogDragEnd
................................................................................................................ 5886
CAppDialog
......................................................................................................................... 5887
Create ................................................................................................................ 5890
Destroy ................................................................................................................ 5891
OnEvent ................................................................................................................ 5892
Run ................................................................................................................ 5893
ChartEvent................................................................................................................ 5894
Minimized ................................................................................................................ 5895
IniFileSave ................................................................................................................ 5896
IniFileLoad................................................................................................................ 5897
IniFileName................................................................................................................ 5898
IniFileEx t ................................................................................................................ 5899
CreateCommon ................................................................................................................ 5900
CreateEx pert ................................................................................................................ 5901
CreateIndicator
................................................................................................................ 5902
CreateButtonMinMa
................................................................................................................
x 5903
OnClickButtonClose
................................................................................................................ 5904
OnClickButtonMinMa
................................................................................................................
x 5905
OnAnotherApplicationClose
................................................................................................................ 5906
Rebound ................................................................................................................ 5907
Minimize ................................................................................................................ 5908
Max imize ................................................................................................................ 5909
CreateInstanceId
................................................................................................................ 5910
ProgramName ................................................................................................................ 5911
SubwinOff ................................................................................................................ 5912
34 Il passaggio dall'
.................................................................................................
MQL4 5913
35 List of MQL5 .................................................................................................
Functions 5917
36 List of MQL5 .................................................................................................
Constants 5955
Riferimento MQL5
MetaQuotes Language 5 (MQL5) è un linguaggio ad alto-livello progettato per lo sviluppo di indicatori
tecnici, robot di trading e applicazioni di utilità, che automatizzano il trading finanziario. MQL5 è
stato sviluppato da MetaQuotes per la loro piattaforma di trading. La sintassi del linguaggio è molto
vicina al C++, consentendo ai programmatori di sviluppare applicazioni nello stile di programmazione
orientata agli oggetti (OOP).
Oltre al linguaggio MQL5, il pacchetto della piattaforma di trading include anche il MetaEditor IDE con
strumenti di scrittura del codice estremamente avanzati, quali templates, snippet, debugging,
profiling e strumenti di completamento automatico, cos ì come MQL5 S torage che abilita il controllo
delle versioni dei file.
Il supporto al linguaggio è disponibile sul sito W eb MQL5.community, che contiene un numero enorme
di CodeBase gratuito e una pletora di articoli. Questi articoli coprono tutti gli aspetti del trading
moderno, tra cui reti neurali, statistiche e analisi, trading ad alta frequenza, arbitraggio, testing ed
ottimizzazione delle strategie di trading, utilizzo di robot di automazione di trading e altro ancora.
Gli sviluppatori di programmi di trading e MQL5 possono comunicare sul forum, ordinare e sviluppare
applicazioni usando il servizio Freelance, cos ì come acquistare e vendere programmi protetti nel
Mark et di applicazioni di trading automatico.
Il linguaggio MQL5 fornisce specializzate funzioni di trading e predefiniti gestori di eventi per aiutare i
programmatori a sviluppare Ex pert Advisors (EA), che controllano automaticamente i processi di
trading seguendo specifiche regole di trading. Oltre agli EA, MQL5 consente lo sviluppo personalizzato
di indicatori tecnici, script e librerie.
Questo riferimento al linguaggio MQL5 contiene funzioni, operazioni, parole riservate ed altre
costruzioni del linguaggio, suddivisi in categorie. Il riferimento fornisce anche le descrizioni delle
classi della Libreria S tandard utilizzate per lo sviluppo di strategie di trading, pannelli di controllo,
grafica personalizzata e abilitazione dell'accesso ai file.
Inoltre, il CodeBase contiene la libreria di analisi numerica A L GL IB, che può essere utilizzata per
risolvere vari problemi matematici.
A dvisor contiene gestori(handlers) di evento per gestire eventi predefiniti che attivano l'esecuzione
indicatori personalizzati possono utilizzare i valori di altri indicatori per i calcoli e possono essere
chiamati da Ex pert Advisors.
Gli indicatori personalizzati sono memorizzati in <Directory_del_Terminale>\MQL5\Indicators.
· Uno Script è un programma per una singola esecuzione di un'azione. A differenza degli Ex pert
Advisors, gli script non gestiscono alcun evento tranne per i trigger(inneschi), inizializzazione e
deinitializzazione. Un codice di script deve contenere la funzione di gestore di OnS tart. Gli script
sono memorizzati in <Directory_del_Terminale>\MQL5\Scripts.
· Servizio è un programma che, a differenza degli indicatori, degli Ex pert Advisors e degli script, non
richiede di essere associato ad un chart per funzionare. Come gli script, i servizi non gestiscono
alcun evento tranne che per l'attivazione(innesco/trigger). Per avviare un servizio, il suo codice
dovrebbe contenere la funzione dell handler OnS tart. I servizi non accettano altri eventi tranne
S tart, ma sono in grado di inviare eventi personalizzati ai charts usando EventChartCustom. I
questo caso viene usata la direttiva #include con le virgolette. Un'altra opzione è quella di
-
© 2000 2021 , MetaQuotes Ltd
MQL5 si basa sul concetto del popolare linguaggio di programmazione C++. R ispetto ad MQL 4, il nuovo
linguaggio ha ora enumerazioni, strutture, classi e event handlers. Aumentando il numero degli inclusi
tipi main, l'interazione di programmi eseguibili in MQL5 con altre applicazioni attraverso le dll è ora il
più semplice possibile. La sintassi MQL5 è simile alla sintassi del C++, e questo lo rende facile tradurlo
in programmi informatici da moderni linguaggi di programmazione.
Per aiutarvi a studiare il linguaggio MQL5, tutti gli argomenti sono raggruppati nelle seguenti sezioni:
· S intassi
· T ipi di Dati
· Operazioni ed Espressioni
· Operatori
· F unzioni
· V ariabili
· Preprocessore
· N amespaces
Sintassi
Per quanto riguarda la sintassi, il linguaggio MQL5 per la progrmamazione di strategie di trading, è
molto simile al linguaggio di programmazione C++ , fatta eccezione per alcune caratteristiche:
Vedi anche
Enumerazioni, S trutture e Classi, Eredità
Commenti
I commenti multi-riga iniziano con la coppia di simboli /* e termina con */ questa. T ali tipi di
commenti non possono essere nidificati. Commenti a riga singola iniziano con la coppia di simboli // e
termina con il carattere di nuova riga, essi possono essere annidati in altri commenti su più righe. I
commenti sono consentiti ovunque dove gli spazi siano consentiti, e possono avere qualsiasi numero
di spazi tra loro.
Esempi:
//--- Commento a riga-singola
/* Commento-
Multi- // riga singola di commento, annidata
riga
*/
Identificatori
Gli identificatori vengono usati come nomi di variabili e funzioni. La lunghezza dell'identificatore non
può superare 63 caratteri.
Icaratteri consentiti da scrivere in un identificatore: cifre 0-9, lettere latine maiuscole e minuscole a-
z ed A-Z, riconosciute come diversi caratteri, il carattere di sottolineatura (_). Il primo carattere non
può essere un numero.
Esempi:
NAME1 namel Total_5 Paper
Vedi anche
Variabili, Funzioni
Parole riservate
I seguenti identificatori sono registrati come parole riservate, ciascuno di essi corrisponde ad una
certa azione, e non può essere utilizzato in un altro significato:
Tipi di Dati
double struct
enum uchar
Specificatori di accesso
delete protected
override public
Classi di memoria
Operatori
default if sizeof
do offsetof w hile
Altro
Tipi di Dati
Qualsiasi programma opera con i dati. I dati possono essere di tipi diversi a seconda dei loro fini. Ad
esempio, i dati integer(_*interi) vengono utilizzati per accedere ai componenti degli array. I dati sui
prezzi appartengono a quelli di doppia precisione con virgola mobile. Ciò è dovuto al fatto che nessun
particolare tipo di dati per dati sui prezzi, è fornito in MQL5.
I dati di differenti tipi sono trattati con tassi differenti. I dati integer vengono elaborati come i più
veloci. Per elaborare i dati a doppia precisione, una speciale co-processore viene utilizzato. H owever,
because of complex ity of internal representation of data with floating point, they are processed slower
than the integer ones.
Dati stringa vengono elaborati in modo più lungo presso a causa dell' allocazione/riallocazione
dinamica della memoria del computer.
· logici (bool);
· letterali (ushort);
· stringa (string);
· colori (color);
· enumerazioni (enum).
· strutture;
· classi.
I n termini di OOP i tipi di dati complessi sono chiamati tipi di dati astratti.
I tipi color e datetime hanno senso solo per facilitare la visualizzazione e l'input dei parametri definiti
dal di fuori - dalla tabella di Ex pert Advisor o delle proprietà degli indicatori personalizzati (la scheda
I nputs). I dati color e datetime vengono rappresentati come interi. I tipi interi ed in virgola-mobile
Vengono usati solo i type casting impliciti nelle espressioni, a meno che non viene specificato il
casting esplicito.
Vedi anche
Ty pecasting
Tipi Integer
In MQL5 gli interi sono rappresentati da undici tipi. Alcuni tipi possono essere usati insieme ad altri,
se richiesto dalla logica del programma, ma in questo caso è necessario ricordare le regole di
conversione di tipo.
La tabella seguente elenca le caratteristiche di ogni tipo. Inoltre, l'ultima colonna mostra il tipo in C++
corrispondente a ciascun tipo.
Valori di tipo intero possono essere presentati come costanti numeriche, letterali di colore, letterali
data-ora, caratteri costanti ed enumerazioni.
Vedi anche
Conversione Dati, Costanti dei T ipi Numerici
uchar
Il tipo intero uchar occupa anche 1 byte di memoria, cos ì come il tipo char, ma a differenza da esso,
uchar è designato solo per i valori positivi. Il valore minimo è zero, il valore massimo è 255. La prima
lettera u del nome del tipo uchar è l'abbreviazione di unsigned.
short
La dimensione del tipo short è 2 byte (16 bit) e, di conseguenza, consente di esprimere l'intervallo di
valori pari a 2 alla potenza di16: 2^16=65 536. S iccome il tipo short è con il segno, e contiene i valori
sia positivi che negativi, l'intervallo di valori è compreso tra -32 768 e 32 767.
ushort
I l tipo short senza segno, è il tipo ushort, che anche, ha una dimensione di 2 byte. Il valore minimo è
0 , il valore massimo è 65 535.
int
La dimensione del tipo int è di 4 byte (32 bit). Il valore minimo è di -2 147 483 648 , quello massimo è
di 2 147 483 647.
uint
I l tipo intero senza segno è uint. Ci vogliono 4 byte di memoria e consente di esprimere interi da 0 a 4
294 967 29 5.
long
La grandezza del tipo long è di 8 byte (64 bit). Il valore minimo è -9 5
223 372 036 8 4 77 5 808 , il valore
massimo è di 9 223 372 036 854 775 807.
ulong
I l tipo ulong anche, occupa 8 byte e può memorizzare i valori da 0 a 18 446 744 073 709 551 61 5.
Esempi:
char ch=12;
short sh=-5000;
int in=2445777;
Poiché i tipi interi senza segno non sono designati per memorizzare i valori negativi, il tentativo di
impostare un valore negativo può portare a conseguenze inaspettate. Un tale semplice script porterà
ad un ciclo infinito:
for(char ch=-128;ch<128;ch++)
{
u_ch=ch;
Print("ch = ",ch," u_ch = ",u_ch);
}
}
La variante corretta è:
for(char ch=-128;ch<=127;ch++)
{
u_ch=ch;
Print("ch = ",ch," u_ch = ",u_ch);
if(ch==127) break;
}
}
Risultato:
ch= -128 u_ch= 128
ch= -127 u_ch= 129
ch= -126 u_ch= 130
ch= -125 u_ch= 131
ch= -124 u_ch= 132
ch= -123 u_ch= 133
ch= -122 u_ch= 134
ch= -121 u_ch= 135
ch= -120 u_ch= 136
ch= -119 u_ch= 137
ch= -118 u_ch= 138
ch= -117 u_ch= 139
ch= -116 u_ch= 140
ch= -115 u_ch= 141
ch= -114 u_ch= 142
ch= -113 u_ch= 143
ch= -112 u_ch= 144
Esempi:
//--- Valori negativi non possono essere memorizzati in tipi senza segno
uchar u_ch=-120;
ushort u_sh=-5000;
uint u_in=-401280;
Esadecimale: numeri 0-9, le lettere a-f o A-F per i valori di - 5, iniziano con 0x o 0X.
10 1
Esempi:
0x0A, 0x12, 0X12, 0x2f, 0xA3, 0Xa3, 0X7C7
Per le variabili intere, i valori possono essere impostati in forma binaria utilizzando il prefisso B. Ad
esempio, è possibile codificare le ore di lavoro di una sessione di trading in variabile di tipo int ed
utilizzare le informazioni su di esse secondo l'algoritmo richiesto:
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- imposta 1 per le ore di lavoro e 0 per quelle non lavorative
int AsianSession =B'111111111'; // Sessione Asiatica da 00:00 alle 9:00
int EuropeanSession=B'111111111000000000'; // Sessione Europea 9:00 - 18:00
int AmericanSession =B'111111110000000000000011'; // Sessione Americana 16:00 - 02:00
//--- derive numerical values of the sessions
PrintFormat("Ore della sessione Asiatica come valore =%d",AsianSession);
PrintFormat("Ore della sessione Europea come valore è %d",EuropeanSession);
PrintFormat("Ore della sessione Americana come valore è %d %d",AmericanSession);
//--- e ora visualizziamo le rappresentazioni stringa delle ore di lavoro delle sessioni '
Print("Sessione Asiatica ",GetHoursForSession(AsianSession));
Print("Sessione Europea ",GetHoursForSession(EuropeanSession));
Print("Sessione Americana ",GetHoursForSession(AmericanSession));
//---
}
//+--------------------------------------------------------------------------------+
//| restituisce le ore di lavoro della sessione come stringa |
//+--------------------------------------------------------------------------------+
string GetHoursForSession(int session)
{
//--- al fine di verificare, usale l'orperazione bit AND e slittamenti sinistro di 1 bit <<=1
//--- avviare il controllo dal bit più basso
int bit=1;
string out="ore lavorative: ";
//--- controlla tutti i 24 bit a partire da quello zero e fino a 23, inclusivamente
for(int i=0;i<24;i++)
{
Vedi anche
Typecasting
Costanti Carattere
Icaratteri come elementi di un stringa in MQL5 sono indici nel set di caratteri Unicode. S ono valori
esadecimali che possono essere espressi in numeri interi, e che possono essere manipolati da
operazioni integer come addizione e sottrazione.
Qualsiasi carattere singolo tra virgolette o un codice esadecimale AS CII di un carattere '\x10' è un
carattere costante ed è di tipo ushort. Ad esempio, un record di tipo '0' è un valore numerico 30, che
corrisponde all'indice di zero nella tabella di caratteri.
Esempio:
voidOnStart()
{
//--- definizione delle costanti carattere
int symbol_0='0';
int symbol_9=symbol_0+9; // ottengo simbolo '9'
//--- valori output delle costanti
printf("In a decimal form: symbol_0 = %d, symbol_9 = %d",symbol_0,symbol_9);
printf("In a hexadecimal form: symbol_0 = 0x%x, symbol_9 = 0x%x",symbol_0,symbol_9);
//--- inserire costanti in una stringa
string test="";
StringSetCharacter(test,0,symbol_0);
StringSetCharacter(test,1,symbol_9);
//--- questo è ciò che sembrano in una stringa
Print(test);
}
Il back slash è un carattere di controllo per il compilatore quando si tratta di stringhe costanti e le
costanti di caratteri nel testo sorgente di un programma. Alcuni simboli, per esempio un singolo apice
('), i doppi apici (" ), back slash (\) e caratteri di controllo possono essere rappresentati come una
combinazione di simboli che iniziano con un back slash (\), secondo la seguente tabella:
feed)
orizzontale
doppio
a 65535
Se il back slash è seguito da un carattere diverso da uelli sopra descritti, il risultato risultato è
q
indefinito.
Esempio
voidOnStart()
{
//--- dichiarazione delle costanti carattere
int a='A';
int b='$';
int c='©'; // codice 0xA9
int d='\xAE'; // codice per il simbolo ®
//--- print output delle costanti
Print(a,b,c,d);
//--- aggiungere un carattere alla stringa
string test="";
StringSetCharacter(test,0,a);
Print(test);
//--- sostituire un carattere in una stringa
StringSetCharacter(test,0,b);
Print(test);
//--- sostituire un carattere in una stringa
StringSetCharacter(test,0,c);
Print(test);
//--- sostituire un carattere in una stringa
StringSetCharacter(test,0,d);
Print(test);
//--- rappresentare i caratteri come un numero
int a1=65;
int b1=36;
int c1=169;
int d1=174;
//--- aggiungere un carattere alla stringa
StringSetCharacter(test,1,a1);
Print(test);
//--- aggiungere un carattere alla stringa
StringSetCharacter(test,1,b1);
Print(test);
//--- aggiungere un carattere alla stringa
StringSetCharacter(test,1,c1);
Print(test);
//--- aggiungere un carattere alla stringa
StringSetCharacter(test,1,d1);
Print(test);
}
Come è stato menzionato sopra, il valore di una costante (o variabile) carattere è un indice nella
tabella dei caratteri. L ' indice essendo un intero, esso può essere scritto in modi diversi.
voidOnStart()
{
//---
int a=0xAE; // il codice di ® corrisponde al letterale '\xAE'
int b=0x24; // il codice di $ corrisponde al letterale '\x24'
int c=0xA9; // il codice di © corrisponde al letterale '\xA9'
int d=0x263A; // il codice di ☺ corrisponde al letterale '\x263A'
//--- mostra valori
Print(a,b,c,d);
//--- aggiungere un carattere alla stringa
string test="";
StringSetCharacter(test,0,a);
Print(test);
//--- sostituire un carattere in una stringa
StringSetCharacter(test,0,b);
Print(test);
//--- sostituire un carattere in una stringa
StringSetCharacter(test,0,c);
Print(test);
//--- sostituire un carattere in una stringa
StringSetCharacter(test,0,d);
Print(test);
//--- codici di suits
int a1=0x2660;
int b1=0x2661;
int c1=0x2662;
int d1=0x2663;
//--- aggiungere il carattere di picche
StringSetCharacter(test,1,a1);
Print(test);
//--- aggiungere il carattere di cuori
StringSetCharacter(test,2,b1);
Print(test);
//--- aggiungere il carattere di quadri
StringSetCharacter(test,3,c1);
Print(test);
//--- aggiungere il carattere di bastoni
StringSetCharacter(test,4,d1);
Print(test);
//--- esempio di letterali carattere in una stringa
test="Regina\x2660Ace\x2662";
printf("%s",test);
}
Vedi anche
S tring S etCharacter(), S tring GetCharacter(), S hortT oS tring(), S hortArrayT oS tring(),
S tring T oS hortA rray()
Tipo Datetime
Il tipo datetime è destinato a memorizzare la data e l'ora come il numero di secondi trascorsi dal 01
Costanti di data e ora possono essere rappresentate come una stringa letterale, che consiste in 6 parti
che mostrano il valore numerico dell 'anno, mese, giorno (o giorno, mese, anno), ore, minuti e
secondi. La costante è racchiusa tra virgolette singole e inizia con il carattere D.
I valori vanno dal 1 ° gennaio 1970 al 31 dicembre 3000. S ia data (anno, mese, giorno) che orario
(ore, minuti, secondi), o tutti insieme possono essere omessi.
Con la specificazione della data letterale, è desiderabile che si specifichi l'anno, mese e giorno.
A ltrimenti il compilatore restituisce un avviso su una voce incompleta.
Esempi:
datetime NY=D'2015.01.01 00:00'; // Orario dell'inizio dell'anno 2015
datetime d1=D'1980.07.19 12:30:27'; // Anno Mese Giorno Ore Minuti Secondi
datetime d2=D'19.07.1980 12:30:27'; // Equivale a D'1980.07.19 12:30:27';
datetime d3=D'19.07.1980 12'; // Equivale a D'1980.07.19 12:00:00'
datetime d4=D'01.01.2004'; // Equivale aD'01.01.2004 00:00:00'
datetime compilation_date=__DATE__; // Data di compilazione
datetime compilation_date_time=__DATETIME__; // Data ed orario di compilazione
datetime compilation_time=__DATETIME__-__DATE__;// Orario di compilazione
//--- Examples of declarations after which compiler warnings will be returned
datetime warning1=D'12:30:27'; // Equivale a D'[data di compilazione] 12:30:27'
datetime warning2=D''; // Equivale a __DATETIME__
Vedi anche
S truttura del tipo Data, Data ed Ora, T imeT oS tring, S tring T oT ime
Color Type
l tipo colore è stato progettato per la memorizzazione delle informazioni sul colore ed occupa
I 4 byte in
memoria. Il primo byte viene ignorato, i restanti 3 byte contengono i-componenti RGB.
Costanti di colore possono essere rappresentate in tre modi: letteralmente, da numeri interi, o per
nome (per i colori nominati W eb-colori solamente).
La rappresentazione letterale è composta da tre parti che rappresentano i valori dei tassi numerici dei
tre principali componenti di colore: rosso, verde, blu. La costante inizia con C ed è racchiusa tra apici.
I tassi dei valori numerici di una componente di colore giacciono nell'intervallo da 0 a 255.
Esempi:
//--- Letterali
C'128,128,128' // Grigio
C'0x00,0x00,0xFF' // Blu
//nomi dei colori
clrRed // rosso
clrYellow // giallo
clrBlack // nero
//--- Rappresentazioni integrali
0xFFFFFF // Bianco
16777215 // Bianco
0x008000 // Verde
32768 // Verde
Vedi anche
W eb Colors,ColorT oS tring, S tring T oColor, pecasting
Ty
Tipo Bool
Il tipo bool è designato per memorizzare i valori logici true o false, la rappresentazione numerica di
essi è 1 o 0, rispettivamente.
Esempi:
bool a = true;
bool b = false;
bool c = 1;
La rappresentazione interna è un numero intero largo 1 byte. Va notato che nelle espressioni logiche è
possibile utilizzare altro numero intero o tipi reali o espressioni di questi tipi - il compilatore non
genererà alcun errore. In questo caso, il valore zero viene interpretato come false, e tutti gli altri
valori - come true.
Esempi:
int i=5;
double d=-2.5;
if(i) Print("i = ",i," ed è impostato a true");
else Print("i = ",i," ed è impostato a false");
i=0;
if(i) Print("i = ",i," ed ha il valore true");
else Print("i = ",i," ed ha il valore false");
d=0.0;
if(d) Print("d = ",d," ed ha il valore true");
else Print("d = ",d," ed ha il valore false");
Vedi anche
Operazioni Booleane, Precedenza R egole
Enumerazioni
Dati del tipo enum appartengono ad un certo insieme limitato di dati. D efinizione del tipo di
enumerazione:
Esempio:
enum mese// enumerazione di costanti denominate
{
Gennaio,
Febbraio,
Marzo,
Aprile,
Maggio,
Giugno,
Luglio,
Agosto,
Settembre,
Ottobre,
Novembre,
Dicembre
};
Regola: Se un certo valore non è assegnato ad una costante nominata che è un membro
dell'enumerazione, il nuovo valore viene formato automaticamente. S e è il primo membro
dell'enumerazione, ad esso verrà assegnato il valore 0. Per tutti i membri successivi, i valori vengono
calcolati sulla base del valore dei componenti precedenti aggiungendo uno.
Esempio:
enum intervals // Enumerazione delle costanti nominate
{
month=1, // Intervallo di un mese
two_months, // Due mesi
quarter, // Tre mesi - un quarto di anno
halfyear=6, // Mezzo anno
year=12, // Anno - 12 mesi
};
Note
· A differenza di C++, la grandezza della rappresentazione interna del tipo enumerato in MQL5 è
sempre uguale a 4 byte. Che è, sizeof (months) restituisce il valore 4.
· A differenza del C++, un' enumerazione anonima non può essere dichiarata in MQL5. Vale a dire, un
nome univoco deve essere sempre specificato dopo la parola chiave enum.
Vedi anche
Ty pecasting
double 8 . 5 5 5
2 22 0738 8 07 .
1 797693134862 double
2014 e-308 31 8 5 e+308
Il nome double significa che la precisione di questi numeri è due volte l'accuratezza del tipo di
numerifloat. Nella maggior parte dei casi, il tipo double è il più conveniente. In molti casi la precisione
limitata dei numeri float non è sufficiente. Il motivo per cui il tipo float è ancora usato, è per salvare
la memoria (questo è importante per grandi array di numeri reali).
Costanti in floating-point consistono di una parte intera, un punto (.) e la parte frazionaria. Le parti
intera e frazionaria sono sequenze di cifre decimali.
Esempi:
double a=12.111;
double b=-956.1007;
float c =0.0001;
float d =16;
C'è un modo scientifico di scrivere costanti reali, spesso questo metodo di registrazione è più
compatto di quello tradizionale.
Esempio:
double c1=1.12123515e-25;
double c2=0.000000000000000000000000112123515; // 24 zero dopo il punto decimale
Print("1. c1 =",DoubleToString(c1,16));
// Result: 1. c1 = 0.0000000000000000
Print("2. c1 =",DoubleToString(c1,-16));
// Result: 2. c1 = 1.1212351499999999e-025
Print("3. c2 =",DoubleToString(c2,-16));
// Result: 3. c2 = 1.1212351499999999e-025
Va ricordato che i numeri reali sono memorizzati nella memoria con una certa precisione limitata nel
sistema binario, mentre generalmente viene utilizzata la notazione decimale . Ecco perché molti
numeri che sono appunto rappresentati nel sistema decimale possono essere scritti solo come una
frazione infinita nel sistema binario.
Per esempio, i numeri 0,3 e 0,7 sono rappresentati nel computer come frazioni infinite, mentre il
numero di 0,25 è memorizzato esattamente cos ì, perché rappresenta la potenza di due.
A questo proposito, si raccomanda di non confrontare due numeri reali per l'uguaglianza, in quanto tale
confronto non è corretto.
Esempio:
voidOnStart()
{
//---
double three=3.0;
double x,y,z;
x=1/three;
y=4/three;
z=5/three;
if(x+y==z)
Print("1/3 + 4/3 == 5/3");
else
Print("1/3 + 4/3 != 5/3");
// Risultato: 1/3 + 4/3 != 5/3
}
Se si ha ancora bisogno di confrontare l'uguaglianza di due numeri reali, allora si può fare in due modi
diversi. Il primo modo consiste nel confrontare la differenza tra due numeri con qualche piccola
quantità che specifica la precisione del confronto.
Esempio:
bool EqualDoubles(double d1,double d2,double epsilon)
{
if(epsilon<0)
epsilon=-epsilon;
//---
if(d1-d2>epsilon)
return false;
if(d1-d2<-epsilon)
return false;
//---
return true;
}
voidOnStart()
{
double d_val=0.7;
float f_val=0.7;
if(EqualDoubles(d_val,f_val,0.000000000000001))
Print(d_val," equals ",f_val);
else
Print("Different: d_val = ",DoubleToString(d_val,16)," f_val = ",DoubleToString(f_val,16));
// Risultato: Different: d_val= 0.7000000000000000 f_val= 0.6999999880790710
}
Osservato che il valore di epsilon nell'esempio precedente non può essere inferiore alla costante
predefinita DBL _EPS ILON. Il valore di questa costante è 2.2204460492503131e-016. La corrispondente
costante per il tipo float è FL T_EPS ILON = 1.192092896e-07. Il significato di questi valori è il
seguente: è il valore più basso che soddisfa la condizione 1.0 + DBL _EPS ILON! = 1.0 (per numeri di tipo
float 1.0 + FL T_EPS ILON! = 1.0).
Il secondo modo offre il confronto della differenza normalizzata di due numeri reali con zero. Non ha
senso confrontare la differenza di numeri normalizzati con uno zero, perché qualsiasi operazione
matematica con i numeri normalizzati da un risultato non-normalizzato.
Esempio:
bool CompareDoubles(double number1,double number2)
{
if(NormalizeDouble(number1-number2,8)==0)
return(true);
else
return(false);
}
voidOnStart()
{
double d_val=0.3;
float f_val=0.3;
if(CompareDoubles(d_val,f_val))
Print(d_val," equals ",f_val);
else
Print("Different: d_val = ",DoubleToString(d_val,16)," f_val = ",DoubleToString(f_val,16));
// Result: Different: d_val= 0.3000000000000000 f_val= 0.3000000119209290
}
A lcune operazioni del co-processore matematico possono provocare il numero reale valido, che non può
essere utilizzato in operazioni matematiche e operazioni di confronto, poiché il risultato di operazioni
con numeri reali non validi è indefinito. Per esempio, quando si cerca di calcolare l' arcoseno di 2, il
risultato è l'infinito negativo.
Esempio:
double abnormal = MathArcsin(2.0);
Print("MathArcsin(2.0) =",abnormal);
// Risultato: MathArcsin(2.0) = -1.#IND
Oltre al meno infinito c'è il più infinito e NaN (not a number). Per determinare che questo numero non
è valido, è possibile utilizzare MathIs ValidNumber(). S econdo lo standard IEEE, hanno una particolare
rappresentazione macchina. Per esempio, più infinito per il tipo double ha la rappresentanza bit di
0x7FF0 0000 0000 0000.
Esempi:
struct str1
{
double d;
};
struct str2
{
long l;
};
//--- Start
str1 s1;
str2 s2;
//---
s1.d=MathArcsin(2.0); // Ottiene il numero non valido -1.#IND
s2=s1;
printf("1. %f %I64X",s1.d,s2.l);
//---
s2.l=0xFFFF000000000000; // numero non valido -1.#QNAN
s1=s2;
printf("2. %f %I64X",s1.d,s2.l);
//---
s2.l=0x7FF7000000000000; // il più grande non-numero SNaN
s1=s2;
printf("3. %f %I64X",s1.d,s2.l);
//---
s2.l=0x7FF8000000000000; // il più piccolo non-numero QNaN
s1=s2;
printf("4. %f %I64X",s1.d,s2.l);
//---
s2.l=0x7FFF000000000000; // il più grande non-numero QNaN
s1=s2;
printf("5. %f %I64X",s1.d,s2.l);
//---
s2.l=0x7FF0000000000000; // Infinito positivo 1.#INF ed il più piccolo non numero SNaN
s1=s2;
printf("6. %f %I64X",s1.d,s2.l);
//---
s2.l=0xFFF0000000000000; // Infinito negativo -1.#INF
s1=s2;
printf("7. %f %I64X",s1.d,s2.l);
//---
s2.l=0x8000000000000000; // Zero negativo -0.0
s1=s2;
printf("8. %f %I64X",s1.d,s2.l);
//---
s2.l=0x3FE0000000000000; // 0.5
s1=s2;
printf("9. %f %I64X",s1.d,s2.l);
//---
s2.l=0x3FF0000000000000; // 1.0
s1=s2;
printf("10. %f %I64X",s1.d,s2.l);
//---
Vedi anche
D oubleT oS tring, NormalizeDouble, Costanti dei T ipi Numerici
Tipo Stringa
Il tipo stringa viene utilizzato per la memorizzazione di stringhe di testo. Una stringa di testo è una
sequenza di caratteri in formato Unicode con lo zero finale al termine di essa. Una costante stringa
può essere assegnata ad una variabile stringa. Una costante stringa è una sequenza di caratteri
Unicode racchiuse tra virgolette: " Questa è una costante stringa" .
Se è necessario includere le virgolette (" ) in una stringa, il carattere di back slash (\) deve essere
messo prima. Qualsiasi speciali costanti carattere possono essere scritte in una stringa, se il carattere
di back slash (\) viene digitato prima di esse.
Esempi:
string svar="Questo è un carattere stringa";
string svar2=StringSubstr(svar,0,4);
Print("Simbolo del Copyright\t\x00A9");
FileWrite(handle,"Questa stringa contiene il simbolo di nuova riga \n");
string MT5path="C:\\Program Files\\MetaTrader 5";
Per rendere il codice sorgente leggibile, lunghe costanti stringa possono essere suddivise in parti
senza operazione di addizione. Durante la compilazione, queste parti verranno combinate in una
stringa long :
Vedi anche
F unzioni di Conversione, Funzioni di S tringa,FileOpen, FileR eadS tring, FileW riteS tring
Dichiarazione Struttura
I l tipo di dati struttura è determinato dalla seguente descrizione:
struct structure_name
{
elements_description
};
Il nome struttura non può essere usato come un identificatore (nome di una variabile o funzione). Va
notato che in MQL5 elementi strutturali si susseguono direttamente, senza allineamento. In C++ un
tale ordine è fatto per il compilatore utilizzando la seguente istruzione:
#pragma pack(1)
Se si vuole fare un altro allineamento nella struttura, utilizzare i membri ausiliari, " fillers " per la giusta
dimensione.
Esempio:
struct trade_settings
{
uchar slippage; // valore grandezza-slippage permissibile 1 byte
char reserved1; // salta 1 byte
short reserved2; // salta 2 bytes
int reserved4; // altri 4 bytes vengono saltati. garantisce l'allineamento del bordo 8 byt
double take; // valore del prezzo del fissaggio del profitto
double stop; // valore del prezzo dello stop protettivo
};
Tale descrizione delle strutture allineate è necessaria solo per il trasferimento di funzioni importate
dll.
Attenzione: Questo esempio illustra dati non correttamente designati. S arebbe meglio prima
dichiarare take e stop dati di grandi dimensioni del tipo double, e quindi dichiarare lo slippagemembro
del tipo uchar. In questo caso, la rappresentazione interna dei dati sarà sempre la stessa
indipendentemente dal valore specificato in #pragma pack().
Se una struttura contiene variabili di tipo string e/o oggetto di un array dinamico, il compilatore
assegna un costruttore implicito a tale struttura. Questo costruttore resetta tutti i membri della
struttura di tipo string ed inizializza correttamente oggetti della matrice dinamica.
Strutture Semplici
Le strutture che non contengono stringhe, oggetti delle classi, puntatori ed oggetti di array dinamici
sono chiamate S trutture S emplici. Le variabili di strutture semplici e le loro array possono essere
passate come parametri alle funzioni importate da DLL.
Per fornire un esempio, sviluppiamo la struttura personalizzata CustomM qlT ick con il suo contenuto
identico a quella built-in M qlT ick . Il compilatore non consente di copiare il valore dell'oggetto M qlT ick
nell'oggetto di tipo CustomM qlT ick . Typecasting diretto al tipo necessario provoca anche l'errore di
compilazione:
//--- fare il typecasting di strutture di tipi differenti l'un l'altra è vietato anche
my_tick1=(CustomMqlTick)last_tick;// il compilatore restituisce un errore qui
Pertanto, resta una sola opzione – la copia dei valori degli elementi della struttura uno ad uno. È
comunque permesso copiare i valori dello stesso tipo di CustomM qlT ick .
CustomMqlTick my_tick1,my_tick2;
//--- è consentito copiare gli oggetti dello stesso tipo di CustomMqlTick nel seguente modo
my_tick2=my_tick1;
//--- creare un array dagli oggetti della struttura semplice CustomMqlTick e scrivere valori
CustomMqlTick arr[2];
arr[0]=my_tick1;
arr[1]=my_tick2;
La funzione ArrayPrint() è chiamata per un controllo per visualizzare la funzione arr[] valore array nel
journal.
//+------------------------------------------------------------------+
//| Funzione start programma Script |
//+------------------------------------------------------------------+
void OnStart()
{
// --- sviluppa la struttura simile al built-in MqlTick
struct CustomMqlTick
{
datetime time; // Ora di aggiornamento del prezzo Last
double bid; // Prezzo Bid corrente
double ask; // Prezzo Ask corrente
double last; // Prezzo corrente dell'ultimo trade (Last)
ulong volume; // Volume per il corrente prezzo Last
long time_msc; // Tempo di aggiornamento del prezzo Last in millisecondi
uint flags; // Tick flags
};
//--- ottiene l'ultimo valore tick
MqlTick last_tick;
CustomMqlTick my_tick1,my_tick2;
//--- tentativo di copiare dati da MqlTick a CustomMqlTick
if(SymbolInfoTick(Symbol(),last_tick))
{
//--- la copia di strutture semplici non correlate è vietata
//1. my_tick1=last_tick; // il compilatore restituisce un errore qui
//--- è consentito copiare gli oggetti dello stesso tipo di CustomMqlTick nel seguente modo
my_tick2=my_tick1;
//--- creare un array dagli oggetti della struttura semplice CustomMqlTick e scrivere valori
CustomMqlTick arr[2];
arr[0]=my_tick1;
arr[1]=my_tick2;
ArrayPrint(arr);
/ --- esempio di visualizzazione dei valori dell'array contenente gli oggetti del tipo CustomMqlTic
/*
[time] [bid] [ask] [last] [volume] [time_msc] [flags]
[0] 2017.05.29 15:04:37 1.11854 1.11863 +0.00000 1450000 1496070277157 2
[1] 2017.05.29 15:04:37 1.11854 1.11863 +0.00000 1450000 1496070277157 2
*/
}
else
Print("SymbolInfoTick() failed, error = ",GetLastError());
}
Il secondo esempio mostra le caratteristiche della copia di strutture semplici dalla discendenza.
S upponiamo di avere la struttura base A nimal, da cui derivano le strutture Cat e Dog. Possiamo
copiare gli oggetti Animal e Cat, cos ì come gli oggetti Animal e Dog, ma non possiamo copiare Cat e
Dog a vicenda, anche se entrambi sono discendenti della struttura A nimal.
some_animal.run=true;
//--- crea oggetti di tipo figlio
Dog dog;
Cat cat;
//--- può essere copiato da antenato a discendente (Animal ==> Dog)
dog=some_animal;
dog.swim=true; // i cani possono nuotare
//--- non è possibile copiare oggetti di strutture figlie (Dog != Cat)
//cat=dog; // il compilatore restituisce errore qui
//--- è pertanto possibile copiare gli elementi uno per uno, solamente
cat.head=dog.head;
cat.legs=dog.legs;
cat.wings=dog.wings;
cat.tail=dog.tail;
cat.fly=dog.fly;
cat.swim=false; // cats cannot swim
//--- è possibile copiare i valori dal discendente all'antenato
Animal elephant;
elephant=cat;
elephant.run=false;// gli elefanti non possono correre
elephant.swim=true;// gli elefanti possono nuotare
//--- crea un array
Animal animals[4];
animals[0]=some_animal;
animals[1]=dog;
animals[2]=cat;
animals[3]=elephant;
//--- stampare
ArrayPrint(animals);
//--- risultato dell' esecuzione
/*
[head] [legs] [wings] [tail] [fly] [swim] [run]
[0] 1 4 0 true false false true
[1] 1 4 0 true false true true
[2] 1 4 0 true false false false
[3] 1 4 0 true false true false
*/
}
Un altro modo per copiare i tipi semplici è l'utilizzo dell' unione. G li oggetti delle strutture dovrebbero
essere membri della stessa unione - vedere l'esempio in union.
Esempio:
struct trade_settings
{
double take; // valori della fissazione dei prezzi profitto
double stop; // valore del prezzo di stop protettivo
uchar slippage; // valore dello scostamento accettabile
};
//--- creare ed inizializza una variabile di tipo trade_settings
trade_settings my_set={0.0,0.0,5};
if (input_TP>0) my_set.take=input_TP;
pack([n])
Esempio:
struct pack(sizeof(long)) MyStruct
{
// i membri della struttura devono essere allineati al limite di 8 byte
};
or
struct MyStruct pack(sizeof(long))
{
// i membri della struttura devono essere allineati al limite di 8 byte
};
pack (1)' è applicato di default per le strutture. Ciò significa che i membri della struttura si trovano
'
uno dopo l'altro in memoria e la dimensione della struttura è uguale alla somma della dimensione dei
membri.
Esempio:
//+------------------------------------------------------------------+
// | Funzione Start del programma di Script |
//+------------------------------------------------------------------+
void OnStart()
{
//--- struttura semplice senza allineamento
struct Simple_Structure
{
char c; // sizeof(char)=1
short s; // sizeof(short)=2
int i; // sizeof(int)=4
double d; // sizeof(double)=8
};
//--- dichiara una semplice istanza di struttura
Simple_Structure s;
//--- mostra la dimensione di ogni membro della struttura
Print("sizeof(s.c)=",sizeof(s.c));
Print("sizeof(s.s)=",sizeof(s.s));
Print("sizeof(s.i)=",sizeof(s.i));
Print("sizeof(s.d)=",sizeof(s.d));
//--- assicurati che la dimensione della struttura POD sia uguale alla somma della dimensione dei s
Print("sizeof(simple_structure)=",sizeof(simple_structure));
/*
Result:
sizeof(s.c)=1
sizeof(s.s)=2
sizeof(s.i)=4
sizeof(s.d)=8
sizeof(simple_structure)=15
*/
}
L 'allineamento dei campi della struttura può essere necessario quando si scambiano dati con librerie di
terze parti (*.DLL) in cui viene applicato tale allineamento.
Usiamo alcuni esempi per mostrare come funziona l'allineamento. A pplicheremo una struttura
composta da quattro membri senza allineamento.
I campi della struttura devono essere collocati in memoria uno dopo l'altro in base all'ordine di
dichiarazione e dimensione del tipo. La dimensione della struttura è 15, mentre un offset rispetto ai
campi della struttura negli array non è definito.
//+------------------------------------------------------------------+
// | Funzione Start del programma di Script |
//+------------------------------------------------------------------+
void OnStart()
{
La dimensione della struttura è cambiata in modo che tutti i membri di 4 byte e più abbiano un offset
dall'inizio della struttura multipla di 4 byte. I membri più piccoli devono essere allineati al loro limite di
dimensione (ad esempio, 2 per " short" ). Ecco come appare (il byte aggiunto è mostrato in grigio).
In questo caso, 1 byte viene aggiunto dopo il sc membro, in modo che il campo s.s (sizeof (short)==2)
ha il limite di 2 byte (allineamento per il tipo 'short').
Anche l'offset all'inizio della struttura nell'array è allineato al limite di 4 byte, ovvero gli indirizzi degli
elementi a [0], a[1] ed a[n] devono essere multipli di 4 byte per S imple_S tructure arr[].
Consideriamo altre due strutture costituite da tipi simili con un allineamento di 4 byte ma un ordine di
membro diverso. Nella prima struttura, i membri si trovano nell'ordine crescente della dimensione del
tipo.
//+------------------------------------------------------------------+
// | Funzione Start del programma di Script |
//+------------------------------------------------------------------+
void OnStart()
{
//--- semplice struttura allineata al limite di 4 byte
struct CharShortInt pack(4)
{
char c; // sizeof(char)=1
short s; // sizeof(short)=2
int i; // sizeof(double)=4
};
//--- dichiara una semplice istanza di struttura
CharShortInt ch_sh_in;
//--- mostra la dimensione di ogni membro della struttura
Print("sizeof(ch_sh_in.c)=",sizeof(ch_sh_in.c));
Print("sizeof(ch_sh_in.s)=",sizeof(ch_sh_in.s));
Print("sizeof(ch_sh_in.i)=",sizeof(ch_sh_in.i));
//--- assicurati che la dimensione della struttura POD sia uguale alla somma della dimensione dei s
Print("sizeof(CharShortInt)=",sizeof(CharShortInt));
/*
Result:
sizeof(ch_sh_in.c)=1
sizeof(ch_sh_in.s)=2
sizeof(ch_sh_in.i)=4
sizeof(CharShortInt)=8
*/
}
Come possiamo vedere, la dimensione della struttura è 8 e consiste dei due blocchi da 4 byte. Il primo
blocco contiene i campi con i tipi " char" e " short" , mentre il secondo contiene il campo con il tipo 'int'.
Ora trasformiamo la prima struttura nella seconda, che differisce solo nell'ordine dei campi, spostando
il membro di tipo 'short' alla fine.
//+------------------------------------------------------------------+
// | Funzione Start del programma di Script |
//+------------------------------------------------------------------+
void OnStart()
{
//--- semplice struttura allineata al limite di 4 byte
struct CharIntShort pack(4)
{
char c; // sizeof(char)=1
int i; // sizeof(double)=4
short s; // sizeof(short)=2
};
//--- dichiara una semplice istanza di struttura
CharIntShort ch_in_sh;
//--- mostra la dimensione di ogni membro della struttura
Print("sizeof(ch_in_sh.c)=",sizeof(ch_in_sh.c));
Print("sizeof(ch_in_sh.i)=",sizeof(ch_in_sh.i));
Print("sizeof(ch_in_sh.s)=",sizeof(ch_in_sh.s));
//--- assicurati che la dimensione della struttura POD sia uguale alla somma della dimensione dei s
Print("sizeof(CharIntShort)=",sizeof(CharIntShort));
/*
Result:
sizeof(ch_in_sh.c)=1
sizeof(ch_in_sh.i)=4
sizeof(ch_in_sh.s)=2
sizeof(CharIntShort)=12
*/
}
Sebbene il contenuto della struttura non sia cambiato, l'alterazione della sequenza dei membri ha
aumentato le sue dimensioni.
struct Parent
{
char c; // sizeof(char)=1
};
Creiamo la classe figlia Children con il membro di tipo " short" (sizeof (short)=2).
La conoscenza di come viene allocata la memoria per i membri della struttura è necessaria se
un'applicazione MQL5 interagisce con i dati di terze parti scrivendo/leggendo sul livello dei file o degli
stream.
La directory MQL5\Include\W inAPI della Libreria standard contiene le funzioni per lavorare con le
funzioni W inAPI. Queste funzioni applicano le strutture con un allineamento specificato per i casi
quando è richiesto per lavorare con W inA PI .
Modificatore 'final'
L 'uso del modificatore 'final' durante la dichiarazione struttura vieta ulteriori eredità da questa
struttura. S e una struttura non necessita di ulteriori modifiche, o le modifiche non sono ammesse per
motivi di sicurezza, dichiarare tale struttura con il modificatore 'final'. Inoltre, tutti i componenti della
struttura saranno implicitamente considerati definitivi.
Se si tenta di ereditare da una struttura con il modificatore 'final', come mostrato nell'esempio
precedente, il compilatore restituirà un errore:
Classi
Le classi differiscono dalle strutture in base a quanto riportato qui di seguito:
· Per impostazione predefinita, tutti i membri della classe hanno lo specificatore di accesso private,
se non diversamente indicato. Data-membri della struttura hanno il tipo predefinito di accesso come
public, salvo diversa indicazione;
· oggetti della classe hanno sempre una tabella di funzioni virtuali, anche se non ci sono funzioni
virtuali dichiarate nella classe. Le strutture non possono avere funzioni virtuali;
· l'operatore new può essere applicato ad oggetti della classe, questo operatore non può essere
applicato a strutture;
· le classi possono essere ereditate solo dalle classi; le strutture possono essere ereditate solo dalle
strutture.
Esempio:
struct trade_settings
{
double take; // valori della fissazione dei prezzi profitto
double stop; // valore del prezzo di stop protettivo
uchar slippage; // valore dello scostamento accettabile
//--- Costruttore
trade_settings() { take=0.0; stop=0.0; slippage=5; }
//--- Distruttore
~trade_settings() { Print("Questa è la fine"); }
};
//--- Il compilatore genera un messaggio di errore riferendo che l'inizializzazione è impossibile
trade_settings my_set={0.0,0.0,5};
Costruttori e distruttori
U n costruttore è una funzione speciale, che viene chiamata automaticamente quando si crea un
oggetto di una struttura o di una classe, e di solito è usato per inizializzare membri della classe.
I noltre parleremo solo di classi, mentre lo stesso vale per le strutture, se non diversamente indicato. I l
nome di un costruttore deve corrispondere al nome della classe. Il costruttore non ha alcun tipo di
ritorno (è possibile specificare il tipo void).
Imembri definiti della classe - stringhe, array dinamici ed oggetti che richiedono inizializzazioni -
verranno in ogni caso inizializzati, indipendentemente dal fatto che vi sia un costruttore.
Ogni classe può avere multipli costruttori, differendo per il numero di parametri e la lista di
inizializzazione. Un costruttore che richiede il fatto di specificare i parametri, viene chiamato un
costruttore parametrico.
Un costruttore senza parametri viene chiamato un costruttore di default. S e non vi sono costruttori
dichiarati in una classe, il compilatore crea un costruttore di default durante la compilazione.
//+--------------------------------------------------------------------------------+
//| La classe per lavorare con una data |
//+--------------------------------------------------------------------------------+
class MyDateClass
{
private:
int m_year; // Anno
int m_month; // Mese
int m_day; // Giorno del mese
int m_hour; // Ore in un giorno
int m_minute; // Minuti
int m_second; // Secondi
public:
//--- Costruttore default
MyDateClass(void);
//--- Costruttore parametrico
MyDateClass(int h,int m,int s);
};
Un costruttore può essere dichiarato nella descrizione della classe e poi il suo corpo può essere
definito. Ad esempio, due costruttori di M yDateClass possono essere definiti nel modo seguente:
//+--------------------------------------------------------------------------------+
//| Costruttore default |
//+--------------------------------------------------------------------------------+
MyDateClass::MyDateClass(void)
{
//---
MqlDateTime mdt;
datetime t=TimeCurrent(mdt);
m_year=mdt.year;
m_month=mdt.mon;
m_day=mdt.day;
m_hour=mdt.hour;
m_minute=mdt.min;
m_second=mdt.sec;
Print(__FUNCTION__);
}
//+--------------------------------------------------------------------------------+
//| Costruttore parametrico |
//+--------------------------------------------------------------------------------+
MyDateClass::MyDateClass(int h,int m,int s)
{
MqlDateTime mdt;
datetime t=TimeCurrent(mdt);
m_year=mdt.year;
m_month=mdt.mon;
m_day=mdt.day;
m_hour=h;
m_minute=m;
m_second=s;
Print(__FUNCTION__);
}
Nel costruttore di default, tutti i membri della classe vengono riempiti con la funzione T imeCurrent(),
nel costruttore parametrico solo i valori orari vengono compilati Altri membri della classe (m_year,
m_month e m_day) viene automaticamente inizializzati con la data corrente.
Il costruttore predefinito ha uno scopo speciale durante l'inizializzazione di un array di oggetti della sua
classe. Il costruttore, di cui tutti i parametri hanno valori predefiniti, non è un costruttore di default.
Ecco un esempio:
//+--------------------------------------------------------------------------------+
string ToString(){return(TimeToString(m_call_time,TIME_DATE|TIME_SECONDS));};
};
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
// CFoo foo; // Questa variante non può essere utilizzata - un costruttore di default non è imposta
//--- Le possibili opzioni per creare l'oggetto CFoo
CFoo foo1(TimeCurrent()); // Una chiamata esplicita di un costruttore parametrico
CFoo foo2(); // Una chiamata esplicita di un costruttore parametrico con un par
CFoo foo3=D'2009.09.09'; // Una chiamata implicita di un costruttore parametrico
CFoo foo40(foo1); // Una chiamata esplicita di un costruttore di copia
CFoo foo41=foo1; // Una chiamata implicita di un costruttore di copia
CFoo foo5; // Una chiamata esplicita di un costruttore di default (se non c'è
// allora viene chiamato un costruttore parametrico con un valore
//--- Le opzioni possibili per ricevere puntatori CFoo
CFoo *pfoo6=new CFoo(); // Creazione dinamica di un oggetto e la ricezione di un puntatore
CFoo *pfoo7=new CFoo(TimeCurrent());// Un'altra opzione di creazione di oggetti dinamici
CFoo *pfoo8=GetPointer(foo1); // Ora pfoo8 punta all'oggetto foo1
CFoo *pfoo9=pfoo7; // pfoo9 e pfoo7 puntano all'unico e stesso oggetto
// CFoo foo_array[3]; // Questa opzione non può essere utilizzata - un costruttore di de
//--- Mostra il valore di m_call_time
Print("foo1.m_call_time=",foo1.ToString());
Print("foo2.m_call_time=",foo2.ToString());
Print("foo3.m_call_time=",foo3.ToString());
Print("foo4.m_call_time=",foo4.ToString());
Print("foo5.m_call_time=",foo5.ToString());
Print("pfoo6.m_call_time=",pfoo6.ToString());
Print("pfoo7.m_call_time=",pfoo7.ToString());
Print("pfoo8.m_call_time=",pfoo8.ToString());
Print("pfoo9.m_call_time=",pfoo9.ToString());
//--- Elimina array creati dinamicamente
delete pfoo6;
delete pfoo7;
//delete pfoo8; // Non è necessario eliminare pfoo8 in modo esplicito, in quanto indica l'ogget
//delete pfoo9; // Non è necessario eliminare pfoo9 esplicitamente. in quanto punta allo stesso
}
//CFoo foo_array[3]; // Questa variante non può essere utilizzata - un costruttore di default
//CFoo foo_dyn_array[]; // Questa variante non può essere utilizzata - un costruttore di default
il compilatore restituisce un errore per loro " il costruttore di default non è definito" .
S e una classe ha un costruttore definito-dall'utente, il costruttore di default non viene generato dal
compilatore. Ciò significa che se un costruttore parametrico è dichiarato in una classe, ma un
costruttore di default non è dichiarato, non è possibile dichiarare gli array di oggetti di questa classe.
I l compilatore restituirà un errore per questo script:
//+--------------------------------------------------------------------------------+
//| Una classe senza un costruttore di default |
//+--------------------------------------------------------------------------------+
class CFoo
{
string m_name;
public:
CFoo(string name) { m_name=name;}
};
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- Ottiene durante la compilazione l'errore "il costruttore di default non è definito"
CFoo badFoo[5];
}
In questo esempio, la classe CFoo dispone di un costruttore parametrico dichiarato - in questi casi, il
compilatore non crea un costruttore di default automaticamente durante la compilazione. Allo stesso
tempo, quando si dichiara un array di oggetti, si presume che tutti gli oggetti debbano essere creati
ed inizializzati automaticamente. Durante l'auto-inizializzazione di un oggetto, è necessario chiamare
un costruttore di default, ma dal momento che il costruttore di default non è esplicitamente dichiarato
e non generato automaticamente dal compilatore, non è possibile creare un tale oggetto. Per questo
motivo, il compilatore genera un errore in fase di compilazione.
C'è una sintassi speciale per inizializzare un oggetto utilizzando un costruttore. Inizializzatori
Costruttore (costruzioni speciali per l'inizializzazione) per i membri di una struttura o classe, possono
essere specificato nella lista di inizializzazione.
Un elenco di inizializzazione è un elenco di inizializzatori separati da virgole, che arriva dopo i due
punti dopo la lista dei parametri di un costruttore e precede il corpo (va prima di una parentesi graffa
di apertura). Ci sono diversi requisiti:
//+--------------------------------------------------------------------------------+
//| Una classe per memorizzare il nome di un personaggior |
//+--------------------------------------------------------------------------------+
class CPerson
{
string m_first_name; // Primo nome
string m_second_name; // Secondo nome
public:
//--- Un costruttore di default vuoto
CPerson() {Print(__FUNCTION__);};
//--- Un costruttore parametrico
CPerson(string full_name);
//--- Un costruttore con un elenco di inizializzazione
CPerson(string surname,string name): m_second_name(surname), m_first_name(name
void PrintName(){PrintFormat("Name=%s Surname=%s",m_first_name,m_second_name);};
};
//+--------------------------------------------------------------------------------+
//| |
//+--------------------------------------------------------------------------------+
CPerson::CPerson(string full_name)
{
int pos=StringFind(full_name," ");
if(pos>=0)
{
m_first_name=StringSubstr(full_name,0,pos);
m_second_name=StringSubstr(full_name,pos+1);
}
}
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- Riceve un errore "il costruttore di default non è definito"
CPerson people[5];
CPerson Tom="Tom Sawyer"; // Tom Sawyer
CPerson Huck("Huckleberry","Finn"); // Huckleberry Finn
CPerson *Pooh = new CPerson("Winnie","Pooh"); // Winnie the Pooh
//--- Valori in Output
Tom.PrintName();
Huck.PrintName();
Pooh.PrintName();
1 . Un esplicito costruttore di default, che permette di creare un array di oggetti di questa classe;
2 . Un costruttore con un parametro, che ottiene un nome completo come parametro e lo divide per il
nome e il secondo nome secondo lo spazio trovato;
3 . Un costruttore con due parametri che contiene un elenco di inizializzazione. Inizializzatori -
m_second_name(surname) e m_first_name(name).
Si noti che l'inizializzazione utilizzando una lista ha sostituito un' assegnazione. I singoli membri
devono essere inizializzati come:
N ella lista di inizializzazione, i membri possono andare in qualsiasi ordine, ma tutti i membri della
classe verranno inizializzati secondo l'ordine del loro annuncio. Ciò significa che nel terzo costruttore,
prima il membro m_first_name verrà inizializzato, come è annunciato prima, e solo dopo che
m_second_name viene inizializzato. Ciò deve essere tenuto in considerazione nel caso in cui
l'inizializzazione di alcuni membri della classe dipendono dai valori di altri membri della classe.
Se un costruttore di default non viene dichiarato nella classe base, ed al tempo stesso vengono
dichiarati uno o più costruttori con parametri, si dovrebbe sempre chiamare uno dei costruttori della
classe base nella lista di inizializzazione. Passa attraverso la virgola come membri ordinari della lista e
verrà chiamato la prima volta durante l'inizializzazione dell'oggetto, non importa dove si trova
nell'elenco di inizializzazione.
//+--------------------------------------------------------------------------------+
//| Classe Base |
//+--------------------------------------------------------------------------------+
class CFoo
{
string m_name;
public:
//--- Un costruttore con un elenco di inizializzazione
CFoo(string name) : m_name(name) { Print(m_name);}
};
//+--------------------------------------------------------------------------------+
//| Classe derivata da CFoo |
//+--------------------------------------------------------------------------------+
class CBar : CFoo
{
CFoo m_member; // Un membro della classe è un oggetto del genitore
public:
//--- Un costruttore di default nella lista di inizializzazione chiama il costruttore di un geni
CBar(): m_member(_Symbol), CFoo("CBAR") {Print(__FUNCTION__);}
};
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
CBar bar;
}
In questo esempio, quando si crea l'oggetto bar, verrà chiamato un costruttore di default CBar(), in cui
prima viene chiamato un un costruttore per la CFoo padre, e poi arriva un costruttore per il membro
della classe m_member.
U n distruttore è una funzione speciale che viene chiamata automaticamente quando un oggetto della
classe viene distrutto. Il nome del distruttore è scritto come il nome della classe con una tilde (~).
S tringhe, array dinamici ed oggetti, richiedenti la deinizializzazione, verranno de-inizializzati in ogni
caso, indipendentemente dalla presenza o assenza del distruttore. S e c'è un distruttore, queste azioni
verranno eseguite dopo aver chiamato il distruttore.
I distruttori sono sempre virtuali, indipendentemente dal fatto che siano dichiarati con la parola
chiave virtual o meno.
Esempio:
class CTetrisShape
{
protected:
int m_type;
int m_xpos;
int m_ypos;
int m_xsize;
int m_ysize;
int m_prev_turn;
int m_turn;
int m_right_border;
public:
void CTetrisShape();
void SetRightBorder(int border) { m_right_border=border; }
void SetYPos(int ypos) { m_ypos=ypos; }
void SetXPos(int xpos) { m_xpos=xpos; }
int GetYPos() { return(m_ypos); }
int GetXPos() { return(m_xpos); }
int GetYSize() { return(m_ysize); }
int GetXSize() { return(m_xsize); }
int GetType() { return(m_type); }
void Left() { m_xpos-=SHAPE_SIZE; }
void Right() { m_xpos+=SHAPE_SIZE; }
void Rotate() { m_prev_turn=m_turn; if(++m_turn>3) m_turn=0; }
virtual void Draw() { return; }
virtual bool CheckDown(int& pad_array[]);
Le funzioni da S etR ightBorder (confine int) per D raw() vengono dichiarate e definite direttamente
all'interno della classe CT etris S hape.
Esempio:
//+--------------------------------------------------------------------------------+
//| Costruttore della classe base |
//+--------------------------------------------------------------------------------+
void CTetrisShape::CTetrisShape()
{
m_type=0;
m_ypos=0;
m_xpos=0;
m_xsize=SHAPE_SIZE;
m_ysize=SHAPE_SIZE;
m_prev_turn=0;
m_turn=0;
m_right_border=0;
}
//+--------------------------------------------------------------------------------+
//| Controlla l'abilità di spostarsi giù (per il "lungo" ed il cubo) |
//+--------------------------------------------------------------------------------+
bool CTetrisShape::CheckDown(int& pad_array[])
{
int i,xsize=m_xsize/SHAPE_SIZE;
//---
for(i=0; i<xsize; i++)
{
if(m_ypos+m_ysize>=pad_array[i]) return(false);
}
//---
return(true);
}
protected, i dati nascosti possono essere acceduti anche dai metodi delle classi - eredi di questa
classe. Lo stesso metodo può essere utilizzato per limitare l'accesso ai metodi-funzione di una classe.
Se è necessario aprire completamente l'accesso ai membri e/o metodi di una classe, utilizzare la
parola chiave public.
Esempio:
class CTetrisField
{
private:
int m_score; // Punteggio
int m_ypos; // Posizione corrente delle figure
int m_field[FIELD_HEIGHT][FIELD_WIDTH]; // Matrice del pozzo
int m_rows[FIELD_HEIGHT]; // Numerazione delle righe del pozzo
int m_last_row; // Ultime righe libere
CTetrisShape *m_shape; // Figura Tetris
bool m_bover; // Game over
public:
void CTetrisField() { m_shape=NULL; m_bover=false; }
void Init();
void Deinit();
void Down();
void Left();
void Right();
void Rotate();
void Drop();
private:
void NewShape();
void CheckAndDeleteRows();
void LabelOver();
};
I membri della classe e metodi dichiarati dopo l'identificatore public: (e prima dello specificatore di
accesso successivo) sono disponibili in qualsiasi riferimento all'oggetto classe dal programma. In
questo esempio questi sono i seguenti membri : funzioni C T etris Field(), I nit(), Deinit(), Down(), Left(),
Imembri che vengono dichiarati dopo lo specificatore di accesso agli elementi private: (e prima dello
specificatore di accesso successivo) sono disponibili solo per i membri funzioni di questa classe. Gli
secificatori di accesso agli elementi finiscono sempre con i due punti (:) e possono comparire nella
definizione della classe molte volte.
Qualsiasi membro della classe dichiarato dopo l' identificatore di accesso protected:(e fino al
successivo identificatore di accesso) sono disponibili solo per le funzioni-membro di questa classe e
per le funzioni-membro delle classi discendenti. Quando si tenta di fare riferimento ai membri che
presentano gli specificatori private e protected dall'esterno, otteniamo l'errore della fase di
compilazione. Esempio:
class A
{
protected:
// --- l'operatore copy è disponibile solo all'interno della classe A e suoi discendenti
void operator=(const A &)
{
}
};
class B
{
//--- oggetto della classe A dichiarato
A a;
};
//+------------------------------------------------------------------+
//| Funzione di avvio del programma di script |
//+------------------------------------------------------------------+
void OnStart()
{
//--- dichiara due variabili di tipo B.
B b1, b2;
//--- tenta di copiare un oggetto in un altro
b2=b1;
}
D urante la compilazione del codice, viene visualizzato il messaggio di errore - tentativo di chiamare
l'operatore copy remoto:
La seconda stringa di seguito fornisce una descrizione più dettagliata — l'operatore copy nella classe B
è stato eliminato esplicitamente, poiché viene chiamato l'operatore copy non disponibile della classe A:
function 'void B::operator=(const B&)' was implicitly deleted because it invokes inaccessible fu
L 'accesso ai membri della classe base può essere ridefinito duranteeredità nelle classi derivate.
'delete' specifier
L ' identificatore delete contrassegna le funzioni dei membri della classe che non possono essere
utilizzate. Ciò significa che se il programma fa riferimento a tale funzione in modo esplicito o
implicito, l'errore viene già ricevuto in fase di compilazione. Ad esempio, questo identificatore
consente di rendere i metodi parent non disponibili in una classe child. Lo stesso risultato può essere
ottenuto se dichiariamo la funzione nell'area privata della classe genitrice (dichiarazioni nella sezione
private). Qui, usare delete rende il codice più leggibile e gestibile a livello di discendenti.
class A
{
public:
A(void) {value=5;};
double GetValue(void) {return(value);}
private:
double value;
};
class B: public A
{
double GetValue(void)=delete;
};
//+------------------------------------------------------------------+
//| Funzione di avvio del programma di script |
//+------------------------------------------------------------------+
void OnStart()
{
//--- dichiara la variabile di tipo A.
A a;
Print("a.GetValue()=", a.GetValue());
//--- tenta di ottenere valore dalla variabile di tipo B.
B b;
Print("b.GetValue()=", b.GetValue()); // il compilatore mostra un errore in questa stringa
}
class A
{
public:
void SetValue(double v) {value=v;}
//--- disabilita la chiamata di tipo int
void SetValue(int) = delete;
//--- disabilita l'operatore copy
void operator=(const A&) = delete;
private:
double value;
};
//+------------------------------------------------------------------+
//| Funzione di avvio del programma di script |
//+------------------------------------------------------------------+
void OnStart()
{
//--- dichiara due variabili di tipo A.
A a1, a2;
a1.SetValue(3); // errore!
a1.SetValue(3.14); // OK
a2=a1; // errore!
}
Modificatore 'final'
L 'uso del modificatore 'final' durante la dichiarazione della classe vieta ulteriori eredità da questa
classe. S e l'interfaccia della classe non richiede ulteriori modifiche, o le modifiche non sono ammesse
per motivi di sicurezza, dichiarare questa classe con il modificatore 'final'. Inoltre, tutti i membri della
classe saranno implicitamente considerati definitivi.
Se si tenta di ereditare da una classe con il modificatore 'final', come mostrato nell'esempio
precedente, il compilatore restituirà un errore:
Unioni (union)
Union è un tipo di dati speciale costituito da diverse variabili che condividono la stessa area di
memoria. Pertanto, l'unione fornisce la capacità di interpretare la stessa sequenza di bit in due (o più)
modi diversi. La dichiarazione dell'unione è simile alla dichiarazione della struttura ed inizia con la
parola chiave union.
union LongDouble
{
long long_value;
double double_value;
};
A differenza della struttura, i vari membri sindacali appartengono alla stessa area di memoria. In
questo esempio, l'unione di Long Double è dichiarata con valori di tipo long e double che condividono la
stessa area di memoria. S i prega di notare che è impossibile fare in modo che union memorizzi (a
differenza di una struttura) simultaneamente valori integer long e valori real double , poiché le
variabili long _value e double_value si sovrappongono (in memoria). D'altro canto, un programma MQL5
è in grado di elaborare in qualsiasi momento i dati contenenti nell'unione un valore intero(long) o
reale(double). Pertanto, l'unione consente di ricevere due (o più) opzioni per rappresentare la stessa
sequenza di dati.
union LongDouble
{
long long_value;
double double_value;
};
//+------------------------------------------------------------------+
//| Funzione start programma Script |
//+------------------------------------------------------------------+
void OnStart()
{
//---
LongDouble lb;
//--- ottiene e visualizza il numero -nan(ind) non valido
lb.double_value=MathArcsin(2.0);
printf("1. double=%f integer=%I64X",lb.double_value,lb.long_value);
//--- il più ampio valore normalizzato (DBL_MAX)
lb.long_value=0x7FEFFFFFFFFFFFFF;
printf("2. double=%.16e integer=%I64X",lb.double_value,lb.long_value);
//--- il più piccolo positivo normalizzato (DBL_MIN)
lb.long_value=0x0010000000000000;
printf("3. double=%.16e integer=%.16I64X",lb.double_value,lb.long_value);
}
/* Risultato dell'esecuzione
1. double=-nan(ind) integer=FFF8000000000000
2. double=1.7976931348623157e+308 integer=7FEFFFFFFFFFFFFF
3. double=2.2250738585072014e-308 integer=0010000000000000
*/
Poiché le unioni consentono al programma di interpretare gli stessi dati di memoria in modi diversi,
esse vengono spesso utilizzate quando un' inusuale conversione di tipo è richiesta.
Le unioni non possono essere coinvolte nella eredità(inheritance), e loro anche non possono avere
membri statici a causa della loro stessa natura. In tutti gli altri aspetti, l' unione si comporta come una
struttura con tutti i suoi membri con un offset di zero. I seguenti tipi non possono essere i membri
dell'unione:
· dynamic arrays
· strings
Simillmente alle classi, l'unione è in grado di avere costruttori e distruttori, cos ì come metodi. Per
default, i membri dell'unione sono di tipo di accesso public. Per creare elementi privati, utilizzare la
parola chiave private. T utte queste possibilità sono visualizzate nell'esempio che illustra come
convertire un colore del tipo color in ARGB come fa la funzione ColorT oARGB().
//+------------------------------------------------------------------+
//| Unione per la conversione in colori (BGR) in ARGB |
//+------------------------------------------------------------------+
union ARGB
{
uchar argb[4];
color clr;
//--- costruttori
ARGB(color col,uchar a=0){Color(col,a);};
~ARGB(){};
//--- metodi pubblici
public:
uchar Alpha(){return(argb[3]);};
void Alpha(const uchar alpha){argb[3]=alpha;};
color Color(){ return(color(clr));};
//--- metodi privati
private:
//+------------------------------------------------------------------+
//| imposta il valore del canale alpha ed il colore |
//+------------------------------------------------------------------+
void Color(color col,uchar alpha)
{
//--- imposta il colore al membro clr
clr=col;
//--- imposta il valore del componente Alpha - livello d'opacità
argb[3]=alpha;
//--- scambia i bite dei componenti R e B (Red e Blue)
uchar t=argb[0];argb[0]=argb[2];argb[2]=t;
};
};
//+------------------------------------------------------------------+
//| Funzione start programma Script |
//+------------------------------------------------------------------+
void OnStart()
{
//--- 0x55 significa 55/255=21.6 % (0% - completamente trasparente)
uchar alpha=0x55;
//--- il tipo di colore è rappresentato come 0x00BBGGRR
color test_color=clrDarkOrange;
//--- qui vengono accettati i valori di byte provenienti dall'unione ARGB
uchar argb[];
PrintFormat("0x%.8X - qui è come il tipo 'color' appare per %s, BGR=(%s)",
test_color,ColorToString(test_color,true),ColorToString(test_color));
//--- Il tipo ARGB è rappresentato da 0x00RRGGBB, RR e BB vengono scambiati
ARGB argb_color(test_color);
//--- copia l'array di byte
ArrayCopy(argb,argb_color.argb);
//--- ecco come appare nella rappresentazione ARGB
PrintFormat("0x%.8X - rappresentazione ARGB con il canale alpha=0x%.2x, ARGB=(%d,%d,%d,%d)",
argb_color.clr,argb_color.Alpha(),argb[3],argb[2],argb[1],argb[0]);
//--- aggiungi livello opacità
argb_color.Alpha(alpha);
Interfacce
n interfaccia consente la determinazione di specifiche funzionalità, che una classe può quindi
U '
implementare. Infatti, un'interfaccia è una classe che non può contenere membri, e non può avere un
costruttore e/o un distruttore. T utti i metodi dichiarati in una interfaccia sono puramente virtuali,
anche in assenza di una definizione esplicita.
{
public:
CDog() { Print("Il cane è nato"); }
~CDog() { Print("Il cane è morto"); }
//--- Implementare il metodo Sound di IAnimal interface
void Sound(){ Print("guaf"); }
};
//+------------------------------------------------------------------+
//| Programma Script funzione start |
//+------------------------------------------------------------------+
void OnStart()
{
//--- Un array di puntatori a oggetti del tipo IAnimal
IAnimal *animals[2];
//--- La creazione di classi figlio di IAnimal e risparmio di puntatori a loro, in un array
animals[0]=new CCat;
animals[1]=new CDog;
//--- Chiamata al metodo Suono() dell'interfaccia base IAnimal per ogni bambino
for(int i=0;i<ArraySize(animals);++i)
animals[i].Sound();
//--- Eliminazione oggetti
for(int i=0;i<ArraySize(animals);++i)
delete animals[i];
//--- Risultato dell'esecuzione
/*
Il gatto è nato
Il cane è nato
meou
guaf
Il gatto è morto
Il cane è morto
*/
}
Come le classi astratte, un oggetto interfaccia non può essere creato senza eredità. Un'interfaccia può
essere ereditata solo dalle altre interfacce e può essere un genitore per una classe. Un interfaccia è
sempre con visibilità pubblica.
n interfaccia non può essere dichiarata all'interno di una dichiarazione della classe o di una struttura,
U '
ma un puntatore per l'interfaccia può essere salvato in una variabile di tipo void *. In generale, un
puntatore ad un oggetto di qualsiasi classe può essere salvato in una variabile di tipo void *. Per
convertire un puntatore void * a un puntatore ad un oggetto di una classe particolare, utilizzare
l'operatore dynamic_cast. S e la conversione non è possibile, il risultato dell'operazione dynamic_cast
sarà NULL.
Vedi anche
Programmazione Ad Oggetti (OOP Object-Oriented-Programming)
Array dinamici vengono automaticamente liberati quando si va oltre l'area visibilità del blocco in cui
sono dichiarati
Esempio:
double matrix[][10][20]; // array dinamico tri-dimensionale
ArrayResize(matrix,5); // Imposta la grandezza della prima dimensione
Array statici
Quando tutte le significative dimensioni dell'array sono specificate in modo esplicito, il compilatore
pre-alloca la dimensione necessaria della memoria. Un tale array è chiamato statico. T uttavia, il
compilatore alloca memoria aggiuntiva per l'oggetto di un array dinamico, il cui (oggetto) è associato
al buffer statico pre-assegnato (parte della memoria per memorizzare l'array).
La creazione di un oggetto array dinamico è dovuta alla possibile necessità di passare questo array
statico come parametro per qualche funzione.
Esempi:
double stat_array[5]; // array statico uni-dimensionale
some_function(stat_array);
...
bool some_function(double& array[])
{
if(ArrayResize(array,100)<0) return(false);
...
return(true);
}
Array in Strutture
Quando un array statico è dichiarato come un membro di una struttura, un oggetto array dinamico non
viene creato. Questo viene fatto per garantire la compatibilità delle strutture di dati utilizzati per la
A PI di W indows.
Tuttavia, gli array statici che vengono dichiarati come membri delle strutture, possono anche essere
passati funzioni-MQL5. In questo caso, quando si passa il parametro di un oggetto temporaneo di un
array dinamico, collegato con l'array statico - verrà creato il membro della struttura.
Vedi anche
F unzioni di Array, Inizializzazione delle Variabili, Visibilità Ambito di Applicazione e Durata delle
V ariabili, Creazione ed Eliminazione di Oggetti
Typecasting
Casting di Tipi Numerici
Spesso si verifica la necessità di convertire un tipo numerico in un altro. N on tutti i tipi numerici
possono essere convertiti in altri. Ecco lo schema di casting consentito:
Le linee continue con le frecce indicano le modifiche che vengono eseguite quasi senza alcuna perdita
di informazioni. Al posto del tipo char, può essere usato il tipo bool (entrambi prendono 1 byte di
memoria), al posto del tipo int, può essere utilizzato il tipo color (4 byte), al posto del tipo long, può
essere utilizzato il tipo datetime (prende 8 byte). Le quattro linee tratteggiate grigie, anch'esse a
freccia, denotano conversioni, quando la perdita di precisione può verificarsi. Ad esempio, il numero
di cifre nel numero intero pari a 123456789 (int) è superiore al numero di cifre che possono essere
rappresentate da un float.
int n=123456789;
float f=n; // il contenuto di f è uguale a 1.234567892E8
Print("n = ",n," f = ",f);
// risulta n= 123456789 f= 123456792.00000
Come risultato di conversione di valori in virgola mobile verso il tipo intero, la parte frazionaria viene
sempre eliminata. S e si desidera arrotondare un float al numero intero più vicino (che in molti casi è
più utile), è necessario utilizzare MathR ound ().
Esempio:
// --- Accelerazione gravitazionale
double g=9.8;
double round_g=(int)g;
double math_round_g=MathRound(g);
Print("round_g = ",round_g);
Print("math_round_g = ",math_round_g);
/*
Risultato:
round_g = 9
math_round_g = 10
*/
I tipi di dati char, uchar, short, ed ushort incondizionatamente vengono convertiti nel tipo int.
Esempi:
char c1=3;
//--- Primo esempio
double d2=c1/2+0.3;
Print("c1/2 + 0.3 = ",d2);
// Risultato: c1/2+0.3 = 1.3
L 'espressione calcolata si compone di due operazioni. Nel primo esempio, la variabile c1 del tipo char
viene convertita in una variabile temporanea di tipo int, perché il secondo operando nell'operazione di
divisione, la costante 2, è del tipo superiore int. Come risultato della divisione intera 3/2 si ottiene il
valore 1, che è di tipo int.
Nella seconda operazione del primo esempio, il secondo operando è la costante 0.3, che è di tipo
double, quindi il risultato della prima operazione viene convertito in una variabile temporanea di tipo
double con il valore di 1.0 .
Nel secondo esempio la variabile di tipo char c1 viene convertita in una variabile temporanea di tipo
double, perché il secondo operando nell'operazione di divisione, la costante 2.0, è di tipo double; non
vengono effettuate altre conversioni.
var_1 = (tipo)var_2;
Un risultato di un'espressione o di esecuzione di una funzione può essere utilizzato come variabile
var_2. La registrazione funzionale del typecasting esplicito è anche possibile:
var_1 = tipo(var_2);
Inoltre, quando si cerca di castare i tipi, il risultato può andare oltre il range permissibile. In questo
caso, avviene un troncamento. Ad esempio:
char c;
uchar u;
c=400;
u=400;
Print("c = ",c); // Risultato c=-112
Print("u = ",u); // Risultato u=144
Prima che le operazioni (ad eccezione di quelle assegnazione) vengano eseguite, i dati vengono
convertiti nel tipo massima priorità. Prima che vengano eseguite le operazioni di assegnazione, i dati
vengono castati nel tipo target(_*di destinazione).
Esempi:
int i=1/2; // nessun casting del tipo, il risultato è 0
Print("i = 1/2 ",i);
double x=1/2; // l'espressione di tipo int viene castata al target di tipo double,
Print("x = 1/2; ",x); // il risultato è 0.0
Durante la conversione di tipo long /ulong in double, la precisione può venir persa nel caso in cui il
valore integer sia maggiore di 9223372036854774784 o minore di -9223372036854774784.
voidOnStart()
{
long l_max=LONG_MAX;
long l_min=LONG_MIN+1;
//--- definisce il valore integer più alto, che non perde precisione quando viene castato in double
while(l_max!=long((double)l_max))
l_max--;
//--- definisce il valore integer più basso, che non perde precisione quando viene castato a double
while(l_min!=long((double)l_min))
l_min++;
//--- deriva l'intervallo trovato per valori interi
PrintFormat("Quando si casta un valore integer a double, dev'essere"
"all'interno dell'intervallo [%I64d, %I64d] ",l_min,l_max);
//--- ora, vediamo cosa succede se il valore cade al di fuori di questo intervallo
PrintFormat("l_max+1=%I64d, double(l_max+1)=%.f, ulong(double(l_max+1))=%I64d",
l_max+1,double(l_max+1),long(double(l_max+1)));
PrintFormat("l_min-1=%I64d, double(l_min-1)=%.f, ulong(double(l_min-1))=%I64d",
l_min-1,double(l_min-1),long(double(l_min-1)));
//--- visualizza il seguente risultato
// Il casting di un valore integer a double, dovrebbe essere entro l'intervallo [-92233720368547747
// l_max+1=9223372036854774785, double(l_max+1)=9223372036854774800, ulong(double(l_max+1))=9223372
// l_min-1=-9223372036854774785, double(l_min-1)=-9223372036854774800, ulong(double(l_min-1))=-9223
}
Esempi:
string s1=1.0/8; // l'espressione viene castata al tipo double,
Print("s1 = 1.0/8; ",s1); // quindi nel tipo target stringa,
// il risultato è "0.12500000" (una stringa contenente 10 caratteri)
string str1="true";
string str2="0,255,0";
string str3="2009.06.01";
string str4="1.2345e2";
Print(bool(str1));
Print(color(str2));
Print(datetime(str3));
Print(double(str4));
Oggetti di classi aperte generate possono anche essere visti come oggetti della classe base
corrispondente. Questo porta ad alcune conseguenze interessanti. Per esempio, nonostante il fatto che
gli oggetti di diverse classi, generati da una singola classe di base, possono differire
significativamente l'uno dall'altro, possiamo creare una lista collegata (List) di essi, giacchè li vediamo
come oggetti del tipo di base. Ma il contrario non è vero: gli oggetti della classe base non sono
automaticamente gli oggetti di una classe derivata.
È possibile utilizzare il casting esplicito per convertire i puntatori della classe base in puntatori di una
classe derivata. Ma si deve essere pienamente fiduciosi nella ammissibilità di tale trasformazione,
perché altrimenti un errore runtime critico si verificherà e il programma MQL5 sarà interrotto.
The type-id parameter in angle brack ets should point to a previously defined class type. U nlik e C++,
expression operand type can be of any value ex cept for void.
Example:
class CBar { };
class CFoo : public CBar { };
void OnStart()
{
CBar bar;
//--- dynamic casting of *bar pointer type to *foo pointer is allowed
CFoo *foo = dynamic_cast<CFoo *>(&bar); // no critical error
Print(foo); // foo=NULL
//--- an attempt to explicitly cast a Bar type object reference to a Foo type object is forbidden
foo=(CFoo *)&bar; // critical runtime error
Print(foo); // this string is not executed
}
Vedi anche
T ipi di Dati
La variabile costante predefinita NULL è di tipo void. Può essere assegnato a variabili di altri tipi
fondamentali senza conversione. Il confronto tra variabili di tipo fondamentale con il valore NULL è
consentito.
Esempio:
//--- Se la stringa non viene inizializzata, allora assegniamo il nostro valore predefinito ad essa
if(some_string==NULL) some_string="empty";
A nche, NULL, può essere paragonato a puntatori a oggetti creati con l'operatore new.
Vedi anche
V ariabili, Funzioni
Qui, type significa qualsiasi tipo di dati accettabile, mentre new_name è un nuovo nome del tipo. Un
nuovo nome viene impostato soltanto in aggiunta (non in sostituzione) a un nome di tipo esistente.
MQL5 permette di creare puntatori a funzioni utilizzando typedef.
typedef tipo_risultato_funzione*Nome_tipo_funzione)(lista_di_tipi_di_parametri_di_input);
dove dopo typedef, viene impostata la firma di funzione (numero e tipo dei parametri di input, cos ì
come un tipo di risultato restituito dalla funzione). Ecco un semplice esempio di creazione ed
applicazione di un puntatore ad una funzione:
//--- dichiarare un puntatore a una funzione che accetta due parametri int
typedef int (*TFunc)(int,int);
//--- TFunc è un tipo, ed è possibile dichiarare la variabile puntatore alla funzione
TFunc func_ptr; // puntatore alla funzione
//--- dichiara le funzioni corrispondenti alla descrizione TFunc
int sub(int x,int y) { return(x-y); } // sottrae un numero da un altro
int add(int x,int y) { return(x+y); } // aggiunta di due numeri
int neg(int x) { return(~x); } // inverte i bit nella variabile
//--- la variabile func_ptr può memorizzare l'indirizzo della funzione da dichiarare successivament
func_ptr=sub;
Print(func_ptr(10,5));
func_ptr=add;
Print(func_ptr(10,5));
func_ptr=neg; // errore: neg non ha il tipo int (int,int)
Print(func_ptr(10)); // errore: mancano due parametri
In questo esempio, la variabile func_ptr può ricevere le funzioni sub e add poiché hanno due input
ciascuno di tipo int definito nel puntatore alla funzione TFunc. Al contrario, la funzione neg non può
essere assegnata al puntatore func_ptr giacchè dalla sua firma è diversa.
ed aggiungere le funzioni per il loro handling. In primo luogo, definire un puntatore alla funzione
TAction da chiamare premendo il bottone e creare tre funzioni secondo la descrizione TAction.
Quindi, crea la classe M yButton da CButton, dove dovremmo aggiungere il puntatore alla funzione
TAction.
//+------------------------------------------------------------------+
//| Creare la classe bottone con la funzione di elaborazione eventi |
//+------------------------------------------------------------------+
class MyButton: public CButton
{
private:
TAction m_action; // chart events handler
public:
MyButton(void){}
~MyButton(void){}
//--- costruttore specificando il testo del bottone e il puntatore all' event handler della funz
MyButton(string text, TAction act)
{
Text(text);
m_action=act;
}
Crea la classe derivata CControls Dialog daCAppDialog, aggiunge l'array m_buttons ad essal per
memorizzare i pulsanti tel tipo MyButton, nonché i metodi AddButton(MyButton &button) e
CreateButtons() .
//+------------------------------------------------------------------+
//| CControlsDialog class |
//| Obiettivo: pannello grafico per la gestione dell'applicazione |
//+------------------------------------------------------------------+
class CControlsDialog : public CAppDialog
{
private:
CArrayObj m_buttons; // array del bottone
public:
CControlsDialog(void){};
~CControlsDialog(void){};
//--- crea
virtual bool Create(const long chart,const string name,const int subwin,const int x1,const
//--- aggiunge il bottone
bool AddButton(MyButton &button){return(m_buttons.Add(GetPointer(button)));m_button
protected:
//--- crea i bottoni
bool CreateButtons(void);
};
//+------------------------------------------------------------------+
//| Crea l'oggetto CControlsDialog sul chart |
//+------------------------------------------------------------------+
bool CControlsDialog::Create(const long chart,const string name,const int subwin,const int x1,const
{
if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2))
return(false);
return(CreateButtons());
//---
}
//+------------------------------------------------------------------+
//| i defines |
//+------------------------------------------------------------------+
//--- indents e gaps
#define INDENT_LEFT (11) // indentazione da sinistra (con permissività
#define INDENT_TOP (11) // indentazione dall'alto(con permissività pe
#define CONTROLS_GAP_X (5) // gap da coordinata X
#define CONTROLS_GAP_Y (5) // gap da coordinata Y
//--- per i bottoni
#define BUTTON_WIDTH (100) // grandezza da coordinate X
#define BUTTON_HEIGHT (20) // grandezza da coordinata Y
//--- for the indication area
#define EDIT_HEIGHT (20) // grandezza da coordinata Y
//+------------------------------------------------------------------+
//| Creare ed aggiunge bottoni al pannello CControlsDialog |
//+------------------------------------------------------------------+
bool CControlsDialog::CreateButtons(void)
{
//--- calcula le coordinate dei buttoni
int x1=INDENT_LEFT;
int y1=INDENT_TOP+(EDIT_HEIGHT+CONTROLS_GAP_Y);
int x2;
int y2=y1+BUTTON_HEIGHT;
//--- aggiunge oggetti bottoni con puntatori a funzioni
AddButton(new MyButton("Open",Open));
AddButton(new MyButton("Save",Save));
AddButton(new MyButton("Close",Close));
//--- creare i bottoni graficamente
for(int i=0;i<m_buttons.Total();i++)
{
MyButton *b=(MyButton*)m_buttons.At(i);
x1=INDENT_LEFT+i*(BUTTON_WIDTH+CONTROLS_GAP_X);
x2=x1+BUTTON_WIDTH;
if(!b.Create(m_chart_id,m_name+"bt"+b.Text(),m_subwin,x1,y1,x2,y2))
{
PrintFormat("Fallimento nel creare il bottone %s %d",b.Text(),i);
return(false);
}
//--- aggiungere ogni bottone al contenitore CControlsDialog
if(!Add(b))
return(false);
}
//--- successo
return(true);
}
Ora, siamo in grado di sviluppare il programma utilizzando il pannello di controllo CControls Dialog
avente 3 pulsanti: Apri, S alva e Chiudi. Quando si fa clic su un bottone, la funzione appropriata nella
forma di puntatore TAction viene chiamata.
//--- dichiara l'oggetto a livello globale per creare automaticamente quando si lancia il programma
CControlsDialog MyDialog;
//+------------------------------------------------------------------+
//| Funzione di inizializzazione Expert |
//+------------------------------------------------------------------+
int OnInit()
{
//--- ora, crea l'oggetto sul chart
if(!MyDialog.Create(0,"Controls",0,40,40,380,344))
return(INIT_FAILED);
//--- avvia l'applicazione
MyDialog.Run();
//--- applicazione inizializzata con successo
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Funzione deinizializzazione Expert |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- distrugge la finestra
MyDialog.Destroy(reason);
}
//+------------------------------------------------------------------+
//| Funzione di evento chart dell' Expert |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, // ID evento
const long& lparam, // parametro evento del tipo long
const double& dparam, // parametro event del tipo double
const string& sparam) // paraemetro evento del tipo string
{
//--- chiama l'handler della classe padre (qui è CAppDialog) per gli eventi chart
MyDialog.ChartEvent(id,lparam,dparam,sparam);
}
L 'apparenza dell'applicazione lanciata e il click dei bottoni viene fornita sulla schermata.
//+------------------------------------------------------------------+
//| Panel_Buttons.mq5 |
//| Copyright 2017, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
}
//+------------------------------------------------------------------+
//| Funzione di evento chart dell' Expert |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, // ID evento
const long& lparam, // parametro evento del tipo long
const double& dparam, // parametro event del tipo double
const string& sparam) // paraemetro evento del tipo string
{
//--- chiama l'handler della classe padre (qui è CAppDialog) per gli eventi chart
MyDialog.ChartEvent(id,lparam,dparam,sparam);
}
Guarda anche
variabili, Funzioni
Esempi:
MyObject* hobject= new MyObject();
In contrast to C++, the hobject variable from ex ample above is not a pointer to memory, but rather an
object descriptor. Furthermore, in MQL5 all objects in function parameters must be passed by
reference. Below are ex amples of passing objects as function parameters :
class Foo
{
public:
string m_name;
int m_id;
static int s_counter;
//--- constructors and desctructors
Foo(void){Setup("noname");};
Foo(string name){Setup(name);};
~Foo(void){};
//--- initializes object of type Foo
void Setup(string name)
{
m_name=name;
s_counter++;
m_id=s_counter;
}
};
int Foo::s_counter=0;
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- declare an object as variable with its automatic creation
Foo foo1;
//--- variant of passing an object by reference
PrintObject(foo1);
//--- declare a pointer to an object and create it using the 'new' operator
Foo *foo2=new Foo("foo2");
//--- variant of passing a pointer to an object by reference
PrintObject(foo2); // pointer to an object is converted automatically by compiler
Vedi anche
Variabili, Inizializzazione delle Variabili, Visibilità Campo e Durata delle Variabili, Creazione ed
Eliminazione di Oggetti
Il passaggio di un parametro per riferimento significa passare l'indirizzo della variabile, è per questo
che tutte le variazioni del parametro che viene passato per riferimento verranno immediatamente
riflesse nella variabile sorgente. Utilizzando il passaggio di parametro per riferimento, è possibile
implementare il ritorno dei svariati risultati di una funzione allo stesso tempo. Al fine di impedire la
variazione di un parametro passato per riferimento, utilizzare il modificatore const.
Esempio
class CDemoClass
{
private:
double m_array[];
public:
void setArray(double &array[]);
};
//+--------------------------------------------------------------------------------+
//| riempie l'array |
//+--------------------------------------------------------------------------------+
void CDemoClass::setArray(double &array[])
{
if(ArraySize(array)>0)
{
ArrayResize(m_array,ArraySize(array));
ArrayCopy(m_array, array);
}
}
N ell'esempio sopra la classe viene dichiarata la CDemoClass, la qualeche contiene il membro privato -
array m_array[] di tipo double. Funzione setArray() viene dichiarata, alla quale array[] è passato per
riferimento. S e l'intestazione funzione non contiene l'indicazione di passaggio per riferimento, cioè
non contiene il carattere 'e commerciale', un messaggio di errore viene generato al tentativo di
compilare tale codice.
Nonostante il fatto che la matrice viene passata per riferimento, non possiamo assegnare un array ad
un altro. Abbiamo bisogno di effettuare la copia elemento-per-elemento dei contenuti della matrice di
origine alla matrice destinataria. La presenza dei & nella descrizione della funzione è la condizione
obbligatoria per array e strutture quando viene passata come parametro della funzione.
La parola riservata this è designata per ottenere il riferimento dell'oggetto stesso, che è disponibile
all'interno di metodi di classe o struttura. this sempre fa riferimento all'oggetto, nel metodo di cui è
utilizzato, e l'espressione GetPointer(this) dà il puntatore dell'oggetto, il cui componente è la funzione,
in cui viene eseguita la chiamata di GetPointer(). In MQL5 funzioni non possono restituire oggetti, ma
possono restituire il puntatore dell'oggetto.
Quindi, se abbiamo bisogno che una funzione restituisca un oggetto, siamo in grado di restituire il
puntatore di questo oggetto sottoforma di GetPointer(this). Aggiungiamo la funzione getDemoClass()
che restituisce il puntatore del oggetto di questa classe, nella descrizione di CDemoClass.
class CDemoClass
{
private:
double m_array[];
public:
void setArray(double &array[]);
CDemoClass *getDemoClass();
};
//+--------------------------------------------------------------------------------+
//| riempie l'array |
//+--------------------------------------------------------------------------------+
void CDemoClass::setArray(double &array[])
{
if(ArraySize(array)>0)
{
ArrayResize(m_array,ArraySize(array));
ArrayCopy(m_array,array);
}
}
//+--------------------------------------------------------------------------------+
//| restituisce il suo puntatore |
//+--------------------------------------------------------------------------------+
CDemoClass *CDemoClass::getDemoClass(void)
{
return(GetPointer(this));
}
Le strutture non hanno puntatori, gli operatori new e delete non possono essere applicati ad essi,
GetPointer(this) non può essere utilizzato.
Vedi anche
Puntatori Oggetto, Creazione ed Eliminazione di Oggetti, Visibilità Campo e Durata di Variabili
Operazioni ed Espressioni
Alcuni caratteri e sequenze di caratteri sono di particolare importanza. Questi sono i cosiddetti simboli
delle operazioni, ad esempio:
Simboli delle operazioni vengono utilizzati nelle espressioni ed hanno senso quando vengono dati ad
essi operandi appropriati. I segni di punteggiatura sono enfatizzati, anche. S i tratta di parentesi,
virgola, due punti e punto e virgola.
S imboli di operazioni, segni di punteggiatura e spazi vengono utilizzati per separare gli elementi del
linguaggio gli uni dagli altri.
· Ex pressions
· A rithmetical Operations
· Operazioni di assegnazione
· Operations of R elation
· Boolean Operations
· Operazioni bit per bit
· A ltre Operazioni
· Priorità ed Ordine delle operazioni
Expressions
n espressione è composta da uno o più operandi e simboli di funzionamento.
U ' n espressione può
U '
Esempi:
a++; b = 10; // in una riga ci sono varie espressioni
//--- un'espressione è divisa in varie righe
x = (y * z) /
(w + 2) + 127;
Vedi anche
R egole di Precedenza
Operazioni Aritmetiche
Operazioni aritmetiche includono operazioni di addizione e moltiplicazione:
Le operazioni di incremento e decremento sono applicate solo alle variabili, non possono essere
applicate alle costanti. I prefissi incremento (++i) e decremento (--k ) vengono applicati a destra
variabile, giusto prima che questa variabile venga utilizzata in un'espressione.
Post-incremento (i++) e post-decremento (k --) vengono applicati alla variabile, giusto dopo che questa
vnga utilizzata in un'espressione.
Avviso importante
int i=5;
int k = i++ + ++i;
Esempi:
int a=3;
a++; // espressione valida
int b=(a++)*3; // espressione non valida
Vedi anche
R egole di Precedenza
Operazioni di assegnazione
I l valore dell'espressione che include l'operazione data è il valore dell'operando sinistro dopo
l'assegnazione:
Operazioni di bit possono essere applicate solo a numeri interi. Quando si esegue l'operazione di
slittamento logico della rappresentazione y verso destra/sinistra di x -bit, vengono utilizzate le 5 cifre
binarie più piccole del valore x , le più alte vengono scartate, cioè il passaggio è fatto per 0-31 bit.
Con l'operazione %= (valore y dal modulo di x ), il segno del risultato è uguale al segno del numero
diviso.
L 'operatore di assegnazione può essere utilizzato più volte in un'espressione. In q uesto caso la
trasformazione dell'espressione viene eseguita da sinistra a destra:
y=x=3;
In primo luogo, alla variabile x viene assegnato il valore 3, poi alla variabile y viene assegnato il valore
di x , vale a dire 3, anche.
Vedi anche
R egole di Precedenza
Operations of Relation
Il booleano FAL S E (_*falso) è rappresentato da un valore intero pari a zero, mentre il booleano TRU E
(_*vero) è rappresentato da qualsiasi valore diverso da zero.
Il valore delle espressioni che contengono operazioni di relazione oppure operazioni logiche è FA L S E(0)
o TRUE(1).
True se a è uguale a b a == b;
True se a non è uguale a b a != b;
True se a è minore di b a < b;
True se a è maggiore di b a > b;
True se a è minore o uguale a b a <= b;
True se a è maggiore o uguale a b a >= b;
L 'uguaglianza di due numeri reali non può essere confrontata. Nella maggior parte dei casi, due numeri
apparentemente identici possono essere diversi a causa di diversi valori nel 15esimo posto decimale.
Per poter confrontare correttamente due numeri reali, confrontare la differenza normalizzata di questi
numeri con lo zero.
Esempio:
bool CompareDoubles(double number1,double number2)
{
if(NormalizeDouble(number1-number2,8)==0) return(true);
else return(false);
}
voidOnStart()
{
double first=0.3;
double second=3.0;
double third=second-2.7;
if(first!=third)
{
if(CompareDoubles(first,third))
printf("%.16f e %.16f sono uguali",first,third);
}
}
// Result: 0.3000000000000000 0.2999999999999998 sono uguali
Vedi anche
R egole di Precedenza
Boolean Operations
Negazione Logica NOT (!)
L 'operando della negazione logica (!) deve essere di tipo aritmetico. Il risultato è TRUE (1), se il valore
operando è FAL S E (0), ed è uguale a FAL S E (0), se l'operando è diverso da FAL S E (0).
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- il primo esempio della stima breve
if(func_false() && func_true())
{
Print("Operazione &&: Non vedrai mai questa espressione");
}
else
{
Print("Operazione &&: Il risultato della prima espressione è falso, così la seconda non viene
}
//--- il secondo esempio della stima breve
if(!func_false() || !func_true())
{
Print("Operazione ||: Il risultato della prima espressione è vero, così la seconda non viene
}
else
{
Print("Operazione ||: Non vedrai mai questa espressione");
}
}
//+--------------------------------------------------------------------------------+
Vedi anche
R egole di Precedenza
b = ~n;
Esempio:
char a='a',b;
b=~a;
Print("a = ",a, " b = ",b);
// Il risultato sarà:
// a = 97 b = -98
Slittamento a Destra
La rappresentazione binaria di x è spostata a destra di y cifre. S e il valore per slittamento è del tipo
senza segno, viene fatto lo slittamento logico destra, cioè i bit liberati del lato sinistro saranno
riempiti con zeri.
Se il valore per lo slittamento è di tipo segnato, viene fatto lo slittamento aritmetico a destra, cioè le
cifre liberate del lato-sinistro verranno riempitecon il valore di un bit di segno (se il numero è
positivo, il valore del bit di segno è 0 , se il numero è negativo, il valore del bit di segno è 1).
x = x >> y;
Esempio:
char a='a',b='b';
Print("Prima: a = ",a, " b = ",b);
//--- slittamento verso destra
b=a>>1;
Print("Dopo: a = ",a, " b = ",b);
// Il risultato sarà:
// Prima: a = 97 b = 98
// Dopo: a = 97 b = 48
Slittamento sinistro
La rappresentazione binaria di x viene slittata verso sinistra di y cifre, i numeri liberati sul lato-destro
vengono riempiti con zeri.
x = x << y;
Esempio:
char a='a',b='b';
Print("Prima: a = ",a, " b = ",b);
//--- slittamento a sinistra
b=a<<1;
Non è consigliabile slittare per un numero di bit maggiore o uguale alla lunghezza della variabile
spostata, perché il risultato di tale operazione è indefinito.
Esempio:
char a='a',b='b';
//--- Operazione AND
char c=a&b;
Print("a = ",a," b = ",b);
Print("a & b = ",c);
// Il risultato sarà:
// a = 97 b = 98
// a & b = 96
L'operazione OR di bit
L 'operazione OR di bit di rappresentazioni binarie di x e y. Il valore dell'espressione contiene 1 in tutte
le cifre dove x o y non contengono 0, e contiene 0 in tutte le altre cifre.
b = x | y;
Esempio:
char a='a',b='b';
//--- Operazione OR
char c=a|b;
Print("a = ",a," b = ",b);
Print("a | b = ",c);
// Il risultato sarà:
// a = 97 b = 98
// a | b = 99
b = x ^ y;
Esempio:
char a='a', b='b';
//--- Operazione di Esclusione OR
char c=a^b;
Print("a = ",a," b = ",b);
Print("a ^ b = ",c);
// Il risultato sarà:
// a = 97 b = 98
// a ^ b = 3
Vedi anche
R egole di Precedenza
Altre Operazioni
Indicizzazione ( [] )
Quando si indirizza l' i-esimo elemento dell'array, il valore dell' espressione è il valore di una variabile
con il numero di serie i.
Esempio:
array[i] = 3; // Assegna il valore di 3 all' i-esimo elemento dell'array.
Solo un numero intero può essere indice di un array. Array a quattro dimensioni ed inferiori, sono
ammessi. Ogni misura è indicizzata da 0 a misurazione della grandezza-1. Nel caso particolare, per
un array unidimensionale costituito da 50 elementi, il riferimento al primo elemento sarà simile ad
array [0], e l'ultimo elemento sarà array [49].
Il valore dell' espressione è il valore restituito dalla funzione. S e il valore restituito è di tipo void, tale
chiamata di funzione non può essere posizionata a destra nell' operazione di assegnazione. S i noti che
le espressioni x1,...,x n vengono eseguite esattamente in questo ordine.
Esempio:
int length=1000000;
string a="a",b="b",c;
// --- Altre Operazioni
int start=GetTickCount(),stop;
long i;
for(i=0;i<length;i++)
{
c=a+b;
}
stop=GetTickCount();
Print("tempo per 'c = a + b' = ",(stop-start)," millisecondi, i = ",i);
Esempio:
Operatore punto (. )
Per l' accesso diretto ai membri pubblici delle strutture e classi viene utilizzato l'operatore punto.
S intassi :
Nome_della_variabile_del_tipo_struttura.Nome_del_membroe
Esempio:
struct SessionTime
{
string sessionName;
int startHour;
int startMinutes;
int endHour;
int endMinutes;
} st;
st.sessionName="Asian";
st.startHour=0;
st.startMinutes=0;
st.endHour=9;
st.endMinutes=0;
[Scope_name]::Function_name(parameters)
Se non c'è un nome ambito, questa è direzione esplicita di utilizzare l'ambito globale. S e non viene
eseguita alcuna operazione di risoluzione dell'ambito, la funzione è ricercata nel più vicino ambito. S e
non esiste una funzione in ambito locale, la ricerca viene eseguita in ambito globale.
L 'operazione di risoluzione dell'ambito viene utilizzata anche per definire la funzionemembro della
classe.
type Class_name::Function_name(parameters_description)
{
// corpo della funzione
}
L 'uso di diverse funzioni con lo stesso nome di diversi contesti di esecuzione in un programma può
causare ambiguità. L 'ordine di priorità delle chiamate di funzione senza esplica specificazione dello
scopo è la seguente:
1 . Imetodi della classe. S e nessuna funzione con il nome specificato viene impostata nella classe,
passare al livello successivo.
2 . F unzioni MQL5. S e il linguaggio non dispone di una tale funzione, passare al livello successivo.
3 . Funzioni globali definite dall'utente. S e non viene trovata alcuna funzione con il nome specificato,
passare al livello successivo.
4 . Funzioni importate. S e non viene trovata alcuna funzione con il nome specificato, il compilatore
restituisce un errore.
Per evitare l'ambiguità di chiamate di funzione, sempre specificare esplicitamente l'ambito funzione
utilizzando l'operazione di risoluzione della visibilità/scopo(scope).
Esempio:
#property script_show_inputs
#import "kernel32.dll"
int GetLastError(void);
#import
class CCheckContext
{
int m_id;
public:
CCheckContext() { m_id=1234; }
protected:
int GetLastError() { return(m_id); }
};
class CCheckContext2 : public CCheckContext
{
int m_id2;
public:
CCheckContext2() { m_id2=5678; }
void Print();
protected:
int GetLastError() { return(m_id2); }
};
void CCheckContext2::Print()
{
::Print("Terminal GetLastError",::GetLastError());
::Print("kernel32 GetLastError",kernel32::GetLastError());
::Print("parent GetLastError",CCheckContext::GetLastError());
::Print("our GetLastError",GetLastError());
}
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//---
CCheckContext2 test;
test.Print();
}
Esempio:
sizeof(espressione)
Qualsiasi identificatore, o nome del tipo racchiuso tra parentesi può essere utilizzato come
espressione. S i noti che il nome di tipo void non può essere utilizzato, e l'identificatore non può
appartenere al campo dei bit, o essere un nome di funzione.
S e l'espressione è il nome di un array statico (cioè è data la prima dimensione), allora il risultato è la
grandezza dell'intero array (cioè il prodotto del numero di elementi e la lunghezza del tipo). S e
l'espressione è il nome di un array dinamico (la prima dimensione non è specificata), il risultato sarà la
grandezza dell'oggetto dell' array dinamico.
Quando sizeof viene applicato al nome del tipo struttura o classe, o all'identificatore del tipo struttura
o classe, il risultato è la grandezza effettiva della struttura o classe.
Esempio:
struct myStruct
{
char h;
int b;
double f;
} str;
Print("sizeof(str) = ",sizeof(str));
Print("sizeof(myStruct) = ",sizeof(myStruct));
Vedi anche
R egole di Precedenza
Regole di Precedenza
Each group of operations in the table has the same priority. T he higher the priority of operations is,
the higher it is position of the group in the table. La regole di precedenza determinano il
raggruppamento delle operazioni ed operandi.
Attenzione: La precedenza delle operazioni in linguaggio MQL5 corrisponde alla priorità adottato in C+
+, e si differenzia dalla priorità data nel linguaggio MQL 4.
struttura
sizeof Typecasting
Determinazione della
grandezza in byte
% Modulo divisione
Per modificare l'ordine di esecuzione dell'operazione, vengono usate le parentesi, che sono di più alta
priorità.
Operatori
G li operatori del linguaggio descrivono alcune operazioni algoritmiche che devono essere eseguite per
realizzare un compito. Il corpo del programma è una sequenza di tali operatori. Gli operatori si
susseguono uno ad uno, e sono separati da un punto e virgola.
Operatore Descrizione
Operatore Composto {} U no o più operatori di qualsiasi tipo, racchiuso
tra parentesi graffe {}
scelta
Un operatore può occupare una o più righe. Due o più operatori possono trovarsi nella stessa riga. Gli
operatori che controllano oltre l'ordine di esecuzione (if, if-else, s witch, while e for) possono essere
annidati l'uno nell'altro.
Esempio:
if(Month() == 12)
if(Day() == 31) Print("Felice Anno Nuovo!");
Vedi anche
nizializzazione delle Variabili, Visibilità Ambito e Durata delle Variabili, Creazione ed Eliminazione di
I
Oggetti
Operatore Composto
Un operatore composto (un blocco) è costituito da uno o più operatori di qualsiasi tipo, racchiusi tra
parentesi graffe {}. La parentesi graffa di chiusura non deve essere seguita da un punto e virgola (;).
Esempio:
if(x==0)
{
Print("invalid position x = ",x);
return;
}
Vedi anche
nizializzazione delle Variabili, Visibilità Ambito e Durata delle Variabili, Creazione ed Eliminazione di
I
Oggetti
Operatore Espressione
Qualsiasi espressione seguita da un punto e virgola (;) è un operatore. Ecco alcuni esempi di operatori
di espressione.
Operatore di assegnazione
I dentificatore = espressione;
x=3;
y=x=3;
bool equal=(x==y);
L ' operatore di assegnazione può essere utilizzato più volte in un'espressione. In this case, the
ex pression is processed from right to left.
FileClose(file);
Operatore Vuoto
Costituito solo da un punto e virgola (;) e viene usato per indicare un corpo vuoto di un operatore di
controllo.
Vedi anche
nizializzazione delle Variabili, Visibilità Ambito e Durata delle Variabili, Creazione ed Eliminazione di
I
Oggetti
Operatore Return
L 'operatore return termina l'esecuione della corrente funzione e restituisce il controllo al programma
chiamante. Il risultato del calcolo dell'espressione viene restituito alla funzione chiamante.
L 'espressione può contenere un operatore di assegnazione.
Esempio:
int CalcSum(int x, int y)
{
return(x+y);
}
I n funzioni con il tipo di ritorno void, l' opratore return deve essere utilizzato senza espressione:
void SomeFunction()
{
Print("Ciao!");
return; // questo operatore può essere rimosso
}
La parentesi graffa destra della funzione significa esecuzione implicita dell' operatore return senza
l'espressione.
Che cosa può essere restituito: tipi semplici, strutture semplici, puntatori agli oggetti. Con l'
operatore return non si è in grado di restituire nessun array, oggetti della classe, variabili di tipo
composto struttura.
Vedi anche
nizializzazione delle Variabili, Visibilità Ambito e Durata delle Variabili, Creazione ed Eliminazione di
I
Oggetti
if (espressione)
operatore1
else
operatore2
Se l'espressione è vera, operatore1 viene eseguito ed il controllo viene dato all'operatore che segue
operatore2 (operatore2 non viene eseguito). S e l'espressione è falsa, operatore2 viene eseguito.
La parte else dell'operatore if può essere omessa. Cos ì, una divergenza può apparire in operatori if
annidati con la parte else omessa. In questo caso, else indirizza al più vicino precedente operatore if
nello stesso blocco che non ha la parte else.
Esempi:
//--- La parte else si riferisce alla seconda se l'operatore:
if(x>1)
if(y==2) z=5;
else z=6;
//--- La parte else si riferisce al primo se l'operatore:
if(x>l)
{
if(y==2) z=5;
}
else z=6;
//--- Operatori nidificati
if(x=='a')
{
y=1;
}
else if(x=='b')
{
y=2;
z=3;
}
else if(x=='c')
{
y=4;
}
else Print("ERROR");
Vedi anche
nizializzazione delle Variabili, Visibilità Ambito e Durata delle Variabili, Creazione ed Eliminazione di
I
Oggetti
Operatore Ternario ?:
La forma generale dell' operatore ternario è la seguente:
Per il primo operando - " ex pression1" - qualsiasi espressione che si traduce in valore di tipo bool può
essere utilizzata. S e il risultato è true, allora viene eseguito l'operatore stabilito dal secondo operando,
vale a dire " ex pression2" .
S e il primo operando è false, viene eseguito il terzo operando - " ex pression3" . Il secondo operando ed
il terzo operando, vale a dire " ex pression2" ed " ex pression3" devono restituire i valori di un certo tipo
e non devono essere di tipo void. Il risultato dell'esecuzione dell' operatore condizionale è il risultato di
ex pression2 o risultato dei ex pression3, a seconda del risultato di ex pression1.
//--- normalizzare la differenza tra il prezzo di apertura e chiusura per un intervallo di giorni
double true_range = (High==Low)?0:(Close-Open)/(High-Low);
double true_range;
if(High==Low)true_range=0; // se High e Low sono uguali
else true_range=(Close-Open)/(High-Low); // se il range non è nullo
1 . Non confondere il tipo definito dall'utente con il tipo semplice o l' enumerazione. NU LL può essere
utilizzato per puntatore.
2 . S e tipi di valori sono semplici, l'operatore sarà del tipo massimo (vedere T ipo di casting).
3 . Se uno dei valori è un' enumerazione ed il secondo è di tipo numerico, l'enumerazione viene
sostituita da int e la seconda regola viene applicata.
4 . Se entrambi i valori sono enumerazioni, i loro tipi devono essere identici, e l'operatore sarà di tipo
enumerazione.
a) I tipi devono essere identici o uno deve essere derivato derivato dall'altro.
b) S e i tipi non sono identici (ereditarietà), allora il figlio è implicitamente castato al genitore, cioè
l'operatore sarà di tipo genitore.
c) D a non confondere l'oggetto ed il puntatore - entrambe le espressioni sono o oggetti o puntatori.
NU LL non può essere usato per il puntatore.
Nota
Fare attenzione quando si usa l'operatore condizionale come argomento di una funzione overloaded,
perchè il tipo di risultato di un operatore condizionale è definito al momento della compilazione del
programma. And this type is defined as the larger of the types " ex pression2" and " ex pression3" .
Esempio:
void func(double d) { Print("argomento double: ",d); }
void func(string s) { Print("argomento string: ",s); }
bool Expression1=true;
double Expression2=M_PI;
string Expression3="3.1415926";
voidOnStart()
{
func(Expression2);
func(Expression3);
// Risultato:
// argomento double: 3.141592653589793
// argomento string: 3.1415926
// argomento string: 3.141592653589793
// argomento string: 3.1415926
Vedi anche
nizializzazione delle Variabili, Visibilità Ambito e Durata delle Variabili, Creazione ed Eliminazione di
I
Oggetti
Operatore Switch
Confronta il valore di espressione con costanti in tutte le varianti case e passa il controllo all'operatore
che corrisponde al valore dell' espressione. Ogni variante di case può essere contrassegnata con una
costante intera, una costante letterale o un'espressione costante. L 'espressione costante non può
contenere variabili o chiamate di funzione. L ' espressione dell'operatore switch deve essere di tipo
integer – int oppure uint.
switch(expression)
{
case costante: operatori
case costante: operatori
...
default: oeratori
}
Gli operatori contrassegnati dall'etichetta default vengono eseguiti se nessuna delle costanti
nell'operatore case è uguale al valore dell'espressione. La variante default non deve essere
necessariamente dichiarata e non deve essere necessariamente l'ultima. S e nessuna delle costanti
corrisponde al valore dell' espressione e la variante default non è disponibile, non vengono eseguite
azioni.
La parola chiave case con una costante sono solo etichette, e se gli operatori vengono eseguiti per una
certa variante case, il programma esegue ulteriormente gli operatori di tutte le varianti successive
fino a che non si verifica l'operatore break. Permette di collegare una sequenza di operatori con
diverse varianti.
n espressione costante è calcolata in fase di compilazione. Non ci sono due costanti in un operatore
U '
Esempi:
//--- Primo esempio
switch(x)
{
case 'A':
Print("CASE A");
break;
case 'B':
case 'C':
Print("CASE B or C");
break;
default:
Print("NOT A, B or C");
break;
}
{
case 1:
res=i;break;
default:
res="default";break;
case 2:
res=i;break;
case 3:
res=i;break;
}
Print(res);
/*
Result
default
*/
Vedi anche
nizializzazione delle Variabili, Visibilità Ambito e Durata delle Variabili, Creazione ed Eliminazione di
I
Oggetti
while(espressione)
operatore;
S e l'espressione è vera, l'operatore viene eseguito finchè l'espressione non diventa falsa. S e
l'espressione è falsa, il controllo viene passato al prossimo operatore. Il valore dell'espressione è
definito prima che l'operatore venga eseguito. Pertanto, se l'espressione è falsa dall'inizio, l'operatore
non verrà eseguito per niente.
Nota
Se si prevede che in un ciclo saranno trattate un gran numero di iterazioni, è consigliabile che si vada
a verificare il fatto della terminazione forzata del programma utilizzando la funzioneIs S topped().
Esempio:
while(k<n && !IsStopped())
{
y=y*x;
k++;
}
Vedi anche
nizializzazione delle Variabili, Visibilità Ambito e Durata delle Variabili, Creazione ed Eliminazione di
I
Oggetti
Espressione1 descrive l'inizializzazione del ciclo. Espressione2 verifica le condizioni della terminazione
del ciclo. S e è vera, il corpo del ciclo for viene eseguito. Il ciclo si ripete fino a quando ex pression2
diventa falsa. S e è false, il ciclo viene terminato, ed il controllo viene dato all'operatore successivo.
Espressione3 viene calcolata dopo ogni iterazione.
espressione1;
while(Espressione2)
{
operatore;
espressione3
};
U na qualunque delle tre, o tutte e tre, le espressioni, possono essere assenti nell'operatore for, ma il
punto e virgola (;) che le separa non deve essere omesso. S e espressione2 è omessa, è considerata
sempre vero. L 'operatore for(;;) è un loop continuo, equivalente all'operatore while(1). Ogni
espressione 1 o 3 può essere costituita da diverse espressioni combinate tramite un operatore virgola
', '.
Nota
Se si prevede che in un ciclo saranno trattate un gran numero di iterazioni, è consigliabile che si vada
a verificare il fatto della terminazione forzata del programma utilizzando la funzioneIs S topped().
Esempi:
for(x=1;x<=7000; x++)
{
if(IsStopped())
break;
Print(MathPower(x,2));
}
//--- Altro esempio
for(;!IsStopped();)
{
Print(MathPower(x,2));
x++;
if(x>10) break;
}
//--- Terzo esempio
for(i=0,j=n-l;i<n && !IsStopped();i++,j--) a[i]=a[j];
Vedi anche
nizializzazione delle Variabili, Visibilità Ambito e Durata delle Variabili, Creazione ed Eliminazione di
I
Oggetti
do
operatore;
while(espressione);
Prima l'operatore viene eseguito, poi l'espressione viene calcolata. S e è vero, allora l'operatore viene
eseguito nuovamente, e cos ì via. S e l'espressione diventa falsa, il ciclo termina.
Nota
Se si prevede che in un ciclo saranno trattate un gran numero di iterazioni, è consigliabile che si vada
a verificare il fatto della terminazione forzata del programma utilizzando la funzioneIs S topped().
Esempio:
//--- Calcolo della serie di Fibonacci
int counterFibonacci=15;
int i=0,first=0,second=1;
int currentFibonacciNumber;
do
{
currentFibonacciNumber=first+second;
Print("i = ",i," currentFibonacciNumber = ",currentFibonacciNumber);
first=second;
second=currentFibonacciNumber;
i++; // senza questo operatore apparirà un loop infinito!
}
while(i<counterFibonacci && !IsStopped());
Vedi anche
nizializzazione delle Variabili, Visibilità Ambito e Durata delle Variabili, Creazione ed Eliminazione di
I
Oggetti
Break Operator
L 'operatore break interrompe l'esecuzione del più vicino esteriore, nidificato: s witch, while, do-while o
for operatore. Il controllo viene passato all'operatore che segue quello terminato. Uno degli scopi di
questo operatore è terminare il ciclo di esecuzione quando un certo valore viene assegnato ad una
variabile.
Esempio:
//--- ricerca per il primo elemento zero
for(i=0;i<array_size;i++)
if(array[i]==0)
break;
Vedi anche
nizializzazione delle Variabili, Visibilità Ambito e Durata delle Variabili, Creazione ed Eliminazione di
I
Oggetti
Operatore Continue
L ' operatore continue passa il controllo all'inizio dell'operatore di ciclo esterno più vicino while, do-while
o for, all'iterazione successiva chiamata. Lo scopo di questo operatore è opposto a quello dell'
operatore break .
Esempio:
//--- Somma di tutti gli elementi diversi da zero
int func(int array[])
{
int array_size=ArraySize(array);
int sum=0;
for(int i=0;i<array_size; i++)
{
if(a[i]==0) continue;
sum+=a[i];
}
return(sum);
}
Vedi anche
nizializzazione delle Variabili, Visibilità Ambito e Durata delle Variabili, Creazione ed Eliminazione di
I
Oggetti
I l nuovo operatore può essere applicato solo ad oggetti classe. Non può essere applicato a strutture.
L 'operatore non deve essere usato per creare array di oggetti. Per effettuare uesta operazione,
q
Esempio:
//+--------------------------------------------------------------------------------+
//| Creazione figura |
//+--------------------------------------------------------------------------------+
void CTetrisField::NewShape()
{
m_ypos=HORZ_BORDER;
//--- a caso crea una delle 7 forme possibili
int nshape=rand()%7;
switch(nshape)
{
case 0: m_shape=new CTetrisShape1; break;
case 1: m_shape=new CTetrisShape2; break;
case 2: m_shape=new CTetrisShape3; break;
case 3: m_shape=new CTetrisShape4; break;
case 4: m_shape=new CTetrisShape5; break;
case 5: m_shape=new CTetrisShape6; break;
case 6: m_shape=new CTetrisShape7; break;
}
//--- draw
if(m_shape!=NULL)
{
//--- pre-settings
m_shape.SetRightBorder(WIDTH_IN_PIXELS+VERT_BORDER);
m_shape.SetYPos(m_ypos);
m_shape.SetXPos(VERT_BORDER+SHAPE_SIZE*8);
//--- draw
m_shape.Draw();
}
//---
}
U n oggetto creato con l'operatore new deve essere esplicitamente rimosso usando l'operatore delete.
Vedi anche
nizializzazione delle Variabili, Visibilità Ambito e Durata delle Variabili, Creazione ed Eliminazione di
I
Oggetti
Esempio:
//--- elimina figura
delete m_shape;
m_shape=NULL;
//--- crea una nuova figura
NewShape();
Vedi anche
nizializzazione delle Variabili, Visibilità Ambito e Durata delle Variabili, Creazione ed Eliminazione di
I
Oggetti
Funzioni
Ogni operazione può essere divisa in sottoattività, ciascuna delle quali può essere direttamente
rappresentata sotto forma di un codice, o suddivisa in piccole sotto-attività. Questo metodo è
chiamato raffinamento per passi successivi. Le funzioni vengono utilizzate per scrivere il codice di
sotto-compiti da risolvere. Il codice che descrive ciò che è una funzione, viene chiamato definizione di
funzione:
intestazione_funzione
{
le istruzioni
}
Tutto ciò che è prima della prima parentesi graffa è l' intestazione della definizione di funzione, e ciò
che è tra le parentesi graffe è il corpo della definizione della funzione. L 'intestazione funzione
comprende una descrizione del tipo di valore di ritorno, il nome (identificatore) e parametri formali. Il
numero di parametri passati alla funzione è limitato e non può superare i 64.
La funzione può essere chiamata da altre parti del programma, tante volte quanto necessario. Infatti,
il tipo di ritorno, identificatore della funzione e tipi di parametri costituiscono la funzione prototipo.
Il prototipo della funzione è la dichiarazione della funzione, ma non la sua definizione. A causa della
dichiarazione esplicita del tipo di return e l' elenco dei tipi di argomento, un controllo di tipo restrittivo
ed il typecasting implicito, sono possibili durante le chiamate di funzione. Molto spesso le dichiarazioni
di funzione vengono utilizzate nelle classi per migliorare la leggibilità del codice.
La definizione della funzione deve corrispondere esattamente alla sua dichiarazione. Ogni funzione
dichiarata deve essere definita.
Esempio:
double // tipo di valore di ritorno(_*return)
linfunc (double a, double b) // nome funzione ed elenco parametri
{
// valore di ritorno
return (a + b); // dell'operatore composito
}
L 'operatore return può restituire il valore di un'espressione che trova in questo operatore. S e
necessario, il valore dell' espressione viene convertito nel tipo di risultato della funzione. Cosa può
essere restituito: tipi semplici, strutture semplici, puntatori agli oggetti. Con l'operatore return non
puoi restituire nessun array, oggetti classe, variabili di tipo struttura composta.
U na funzione non restituisce un valore dev 'essere descritta come tipo void.
Esempio:
void errmesg(string s)
{
Print("errore: "+s);
}
Iparametri passati alla funzione possono avere valori di default, che sono definiti dalle costanti di
quel tipo.
Esempio:
int unaqualchefunzione(double a,
double d=0.0001,
int n=5,
bool b=true,
string s="stringa passata")
{
Print("Parametro Richiesto a = ",a);
Print("Passa i seguenti parametri: d = ",d," n = ",n," b = ",b," s = ",s);
return(0);
}
Se uno dei parametri ha un valore di default, tutti i parametri successivi devono avere anche valori di
default.
Vedi anche
Overload, Funzioni Virtuali, Polimorfismo
Chiamate di funzione
Se un nome che non è stato descritto in precedenza, appare nell'espressione ed è seguito da parentesi
sinistra, viene contestualmente considerato come il nome di una funzione.
Argomenti (parametri formali) vengono passati per valore, ad es. ogni espressione x1,..., x n viene
calcolata, ed il valore viene passato alla funzione. L 'ordine di calcolo delle espressioni e l'ordine di
caricamento dei valori non sono garantiti. Durante l'esecuzione, il sistema controlla il numero e il tipo
di argomenti passati alla funzione. T al modo di affrontare la funzione viene chiamato una chiamata
valore.
Chiamata di funzione è un'espressione, il cui valore è il valore restituito dalla funzione. Il tipo di
funzione sopra descritto deve corrispondere con il tipo del valore di ritorno. La funzione può essere
dichiarata o descritta in qualsiasi parte del programma a portata globale, cioè, al di fuori di altre
funzioni. La funzione non può essere dichiarata o descritta all'interno di un'altra funzione.
Esempi:
int start()
{
double some_array[4]={0.3, 1.4, 2.5, 3.6};
double a=linfunc(some_array, 10.5, 8);
//...
}
double linfunc(double x[], double a, double b)
{
return (a*x[0] + b);
}
A lla chiamata di una funzione con parametri di default, l'elenco dei parametri da passare può essere
limitato, ma non prima del primo parametro predefinito.
Esempi:
void somefunc(double init,
double sec=0.0001, //impostazione valori default
int level=10);
//...
somefunc(); // Chiamata sbagliata. Il primo parametro deve essere presentato.
somefunc(3.14); // Chiamata corretta
somefunc(3.14,0.0002); // Chiamata corretta
somefunc(3.14,0.0002,10); // Chiamata corretta
Quando si chiama una funzione, non si possono saltare parametri, anche quelli con valori di default:
Vedi anche
Overload, Funzioni Virtuali, Polimorfismo
Passaggio di parametri
Ci sono due metodi, con cui il linguaggio macchina può passare argomenti ad un sottoprogramma
(funzione). Il primo metodo è quello di inviare un parametro per valore. Questo metodo copia il valore
dell' argomento in un parametro di funzione formale. Pertanto, le variazioni di questo parametro
all'interno della funzione non hanno alcuna influenza sull'argomento della corrispondente chiamata.
//+--------------------------------------------------------------------------------+
//| Passaggio di parametri per valore |
//+--------------------------------------------------------------------------------+
double FirstMethod(int i,int j)
{
double res;
//---
i*=2;
j/=2;
res=i+j;
//---
return(res);
}
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//---
int a=14,b=8;
Print("a e b prima della chiamata:",a," ",b);
double d=FirstMethod(a,b);
Print("a e b dopo la chiamata:",a," ",b);
}
//--- Risultato dell'esecuzione dello script
// a e b prima della chiamata: 14 8
// a e b dopo la chiamata: 14 8
Il secondo metodo è passare per riferimento. In questo caso, il riferimento ad un parametro (non al
suo valore) viene passato ad un parametro di funzione. All'interno della funzione, viene utilizzato per
fare riferimento al parametro attuale specificato nella chiamata. Ciò significa che le modifiche dei
parametri influenzeranno l'argomento utilizzato per chiamare la funzione.
//+--------------------------------------------------------------------------------+
//| Passaggio di parametri per riferimento |
//+--------------------------------------------------------------------------------+
double SecondMethod(int &i,int &j)
{
double res;
//---
i*=2;
j/=2;
res=i+j;
//---
return(res);
}
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//---
int a=14,b=8;
Print("a e b prima della chiamata:",a," ",b);
double d=SecondMethod(a,b);
Print("a e b dopo la chiamata:",a," ",b);
}
//+--------------------------------------------------------------------------------+
//--- risultato dell'esecuzione dello script
// a e b prima della chiamata: 14 8
// a e b dopo la chiamata: 28 4
MQL5 utilizza entrambi i metodi, con una sola eccezione: gli array, le variabili di tipo struttura e gli
oggetti della classe sono sempre passati per riferimento. Al fine di evitare variazioni di parametri
attuali (argomenti passati alla chiamata di funzione) utilizziamo lo specificatore di accesso const.
Quando si tenta di modificare il contenuto di una variabile dichiarata con l'identificatore const , il
compilatore genera un errore.
Nota
Va notato che i parametri vengono passati ad una funzione in ordine inverso, cioè, prima viene
calcolato e passato l'ultimo parametro, e poi il penultimo, e cos ì via. L 'ultimo parametro calcolato e
passato è quello che sta prima dopo la parentesi di apertura.
Esempio:
voidOnStart()
{
//---
int a[]={0,1,2};
int i=0;
}
//+--------------------------------------------------------------------------------+
//| |
//+--------------------------------------------------------------------------------+
void func(int par1,int par2,string comment)
{
Print(comment,": par1 = ",par1," par2 = ",par2);
}
Nella prima chiamata (vedi esempio sopra) la variabile i viene prima usata nella concatenazione
stringhe:
Qui il suo valore non cambia. Poi la variabile i viene utilizzata nel calcolo dell'elemento dell' array a[i+
+], cioè quando si accede all'elemento dell'array con indice i, la variabile i viene incrementata. E solo
N ella seconda chiamata lo stesso valore di i (calcolato sulla prima fase della chiamata di funzione)
viene utilizzato per calcolare tutti i tre i parametri. S olo dopo che il primo parametro viene calcolato,
la variabile i viene modificata di nuovo.
Vedi anche
isibilità Ambito e Durata delle Variabili,L 'Overload, Funzioni Virtuali, Polimorfismo
V
L'overloading di funzioni
D i solito il nome della funzione tende a riflettere il suo scopo principale. Di regola, i programmi
leggibili e contengono vari ben selezionati identificatori. T alvolta funzioni diverse vengono utilizzate
per gli stessi scopi. Consideriamo, per esempio, una funzione che calcola il valore medio di un array di
numeri a doppia precisione e la stessa funzione, ma operante con un array di interi. Entrambi sono
comodi da poter essere chiamati AverageFromArray:
//+--------------------------------------------------------------------------------+
//| Il calcolo della media per un array di tipo double |
//+--------------------------------------------------------------------------------+
double AverageFromArray(const double & array[],int size)
{
if(size<=0) return 0.0;
double sum=0.0;
double aver;
//---
for(int i=0;i<size;i++)
{
sum+=array[i]; // Sommatoria per il double
}
aver=sum/size; // Divisione della somma per il numero
//---
Print("Calcolo della media per un array di tipo double");
return aver;
}
//+--------------------------------------------------------------------------------+
/ / | Il calcolo della media per un array di tipo int |
//+--------------------------------------------------------------------------------+
double AverageFromArray(const int & array[],int size)
{
if(size<=0) return 0.0;
double aver=0.0;
int sum=0;
//---
for(int i=0;i<size;i++)
{
sum+=array[i]; // Sommatoria per l'int
}
aver=(double)sum/size;// Dare la quantità di tipo double, e dividere
//---
Print("Calcolo della media per un array di tipo int");
return aver;
}
Il compilatore seleziona una funzione necessaria in conformità con i tipi degli argomenti e la loro
quantità. La regola, secondo cui la scelta è fatta, è chiamata algoritmo signature matching. Una
Esempio:
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//---
int a[5]={1,2,3,4,5};
double b[5]={1.1,2.2,3.3,4.4,5.5};
double int_aver=AverageFromArray(a,5);
double double_aver=AverageFromArray(b,5);
Print("int_aver = ",int_aver," double_aver = ",double_aver);
}
//--- Risultato dello script
// Calcola la media per un array di tipo int
// Calcola la media per un array di tipo double
// int_aver= 3.00000000 double_aver= 3.30000000
Il function overloading è un processo di creazione di più funzioni con lo stesso nome, ma parametri
diversi. Ciò significa che in varianti overload di una funzione, il numero di argomenti e/o i loro tipi
devono essere diversi. Una specifica variante di funzione viene selezionata in base alla corrispondenza
della lista di argomenti quando si chiama la funzione, per l'elenco dei parametri nella dichiarazione di
funzione.
Quando una funzione in overload viene chiamata, il compilatore deve avere un algoritmo per
selezionare la funzione appropriata. L 'algoritmo che esegue questa scelta dipende dai castings di quali
tipi sono presenti. La migliore corrispondenza deve essere univoca. Una funzione overloadata deve
essere il miglior connubio tra tutte le altre varianti di almeno un argomento. Allo stesso tempo, deve
corrispondere per tutti gli altri argomenti, non peggio di altre varianti.
N aturalmente, lo strict matching è il migliore. Per ottenere una tale consistenza può essere utilizzato
typecasting. Il compilatore non può far fronte a situazioni ambigue. Pertanto non si dovrebbe fare
affidamento su sottili differenze di tipi e conversioni implicite che rendono poco chiara la funzione di
overload.
S e avete dei dubbi, utilizzare la conversione esplicita per garantire il rispetto rigoroso.
Esempio:
// 1. overload consentito - la funzione differisce dalla funzione incorporata MathMax() nel numero
double MathMax(double a,double b,double c);
Vedi anche
Overload, Funzioni Virtuali, Polimorfismo
Operazione Overloading
Per facilità di lettura e scrittura di codice, l'overloading di alcune operazioni è consentito. L ' operatore
overloading è scritto usando la parola chiave operator. I seguenti operatori possono essere sottoposti
ad overload:
· binari +,-,/,*,%,<<,>>,==,!=,<,>,<=,>=,=,+=,-=,/=,*=,%=,&=,|=,^=,<<=,>>=,&&,||,&,|,^
· unari +,-,++,--,!,~
· operatore di assegnazione =
· operatore di indicizzazione []
L 'operazione di overloading consente l'utilizzo della notazione operativa (scritta in forma di espressioni
semplici) per gli oggetti complessi - strutture e classi. La scrittura di espressioni utilizzando le
operazioni di overload semplifica la visualizzazione del codice sorgente, perché una implementazione
più complessa è nascosta.
Per esempio, consideriamo numeri complessi, che sono composti dalla parte reale e quella
immaginaria. Essi sono ampiamente utilizzati in matematica. Il linguaggio MQL5 non ha un tipo di dati
per rappresentare numeri complessi, ma è possibile creare un nuovo tipo di dati nella forma di una
struttura o classe. Dichiarare la struttura complessa e definire i quattro metodi che implementano
quattro operazioni aritmetiche:
//+--------------------------------------------------------------------------------+
//| Una struttura per le operazioni con i numeri complessi |
//+--------------------------------------------------------------------------------+
struct complex
{
double re; // Parte reale
double im; // Parte immaginaria
//--- Costruttori
complex():re(0.0),im(0.0) { }
complex(const double r):re(r),im(0.0) { }
complex(const double r,const double i):re(r),im(i) { }
complex(const complex &o):re(o.re),im(o.im) { }
//--- Operazioni aritmetiche
complex Add(const complex &l,const complex &r) const; // Adizione
complex Sub(const complex &l,const complex &r) const; // Sottrazione
complex Mul(const complex &l,const complex &r) const; // Moltiplicazione
complex Div(const complex &l,const complex &r) const; // Divisione
};
Ora, nel nostro codice possiamo dichiarare variabili che rappresentano i numeri complessi, e lavorare
con esse.
A d esempio:
voidOnStart()
{
// --- Dichiara e inizializza le variabili del tipo complesso
complex a(2,4),b(-4,-2);
PrintFormat("a=%.2f+i*%.2f, b=%.2f+i*%.2f",a.re,a.im,b.re,b.im);
//--- Sommare due numeri
complex z;
z=a.Add(a,b);
PrintFormat("a+b=%.2f+i*%.2f",z.re,z.im);
//--- Moltiplicare due numeri
z=a.Mul(a,b);
PrintFormat("a*b=%.2f+i*%.2f",z.re,z.im);
//--- Dividere due numeri
z=a.Div(a,b);
PrintFormat("a/b=%.2f+i*%.2f",z.re,z.im);
//---
}
L ' operatore parola chiave viene utilizzato per la definizione di una funzione membro che esegue la
conversione del tipo. Operazioni unarie e binarie per le variabili oggetto della classe possono essere
sovraccaricate come funzioni membro non-statiche. Esse implicitamente agiscono sull' oggetto della
classe.
G ran parte delle operazioni binarie possono essere sovraccaricate come funzioni regolari che accettano
uno o entrambi gli argomenti come variabile della classe o un puntatore ad un oggetto di questa
classe. Per il nostro tipo complesso, l'overloading nella dichiarazione sarà simile a questa:
//--- Operatori
complex operator+(const complex &r) const { return(Add(this,r)); }
complex operator-(const complex &r) const { return(Sub(this,r)); }
complex operator*(const complex &r) const { return(Mul(this,r)); }
complex operator/(const complex &r) const { return(Div(this,r)); }
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- Dichiara ed inizializza le variabili di tipo complex
complex a(2,4),b(-4,-2);
PrintFormat("a=%.2f+i*%.2f, b=%.2f+i*%.2f",a.re,a.im,b.re,b.im);
//a.re=5;
//a.im=1;
//b.re=-1;
//b.im=-5;
//--- Sommare due numeri
complex z=a+b;
PrintFormat("a+b=%.2f+i*%.2f",z.re,z.im);
z=a*b;
PrintFormat("a*b=%.2f+i*%.2f",z.re,z.im);
//--- Dividere due numeri
z=a/b;
PrintFormat("a/b=%.2f+i*%.2f",z.re,z.im);
//---
}
//+--------------------------------------------------------------------------------+
//| Una struttura per le operazioni con i numeri complessi |
//+--------------------------------------------------------------------------------+
struct complex
{
double re; // Parte reale
double im; // Parte immaginaria
//--- Costruttori
complex():re(0.0),im(0.0) { }
complex(const double r):re(r),im(0.0) { }
complex(const double r,const double i):re(r),im(i) { }
complex(const complex &o):re(o.re),im(o.im) { }
//--- Operazioni aritmetiche
complex Add(const complex &l,const complex &r) const; // Adizione
complex Sub(const complex &l,const complex &r) const; // Sottrazione
complex Mul(const complex &l,const complex &r) const; // Moltiplicazione
complex Div(const complex &l,const complex &r) const; // Divisione
//--- Operatori Binari
complex operator+(const complex &r) const { return(Add(this,r)); }
complex operator-(const complex &r) const { return(Sub(this,r)); }
complex operator*(const complex &r) const { return(Mul(this,r)); }
complex operator/(const complex &r) const { return(Div(this,r)); }
};
//+--------------------------------------------------------------------------------+
//| Addizione |
//+--------------------------------------------------------------------------------+
complex complex::Add(const complex &l,const complex &r) const
{
complex res;
//---
res.re=l.re+r.re;
res.im=l.im+r.im;
//--- Risultato
return res;
}
//+--------------------------------------------------------------------------------+
//| Sottrazione |
//+--------------------------------------------------------------------------------+
complex complex::Sub(const complex &l,const complex &r) const
{
complex res;
//---
res.re=l.re-r.re;
res.im=l.im-r.im;
//--- Risultato
return res;
}
//+--------------------------------------------------------------------------------+
//| Moltiplicazione |
//+--------------------------------------------------------------------------------+
complex complex::Mul(const complex &l,const complex &r) const
{
complex res;
//---
res.re=l.re*r.re-l.im*r.im;
res.im=l.re*r.im+l.im*r.re;
//--- Risultato
return res;
}
//+--------------------------------------------------------------------------------+
//| Divisione |
//+--------------------------------------------------------------------------------+
complex complex::Div(const complex &l,const complex &r) const
{
//--- Numeri complessi vuoti
complex res(EMPTY_VALUE,EMPTY_VALUE);
//--- Controlla per lo zero
if(r.re==0 && r.im==0)
{
Print(__FUNCTION__+": il numero è zero");
return(res);
}
//--- Variabili ausiliarie
double e;
double f;
//--- Seleziona variante di calcolo
if(MathAbs(r.im)<MathAbs(r.re))
{
e = r.im/r.re;
f = r.re+r.im*e;
res.re=(l.re+l.im*e)/f;
res.im=(l.im-l.re*e)/f;
}
else
{
e = r.re/r.im;
f = r.im+r.re*e;
res.re=(l.im+l.re*e)/f;
res.im=(-l.re+l.im*e)/f;
}
//--- Risultato
return res;
}
Gran parte delle operazioni unarie per le classi possono essere sovraccaricate come funzioni ordinarie
che accettano un solo argomento di oggetto della classe o un puntatore ad essa. Aggiungere
overloading di operazioni unarie " -" e " !" .
//+--------------------------------------------------------------------------------+
//| Una struttura per le operazioni con i numeri complessi |
//+--------------------------------------------------------------------------------+
struct complex
{
double re; // Parte Reale
double im; // Parte Immaginaria
...
//--- Operatori Unari
complex operator-() const; // Meno unario
bool operator!() const; // Negazione
};
...
//+--------------------------------------------------------------------------------+
//| Fare l'Overloading dell'operatore "meno unario" |
//+--------------------------------------------------------------------------------+
complex complex::operator-() const
{
complex res;
//---
res.re=-re;
res.im=-im;
//--- Risultato
return res;
}
//+--------------------------------------------------------------------------------+
//| Fare l'Overloading dell'operatore "negazione logica" |
//+--------------------------------------------------------------------------------+
bool complex::operator!() const
{
//--- Le parti reale ed immaginaria del numero complesso sono pari a zero?
return (re!=0 && im!=0);
}
Ora siamo in grado di controllare il valore di un numero complesso per lo zero ed ottenere un valore
negativo:
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- Dichiara ed inizializza le variabili di tipo complex
complex a(2,4),b(-4,-2);
PrintFormat("a=%.2f+i*%.2f, b=%.2f+i*%.2f",a.re,a.im,b.re,b.im);
//--- Divide i due numeri
complex z=a/b;
PrintFormat("a/b=%.2f+i*%.2f",z.re,z.im);
//--- Un numero complesso è uguale a zero per default (nel costruttore di default re==0 ed im==0)
zero complesso;
Print("!zero=",!zero);
//--- Assegna un valore negativo
zero=-z;
PrintFormat("z=%.2f+i*%.2f, zero=%.2f+i*%.2f",z.re,z.im, zero.re,zero.im);
PrintFormat("-zero=%.2f+i*%.2f",-zero.re,-zero.im);
//--- Controlla per lo zero ancora una volta
Print("!zero=",!zero);
//---
}
S i noti che non abbiamo dovuto overloadare l'operatore di assegnazione " =" , come nelle strutture di
tipi semplici che possono essere copiate direttamente una dentro l'altra. Quindi, possiamo ora scrivere
un codice per i calcoli che coinvolgono numeri complessi nel modo consueto.
//+--------------------------------------------------------------------------------+
//| Classe per accedere ai simboli nella stringa come array di simboli |
//+--------------------------------------------------------------------------------+
class CString
{
string m_string;
public:
CString(string str=NULL):m_string(str) { }
ushort operator[] (int x) { return(StringGetCharacter(m_string,x)); }
};
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
void OnStart()
{
//--- Un array per ricevere i simboli da una stringa
int x[]={ 19,4,18,19,27,14,15,4,17,0,19,14,17,27,26,28,27,5,14,
17,27,2,11,0,18,18,27,29,30,19,17,8,13,6 };
CString str("abcdefghijklmnopqrstuvwxyz[ ]CS");
string res;
//--- Fa una frase utilizzando i simboli dalla variabile str
for(int i=0,n=ArraySize(x);i<n;i++)
{
res+=ShortToString(str[x[i]]);
}
//--- Mostra i risultati
Print(res);
}
Un altro esempio di sovraccarico della operazione di indicizzazione sono le operazioni con gli array. La
matrice rappresenta un array bi-dimensionale dinamico, la dimensione della matrice non è definita in
anticipo. Di conseguenza, non è possibile dichiarare un array di forma array [ ] [ ] senza specificare la
dimensione della seconda dimensione, e quindi passare questo array come parametro. A possible
solution is a special class CMatrix , which contains an array of CR ow class objects.
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- Operazioni di addizzione e moltiplicazione di matrici
CMatrix A(3),B(3),C();
//--- Prepara un array per riga
double a1[3]={1,2,3}, a2[3]={2,3,1}, a3[3]={3,1,2};
double b1[3]={3,2,1}, b2[3]={1,3,2}, b3[3]={2,1,3};
//--- Riempie la matrice
A[0]=a1; A[1]=a2; A[2]=a3;
B[0]=b1; B[1]=b2; B[2]=b3;
//--- Da in output le matrici nel log degli Experts
Print("---- Elementi della matrice A");
Print(A.String());
Print("---- Elementi della matrice B");
Print(B.String());
//--- Ora vi mostriamo come ottenere i valori nello stile di matrice array dinamica [i][j]
if(size>0)
{
ArrayResize(m_array,size);
//--- Riempie con i valori
for(int i=0;i<size;i++)
m_array[i]=array[i];
}
//---
}
//+--------------------------------------------------------------------------------+
//| Operatore di assegnazione per l'array |
//+--------------------------------------------------------------------------------+
void CRow::operator=(const double &array[])
{
int size=ArraySize(array);
if(size==0) return;
//--- Riempie l'array con i valori
ArrayResize(m_array,size);
for(int i=0;i<size;i++) m_array[i]=array[i];
//---
}
//+--------------------------------------------------------------------------------+
//| Operatore di assegnazione per CRow |
//+--------------------------------------------------------------------------------+
void CRow::operator=(const CRow &r)
{
int size=r.Size();
if(size==0) return;
//--- Riempie l'array con i valori
ArrayResize(m_array,size);
for(int i=0;i<size;i++) m_array[i]=r[i];
//---
}
//+--------------------------------------------------------------------------------+
//| Operatore di moltiplicazione per un'altra riga |
//+--------------------------------------------------------------------------------+
double CRow::operator*(const CRow &o)
{
double res=0;
//--- Verifiche
int size=Size();
if(size!=o.Size() || size==0)
{
Print(__FUNCSIG__,": Fallimento nel moltiplicare le due matrici, le loro grandezze sono diffe
return(res);
}
//--- Moltiplica l'array in base agli elementi ed aggiunge i prodotti
for(int i=0;i<size;i++)
res+=m_array[i]*o[i];
//--- Risultato
return(res);
}
//+--------------------------------------------------------------------------------+
//| Restituisce la rappresentazione in formato stringa |
//+--------------------------------------------------------------------------------+
string CRow::String(void) const
{
string out="";
//--- Se la grandezza dell'array è maggiore di zero
int size=ArraySize(m_array);
//--- Lavoriamo solo con un numero non-zero degli elementi dell'array
if(size>0)
{
out="{";
for(int i=0;i<size;i++)
{
//--- Raccoglie i valori in una stringa
out+=StringFormat(" %G;",m_array[i]);
}
out+=" }";
}
//--- Risultato
return(out);
}
//+--------------------------------------------------------------------------------+
//| Classe "Matrix" |
//+--------------------------------------------------------------------------------+
class CMatrix
{
private:
CRow m_rows[];
public:
//--- Costruttori ed un distruttore
CMatrix(void);
CMatrix(int rows) { ArrayResize(m_rows,rows); }
~CMatrix(void){};
//--- Ottiene le grandezze della matrice
int Rows() const { return(ArraySize(m_rows)); }
int Cols() const { return(Rows()>0? m_rows[0].Size():0); }
//--- Restituisce i valori della colonna sottoforma di una riga CRow
CRow GetColumnAsRow(const int col_index) const;
//--- Restituisce la stringa con i valori della matrice
string String(void) const;
//--- L'operatore di indicizzazione restituisce la stringa per il suo numero
CRow *operator[](int i) const { return(GetPointer(m_rows[i])); }
//--- Operatore addizone
CMatrix operator+(const CMatrix &m);
return(res);
}
//--- Array ausiliario
double arr[];
ArrayResize(arr,cols1);
//--- Riempie le righe nella moltiplicazione della matrice
for(int i=0;i<rows1;i++)// Va attraverso le righe
{
//--- Resetta l'array di ricezione
ArrayInitialize(arr,0);
//--- Va attraverso gli elementi nella riga
for(int k=0;k<cols1;k++)
{
//--- Prende i valori delle colonne k della matrice m nel for di CRow
CRow column=m.GetColumnAsRow(k);
//--- Moltiplica due righe e scrive i risultati della moltiplicazione scalare di vettori n
arr[k]=this[i]*column;
}
//--- piazza l'array arr[] nella i-esima riga della matrice
res[i]=arr;
}
//--- Restituisce il prodotto di due matrici
return(res);
}
//+--------------------------------------------------------------------------------+
//| Operazione di Assegnazione |
//+--------------------------------------------------------------------------------+
CMatrix *CMatrix::operator=(const CMatrix &m)
{
//--- Trova ed imposta il numero di righe
int rows=m.Rows();
ArrayResize(m_rows,rows);
//--- Riempiamo le righe con i valori di rows della matrice passata
for(int i=0;i<rows;i++) this[i]=m[i];
//---
return(GetPointer(this));
}
//+--------------------------------------------------------------------------------+
//| Rappresentazione stringa della matrice |
//+--------------------------------------------------------------------------------+
string CMatrix::String(void) const
{
string out="";
int rows=Rows();
//--- Forma stringa per stringa
for(int i=0;i<rows;i++)
{
out=out+this[i].String()+"\r\n";
}
//--- Risultato
return(out);
}
Vedi anche
L ' overloading, Operazioni aritmetiche, Overloading di funzioni, R egole di precedenze
Esempi:
#import "user32.dll"
int MessageBoxW(int hWnd ,string szText,string szCaption,int nType);
int SendMessageW(int hWnd,int Msg,int wParam,int lParam);
#import "lib.ex5"
double round(double value);
#import
Con l'aiuto di import, è facile descrivere le funzioni che sono chiamate da DLL esterne o compilato
librerie EX5. Librerie EX5 sono file ex 5 compilati, che hanno la proprietà library. S olo funzioni descritte
con il modificatore ex port possono essere importate da librerie EX5.
Si prega di tenere presente che le librerie DLL ed EX5 devono avere nomi diversi (a prescindere delle
directory in cui si trovano) se sono importate insieme. T utte le funzioni importate hanno la risoluzione
ambito, corrispondente al " nome file" della libreria.
Esempio:
#import "kernel32.dll"
int GetLastError();
#import "lib.ex5"
int GetLastError();
#import
class CFoo
{
public:
int GetLastError() { return(12345); }
void func()
{
Print(GetLastError()); // chiamata del metodo della classe
Print(::GetLastError()); // chiamata della funzione MQL5
Print(kernel32::GetLastError()); // chiamata della funzione libreria DLL dal kernel32.dll
Print(lib::GetLastError()); // chiamata della funzione libreria EX5 da lib.ex5
}
};
voidOnStart()
{
CFoo foo;
foo.func();
}
Vedi anche
Overload, Funzioni Virtuali, Polimorfismo
Esportazione di funzioni
Una funzione dichiarata in un programma mql5 con postmodificatoreexport può essere utilizzata in un
altro programma mql5. T ale funzione viene chiamata esportabile, e può essere chiamata da altri
programmi dopo la compilazione.
Questo modificatore ordina al compilatore di aggiungere la funzione nella tabella di funzioni EX5
esportate da questo file EX5. S olo funzioni con tale modificatore sono accessibili (" visibile" ) da altri
programmi mql5.
La proprietà library indica al compilatore che il file-EX5 sarà una libreria, ed il compilatore lo mostra
nell'header di EX5.
Tutte le funzioni che sono previste come uelle esportabili devono essere contrassegnate con il
q
modificatore export.
Vedi anche
Overload, Funzioni Virtuali, Polimorfismo
L 'event handler (_* gestore di eventi) del terminale client identifica le funzioni, la gestione di questo o
quell'evento, dal tipo di valore di ritorno e dal tipo di parametri. S e altri parametri, non corrispondenti
alle descrizioni che seguono, vengono specificati per una funzione corrispondente, o un altro tipo di
ritorno è indicato per esso, una tale funzione non sarà utilizzata come un event handler.
OnStart
La funzione OnS tart () è l'event handler d' Inizio, che viene generato automaticamente solo per
l'esecuzione di scripts. Deve essere di tipo void, senza parametri:
voidOnStart()
Per la funzione OnS tart (), può essere specificato il tipo di ritorno int.
OnInit
La funzione OnInit() è l'event handler Init. Deve essere di tipo void o int, senza parametri:
void OnInit();
L 'evento Init viene generato immediatamente dopo che viene scaricato un Ex pert Advisor o un
indicatore; questo evento non viene generato per gli script. La funzione OnInit() viene utilizzata per
l'inizializzazione. S e OnInit() ha il tipo int come valore di ritorno, il codice di ritorno diverso-da-zero
indica l'inizializzazione di esito negativo, e genera l'evento Deinit con il codice della ragione di
deinizializzazione R EAS ON_INITFAILED.
informazioni sulla configurazione e le risorse di un agente (il numero di cores, quantità di memoria
libera, ecc.) utilizzando la funzoone T erminalInfoInteger() . S ulla base delle informazioni ottenute, ci
si può permettere di usare questo agente di testing, o rifiutare di utilizzalo, per l'ottimizzazione di
quell' Ex pert A dvisor.
ENUM_INIT_RETCODE
Identificatore Descrizione
CCEEDED
INIT_S U Inizializzazione con successo, il testing dell'
Ex pert Advisor può essere continuato.
Questo codice indica la stessa cosa del valore
null - l'Ex pert Advisor è stato correttamente
inizializzato nel tester.
Identificatore Descrizione
INIT_FAI LED Inizializzazione fallita; non c'è alcun modo di
continuare il testing a causa di errori fatali. Ad
esempio, fallimento nella creazione di un
indicatore che è richiesto per il lavoro dell'
Ex pert Advisor.
Questo valore di ritorno è lo stesso che di valore
diverso da zero - l'inizializzazione dell' Ex pert
A dvisor nel tester non è riuscito.
P
INIT_ ARA MET ERS _INCORR ECT Questo valore indica l'insieme di parametri di
input non corretti. La stringa risultante
contenente questo codice di ritorno è
evidenziata in rosso nella tabella generale di
ottimizzazione.
I l testing per il dato insieme di parametri dell'
E
INIT_AG NT_N OT_S UITABLE N essun errore durante l'inizializzazione, ma per
qualche motivo l'agente non è adatto per il
La funzione OnInit() del tipo void indica sempre l'inizializzazione con successo.
OnDeinit
OnDeinit() viene chiamato durante la deinizializzazione ed è l'event handler Deinit. Deve essere
dichiarato come void(tipo) e dovrebbe avere un parametro di tipo const int, che contiene il codice del
motivo della deinizializzazione. S e viene dichiarato un tipo diverso, il compilatore genererà un avviso,
ma la funzione non verrà chiamata. Per gli script, l'evento Deinit non viene generato e quindi la
funzione OnDeinit() non può essere utilizzata negli scripts.
L 'evento Deinit viene generato per l'Ex pert Advisors e gli Indicatori nei seguenti casi:
· prima della reinizializzazione dovuta alla variazione di un simbolo o di un periodo del grafico, al
quale il programma MQL5 è annesso;
· prima della reinizializzazione dovuta alla variazione di parametri di input;
· prima dello scarico(_*decarico) del programma MQL5.
OnTick
L 'eventoNewT ick viene generato per li Expert Advisors solo quando viene ricevuto un nuovo tick per
un simbolo, al grafico al quale è annesso l'Ex pert Advisor. E' inutile definire la funzione OnT ick () in un
indicatore personalizzato o uno script, perché l'evento NewT ick non viene generato per essi.
L 'evento T ick viene generato solo per Ex pert Advisor, ma questo non vuol dire che l'Ex pert Advisor ha
richiesto la funzione OnT ick (), dal momento che gli eventi NewT ick non solo vengono generati per
Ex pert Advisor, ma anche eventi di T imer, Book Event e ChartEvent vengono generati. Deve essere
dichiarato come tipo void, senza parametri:
void OnTick();
OnTimer
La funzione OnT imer() viene chiamata quando avviene l'evento T imer, che viene generato dal timer di
sistema solo per Ex pert Advisors ed Indicatori - non può essere utilizzato negli script. La frequenza del
verificarsi dell'evento viene impostata al momento della sottoscrizione riguardo le notifiche su quell'
evento che dev 'essere ricevuto dalla funzione EventS etT imer().
È possibile annullare la sottoscrizione a ricevere gli eventi timer per un particolare Ex pert Advisor
utilizzando la funzione EventKillT imer(). La funzione deve essere definita con il tipo void, senza
parametri:
void OnTimer();
Si consiglia di chiamare la funzione EventS etT imer() una volta nella funzione OnInit(), e la funzione
EventKillT imer() dovrebbe essere chiamata una volta in OnDeinit().
Ogni Ex pert Advisor, cos ì come ogni Indicatore lavora con il proprio timer e riceve gli eventi solo da
esso. Non appena il programma MQL5 programma si arresta, il timer viene distrutto forzatamente, se
era stato stato creato ma non disabilitato dalla funzione EventKillT imer ().
OnTrade
La funzione viene chiamata quando avviene l'evento T rade, che appare quando si cambia l'elenco degli
ordini piazzati e delle posizioni aperte, la cronistoria degli ordini e storia degli affari. Quando una
attività di trade viene eseguita (apertura ordine pendente, apertura/chiusura posizione, impostazione
stops, innesco ordini pendenti, ecc), la cronistoria degli ordini e/o elenco delle posizioni ed ordini
correnti, viene cambiata di conseguenza.
void OnTrade();
G li utenti devono autonomamente applicare nel codice, la verifica di uno stato di un account di trade,
q uando un tale evento viene ricevuto (se ciò è richiesto dalle condizioni della strategia di trading). S e
la funzione OrderS end() chiamata è stata completata con successo e ha restituito un valore true,
questo significa che il trading server ha messo l'ordine nella coda per l'esecuzione ed ha assegnato un
numero di tick et ad essa. Non appena il server elabora questo ordine, l'evento T rade verrà generato. E
se un utente ricorda il valore del tick et, lui/lei sarà in grado di scoprire cosa è successo all'ordine
utilizzando questo valore durante l' OnT rade() event handling.
OnTradeTransaction
Quando si eseguono alcune azioni precise su un trade account, il suo stato cambia. T ali azioni
comprendono:
· I nviare una richiesta di trade da qualsiasi applicazione MQL5 nel terminale client utilizzando le
Per esempio, quando si invia un ordine di mercato buy, esso viene gestito, un appropriato ordine di
buy viene creato per l'account, l'ordine viene poi eseguito e rimosso dalla lista di quelli aperti, quindi
viene aggiunto alla cronistoria ordini, un appropriato affare si aggiunge alla cronistoria e una nuova
posizione viene creata. T utte queste azioni sono transazioni di trade. L ' arrivo di una tale operazione
presso il terminale è un evento T radeT ransaction. Esso chiama l'handler(_*gestore)
OnT radeT ransaction
void OnTradeTransaction(
const MqlTradeTransaction& trans, // struttura transazione di trade
const MqlTradeRequest& request, // struttura request
const MqlTradeResult& result // struttura result
);
· trans - questo parametro riceve la struttura M qlTradeTransaction che descrive una transazione di
trade applicata ad un account;
· request - questo parametro riceve la struttura M qlTradeRequest che descrive una richiesta di trade;
· result - questo parametro riceve la struttura M qlTradeResult che descrive un risultato di esecuzione
di una richiesta di trade.
G li ultimi due parametri request e result sono riempiti da valori solo per il tipo di transazione
E
TRAD _TRANS A CTION_R EQUES T , i dati sulle transazioni possono essere ricevuti dal tipo di parametro
della variabile trans. S i noti che in questo caso, il campo request_id nella variabile result contiene l'ID
di requesttrade request, dopo l'esecuzione di cui la transazione commerciale descritta nella variabile
trans è stata eseguita. Request ID consente di associare l'azione eseguita (chimate di funzioni
OrderS end oppure OrderS endAs ync ) con il risultato di questa azione inviata a OnT radeT ransaction().
Una richiesta di trade manualmente inviata dal terminale o via funzioni OrderS end()/OrderS endAs ync()
può generare varie transazioni consecutive sul trade server. La priorità di arrivo di queste transazioni
al terminale, non è garantita. Quindi, non si deve aspettare che un gruppo di transazioni arriveranno
dopo un altro, durante lo sviluppo del vostro algoritmo di trading.
· utti
T i tipi di transazioni di trade sono descritti nell' enumerazione
ENUM _TRADE_TRANS ACTION_TYPE.
· La struttura M qlT radeT ransaction descrive una transazione di trade che è riempita in modi
diversi a seconda del tipo di transazione. Ad esempio, solo tipo di campo (tipo di transazione di
trade) deve essere analizzato per le transazioni di tipo TRADE_TRANS ACTION_R EQUES T . Il
secondo e terzo parametro della funzione OnT radeT ransaction (richiesta e risultato) devono
essere analizzati per dati aggiuntivi. Per ulteriori informazioni, vedere " S truttura di una
transazione di T rade" .
· Una descrizione di una transazione di trade non fornisce tutte le informazioni disponibili
riguardanti gli ordini, gli affari e le posizioni (per esempio, i commenti). Le funzioni OrderGet*,
H istoryOrderGet* , H istoryDealGet* and PositionGet* devono essere usate per ottenere
informazioni estese.
Dopo l'applicazione di transazioni di trade per un account client, esse sono costantemente messe nella
coda di transazioni del terminale, da cui costantemente vengono inviate al punto di ingresso
OnT radeT ransaction in ordine di arrivo al terminale.
Quando si maneggiano le transazioni di trade da parte di un Ex pert Advisor che utilizza l'handler
OnT radeT ransaction, il terminale continua a gestire le transazioni di trade che nuovamente arrivano.
Pertanto, lo stato di un account di trade può già cambiare durante il funzionamento di
OnT radeT ransaction. Per esempio, mentre un programma MQL5 gestisce un evento di aggiunta un
nuovo ordine, esso può essere eseguito, cancellato dalla lista di quelli aperti e spostato nella
cronistoria. Inoltre poi, l'applicazione verrà notificata di questi eventi.
La lunghezza delle transazioni della coda comprende 1024 elementi. S e OnT radeT ransaction gestisce
una nuova transazione per troppo tempo, quelle vecchie in coda possono essere sostituite da quelle più
recenti.
OnT radeT ransaction. Una chiamata OnT rade corrisponde a una o più chiamate
OnT radeT ransaction.
· OnT rade viene chiamato dopo le appropriate chiamate OnT radeT ransaction.
OnTester
La funzione OnT ester() è il gestore dell'evento del T ester che viene generato automaticamente dopo
un test di storia di un Ex pert Advisor dopo che un intervallo scelto è finito. La funzione deve essere
definita con il tipo double, senza parametri:
double OnTester();
La funzione viene chiamata poco prima della chiamata di OnDeinit() ed ha lo stesso tipo del valore
restituito - double. OnT ester() può essere utilizzata solo nel testing di Ex pert Advisors. Il suo scopo
principale è quello di calcolare un certo valore che viene utilizzato come criterio Custom max nell'
ottimizzazione genetica di parametri di input.
restituiti dalla funzione OnT ester). In tale ordinamento, i valori peggiori sono posizionati all'estremità
e successivamente scartati e non partecipano alla formazione della prossima generazione.
OnTesterInit
La funzione OnT esterInit() è l'handler dell'evento T esterInit, che viene generato automaticamente
prima dell'inizio dell' ottimizzazione di un Ex pert Advisor nel tester strategia. La funzione deve essere
definita con il tipo void. Non ha parametri:
void OnTesterInit();
Con l'avvio dell'ottimizzazione, un Ex pert Advisor con l'handler OnT esterDeinit() o OnT esterPass()
viene caricato automaticamente in un grafico separato del terminale con il simbolo e il periodo
specificato nel tester, e riceve l'evento T esterInit. La funzione viene utilizzata per l'inizializzazione
dell' Ex pert Advisor prima dell'inizio dell' ottimizzazione per l'ulteriore elaborazione dei risultati di
ottimizzazione.
OnTesterPass
La funzione OnT esterPass() è il gestore dell'evento T esterPass, che viene generato automaticamente
quando si riceve un frame durante l'ottimizzazione Ex pert A dvisor nel tester strategia. La funzione
void OnTesterPass();
U n Ex pert Advisor con l'handler OnT esterPass() viene caricato automaticamente in un grafico separato
del terminale con il simbolo/periodo previsto per il testing, ed ottiene gli eventi T esterPass quando un
frame viene ricevuto durante l'ottimizzazione. La funzione viene utilizzata per l'handling dinamico dei
risultati di ottimizzazione " In loco" senza attendere il suo completamento. I frame vengono aggiunti
utilizzando la funzione FrameAdd(), che può essere chiamata dopo la fine di una singolo pass nell'
handler OnT ester().
OnTesterDeinit
OnT esterDeinit() è il gestore dell'evento T esterDeinit, che viene generato automaticamente dopo la
fine dell' ottimizzazione dell' Ex pert Advisor nel tester strategia. La funzione deve essere definita con
il tipo void. Non ha parametri:
void OnTesterDeinit();
U n Ex pert Advisor con l'handler T esterDeinit() viene automaticamente caricato su un grafico all'inizio
dell'ottimizzazione, e riceve T esterDeinit dopo il suo completamento. La funzione viene utilizzata per
la lavorazione finale di tutti i risultati dell'ottimizzazione.
OnBookEvent
La funzione OnBook Event() è l'handlerBook Event. Book Event viene generato per Ex pert Advisors ed
I ndicatori quando cambia il Depth of Mark et. Deve essere di tipo void ed avere un parametro di tipo
stringa:
Per ricevere gli eventi Book Event per ogni simbolo, basta pre-iscriversi per ricevere questi eventi per
quel simbolo con la funzione Mark etBookA dd(). Per annullare l'iscrizione a ricevere gli eventi
A differenza di altri eventi, l'evento Book Event è broadcast. Ciò significa che se un Ex pert Advisor
sottoscrive la ricezione degli eventi Book Event utilizzando Mark etBookAdd, tutti gli altri Ex pert
A dvisors che hanno l'handler OnBook Event() riceveranno questo evento. È pertanto necessario
analizzare il nome del simbolo, che viene passato al gestore come parametro const string& simbol.
OnChartEvent
OnChartEvent() è l'handler di un gruppo di eventi ChartEvent:
· CHART EVENT_KEYDOW N — evento di una sequenza di tasti, uando è focalizzata la finestra del
q
grafico ;
· CHART EVENT_MOUS E_MOVE eventi di spostamento del mouse e gli eventi clic del mouse (se
—
La funzione può essere chiamata solo in Ex pert Advisors ed indicatori. La funzione deve essere di tipo
void con 4 parametri:
Per ciascun tipo di evento, i parametri di input della funzione OnChartEvent() hanno valori definiti che
sono necessari per l'elaborazione di questo evento. Gli eventi e valori passati attraverso questi
parametri sono elencati nella tabella seguente.
rue è impostato
per il grafico)
rue è impostato
per il grafico)
grafico
OnCalculate
La funzione OnCalculate() viene chiamata solo in indicatori personalizzati quando è necessario
calcolare i valori degli indicatori dall'evento Calculate. Ciò si verifica tipicamente quando un nuovo tick
viene ricevuto per il simbolo, per cui l'indicatore viene calcolato. Questo indicatore non è richiesto da
essere collegato a qualsiasi grafico dei prezzi di questo simbolo.
La funzione OnCalculate() deve avere un tipo di ritorno int. Ci sono due possibili definizioni. All'interno
di un indicatore non è possibile utilizzare entrambe le versioni della funzione.
La prima forma è destinata a quegli indicatori che possono essere calcolati su un buffer di dati unico.
Un esempio di tale indicatore è Custom Moving A verage.
_*Poiché l'array prezzo[], è uno delle timeseries o un buffer calcolato di un qualche indicatore, può
essere passato. Per determinare la direzione di indicizzazione dell'array price[], chiamare
A rrayGetAs S eries(). Per non dipendere dai valori di default, è necessario chiamare
incondizionatamente la funzione ArrayS etAs S eries() per quegli array, con cui si prevede di lavorare.
Timeseries o un indicatore necessario, per essere usato come array price[] può essere selezionato
dall'utente nella scheda " Parametri" quando si avvia l'indicatore. Per fare questo, è necessario
specificare l'elemento necessario nei menu a tendina del campo " Applica a" .
Per ottenere valori di un indicatore personalizzato da altri programmi MQL5, viene usata la funzione
iCustom(), che restituisce l'handle indicatore per le operazioni successive. È inoltre possibile
specificare il prezzo l'appropriato array price[] o l'handle di un altro indicatore. Questo parametro
dovrebbe essere trasmesso per ultimo nell'elenco delle variabili di input dell' indicatore personalizzato.
Esempio:
voidOnStart()
{
//---
string terminal_path=TerminalInfoString(STATUS_TERMINAL_PATH);
int handle_customMA=iCustom(Symbol(),PERIOD_CURRENT, "Custom Moving Average",13,0, MODE_EMA,PRIC
if(handle_customMA>0)
Print("handle_customMA = ",handle_customMA);
else
Print("Cannot open or not EX5 file '"+terminal_path+"\\MQL5\\Indicators\\"+"Custom Moving Ave
}
Un altro esempio che mostra il passaggio dell'handler dell' indicatore come ultimo parametro per
specificare l'array prezzo[], viene riportato nella descrizione della funzione iCustom ().
La seconda forma è destinata a tutti gli altri indicatori, in cui più di una time series è utilizzata per i
calcoli.
int OnCalculate (const int rates_total, // grandezza di input della time series
const int prev_calculated, // barre gestite nella chiamata precedente
const datetime& time[], // Orario
const double& open[], // Open
const double& high[], // High
const double& low[], // Low
const double& close[], // Close
const long& tick_volume[], // Tick Volume
const long& volume[], // Real Volume
const int& spread[] // Spread
);
Parametri di open[], high[], low[] e close[] contengono array con prezzi di open, prezzi high e low e
prezzi close, del timeframe corrente. Il parametro time[] contiene un array con valori di tempo di
apertura, il parametro spread[] ha un array contenente la cronistoria degli spreads (se qualche spread
è fornito per il titolo negoziato). I parametri di volume[] e tick_volume[] contengono la cronistoria del
volume di trade e tick , rispettivamente.
Per determinare la direzione di indicizzazione di time[], open[], high[], low[], close[], tick_volume[],
volume[] and spread[], chiamare ArrayGetAs S eries(). Al fine di non dipendere da valori di default, si
dovrebbe chiamare incondizionatamente la funzioneArrayS etAs S eries() per queli array, con cui ci si
aspetta di lavorare.
Il primo parametro rates _total contiene il numero di barre, disponibile per l'indicatore per il calcolo, e
corrisponde al numero di barre disponibili nel grafico.
Per questo, è di solito sufficiente restituire il valore del parametro rates _total, che contiene il numero
di barre nella chiamata alla funzione in corso. S e dopo l'ultima chiamata di OnCalculate() i dati sui
prezzi sono cambiati (uno storico più profonda scaricato o spazi di storico riempiti di vuoti), il valore
del parametro di input prev _calculated sarà impostato a zero dal terminale.
Nota: se OnCalculate restituisce zero, allora i valori dell'indicatore non sono mostrati nella
D ataW indow del terminale client.
Per capire meglio, sarebbe utile aviare l'indicatore, il cui codice è allegato qui sotto.
Esempio Indicatore:
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//---- plot linea
#property indicator_label1 "Line"
#property indicator_type1 DRAW_LINE
Vedi anche
Eseguire Programmi, Eventi T erminale Client, Utilizzo degli eventi
Variabili
Dichiarazione delle variabili
Le variabili devono essere dichiarate prima di essere usate. Nomi unici vengono usati per identificare
variabili. Per dichiarare una variabile, è necessario specificare il tipo ed il nome univoco.
Dichiarazione di variabile non è un operatore.
· datetime - la data e l'ora, un numero intero senza segno che contiene il numero di secondi dall'ora 0
Esempi:
string szInfoBox;
int nOrders;
double dSymbolPrice;
bool bLog;
datetime tBegin_Data = D'2004.01.01 00:00';
color cModify_Color = C'0x44,0xB9,0xE6';
struct MyTime
{
int hour; // 0-23
int minute; // 0-59
int second; // 0-59
};
...
MyTime strTime; // Variabile della precedentemente dichiarata struttura MyTime
N on è possibile dichiarare variabili del tipo di struttura fino a che non si dichiarara la struttura.
Arrays
Solo un numero intero può essere un indice di array. Non più di quattro dimensioni array sono
ammesse. La numerazione degli elementi inizia con 0. L 'ultimo elemento di una matrice uni-
dimensionale ha il numero che è di 1 inferiore alla grandezza della matrice. Ciò significa che la
chiamata per l'ultimo elemento di un array composto da 50 numeri interi apparirà come a[49]. La
stessa cosa vale per array multidimensionali: Una dimensione è indicizzata da 0 fino alla grandezza
della dimensione -1. L 'ultimo elemento di un array bi-dimensionale dall'esempio apparirà come m[6]
[49] .
Array statici non possono essere rappresentati come timeseries, ad es. la funzione ArrayS etAs S eries(),
che definisce l'accesso ad elementi dell'array dalla fine all'inizio, non può essere applicata ad essi. S e si
desidera fornire l'accesso ad un array cos ì come nelle timeseries, utilizzare l'oggetto array dinamico.
Specificatori di accesso
Specificatori di accesso definiscono come il compilatore può accedere a variabili, membri di strutture
o classi.
Lo specificatore const dichiara una variabile come una costante, e non consente di modificare questa
variabile durante l'esecuzione. E' consentita una singola inizializzazione di una variabile quando questa
si dichiara.
Esempio:
int OnCalculate (const int rates_total, // size of the price[] array
const int prev_calculated, // barre gestite in una chiamata precedente
const int begin, // da cui partono i dati significativi
const double& price[] // dall'array per il calcolo
);
· virtual - si applica solo ai metodi della classe (ma non ai metodi di strutture) e dice al compilatore
che il metodo deve essere inserito nella tabella delle funzioni virtuali della classe.
Classi di memorizzazione
Ci sono tre classi di memorizzazione: static, input ed ex tern. Questi modificatori di una classe di
memorizzazione indicano esplicitamente al compilatore che le variabili corrispondenti sono distribuite
in un area di memoria pre-assegnata, che è chiamata il pool globale. Inoltre, questi modificatori
indicano il trattamento speciale dei dati delle variabili. S e una variabile dichiarata a livello locale non è
una static , la memoria per tale variabile viene assegnata automaticamente allo stack programma. La
liberazione della memoria allocata per un array non-statico viene anche eseguita automaticamente
quando si va oltre l'area di visibilità del blocco, in cui è dichiarato l'array.
Vedi anche
Tipi di dati, Incapsulamento ed estensibilità dei T ipi,Inizializzazione delle Variabili, Visibilità Campo
di Applicazione e Durata delle Variabili, Creazione ed Eliminazione di Oggetti, Membri S tatici di una
Classe
Variabili locali
U na variabile dichiarata all'interno di una funzione è locale. L 'ambito di una variabile locale è limitato
alla gamma di funzioni all'interno del quale è stata dichiarata. La variabile locale può essere
inizializzata dal risultato di ogni espressione. Ogni chiamata della funzione inizializza una variabile
locale. Le variabili locali vengono memorizzate in un'area di memoria, della funzione corrispondente.
Esempio:
int somefunc()
{
int ret_code=0;
...
return(ret_code);
}
La visibilità di una variabile è la parte del programma, in cui una variabile può essere riferita. Le
variabili dichiarate all'interno di un blocco (sul piano interno), hanno il blocco come loro campo di
applicazione. Il campo di applicazione blocco inizia con la dichiarazione della variabile e termina con la
parentesi graffa finale destra.
Le variabili locali dichiarate all'inizio di una funzione hanno anche la visibilità del blocco, cos ì come i
parametri di funzioni che sono variabili locali. Ogni blocco può contenere dichiarazioni di variabili. S e i
blocchi sono nidificati e l' identificatore nel blocco esterno ha lo stesso nome dell'identificatore nel
blocco interno, l'identificatore del blocco esterno è nascosto, finché il funzionamento del blocco interno
non è finito.
Esempio:
voidOnStart()
{
//---
int i=5; // variabile locale della funzione
{
int i=10; // variabile della funzione
Print("Inside block i = ",i); // il risultato è i=10;
}
Print("Blocco esterno i = ",i); // il risultato è i=5;
}
Ciò significa che mentre il blocco interno è in esecuzione, esso vede i valori dei propri identificatori
locali e non i valori di identificatori con nomi identici nel blocco esterno.
Esempio:
voidOnStart()
{
//---
int i=5; // variabile locale della funzione
for(int i=0;i<3;i++)
Print("Interno per i = ",i);
Print("Esterno per il blocco i = ",i);
}
/* Risultato dell'esecuzione
Interno per i = 0
Interno per i = 1
Interno per i = 2
Blocco esterno i = 5
*/
Le variabili locali dichiarate come static hanno la visibilità del blocco, nonostante il fatto che esse
esistono sin dal momento in cui il programma inizia.
Stack
In ogni programma MQL5, un'area di memoria speciale chiamata stack viene allocata per memorizzare
le variabili locali delle funzioni che vengono create automaticamente. Uno stack viene allocato per
tutte le funzioni, le dimensioni predefinite per indicatori sono pari a 1 Mb. In Ex pert Advisors e gli
script, dimensione dello stack può essere gestito tramite il #property stack size istruzione di
compilatore (che imposta la dimensione dello stack in byte), una memoria di 8Mb viene allocata di
default per la pila.
Le variabili locali S tatic sono memorizzate nello stesso luogo dove altre variabili static e global
vengono memorizzate - in un'area di memoria speciale, che esiste separatamente dallo stack . Le
variabili createDinamicamente usano anche un'area di memoria separata dallo stack .
A d ogni chiamata di funzione, un posto sullo stack viene allocato per variabili interne non-statiche.
D opo l'uscita dalla funzione, la memoria è disponibile per l'uso.
S e dalla prima funzione viene chiamata la seconda, allora la seconda funzione occupa la grandezza
richiesta dalla memoria stack rimanente per le sue variabili. Pertanto, quando si utilizzano funzioni
incluse, lo stack di memoria sarà occupato sequenzialmente per ogni funzione. Questo può portare ad
una carenza di memoria durante una delle chiamate di funzione, tale situazione è chiamata stack
overflow.
Pertanto, per i dati locali grandi, si dovrebbe meglio usare la memoria dinamica - quando si entra in
una funzione, allocare la memoria, che è richiesta per le esigenze locali, nel sistema (new,
A rrayR esize()), ed all'uscita della funzione, rilasciare la memoria (delete, A rrayFree()).
Vedi anche
Tipi di dati, Incapsulamento ed Estensibilità dei T ipi,Inizializzazione delle Variabili, Visibilità Campo
di Applicazione e Durata delle Variabili, Creazione ed Eliminazione di Oggetti
Parametri Formali
I parametri passati alla funzione sono locali. Il campo di applicazione è il blocco della funzione.
Parametri formali devono avere nomi diversi da quelli delle variabili esterne e variabili locali definite
all'interno di una funzione. Alcuni valori possono essere assegnati ai parametri formali nel blocco della
funzione. S e un parametro formale viene dichiarato con il modificatore const, il suo valore non può
essere modificato all'interno della funzione.
Esempio:
void func(const int & x[], double y, bool z)
{
if(y>0.0 && !z)
Print(x[0]);
...
}
Parametri formali possono essere inizializzati da costanti. In questo caso, il valore di inizializzazione
viene considerato come valore predefinito. Parametri, accanto a quelli inizializzati, devono
anch'essere inizializzati.
Esempio:
void func(int x, double y = 0.0, bool z = true)
{
...
}
Quando si chiama una funzione, i parametri inizializzati possono essere omessi, quelli di default
vengono sostituiti al loro posto.
Esempio:
func(123, 0.5);
Parametri di tipo semplice sono passati per valore, ad. es., modifiche della corrispondente variabile
locale di questo tipo all'interno della funzione chiamata non si rifletteranno nella funzione chiamante.
A rray di qualsiasi tipo e dati del tipo struttura, vengono sempre passati per riferimento. S e è
necessario vietare, modificando il contenuto dell'array o struttura, i parametri di questo tipo devono
essere dichiarati con la parola chiave const.
V i è la possibilità di passare i parametri di tipo semplice, per riferimento. In questo caso, la modifica
di tali parametri all'interno della funzione chiamante influenzerà le corrispondenti variabili passate per
riferimento. Per indicare che un parametro viene passato per riferimento, mettere il modificatore &
dopo il tipo di dato.
Esempio:
void func(int& x, double& y, double & z[])
{
double calculated_tp;
...
for(int i=0; i<OrdersTotal(); i++)
{
if(i==ArraySize(z)) break;
if(OrderSelect(i)==false) break;
z[i]=OrderOpenPrice();
}
x=i;
y=calculated_tp;
}
I parametri passati per riferimento, non possono essere inizializzati con i valori predefiniti.
Vedi anche
Variabili di Input, T ipi di dato, Incapsulamento ed Estensibilità dei T ipi,Inizializzazione delle
Variabili, Visibilità Campo di A pplicazione e Durata delle Variabili, Creazione ed Eliminazione di
Oggetti
Variabili Statiche
La classe di memoria di static definisce una variabile statica. Il modificatore static viene indicato
prima del tipo di dati.
Esempio:
int somefunc()
{
static int flag=10;
...
return(flag);
}
Una variabile static può essere inizializzata da una costante o espressione costante corrispondente al
suo tipo, a differenza di una semplice variabile locale, che può essere inizializzata da qualsiasi
espressione.
Variabili statiche esistono dal momento di esecuzione del programma e vengono inizializzate solo una
volta prima che le funzioni specializzate OnInit() vengano chiamate. S e i valori iniziali non vengono
specificati, le variabili della classe di memorizzazione static stanno assumendo i valori zero iniziali.
Le variabili locali dichiarate con la parola chiave static mantengono i loro valori per tutto il lifetime
della funzione . Ad ogni chiamata di funzione successiva, tali variabili locali contengono i valori che
avevano durante la chiamata precedente.
Tutte le variabili in un blocco, ad eccezione di parametri formali di una funzione, possono essere
definiti come statico. S e una variabile dichiarata a livello locale non è una statica, la memoria per tale
variabile viene assegnata automaticamente ad uno stack di programma.
Esempio:
int Counter()
{
static int count;
count++;
if(count%100==0) Print("La fuzione Counter viene chiamata",count," times");
return count;
}
voidOnStart()
{
//---
int c=345;
for(int i=0;i<1000;i++)
{
int c=Counter();
}
Print("c =",c);
}
Vedi anche
Tipi di Dati, Incapsulamento ed Estensibilità dei T ipi,Inizializzazione delle Variabili, Ambito Visibilità
e Durata delle Variabili, Creazione ed Eliminazione di Oggetti,Membri di Classi S tatiche
Variabili Globali
Le variabili globali vengono create mettendo le loro dichiarazioni fuori dalle descrizioni delle funzioni.
Variabili globali sono definite allo stesso livello come funzioni, cioè, non sono locali in ogni blocco.
Esempio:
int GlobalFlag=10; // Variabile globale
int OnStart()
{
...
}
Il campo di applicazione delle variabili globali è l'intero programma. Le variabili globali sono accessibili
da tutte le funzioni definite nel programma. Esse vengono inizializzate a zero a meno che un altro
valore iniziale non viene definito in modo esplicito. Una variabile globale può essere inizializzata solo
da una costante o un'espressione che corrisponde al suo tipo.
G lobal variables are initialized only once after the program is loaded into the client terminal memory
and before the first handling of the Init event. For global variables representing class objects, during
their initialization the corresponding constructors are called. In scripts global variables are initialized
before handling the S tart event.
Nota: Le variabili dichiarate a livello globale non devono essere mischiate con le variabili globali del
terminale client a cui è possibile accedere utilizzando le funzioni GlobalVariable...().
Vedi anche
Tipi di dati, Incapsulamento ed Estensibilità dei T ipi,Inizializzazione delle Variabili, Visibilità Campo
di Applicazione e Durata delle Variabili, Creazione ed Eliminazione di Oggetti
Variabili di Input
La classe di memorizzazione input definisce la variabile esterna. Il modificatore input viene indicato
prima del tipo di dati. Una variabile con il modificatore input non può essere modificata all'interno dei
programmi MQL5, tali variabili sono accessibili in sola lettura. I valori delle variabili di ingresso
possono essere modificati solo dall'utente dalla finestra delle proprietà del programma. Le variabili
esterne vengono sempre reinizializzate immediatamente prima che OnInit() venga chiamato.
The max imum length of input variable names is 63 characters. For the input parameter of string type,
the maximum value length (string length) can be from 191 to 253 characters (see the Note). T he
minimum length is 0 characters (the value is not set).
Esempio:
//--- parametri di input
input int MA_Period=13;
input int MA_Shift=0;
input ENUM_MA_METHOD MA_Method=MODE_SMMA;
V ariabili di input determinano i parametri di input di un programma. Esse sono disponibili nella
finestra Proprietà di un programma.
È possibile impostare un altro modo per visualizzare i nomi dei parametri di input nella scheda Input.
Per fare questo, viene utilizzato un commento stringa, che dovrebbe trovarsi dopo la descrizione di un
parametro di input nella stessa riga. Cos ì, nomi più comprensibili per un utente possono essere
abbinati a parametri di input.
Esempio:
//--- parametri di input
input int InpMAPeriod=13; // Periodo di smussamento
input int InpMAShift=0; // Slittamento linea orizziontale
Nota: Array e variabili di tipo complesso non possono agire come variabili di input.
Nota: La lunghezza di un di un commento string per le variabili di input non può superare i 63
caratteri.
Note: For input variables of string type, the limitation of the value length (string length) is set by the
following conditions :
T hus, the max imum string size for a string parameter is calculated using the equation:
parameter_value_length=total_length_max-parameter_name_length=254-parameter_name_length
This provides the max imum string size from 191 (parameter_name_length=63) to 5
2 3 characters
(parameter_name_length=1).
Se l'indicatore personalizzato utilizza la funzione OnCalculate del primo tipo (cioè, l'indicatore è
calcolato utilizzando lo stesso array di dati), allora uno dei valori ENUM _APPL IED_PRICE o l'handle di un
altro indicatore deve essere utilizzato come ultimo parametro quando si chiama un indicatore
personalizzato. T utti i parametri relativi alle variabili di input devono essere chiaramente indicati.
Esempio:
#property script_show_inputs
//--- giorno della settimana
enum dayOfWeek
{
S=0, // Domenica
M=1, // Lunedì
T=2, // Martedì
W=3, // Mercoledì
Th=4, // giovedì
Fr=5, // Venerdì,
St=6, // Sabato
};
//--- parametri di input
input dayOfWeek swapday=W;
A l fine di consentire ad un utente di selezionare un valore necessario dalla finestra delle proprietà
durante l'avvio dello script, si usa il comando del preprocessore #property script_show_inputs.
A vviamo lo script e possiamo scegliere uno dei valori dell'enumerazione dayOfW eek dall'elenco.
A vviamo lo script EnumI nI nput ed andiamo alla alla scheda I nput. Per impostazione predefinita, il
valore di s wapday (giorno di triplo carico s wap) è Mercoledì (W =3), ma è possibile specificare un altro
valore, ed utilizzare questo valore per modificare il funzionamento del programma.
Numero di possibili valori di un'enumerazione è limitato. Per selezionare un valore di input viene
utilizzata una lista a discesa. Nomi mnemonici dei membri di enumerazione vengono utilizzati per i
valori visualizzati nella lista. S e un commento è associato ad un nome mnemonico, come mostrato in
questo esempio, il contenuto del commento viene usato al posto del nome mnemonico.
Ogni valore dell'enumerazione dayOfW eek ha il suo valore da 0 a 6, ma nella lista dei parametri,
verranno mostrati i commenti specificati per ogni valore. Ciò fornisce una maggiore flessibilità per la
scrittura di programmi con chiare descrizioni di parametri di input.
Talvolta, è necessario escludere alcuni parametri esterni di programma dall'area di tutti i passi nel
tester. sinput è un modificatore di memoria che è stato introdotto per casi del genere. sinput sta per
dichiarazione statica di variabile esterna (sinput = static input). Ciò significa che la seguente
dichiarazione in un codice di Ex pert Advisor
valori non vengono enumerati quando si va alla ricerca del miglior set di parametri che corrispondono
ad una condizione specificata.
L 'Ex pert Advisor mostrato sopra ha 5 parametri esterni. " Numero di strati" è dichiarato in modo da
essere sinput e pari a 6. Questo parametro non può essere modificato durante l'ottimizzazione della
strategia di trading. Possiamo specificare il valore necessario per esso, per essere utilizzato
ulteriormente. I campi S tart, S tep e S top non sono disponibili per tale variabile.
Pertanto, gli utenti non saranno in grado di ottimizzare questo parametro dopo aver specificato il
modificatore sinput per la variabile. In altre parole, gli utenti dei terminali non saranno in grado di
impostare i valori iniziali e finali nello S trateg y T ester per l'enumerazione automatica nell'intervallo
specificato, durante l'ottimizzazione.
T uttavia, vi è una sola eccezione a questa regola: le variabili sinput possono essere variate in attività
di ottimizzazione utilizzando la funzione ParameterS etR ange(). Questa funzione è stata introdotta
specificatamente per il controllo del programma sui sets di valori disponibili per qualsiasi variabile
input comprese quelle dichiarate come static input (sinput). La funzione ParameterGetR ange()
consente di ricevere i valori delle variabili di input quando viene lanciata l'ottimizzazione (nell' handler
OnT esterInit()) e per resettare un valore di cambiamento di step, all'interno del quale, i valori dei
parametri ottimizzati verranno enumerati.
In questo modo, combinando il modificatore sinput e due funzioni che lavorano con parametri di input,
si consente di creare un setting di regole flessibili per l'impostazione di intervalli di ottimizzazione dei
parametri di input che dipendono da valori di altri parametri di input.
Dopo tale dichiarazione, tutti i parametri di input vengono uniti visivamente in un gruppo specificato,
semplificando la configurazione dei parametri per gli utenti MQL5 all'avvio su un chart o nello strateg y
tester. Le specifiche di ciascun gruppo sono valide fino a quando appare una nuova dichiarazione di
gruppo:
Quando si avvia tale EA nello strateg y tester, è possibile fare doppio clic sul nome di un gruppo per
comprimere/espandere il blocco di input, nonché fare clic sulla casella di controllo del gruppo per
selezionare tutti i suoi parametri per l'ottimizzazione.
Vedi anche
iCustom, Enumerazioni, Proprietà dei Programmi
Variabili Esterne
La parola chiave ex tern viene utilizzata per dichiarare identificatori di variabili come identificatori
della classe staticadi memorizzazione con lifetime globale. Queste variabili esistono dall'inizio del
programma e la memoria per esse viene allocata ed inizializzata immediatamente dopo l'inizio del
programma.
È possibile creare programmi composti da più file di sorgenti, in questo caso viene utilizzata la
direttiva per il preprocessore #include. Le variabili dichiarate come ex tern con lo stesso tipo e
l'identificatore possono esistere in diversi file sorgente di un progetto.
Quando si compila il progetto, tutte le variabili ex tern con lo stesso tipo ed un identificatore sono
associate con una parte di memoria del pool di variabile globale. Variabili ex tern sono utili per la
compilazione separata di file di origine. Variabili esterne possono essere inizializzate, ma soltanto una
volta - l'esistenza di diverse variabili ex tern inizializzate dello stesso tipo e con lo stesso
identificatore, è vietata.
Vedi anche
Tipi di dati, Incapsulamento ed Estensibilità dei T ipi,Inizializzazione delle Variabili, Visibilità Campo
di Applicazione e Durata delle Variabili, Creazione ed Eliminazione di Oggetti
Variabili global e static possono essere inizializzate solo da una costante del tipo corrispondente o
un'espressione costante. Le variabili locali possono essere inizializzate da qualsiasi espressione, non
solo una costante.
L ' inizializzazione delle variabili globali e statiche viene eseguita una sola volta. L ' inizializzazione delle
variabili locali viene fatta ogni volta che si chiama la funzione corrispondente.
Esempi:
int n = 1;
string s = "hello";
double f[] = { 0.0, 0.236, 0.382, 0.5, 0.618, 1.0 };
int a[4][4] = { {1, 1, 1, 1}, {2, 2, 2, 2}, {3, 3, 3, 3}, {4, 4, 4, 4 } };
//--- dal tetris
int right[4]={WIDTH_IN_PIXELS+VERT_BORDER,WIDTH_IN_PIXELS+VERT_BORDER,
WIDTH_IN_PIXELS+VERT_BORDER,WIDTH_IN_PIXELS+VERT_BORDER};
//--- inizializzazione di tutti i campi delle strutture con valori zero
MqlTradeRequest request={};
La lista dei valori degli elementi di un array deve essere racchiusa tra parentesi graffe. Le sequenze di
inizializzazione perse sono considerate uguali a 0.
Esempi:
struct str3
{
int low_part;
int high_part;
};
struct str10
{
str3 s3;
double d1[10];
int i3;
};
voidOnStart()
{
str10 s10_1={{1,0},{1.0,2.1,3.2,4.4,5.3,6.1,7.8,8.7,9.2,10.0},100};
str10 s10_2={{1,0},{},100};
str10 s10_3={{1,0},{1.0}};
//---
Print("1. s10_1.d1[5] = ",s10_1.d1[5]);
Per la variabile di tipo struttura, l'inizializzazione parziale è consentita, cos ì come per gli array statici
(con una grandezza implicitamente impostata). È possibile inizializzare uno o più elementi prima di
una struttura o un array, gli altri elementi vengono inizializzati con la cifra zero in questo caso.
Vedi anche
Tipi di Dati, Incapsulamento ed Estensibilità dei T ipi, Visibilità Campo di applicazione e Durata delle
Variabili, Creazione ed Eliminazione di Oggetti
Una variabile dichiarata al di fuori di tutte le funzioni si trova in ambito globale. L 'accesso a tali
variabili può essere fatto da ovunque nel programma. Queste si trovano nel pool globale di memoria,
per cui la loro vita coincide con la durata del programma.
Una variabile dichiarata all'interno di un blocco (parte del codice racchiuso tra parentesi graffe)
appartiene all' ambito locale. T ale variabile non è visibile (e quindi non disponibile) fuori del blocco, in
cui è dichiarata. Il caso più comune di dichiarazione locale è una variabile dichiarata all'interno di una
funzione. Una variabile dichiarata localmente, si trova sullo stack , e la durata di tale variabile è uguale
alla durata della funzione.
Poiché l'ambito di una variabile locale è il blocco in cui è dichiarata, è possibile dichiarare variabili con
lo stesso nome, come quelle di variabili dichiarate in altri blocchi, come pure quelle dichiarate a livelli
superiori, fino a livello globale.
Esempio:
void CalculateLWMA(int rates_total,int prev_calculated,int begin,const double &price[])
{
int i,limit;
static int weightsum=0;
double sum=0;
//---
if(prev_calculated==0)
{
limit=MA_Period+begin;
//--- imposta il valore vuoto per la prima barra limite
for(i=0; i<limit; i++) LineBuffer[i]=0.0;
//--- calcola il primo valore visibile
double firstValue=0;
for(int i=begin; i<limit; i++)
{
int k=i-begin+1;
weightsum+=k;
firstValue+=k*price[i];
}
firstValue/=(double)weightsum;
LineBuffer[limit-1]=firstValue;
}
else
{
limit=prev_calculated-1;
}
for(i=limit;i<rates_total;i++)
{
sum=0;
Il suo ambito è solo per il ciclo, al di fuori di questo ciclo è un'altra variabile con lo stesso nome,
dichiarata all'inizio della funzione. Inoltre, la variabile k viene dichiarata nel corpo del ciclo, il suo
ambito è il corpo del ciclo.
Le variabili locali possono essere dichiarate con lo specificatore di accesso static. In questo caso, il
compilatore ha una variabile nel pool globale di memoria. Pertanto, la durata di una variabile statica è
pari alla durata del programma. Qui la portata di tale variabile è limitata al blocco in cui è dichiarata.
Vedi anche
Tipi di dati, Incapsulamento ed Estensibilità dei T ipi,Inizializzazione delle Variabili, Creazione ed
Eliminazione di Oggetti
Nonostante il fatto che le variabili static vengono solitamente dichiarate a livello locale, la memoria
per queste variabili viene pre-assegnata, e l'inizializzazione viene eseguita subito dopo che un
programma viene caricato, lo stesso per le variabili globali.
Le variabili locali vengono deinizializzate alla fine del blocco del programma nel quale sono state
dichiarate, ed in senso opposto alla loro dichiarazione. Un blocco del programma è un operatore
composto che può essere una parte dell' operatore di selezione s witch, l'operatore ciclico (for, while,
do-while), il corpo di una funzione o una parte dell' operatore if-else.
Le variabili locali vengono inizializzate solo nel momento in cui l'esecuzione del programma incontra la
dichiarazione della variabile. S e durante l'esecuzione del programma, il blocco in cui viene dichiarata la
variabile non è stato eseguito, tale variabile non viene inizializzata.
I puntatori possono essere dichiarati a livello locale o globale, e possono essere inizializzati con il
valore vuoto di NULL o il valore del puntatore dello stesso tipo o ereditato. S e l' operatore new viene
chiamato per un puntatore dichiarato a livello locale, l' operatore delete per questo puntatore deve
essere eseguito prima di uscire dal livello. In caso contrario, il puntatore verrà perso e l'eliminazione
esplicita dell'oggetto avrà esito negativo.
T utti gli oggetti creati dall'espressione di object_pointer =new Class_name, devono essere quindi
eliminati per l'operatore delete(object_pointer). S e per qualche motivo tale variabile non viene
eliminata dall' operatore delete quando il programma è completato, la voce corrispondente apparirà nel
j ournal " Ex perts " . S i possono dichiarare pi ù variabili ed assegnare un puntatore di un oggetto a tutte
loro.
Cos ì oggetti dinamicamente piazzati, vengono creati solo nel momento in cui vengono creati
dall'operatore new, e sono cancellati in modo assicurato, dall'operatoredelete o automaticamente dal
sistema di esecuzione MQL5 durante il decarico del programma. L 'ordine di dichiarazione di puntatori
di oggetto creato dinamicamente non influenza l'ordine di inizializzazione. L 'ordine di inizializzazione e
deinizializzazione è interamente controllato dal programmatore.
Quando si lavora con oggetti di classe dinamici utilizzando l' operatore new, dapprima la memoria
viene richiesta dal pool della memoria della classe con cui il gestore della memoria sta lavorando. S e
non c'è abbastanza memoria nel pool, la memoria viene richiesta dal sistema operativo. Quando si
elimina l'oggetto dinamico utilizzando l' l'operatore delete, la memoria liberata viene immediatamente
restituica al pool di memoria della classe.
I l gestore della memoria restituisce la memoria indietro al sistema operativo immediatamente dopo
l'uscita delle seguenti funzioni event handling : OnInit(), OnDeinit(), OnS tart(), OnT ick (),
OnCalculate(), OnT imer(), OnT rade(), OnT ester(), OnT esterInit(), OnT esterPass(), OnT esterDeinit(),
OnChartEvent(), OnBook Event().
Logs Errore log dei messaggi sul log dei messaggi sul log dei messaggi sul
j ournal " Ex perts " al j ournal " Ex perts " al j ournal " Ex perts " in
tentativo di eliminare tentativo di eliminare merito ad oggetti
un oggetto creato un oggetto creato dinamicamete creati
automaticamente automaticamente non-eliminati al
decarico di un
programma MQL5
Vedi anche
Tipi di Dati, Incapsulamento ed Estensibilità dei T ipi,Inizializzazione delle Variabili, Ambito Visibilità
e Durata delle Variabili
Preprocessore
Il preprocessore è uno speciale sottosistema del compilatore MQL5 che è inteso per la preparazione del
codice sorgente del programma, immediatamente prima che il programma venga compilato.
Il preprocessore permette miglioramenti della leggibilità del codice sorgente. Il codice può essere
strutturato includendo file specifici che contengono codici sorgenti di programmi-mql5. La possibilità
di assegnare nomi mnemonici a costanti specifiche contribuisce al miglioramento della leggibilità del
codice.
· D ichiara costanti
· I mposta le proprietà del programma
· I mporta funzioni
· Compilazione Condizionale
Le direttive del preprocessore sono usate dal compilatore per pre-elaborare il codice sorgente prima di
compilarlo. La direttiva inizia sempre con #, quindi il compilatore vieta l'utilizzo del simbolo nei nomi
di variabili, funzioni, ecc.
Ogni direttiva è descritta da una voce separata ed è valida fino all'interruzione di riga. Non è possibile
utilizzare più direttive in un'unica voce. S e la voce direttiva è troppo grande, può essere suddivisa in
più righe usando il simbolo '\'. In questo caso, la riga successiva è considerata una continuazione della
voce direttiva.
//+------------------------------------------------------------------+
//| foreach pseudo-operator |
//+------------------------------------------------------------------+
#define ForEach(index, array) for (int index = 0, \
max_##index=ArraySize((array)); \
index<max_##index; index++)
//+------------------------------------------------------------------+
//| Funzione Start programma script |
//+------------------------------------------------------------------+
void OnStart()
{
string array[]={"12","23","34","45"};
//--- bypassa l'array usando ForEach
ForEach(i,array)
{
PrintFormat("%d: array[%d]=%s",i,i,array[i]);
}
}
//+------------------------------------------------------------------+
/* Risultato dell'output
0: array[0]=12
1: array[1]=23
2: array[2]=34
3: array[3]=45
*/
Per il compilatore, tutti queste tre righe di direttive #definire sembrano un'unica lunga riga. L 'esempio
sopra vale anche al carattere ## che è un operatore di unione utilizzato nelle macro #define per unire i
due tok en macro in uno solo. L 'operatore di unione(merge) di tok en non può essere il primo o l'ultimo
in una definizione di macro.
Ogni direttiva è descritta da una voce separata ed è valida fino all'interruzione di riga. Non è possibile
utilizzare più direttive in un'unica voce. S e la voce direttiva è troppo grande, può essere suddivisa in
più righe usando il simbolo '\'. In questo caso, la riga successiva è considerata una continuazione della
voce direttiva.
La direttiva #define può essere utilizzata per assegnare i nomi alle costanti mnemoniche. Ci sono due
forme:
La direttiva #define sostitutisce l'espressione per tutte le altre voci trovate di identificatore nel testo
di partenza. L 'identificatore è sostituito solo se è un tok en separato. L ' identificatore non è sostituito
se è parte di un commento, parte di una stringa, o parte di un altro identificatore più.
L 'identificatore costante è governato dalle stesse regole dei nomi delle variabili. Il valore può essere di
qualsiasi tipo:
expression può essere costituito da vari token, quali parole chiave, costanti, espressioni costanti e
non-costanti. expression termina con l'estremità della linea e non può essere trasferito alla linea
successiva.
Esempio:
#define DUE 2
#define TRE 3
#define INCOMPLETO DUE+TRE
#define COMPLETO (DUE+TRE)
voidOnStart()
{
Print("2 + 3*2 = ",INCOMPLETO*2);
Print("(2 + 3)*2 = ",COMPLETO*2);
}
// Risultato
// 2 + 3*2 = 8
// (2 + 3)*2 = 10
double c=MUL(A,B);
Print("c=",c);
/*
l'esprezzione double c=MUL(A,B);
è equivalente a double c=((2+3)*(5-1));
*/
// Risultato
// c=20
double c=MUL(A,B);
Print("c=",c);
/*
l'esprezzione double c=MUL(A,B);
è equivalente a double c=2+3*5-1;
*/
// Risultato
// c=16
Esempio:
#define MACRO
void func1()
{
#ifdef MACRO
Print("MACRO is defined in ",__FUNCTION__);
#else
Print("MACRO is not defined in ",__FUNCTION__);
#endif
}
#undef MACRO
void func2()
{
#ifdef MACRO
Print("MACRO is defined in ",__FUNCTION__);
#else
Print("MACRO is not defined in ",__FUNCTION__);
#endif
}
void OnStart()
{
func1();
func2();
}
/* Risultato:
MACRO is defined in func1
MACRO is not defined in func2
*/
Vedi anche
I dentificatori, Costanti Carattere
caratteri
utilizzata da un indicatore
personalizzato, questa proprietà è
necessaria.
S e si specifica il nome EA e il
numero di versione come
" <nome_ex pert> _ <numero> .set "
Specificando la proprietà
tester_everytick_calculate, è
possibile attivare il calcolo forzato
dell'indicatore su ogni tick .
EventChartCustom,
OnChartEvent, OnT imer;
· se l'indicatore è stato creato
usando il compilatore con
numero di build sotto il
1916.
· "1d,
input_parameter_name1,
input_parameter_name2"
significa un chart lineare, in
cui i risultati sono ordinati
in base al parametro
specificato. Ogni passaggio
viene visualizzato come un
punto. Il chart è basato su
un parametro.
· d,
"0
input_parameter_name1,
input_parameter_name2"
indica un chart normale con
risultati ordinati in base
all'ora di arrivo del risultato
del passaggio. Ogni
passaggio viene visualizzato
come un punto nel chart.
L 'indicazione dei parametri
non è richiesta, ma i
parametri specificati
possono essere utilizzati per
il passaggio manuale ad altri
tipi di chart.
Facoltativamente, è possibile
indicare solo il tipo di chart, senza
specificare uno o due parametri di
input. In questo caso, il terminale
selezionerà i parametri richiesti
per mostrare il chart di
ottimizzazione.
Esempi di Specificare un' Etichetta Separata per ogni Indicatore Buffer (" C open; C high; C low; C
close" )
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_plots 1
#property indicator_type1 DRAW_CANDLES
#property indicator_width1 3
#property indicator_label1 "C open;C high;C low;C close"
#include <file_name>
#include "file_name"
Esempi:
#include <WinUser32.mqh>
#include "mylib.mqh"
Il preprocessore rimpiazza la riga #include <file_name> con il contenuto del file W inUser32.mqh. Le
parentesi angolari indicano che il file W inUser32.mqh sarà preso dalla directory standard (di solito è
terminal_installation_directory\\MQL5\\Include). La directory corrente non è visibile.
Se il nome del file è racchiuso tra virgolette, la ricerca viene effettuata nella directory corrente (che
contiene il file sorgente principale). La directory standard non è visibile.
Vedi anche
S tandard Library, Importazione di Funzioni
#import "file_name"
func1 define;
func2 define;
...
funcN define;
#import
Funzioni importate possono avere qualsiasi nome. Funzioni aventi gli stessi nomi, ma da diversi
moduli possono essere importate contemporaneamente. Funzioni importate possono avere nomi che
coincidono con i nomi delle funzioni incorporate. L ' operazione di risoluzione ambito definisce quale
delle funzioni dovrebbe essere chiamata.
L 'ordine di ricerca di un file specificato dopo la parola chiave #import è descritto in Chiamata delle
Funzioni I mportate.
Poiché le funzioni importate sono al di fuori del modulo compilato, il compilatore non è in grado di
verificare la validità dei parametri passati. Pertanto, per evitare errori di run-time, si deve descrivere
con precisione la composizione e l'ordine dei parametri passati alle funzioni importate. I parametri
passati alle funzioni importate (sia da EX5, e dal modulo DLL) possono avere valori di default.
· puntatori (*);
Le classi, array di stringhe o oggetti complessi che contengono stringhe e/o array dinamici di ogni tipo
non possono essere passati come parametro alle funzioni importate dalla DLL.
Esempi:
#import "stdlib.ex5"
string ErrorDescription(int error_code);
int RGB(int valore_rosso,int valore_verde,int valore_blu);
bool CompareDoubles(double number1,double number2);
string DoubleToStrMorePrecision(double numero,int precisione);
string IntegerToHexString(int integer_number);
#import "ExpertSample.dll"
int GetIntValue(int);
double GetDoubleValue(double);
string GetStringValue(string);
double GetArrayItemValue(double &arr[],int,int);
bool SetArrayItemValue(double &arr[],int,int,double);
double GetRatesItemValue(double &rates[][6],int,int,int);
#import
Per importare le funzioni durante l'esecuzione di un programma di MQL5, viene utilizzata l'associazione
anticipata. Ciò significa che la libreria viene caricata durante il caricamento di un programma con il
suo programma EX5.
Non è raccomandato l'uso di un nome completo qualificato del modulo caricabile del tipo Unità:
\Cartella\NomeFile.Ext. Le librerie MQL5 vengono caricate dalla cartella terminal_dir\MQL5\Libraries.
Esempio:
#import "user32.dll"
//--- Per il sistema a 32 bit
int MessageBoxW(uint hWnd,string lpText,string lpCaption,uint uType);
//--- Per il sistema a 64 bit
int MessageBoxW(ulong hWnd,string lpText,string lpCaption,uint uType);
#import
//+------------------------------------------------------------------+
//| MessageBox_32_64_bit utilizza la versione corretta di MessageBoxW|
//+------------------------------------------------------------------+
int MessageBox_32_64_bit()
{
int res=-1;
//--- Se stiamo usando Windows a 64 bit
if(_IsX64)
{
ulong hwnd=0;
res=MessageBoxW(hwnd,"64-bit MessageBoxW call example","MessageBoxW 64 bit",MB_OK|MB_ICONINFO
}
else // Stiamo usando Windows a 32-bit
{
uint hwnd=0;
res=MessageBoxW(hwnd,"32-bit MessageBoxW esempio di chiamata","MessageBoxW 32 bit",MB_OK|MB_I
}
return (res);
}
//+------------------------------------------------------------------+
//| Funzione Start programma Script |
//+------------------------------------------------------------------+
void OnStart()
{
//---
int ans=MessageBox_32_64_bit();
PrintFormat("MessageBox_32_64_bit ha restituito %d",ans);
}
· S trutture semplici (POD, semplici vecchi dati) — strutture che contengono solo tipi di dati semplici.
· Funzioni statiche pubbliche aventi parametri in cui vengono utilizzati solo tipi semplici e strutture
POD o i loro array
#import "TestLib.dll"
//+------------------------------------------------------------------+
//| Funzione Start del programma Script |
//+------------------------------------------------------------------+
void OnStart()
{
int x=41;
TestClass::Inc(x);
Print(x);
}
Vedi anche
I nclusione Files
Ogni direttiva è descritta da una voce separata ed è valida fino all'interruzione di riga. Non è possibile
utilizzare più direttive in un'unica voce. S e la voce direttiva è troppo grande, può essere suddivisa in
più righe usando il simbolo '\'. In questo caso, la riga successiva è considerata una continuazione della
voce direttiva.
#ifdef identifier
// il codice che si trova qui viene compilato se l'identificatore è già stato definito per il pr
#endif
#ifndef identifier
// il codice che si trova qui viene compilato se l'identificatore non è attualmente definitp dal
#endif
Qualsiasi direttiva di compilazione condizionale può essere seguita da un numero qualsiasi di righe
eventualmente contenenti la direttiva #else e terminante con #endif. S e la condizione verificata è
vera, le righe tra #else ed #endif vengono ignorate. S e la condizione verificata non è soddisfatta,
tutte le righe tra il controllo e la direttiva #else (o direttiva #endif se la prima è assente) vengono
ignorate.
Esempio:
#ifndef TestMode
#define TestMode
#endif
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
#ifdef TestMode
Print("Modalità Test");
#else
Print("Modalità Normale");
#endif
}
A seconda del tipo di programma e modalità di compilazione, le macro standard sono definite nel
seguente modo:
la macro __MQL5__ viene definita quando si compila il file *.mq5, la macro __ MQL 4__ viene definita
durante la compilazione di un *.mq4.
Esempio:
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
#ifdef __MQL5__
#ifdef _DEBUG
Print("Saluti dal compilatore MQL5 [DEBUG]");
#else
#ifdef _RELEASE
Print("Saluti dal compilatore MQL5 [RELEASE]");
#endif
#endif
#else
#ifdef __MQL4__
#ifdef _DEBUG
Print("Saluti dal compilatore MQL4 [DEBUG]");
#else
#ifdef _RELEASE
Print("Saluti dal compilatore MQL4 [RELEASE]");
#endif
#endif
#endif
#endif
}
· Ereditarietà
· Polimorfismo
· S ovraccarico
· F unzioni virtuali
L ' OOP considera il calcolo come la modellazione del comportamento. L 'elemento modellato è l'oggetto
rappresentato da astrazioni computazionali. S upponiamo di voler scrivere il noto gioco " T etris " . Per
fare questo, dobbiamo imparare a modellare l'apparenza di forme casuali composte da quattro
quadrati uniti tra loro da bordi. I noltre abbiamo bisogno di regolare la velocità di caduta delle forme,
definire le operazioni di rotazione e lo spostamento delle forme. Lo spostamento delle forme sullo
schermo è limitato da confini del 'pozzo', tale requisito deve anch'essere modellato. Oltre a ciò, le
righe riempite di cubi devono essere distrutte ed i punti conseguiti devono essere contati.
Cos ì, questo gioco di-facile-comprensione richiede la creazione di vari modelli - modello delle forme,
modello del pozzo, il modello del movimento della forma e cos ì via. T utti questi modelli sono
astrazioni, rappresentate dai calcoli del computer. Per descrivere questi modelli, viene usato il
concetto di T ipo di Dati Astratti, ADT (o tipo di dati complessi). S trettamente parlando, il modello del
movimento delle " forme" nel DOM non è un tipo di dati, ma è un insieme di operazioni sul tipo di dati
" forma" , utilizzando le restrizioni del tipo di dati " pozzo" .
G li oggetti sono variabili classe. La programmazione orientata agli oggetti permette di creare e
utilizzare facilmente ADT . La programmazione orientata agli oggetti utilizza il meccanismo dell'
ereditarietà. Il vantaggio dell' ereditarietà è nel fatto che essa consente di ottenere tipi derivati da
tipi di dati già definiti dall'utente.
Ad esempio, per creare le forme del T etris, è conveniente creare prima una classe base S hape. Le
altre classi che rappresentano tutti i tipi di sette forme possibili si può ottenere sulla sua base. Il
comportamento delle forme è definito nella classe base, mentre l'attuazione del comportamento di
ogni forma separata è definito nelle classi derivate.
N ella programmazione orientata agli oggetti, essi sono responsabili per il loro comportamento. Lo
sviluppatore ADT dovrebbe includere un codice per descrivere qualsiasi comportamento che
normalmente ci si aspetterebbe dagli oggetti corrispondenti. Il fatto che l'oggetto stesso è
responsabile per il suo comportamento, semplifica notevolmente il compito di programmazione per
l'utente di questo oggetto.
Se vogliamo disegnare una forma sullo schermo, abbiamo bisogno di sapere dove sarà il centro e come
disegnarlo. S e una forma separata sa come disegnare se stessa, il programmatore deve inviare un
messaggio di " disegna" quando si utilizza tale forma.
A lcuni di questi concetti sono piuttosto vaghi, alcuni sono astratti, altri sono generali.
Un tipo di dato astratto, per esempio, una stringa, è una descrizione dell' ideale, ben noto,
comportamento del tipo.
L 'utente che utlizza la stringa sa che le operazioni sulle stringhe, quali concatenazione o stampa,
hanno un certo comportamento. Operazioni di concatenazione e stampa sono chiamate metodi.
U na certa implementazione di ADT può avere alcune limitazioni, per esempio, le stringhe possono
essere limitate in lunghezza. Queste limitazioni influenzano il comportamento aperto a tutte. Al tempo
stesso, dettagli di implementazione interni o privati non influenzano direttamente il modo in cui
l'utente vede l'oggetto. Ad esempio, la stringa è spesso implementata come un array, mentre l'indirizzo
di base interno di questo array ed il suo nome non sono essenziali per l'utente.
La parola chiave public indica che l'accesso ai membri che stanno dietro di esso, è aperto senza
restrizioni. S enza questa parola chiave, i membri della classe sono bloccati per impostazione
predefinita. I membri privati s ono accessibili solo da funzioni che sono membro soltanto della sua
classe.
Funzioni di classe protette sono disponibili per funzioni di classe non solo nella sua classe, ma anche
nelle sue classi eredi. Funzioni di classe pubbliche sono disponibili per qualsiasi funzione nell'ambito
della dichiarazione di classe. La protezione permette di nascondere parte dell'implementazione della
classe, impedendo cambiamenti inattesi nella struttura dei dati. R estrizioni all' accesso oppure
oscuramento dei dati sono una caratteristica della programmazione orientata agli oggetti.
Di solito, le funzioni di classe sono protette e dichiarate con il modificatore protected, la lettura e la
scrittura dei valori vengono eseguite utilizzando cosiddetti speciali metodi set-and-get che sono
definiti dai modificatori pubblici di accesso.
Esempio:
class CPerson
{
protected:
string m_name; // name
public:
void SetName(string n){m_name=n;}// imposta il nome
string GetName(){return (m_name);} // restituisce il nome
};
Questo approccio offre diversi vantaggi. In primo luogo, dal nome della funzione possiamo capire ciò
che fa - imposta o ottiene il valore di un membro della classe. In secondo luogo, forse in futuro ci sarà
bisogno di cambiare il tipo della variabile m_name nella classe CPerson o in una delle sue classi
derivate.
In questo caso, abbiamo bisogno solo di modificare l'implementazione delle funzioni S etName() e
G etName(), mentre gli oggetti della classe CPerson saranno disponibili per l'utilizzo in un programma
senza modifiche al codice, perché l'utente non sa nemmeno che il tipo di dati di m_name è cambiato.
Esempio:
struct Name
{
string first_name; // nome
string last_name; // cognome
};
class CPerson
{
protected:
Name m_name; // nome
public:
void SetName(string n);
string GetName(){return(m_name.first_name+" "+m_name.last_name);}
private:
string GetFirstName(string full_name);
string GetLastName(string full_name);
};
void CPerson::SetName(string n)
{
m_name.first_name=GetFirstName(n);
m_name.last_name=GetLastName(n);
}
Vedi anche
T ipi di Dati
Ereditarietà
La caratteristica della OOP è l'incoraggiamento del riutilizzo del codice attraverso l'ereditarietà. Una
nuova classe viene costituita da una esistente, che è chiamata la classe base. La classe derivata
utilizza i membri della classe base, ma può anche modificarli e completarli.
Molti tipi sono variazioni dei tipi esistenti. È spesso tediante sviluppare un nuovo codice per ciascuno
di essi. Inoltre, un nuovo codice comporta nuovi errori. La classe derivata eredita la descrizione della
classe base, in tal modo qualsiasi nuovo sviluppo e re-testing del codice non è necessario. Le relazioni
di ereditarietà sono gerarchiche.
La gerarchia è un metodo che permette di copiare gli elementi in tutta la loro diversità e complessità.
Esso introduce la classificazione oggetti. Ad esempio, la tavola periodica degli elementi ha i gas. Essi
possiedono le proprietà intrinseche a tutti gli elementi periodici.
G as inerti costituiscono la successiva sottoclasse più importante. La gerarchia è che il gas inerte,
come l'argon, è un gas, ed il gas, a sua volta, è parte del sistema. T ale gerarchia permette di
interpretare il comportamento di gas inerti facilmente. S appiamo che i loro atomi contengono protoni
ed elettroni, che è vero per tutti gli altri elementi.
Sappiamo che sono in uno stato gassoso a temperatura ambiente, come tutti i gas. S appiamo che
nessun gas della sottoclasse dei gas inerti, entra usualmente in reazione chimica con altri elementi, ed
è una proprietà di tutti i gas inerti.
Si consideri un esempio della successione di forme geometriche. Per descrivere la varietà di forme
semplici (cerchio, triangolo, rettangolo, quadrato, ecc.), il modo migliore è quello di creare una classe
base (ADT ), che è l'antenato di tutte le classi derivate.
Creiamo un classe base CS hape, che contiene solo i componenti più comuni che descrivono la forma.
Questi membri descrivono proprietà caratteristiche a qualsiasi forma - il tipo di forma e le principali
coordinate di punto di ancoraggio.
Esempio:
//--- La classe base Shape
class CShape
{
protected:
int m_type; // tipo di Shape(forma)
int m_xpos; // X - coordinate del punto base
int m_ypos; // Y - coordinate del punto base
public:
CShape(){m_type=0; m_xpos=0; m_ypos=0;} // costruttore
void SetXPos(int x){m_xpos=x;} // imposto X
void SetYPos(int y){m_ypos=y;} // imposto Y
};
Successivamente, creare nuove classi derivate dalla classe base, in cui si andranno ad aggiungere i
campi necessari, ognuna delle quali specifica una certa classe. Per la forma del Cerchio è necessario
aggiungere un membro che contiene il valore del raggio. La forma del Quadrato è caratterizzata dal
valore del lato. Pertanto, classi derivate, ereditate dalla classe base CS hape verranno dichiarate come
segue:
public:
CCircle(){m_type=1;}// costruttore, type 1
};
public:
CSquare(){m_type=2;} // costruttore, type 2
};
Occorre notare che mentre l'oggetto viene creato viene chiamato prima il costruttore della classe base,
e poi viene chiamato il costruttore della classe derivata. Quando un oggetto viene distrutto viene
prima chiamato il distruttore della classe derivata, e poi viene chiamato il distruttore della classe
base.
Cos ì, dichiarando i membri più generici nella classe base, possiamo aggiungere i membri addizionali
nelle classi derivate, che specificano una classe particolare. L 'ereditarietà consente di creare potenti
librerie di codice che possono essere riutilizzate più volte.
La sintassi per creare una classe derivata da una già esistente è la seguente:
class class_name :
(public | protected | private) opt base_class_name
{
dichiarazione di membri della classe
};
Uno degli aspetti della classe derivata è la visibilità (apertura) dei suoi membri successori (eredi). Le
parole chiave public, protected e private vengono utilizzate per indicare il grado, con cui i membri
della classe base saranno disponibili per qualla derivata. La parola chiave public dopo i due punti
nell'intestazione di una classe derivata indica che i membri protetti e pubblici della classe base CS hape
devono essere ereditati come membri protetti e pubblici della classe derivata CCircle.
I membri della classe private della classe base non sono disponibili per la classe derivata.
L 'ereditarietà public anche significa che le classi derivate (CCircle e CS quare) sono CS hapes. Cioè, il
Quadrato (CS quare) è una forma (CS hape), ma la forma non deve necessariamente essere un
quadrato.
La classe derivata è una modifica della classe base, essa eredita i membri protetti e pubblici della
classe base. I costruttori e distruttori della classe di base non possono essere ereditati. Oltre ai
membri della classe base, nuovi membri vengono aggiunti nella classe derivata.
La classe derivata può includere l'implementazione di funzioni membro, diverse dalla classe base. Non
ha niente in comune con l' overload, laddove il significato del nome della stessa funzione può essere
diverso per le differenti sigle.
Nell' ereditarietà protected, i membri public e protected della classe base divengono membri protected
della classe derivata. Nell' ereditarietà private, i membri public e protected della classe base
divengono membri private della classe derivata.
Nelle ereditarietà protected e private, la relazione che " l'oggetto di una classe derivata sia l' oggetto di
una classe base" non è vero. Le ereditarietà protected e private sono rare, e ciascuna di esse deve
essere usata con attenzione.
Si dovrebbe comprendere che il tipo di ereditarietà (public, protected o private) non influenza le vie di
accesso ai membri delle classi base nella gerarchia di ereditarietà da una classe derivata. Con
qualunque tipo di eredità, solo i membri della classe base dichiarata con gli specificatori di accesso
public e protected saranno disponibili fuori dalle classi derivate. Prendiamolo in considerazione nel
seguente esempio:
};
//+--------------------------------------------------------------------------------+
//| Classe derivata con errori |
//+--------------------------------------------------------------------------------+
class CDerived: public CBaseClass // la specifica di ereditarietà pubblica può essere omessa, in qu
{
public:
void Func() // Nella classe derivata, definire una funzione con le chiamate ai membri della clas
{
//--- Un tentativo di modifica di un membro private della classe base
m_member=0; // Errore, il membro private della classe base non è disponibile
Member(0); // Errore, il metodo private della classe base non è disponibile nelle cla
//--- Lettura del membro della classe base
Print(m_member); // Errore, il membro private della classe base non è disponibile
Print(Member()); // Nessun errore, il metodo di protezione è disponibile dalla classe base
}
};
In caso di ereditarietà protected, tutti i membri della classe base con accesso public e protected
diventano protected. Ciò significa che se i dati public dei membri e metodi della classe di base erano
accessibili dall'esterno, con l'ereditarietà protected sono disponibili solo dalle classi della classe
derivata e dei suoi ulteriori derivati.
//+--------------------------------------------------------------------------------+
//| Esempio di classe con un qualche tipo di accesso |
//+--------------------------------------------------------------------------------+
class CBaseMathClass
{
private: //--- Il membro private non è disponibile da classi derivate
double m_Pi;
public: //--- Ottenere ed impostare un valore per m_Pi
void SetPI(double v){m_Pi=v;return;};
double GetPI(){return m_Pi;};
public: // Il costruttore della classe è a disposizione di tutti i membri
CBaseMathClass() {SetPI(3.14); PrintFormat("%s",__FUNCTION__);};
};
//+--------------------------------------------------------------------------------+
//| Classe derivata, in cui m_Pi non può essere modificato |
//+--------------------------------------------------------------------------------+
class CProtectedChildClass: protected CBaseMathClass // Ereditarietà protected
{
private:
double m_radius;
public: //--- Metodi public nella classe derivata
void SetRadius(double r){m_radius=r; return;};
double GetCircleLength(){return GetPI()*m_radius;};
};
//+--------------------------------------------------------------------------------+
//| Funzione di starting dello Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- Quando si crea una classe derivata, il costruttore della classe base verrà chiamato automatic
CProtectedChildClass pt;
//--- Specificare il raggio
pt.SetRadius(10);
PrintFormat("Length=%G",pt.GetCircleLength());
//--- Se commentiamo la stringa qui di seguito, verrà visualizzato un errore in fase di compilazion
// pt.SetPI(3);
//--- Ora dichiariamo una variabile della classe base e cerchiamo di impostare la costante Pi ugual
CBaseMathClass bc;
bc.SetPI(10);
//--- Ecco il risultato
PrintFormat("bc.GetPI()=%G",bc.GetPI());
}
L 'esempio mostra che i metodi S etPi() e GetPi() nella classe base CBaseMathClass sono aperti e
disponibili per essere chiamati da qualsiasi punto del programma. Ma al tempo stesso, per
CProtectedChildClass che è derivato da esso questi metodi possono essere chiamati solo dai metodi
della classe CProtectedChildClass o sue classi derivate.
In caso di ereditarietà private, tutti i membri della classe di base con accesso public e protected
diventato private, e chiamarli diventa impossibile in un' ulteriore eredità.
Vedi anche
S trutture e Classi
Polimorfismo
Il polimorfismo è una opportunità per le diverse classi di oggetti, relazionate attraverso l'ereditarietà,
per rispondere in vari modi quando si chiama lo stesso elemento della funzione. Contribuisce a creare
un meccanismo universale che descrive il comportamento non solo della classe base, ma anche delle
classi discendenti.
Continuiamo a sviluppare una classe base CS hape ,e definiamo un membro della funzione GetArea(),
designato per calcolare l'area di una forma. In tutte le classi discendenti, prodotto per eredità dalla
classe base, ri-definiamo questa funzione secondo le regole del calcolo dell'area di una forma
particolare.
Per un quadrato (classe CS quare), l'area è calcolata attraverso i suoi lati, per un cerchio (classe
CCircle), l'area si esprime attraverso il suo raggio, ecc. S iamo in grado di creare un array per
memorizzare gli oggetti di tipo CS hape, in cui entrambi gli oggetti di una classe base e quelli di tutte
le classi discendenti possono essere memorizzati. Inoltre siamo in grado di chiamare la stessa
funzione per ogni elemento della matrice.
Esempio:
//--- Base class
class CShape
{
protected:
int m_type; // Tipo di forma
int m_xpos; // X - coordinata del punto base
int m_ypos; // Y - coordinata del punto base
public:
void CShape(){m_type=0;}; // costruttore, type=0
int GetType(){return(m_type);};// restituisce il tipo della forma
virtual
double GetArea(){return (0); }// restituisce l'area della forma
};
Ora, tutte le classi derivate hanno un membro di funzione getArea(), che restituisce un valore pari a
zero. L 'implementazione di questa funzione in ogni discendente varierà.
public:
void CCircle(){m_type=1;}; // costruttore, type=1
void SetRadius(double r){m_radius=r;};
virtual double GetArea(){return (3.14*m_radius*m_radius);}// area del cerchio
};
class CSquare : public CShape // Dopo i due punti si definisce la classe base
{ // da cui viene fatta l'eredità
private:
double m_square_side; // lato del quadrato
public:
void CSquare(){m_type=2;}; // costruttore, type=1
void SetSide(double s){m_square_side=s;};
virtual double GetArea(){return (m_square_side*m_square_side);}// area del quadrato
};
Per calcolare l'area del quadrato e del cerchio, abbiamo bisogno dei valori corrispondenti di m_radius e
m_s quare_side, cos ì abbiamo aggiunto la funzione setR adius e S etS ide() nella dichiarazione della
classe corrispondente.
Si presume che oggetti di tipo diverso (CCircle e CS quare) derivati da uno tipo base CS hape sono
utilizzati nel nostro programma. Il polimorfismo consente di creare un array di oggetti della classe
base CS hape, ma quando si dichiara questo array, questi oggetti sono ancora sconosciuti ed il loro tipo
non è definito.
La decisione su quale tipo di oggetto sarà contenuto in ogni elemento della matrice sarà presa
direttamente durante l'esecuzione del programma. Ciò comporta la creazione dinamica di oggetti di
classi corrispondenti, e quindi la necessità di utilizzare puntatori agli oggetti invece degli oggetti.
Il nuovo operatore viene utilizzato per la creazione dinamica di oggetti. Ognuno di questi oggetti deve
essere individualmente ed esplicitamente eliminato utilizzando l'operatore delete. Quindi noi
dichiariamo un array di puntatori di tipo CS hape, e creiamo un oggetto di un tipo adatto per ogni
elemento (nome_nuovaClasse), come illustrato nello script di esempio seguente:
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- Dichiara un array di puntatori a oggetti del tipo base
CShape *shapes[5]; // Un array di puntatori all'oggetto CShape
//circle=new CCircle();
//circle.SetRadius(10);
//shapes[2]=circle;
}
}
}
Si prega di notare che quando si elimina un oggetto utilizzando l'operatore delete, il tipo del suo
puntatore deve essere controllato. S olo gli oggetti con il puntatore POINT ER_DYNAM IC possono essere
eliminati usando delete. Per i puntatori di altro tipo, verrà restituito un errore.
Ma oltre la ridefinizione delle funzioni durante la ereditarietà, il polimorfismo include anche l'
implementazione di una e le stesse funzioni con diversi set di parametri all'interno di una classe. Ciò
significa che la classe può avere funzioni diverse con lo stesso nome, ma con un diverso tipo e/o
insieme di parametri. In questo caso, il polimorfismo è attuato mediante l'overload di funzione.
Vedi anche
S tandard Library
L' Overload
ll interno di una classe è possibile definire due o più metodi che utilizzano lo stesso nome, ma hanno
A '
un diverso numero di parametri. Quando ciò si verifica, i metodi vengono chiamati overloaded(_*
sovraccarico) e tale processo viene indicato come metodo di overloading.
Il metodo di overloading è uno dei modi di realizzazione del polimorfismo. L ' Overloading dei metodi è
eseguito secondo le stesse regole dell' overloading di funzioni.
S e non vi è corrispondenza esatta a tutti i livelli, ma vengono trovate diverse funzioni adatte a diversi
livelli, viene utilizzata la funzione trovata al livello minimo. All'interno di un livello, non vi può essere
più di una funzione adatta.
Vedi anche
F unzioni di R icarica
Funzioni Virtuali
La parola chiave virtuale è l'identificatore di funzione, che fornisce un meccanismo per selezionare
dinamicamente in fase di esecuzione un appropriato membro-di-funzione tra le funzioni delle classi di
base e derivate. Le strutture non possono avere funzioni virtuali. Esse possono essere utilizzate per
cambiare le dichiarazioni solo per i membri della funzione.
La funzione virtuale, come una funzione ordinaria, deve avere un corpo eseguibile. Quando viene
chiamata, la sua semantica è la stessa di quella delle altre funzioni.
U na funzione virtuale può essere sottoposta a override in una classe derivata. La scelta di quale
definizione di funzione dovrebbe essere chiamata per una funzione virtuale, è fatta in modo dinamico
(in fase di esecuzione). Un caso tipico è quando una classe base contiene una funzione virtuale, e
classi derivate hanno le loro versioni di questa funzione.
Il puntatore alla classe base può indicare sia un oggetto di classe base che l'oggetto di una classe
derivata. La scelta del membro-funzione da chiamare verrà eseguita in fase di esecuzione e dipende
dal tipo di oggetto, non dal tipo di puntatore. S e non vi sono membri di un tipo derivato, la funzione
virtuale della classe base viene utilizzata per impostazione predefinita.
I Distruttori sono sempre virtuali, indipendentemente dal fatto che siano dichiarati o meno con la
parola chiave virtual.
Prendiamo in considerazione l'uso di funzioni virtuali sull'esempio di M T 5_T etris.mq5. La classe base
CT etris S hape con la funzione virtuale Dra è definita nel file include M T 5_T etris S hape.mqh.
//+--------------------------------------------------------------------------------+
class CTetrisShape
{
protected:
int m_type;
int m_xpos;
int m_ypos;
int m_xsize;
int m_ysize;
int m_prev_turn;
int m_turn;
int m_right_border;
public:
void CTetrisShape();
void SetRightBorder(int border) { m_right_border=border; }
void SetYPos(int ypos) { m_ypos=ypos; }
void SetXPos(int xpos) { m_xpos=xpos; }
int GetYPos() { return(m_ypos); }
int GetXPos() { return(m_xpos); }
int GetYSize() { return(m_ysize); }
int GetXSize() { return(m_xsize); }
int GetType() { return(m_type); }
void Left() { m_xpos-=SHAPE_SIZE; }
void Right() { m_xpos+=SHAPE_SIZE; }
void Rotate() { m_prev_turn=m_turn; if(++m_turn>3) m_turn=0; }
Inoltre, per ciascuna classe derivata, questa funzione è implementata in conformità con le
caratteristiche di una classe discendente. Ad esempio, la prima forma CT etris S hape1 ha la propria
implementazione della funzione Draw():
La forma Square è descritta dalla classe CT etris S hape6 ha la propria implementazione del metodo
Draw() :
{
int i;
string name;
//---
for(i=0; i<2; i++)
{
name=SHAPE_NAME+(string)i;
ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos+i*SHAPE_SIZE);
ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos);
}
for(i=2; i<4; i++)
{
name=SHAPE_NAME+(string)i;
ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos+(i-2)*SHAPE_SIZE);
ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos+SHAPE_SIZE);
}
}
};
A seconda della classe a cui appartiene l'oggetto creato, essa chiama la funzione virtuale di questa o
quella classe derivata.
void CTetrisField::NewShape()
{
//--- creazione di una delle 7 forme possibili a caso
int nshape=rand()%7;
switch(nshape)
{
case 0: m_shape=new CTetrisShape1; break;
case 1: m_shape=new CTetrisShape2; break;
case 2: m_shape=new CTetrisShape3; break;
case 3: m_shape=new CTetrisShape4; break;
case 4: m_shape=new CTetrisShape5; break;
case 5: m_shape=new CTetrisShape6; break;
case 6: m_shape=new CTetrisShape7; break;
}
//--- draw
m_shape.Draw();
//---
}
Modifier 'override'
Il modificatore 'overrire' significa che la funzione dichiarata deve eseguire l'override(" scavalco) del
metodo di una classe genitore. L 'utilizzo di questo metodo consente di evitare errori di primaria
importanza, ad esempio, consente di evitare la modifica accidentale della firma del metodo.
S upponiamo che, il metodo 'func' è definito nella classe base. I l metodo accetta una variabile int come
argomento:
class CFoo
{
void virtual func(int x) const { }
};
T uttavia, il tipo di argomento è erroneamente cambiato da int a short. In realtà, questo non è
l'overriding del metodo, ma è l'overloading del metodo. Agendo in accordo all algoritmo definente la
funzione overloadata, Il compilatore può in alcune situazioni scegliere un metodo definito nella classe
base invece del metodo overridato.
Al fine di evitare tali errori, si dovrebbe aggiungere in modo esplicito il modificatore 'override' per il
metodo che si desidera overridare.
Se la firma del metodo viene modificata durante l'override, il compilatore non sarà in grado di trovare
un metodo con la stessa firma nella classe padre, e restituituirà un errore di compilazione:
'CBar::func' medoto è dichiarato con lo specificatore 'override' ma non fa l'override di nessun met
Modificatore 'final'
Il modificatore 'final' fa il contrario — vieta il metodo prevalente alla classi figlie. S e
un'implementazione metodo è sufficiente e completa del tutto, dichiarare questo metodo con il
modificatore 'final' in modo da assicurarsi che non sarà modificato successivamente.
class CFoo
{
void virtual func(int x) final { }
};
Se si tenta di eseguire l'override un metodo con il modificatore 'final', come mostrato nell'esempio
precedente, il compilatore restituirà un errore:
'CFoo::func' metodo dichiarato come 'final' non può essere overridato da 'CBar::func'
vedere la dichiarazione di 'CFoo::func'
Vedi anche
S tandard Library
L 'incapacità di dichiarare membri statici di una classe avrebbe comportato la necessità di dichiarare
questi dati a livello globale del programma. R omperebbe la relazione tra i dati e la loro classe, e non è
coerente con il paradigma di base della programmazione orientata agli oggetti - unione dati e metodi
per la loro gestione in una classe. Il membro statico consente ai dati della classe che non sono specifici
di una particolare istanza di esistere nell'ambito classe.
Poiché un membro della classe statica non dipende dalla particolare istanza, il riferimento è il
seguente:
class_name::variable
dove class_name è il nome della classe, e variabile è il nome del membro della classe.
Come vedete, per accedere al membro statico di una classe, viene utilizzato l'operatore di risoluzione
del contesto :. Quando si accede ad un membro statico all'interno dei metodi della classe, l'operatore
di contesto è opzionale.
Il membro statico di una classe deve essere esplicitamente inizializzato con il valore desiderato. Per
q uesto esso deve essere dichiarato ed inizializzato in ambito globale. La sequenza di inizializzazione
dei membri statici corrisponderà alla sequenza della loro dichiarazione in ambito globale.
Ad esempio, abbiamo la classe CParser usata per l'analisi del testo, ed abbiamo bisogno di contare il
numero totale di parole e caratteri elaborati. Abbiamo solo bisogno di dichiarare i necessari membri
della classe di statici ed inizializzarli a livello globale. Poi tutte le istanze della classe utilizzeranno i
contatori comuni di parole e caratteri.
//+--------------------------------------------------------------------------------+
//| Classe "Text analyzer" |
//+--------------------------------------------------------------------------------+
class CParser
{
public:
static int s_words;
static int s_symbols;
//--- Costruttore e distruttore
CParser(void);
~CParser(void){};
};
...
//--- Inizializzazione dei membri statici della classe Parser a livello globale
int CParser::s_words=0;
int CParser::s_symbols=0;
Un membro statico della classe può essere dichiarato con la parola chiaveconst. T ali costanti statiche
devono essere inizializzate a livello globale con la parola chiave const :
//+--------------------------------------------------------------------------------+
//| Classe "Stack" per memorizzare i dati elaborati |
//+--------------------------------------------------------------------------------+
class CStack
{
public:
CStack(void);
~CStack(void){};
...
private:
static const int s_max_length; // Massima capacità stack
};
Puntatore this
La parola chiave this denota un implicitamente dichiarato puntatore a s é - ad un'istanza specifica della
classe, nel contesto del quale viene eseguito il metodo. Esso può essere utilizzato solo in metodi non
statici della classe. Il puntatore this è un implicito non-statico membro di qualsiasi classe.
N elle funzioni statiche è possibile accedere solo a membri/metodi statici di una classe.
Metodi statici
In MQL5 possono essere utilizzate le funzioni membro del tipo static. Il modificatore static deve
precedere il tipo di ritorno di una funzione nella dichiarazione all'interno di una classe.
class CStack
{
public:
//--- Costruttore e distruttore
CStack(void){};
~CStack(void){};
//--- Massima capacità stack
static int Capacity();
private:
int m_length; // Il numero di elementi nello stack
static const int s_max_length; // Massima capacità stack
};
//+--------------------------------------------------------------------------------+
//| Restituisce il numero massimo di elementi da memorizzare nello stack |
//+--------------------------------------------------------------------------------+
int CStack::Capacity(void)
{
return(s_max_length);
}
//--- Inizializzazione delle costanti statiche della classe CStack
const int CStack::s_max_length=1000;
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- dichiara il tipo di variabile CStack
CStack stack;
//--- chiama il metodo statico dell'oggetto
Print("CStack.s_max_length=",stack.Capacity());
//--- può anche essere chiamato nel seguente modo, giacchè il metodo è statico e non richiede la pr
Print("CStack.s_max_length=",CStack::Capacity());
}
Un metodo con il modificatore const viene chiamato costante e non può modificare i membri impliciti
della sua classe. Le dichiarazione di funzioni costanti di una classe e parametri costanti, viene
denominata controllo di correttezza-const. Attraverso questo controllo si può essere sicuri che il
compilatore garantisce la coerenza dei valori degli oggetti e restituisce un errore in fase di
compilazione se vi è qualcosa di sbagliato.
Il modificatore const viene inserito dopo l'elenco degli argomenti all'interno di una dichiarazione della
classe. La definizione fuori da una classe deve anche includere il modificatore const:
//+--------------------------------------------------------------------------------+
//| Classe "Rettangolo" |
//+--------------------------------------------------------------------------------+
class CRectangle
{
private:
double m_width; // Spessore
double m_height; // Altezza
public:
//--- Costruttore e distruttore
CRectangle(void):m_width(0),m_height(0){};
CRectangle(const double w,const double h):m_width(w),m_height(h){};
~CRectangle(void){};
//--- Calcola l'area
double Square(void) const;
static double Square(const double w,const double h);// { return(w*h); }
};
//+--------------------------------------------------------------------------------+
//| Restituisce l'area dell'oggetto "Rettangolo" |
//+--------------------------------------------------------------------------------+
double CRectangle::Square(void) const
{
return(Square(m_width,m_height));
}
//+--------------------------------------------------------------------------------+
Un ulteriore argomento a favore dell'utilizzo del controllo di costanza è il fatto che in questo caso, il
compilatore genera un'ottimizzazione speciale, per esempio, inserisce un oggetto costante nella
memoria di sola lettura.
Una funzione statica non può essere determinata con il modificatore const, perché questo
modificatore assicura la costanza dei membri dell' istanza quando si chiama questa funzione. Ma,
come detto sopra, la funzione statica non può accedere a membri non statici della classe.
Vedi anche
ariabili statiche, Variabili, R iferimenti. Modificatore & e Parola Chiave this
V
Templates di Funzioni
F unzioni overloadate vengono comunemente utilizzati per eseguire operazioni simili su vari tipi di
dati. ArrayS ize() è un semplice esempio di tale funzione in MQL5. R estituisce la grandezza di qualsiasi
tipo di array. In realtà, questa funzione di sistema è overloadata e l'intera implementazione di un tale
sovraccarico è nascosto agli sviluppatori di applicazioni MQL5:
int ArraySize(
void& array[] // array verificato
);
Ciò significa che il compilatore del linguaggio MQL5 inserisce implementazioni necessarie per ogni
chiamata di questa funzione. Ad esempio, è cos ì che si può fare per gli array di tipo double:
int ArraySize(
int& array[] // array con elementi di tipo int
);
La funzione Arraysize() può essere visualizzata nel modo seguente per il tipo di array M qlR ates per
l'utilizzo di quotazioni in formato dati storici:
int ArraySize(
MqlRates& array[] // array riempito con valori di tipo MqlRates
);
Pertanto, è molto conveniente utilizzare la stessa funzione per lavorare con differenti tipi. Ad ogni
modo, dev ' essere effettuato tutto il lavoro preliminare - la funzione necessaria deve essere
overloadata per tutti i tipi di dati con cui dovrebbe funzionare correttamente.
C'è una soluzione conveniente. S e operazioni simili devono essere eseguite per ogni tipo di dati, è
possibile utilizzare i modelli di funzione. In questo caso, un programmatore ha bisogno di scrivere solo
una descrizione del template funzione. Quando si descrive il template in modo tale, dovremmo
specificare solo qualche parametro formale invece di un tipo definito di dati con cui la funzione
dovrebbe lavorare. Il compilatore genera automaticamente varie funzioni per la corretta gestione di
ogni tipo in base ai tipi di argomenti utilizzati quando si chiama la funzione.
La definizione del template di funzione inizia con la parola chiave template seguita dalla lista dei
parametri formali tra parentesi angolari. Ogni parametro formale è preceduto dalla parola chiave
typename. I tipi di parametri formali sono di tipo built-in o definiti-dall'utente. Essi sono utilizzati:
Il numero di parametri del modello non può essere superiore ad otto. Ogni parametro formale nella
definizione del modello dovrebbe apparire nella lista dei parametri della funzione almeno una volta.
Ogni nome del parametro formale deve essere univoco.
D i seguito è riportato un esempio di un modello di funzione per ricercare il valore più alto nell' array di
q ualsiasi tipo numerico (numeri interi e reali):
template<typename T>
T ArrayMax(T &arr[])
{
uint size=ArraySize(arr);
if(size==0) return(0);
T max=arr[0];
for(uint n=1;n<size;n++)
if(max<arr[n]) max=arr[n];
//---
return(max);
}
Questo template definisce la funzione che rileva il valore massimo nell'array passato e restituisce
questo valore come risultato. T enete a mente che la funzione A rrayMax imum() costruita in MQL5
restituisce solo l'indice di più alto valore che può essere utilizzato per trovare il valore stesso. Ad
esempio:
Cos ì, abbiamo effettuato due passaggi per ottenere il più alto valore nell'array. Con il template di
funzione ArrayMax (), si può ottenere il risultato del tipo necessario semplicemente passando l'array di
un tipo appropriato in questa funzione. S ignifica che invece delle ultime due righe
ora è possibile utilizzare una sola riga, in cui il risultato restituito ha lo stesso tipo dell'array passato
nella funzione:
In questo caso, il tipo di risultato restituito dalla funzione A rrayMax () funzione abbina
automaticamente il tipo di matrice.
Utilizzare la parola chiave typename per ottenere il tipo di argomento come stringa al fine di creare i
metodi di uso generale di lavoro con diversi tipi di dati. Consideriamo un esempio specifico della
funzione che restituisce tipo di dati come una stringa:
#include <Trade\Trade.mqh>
//+--------------------------------------------------------------------------------+
//| |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//---
CTrade trade;
double d_value=M_PI;
int i_value=INT_MAX;
Print("d_value: type=",GetTypeName(d_value), ", value=", d_value);
Print("i_value: type=",GetTypeName(i_value), ", value=", i_value);
Print("trade: type=",GetTypeName(trade));
//---
}
//+--------------------------------------------------------------------------------+
//| Il tipo viene restituito come una linea |
//+--------------------------------------------------------------------------------+
template<typename T>
string GetTypeName(const T &t)
{
//--- restituisce il tipo come una linea
return(typename(T));
//---
}
T emplates di funzioni possono anche essere utilizzati per metodi della classe, per esempio:
class CFile
{
...
public:
...
template<typename T>
uint WriteStruct(T &data);
};
template<typename T>
uint CFile::WriteStruct(T &data)
{
...
return(FileWriteStruct(m_handle,data));
}
T emplates di funzioni non devono essere dichiarati con le parole chiave ex port, virtual e #import.
//+------------------------------------------------------------------+
//| Funzione Template |
//+------------------------------------------------------------------+
template<typename T1,typename T2>
string Assign(T1 &var1,T2 var2)
{
var1=(T1)var2;
return(__FUNCSIG__);
}
//+------------------------------------------------------------------+
//| Speciale overload per bool+string |
//+------------------------------------------------------------------+
string Assign(bool &var1,string var2)
{
var1=(StringCompare(var2,"true",false) || StringToInteger(var2)!=0);
return(__FUNCSIG__);
}
//+------------------------------------------------------------------+
//| Funzione di start del programma Script |
//+------------------------------------------------------------------+
void OnStart()
{
int i;
bool b;
Print(Assign(i,"test"));
Print(Assign(b,"test"));
}
Come risultato dell'esecuzione del codice, possiamo vedere che la funzione template Assign() è stata
utilizzata per la coppia int+string, mentre la versione overload è già stata utilizzata per la coppia
string+bool durante la seconda chiamata.
string Assign<int,string>(int&,string)
string Assign(bool&,string)
Guarda anche
Overload
template<typename T>
T ArrayMax(T array[])
{
if(ArraySize()==0)
return(0);
uint max_index=ArrayMaximum(array);
return(array[max_index]);
}
double high[];
datetime time[];
....
double max_high=ArrayMax(high);
datetime lasttime=ArrayMax(time);
Qui, il parametro formale T specificante un tipo di dati utilizzato è sostituito con un tipo
effettivamente applicata durante la compilazione, cioè il compilatore genera automaticamente una
funzione separata per ogni tipo - double, datetime, eccetera. MQL5 permette inoltre di sviluppare
modelli di classi utilizzando tutti i vantaggi di questo approccio.
Quindi, cerchiamo di applicare metodi diversi per creare tre oggetti TArray nel programma per
lavorare con vari tipi
void OnStart()
{
TArray<double> double_array; // il vettore ha la grandezza di default di 10
TArray<int> int_array(15); // il vettore ha la grandezza di 15
TArray<string> *string_array; // puntatore al vettore TArray<string>
//--- crea un oggetto dinamico
string_array=new TArray<string>(20);
//--- mostra il nome dell'oggetto, il tipo di dati e grandezza vettore nel Journal
PrintFormat("%s (%s)",TOSTR(double_array),double_array.Type());
PrintFormat("%s (%s)",TOSTR(int_array),int_array.Type());
PrintFormat("%s (%s)",TOSTR(string_array),string_array.Type());
//--- rimuove un oggetto dinamico prima di completare il programma
delete(string_array);
}
double_array (double:10)
int_array (int:15)
string_array (string:20)
Ora, abbiamo 3 vettori con diversi tipi di dati: double, int e string.
I modelli(template) della classe sono adatti per lo sviluppo di contenitori - oggetti progettati per
incapsulare altri oggetti di qualsiasi tipo. Gli oggetti container sono raccolte già contenenti oggetti di
un certo tipo. Di solito, il lavoro con i dati memorizzati è immediatamente costruito nel contenitore.
Ad esempio, è possibile creare un modello della classe che non consente l'accesso a un elemento al di
fuori dell'array, evitando cos ì l' errore critico " out of range" .
//+------------------------------------------------------------------+
//| Classe per il libero accetto agli elementi dell'array |
//+------------------------------------------------------------------+
template<typename T>
class TSafeArray
{
protected:
T m_array[];
public:
//--- costruttore default
void TSafeArray(void){}
//--- costruttore per creare l'array di grandezza specificata
void TSafeArray(int size){ArrayResize(m_array,size);}
//--- grandezza array
int Size(void){return(ArraySize(m_array));}
//--- cambia la grandezza array
int Resize(int size,int reserve){return(ArrayResize(m_array,size,reserve));}
//--- rilascia l'array
void Erase(void){ZeroMemory(m_array);}
//--- operatore per accedere agli elementi dell'array per indice
T operator[](int index);
//--- assegnazione dell'operatore per ricevere tutti gli elementi dall'array tutto in una volta
void operator=(const T &array[]); // T type array
};
//+------------------------------------------------------------------+
//| Ricezione di un elemento per indice |
//+------------------------------------------------------------------+
template<typename T>
T TSafeArray::operator[](int index)
{
static T invalid_value;
//---
int max=ArraySize(m_array)-1;
if(index<0 || index>=ArraySize(m_array))
{
PrintFormat("%s indice %d non è nel range (0-%d)!",__FUNCTION__,index,max);
return(invalid_value);
}
//---
return(m_array[index]);
}
//+------------------------------------------------------------------+
//| Assegnazione per l'rray |
//+------------------------------------------------------------------+
template<typename T>
void TSafeArray::operator=(const T &array[])
{
int size=ArraySize(array);
ArrayResize(m_array,size);
//--- Tipo T deve supportare la copia dell'operatore
for(int i=0;i<size;i++)
m_array[i]=array[i];
//---
}
//+------------------------------------------------------------------+
//| Funzione di start del programma Script |
//+------------------------------------------------------------------+
void OnStart()
{
int copied,size=15;
MqlRates rates[];
//--- copia l'array delle quotazioni
if((copied=CopyRates(_Symbol,_Period,0,size,rates))!=size)
{
PrintFormat("CopyRates(%s,%s,0,%d) ha restituito il codice errore %d",
_Symbol,EnumToString(_Period),size,GetLastError());
return;
}
//--- crea un contenintore ed inserisce i valori MqlRates in esso
TSafeArray<MqlRates> safe_rates;
safe_rates=rates;
//--- indice dentro l'array
int index=3;
PrintFormat("Close[%d]=%G",index,safe_rates[index].close);
//--- indice fuori l'array
index=size;
PrintFormat("Close[%d]=%G",index,safe_rates[index].close);
}
Si prega di notare che la dichiarazione del template dev essere utilizzata anche quando si descrivono i
metodi fuori della dichiarazione della classe:
template<typename T>
T TSafeArray::operator[](int index)
{
...
}
template<typename T>
void TSafeArray::operator=(const T &array[])
{
...
}
Modelli della classe e funzionalità consentono di definire più parametri formali separati da virgole, ad
esempio, la raccolta Map per la memorizzazione di coppie " valori-chiave" :
Guarda anche
T emplates funzioni, Overload
U na classe che contiene almeno una pura funzione virtuale è astratta. Pertanto, le classi derivate dalla
classe astratta devono implementare tutte le sue pure funzioni virtuali, altrimenti saranno anche classi
astratte.
U na funzione virtuale viene dichiarata " pura" utilizzando la sintassi degli specificatori puri. S i
consideri l'esempio della classe CAnimal, che viene creata solo per fornire funzioni comuni - gli oggetti
del tipo CAnimal sono troppo generici per l'uso pratico. Quindi, CAnimal è un buon esempio per una
classe astratta:
class CAnimal
{
public:
CAnimal(); // Constructor
virtual void Sound() = 0; // Una funzione virtuale pura
private:
double m_legs_count; // Il numero di gambe dell'animale
};
Qui S ound() è una pura funzione virtuale, perché è dichiarata con l'identificatore della funzione
virtuale pura PUR E (=0).
Le funzioni virtuali pure sono solo le funzioni virtuali per le quali è impostato lo specificatore PUR E:
(=NULL) o (=0). Esempio di dichiarazione di classe astratta e uso:
class CAnimal
{
public:
virtual void Sound()=NULL; // IL metodo PURE, dovrebbe essere sovrascritto nella classe
};
//--- Derivato da una classe astratta
class CCat : public CAnimal
{
public:
virtual void Sound() { Print("Myau"); } // PURE è sovrascritto, CCat non è astratto e può
};
//+------------------------------------------------------------------+
//| Una classe base astratta |
//+------------------------------------------------------------------+
class CAnimal
{
public:
//--- Una funzione virtuale pura
virtual void Sound(void)=NULL;
//--- Funzione
void CallSound(void) { Sound(); }
//--- Costruttore
CAnimal()
{
//--- Una chiamata esplicita del metodo virtuale
Sound();
//--- Una chiamata implicita (utilizzando una terza funzione)
CallSound();
//--- Un costruttore e/o un distruttore chiama sempre le sue funzioni,
//--- anche se sono virtuali e sovrascritti da una funzione chiamata in una classe derivata
//--- Se la funzione chiamata è virtuale pura
//--- la sua chiamata causerà un errore critico di runtime: "pura chiamata di funzione virtual
}
};
T uttavia, costruttori e distruttori per le classi astratte possono chiamare altri membri di funzione.
Namespaces
Un namespace è un'area dichiarata appositamente, all'interno della quale sono definiti vari ID:
variabili, funzioni, classi, ecc. S i imposta usando la parola chiave namespace parola chiave:
:: (operazione di risoluzione del contesto) viene utilizzato per accedere ai membri del namespace
dall'esterno.
namespace ProjectData
{
class DataManager
{
public:
void LoadData() {}
};
void Func(DataManager& manager) {}
}
//+------------------------------------------------------------------+
//| Funzione di avvio del programma di script |
//+------------------------------------------------------------------+
void OnStart()
{
//--- lavorare con il namespace ProjectData
ProjectData::DataManagermgr;
mgr.LoadData();
ProjectData::Func(mgr);
}
I namespaces vengono utilizzati per disporre un codice sotto forma di gruppi logici ed evitare conflitti
di nomi che possono verificarsi quando si utilizzano più librerie in un programma. In tali casi, ciascuna
libreria può essere dichiarata nel suo namespace per accedere esplicitamente alle funzioni ed alle
classi necessarie di ciascuna libreria.
U n namespace può essere dichiarato in più blocchi in uno o più file. Il compilatore combina tutte le
parti insieme durante il preprocessing(preelaborazione) ed il namespace risultante contiene tutti i
membri dichiarati in tutte le parti. S upponiamo di avere una classe implementata nel file include
S ample.mqh:
//+------------------------------------------------------------------+
//| Sample.mqh |
//+------------------------------------------------------------------+
class A
{
public:
A() {Print(__FUNCTION__);}
};
Vogliamo usare questa classe nel nostro progetto, ma abbiamo già una classe A. Per poter utilizzare
entrambe le classi ed evitare conflitti di ID, è sufficiente avvolgere il file incluso in un namespace:
/*
Risultato:
A::A
Library::A::A
Library::B::B
*/
Inamespaces possono essere nidificati. Uno namespace nidificato ha accesso illimitato ai membri del
suo spazio genitore, ma i membri dello spazio genitore non hanno accesso illimitato al namespace
nidificato.
namespace General
{
int Func();
namespace Details
{
int Counter;
int Refresh() {return Func(); }
}
Namespace Globale
Se l'ID non viene dichiarato esplicitamente nel namespace, viene considerato una parte implicita del
namespace globale. Per impostare l'ID globale in modo esplicito, utilizzare l'operatore di risoluzione
dell'ambito senza un nome. Ciò ti consentirà di distinguere questo ID da qualsiasi altro elemento con lo
stesso nome situato in un namespace diverso. Ad esempio, quando si importa una funzione:
#import "lib.dll"
int Func();
#import
//+------------------------------------------------------------------+
//| Alcune funzioni |
//+------------------------------------------------------------------+
int Func()
{
return(0);
}
//+------------------------------------------------------------------+
//| Funzione di avvio del programma di script |
//+------------------------------------------------------------------+
void OnStart()
{
//+--- chiama la funzione importata
Print(lib::Func());
//+--- chiama la nostra funzione
Print(::Func());
}
In questo caso, tutte le funzioni importate dalla funzione DLL sono state incluse nel namespace con lo
stesso nome. Ciò ha permesso al compilatore di determinare chiaramente la funzione da chiamare.
Guarda anche
Variabili globali, Variabili locali, Ambito di Visibilità e Durata delle Variabili, Creazione ed
Eliminazione di Oggetti
· Costanti del grafico vengono utilizzate quando si lavora con prezzi dei grafici: apertura,
navigazione, impostazione dei parametri;
· Costanti oggetti sono destinati alla trasformazione di oggetti grafici che possono essere creati e
visualizzati nei grafici;
· Costanti I ndicatore vengono utilizzate per lavorare con indicatori standard e personalizzati;
ENUM_CHART_EVENT
ID Descrizione
CHART EVENT_KEYDOW N T asti
CHART EVENT_MOUS E_MOVE Movimento del mouse, clic del mouse (se
CHART_EVENT_MOUS E_MOVE=true è impostato
per il grafico)
CHART EVENT_MOUS E_W H EEL Pressione o scorrimento della rotellina del mouse
(se CHART_EVENT_MOUS E_W H EEL =T rue per il
chart)
Per ciascun tipo di evento, i parametri di input della funzione OnChartEvent() hanno valori definiti che
sono necessari per l'elaborazione di questo evento. Gli eventi ed i valori passati attraverso questi
parametri sono elencati nella tabella seguente.
del mouse (se US E_W H EEL tasti e pulsanti della rotellina del
CHART_EVENT_ del mouse, le mouse
MOUS E_W H EEL = coordinate X e Y
true per il chart) del puntatore del
mouse. Vedere la
descrizione nell'
esempio sotto
rue è impostato
per il grafico)
della grandezza
del chart o
modifica delle
proprietà del
chart tramite la
finestra delle
Proprietà
Esempio:
#define KEY_NUMPAD_5 12
#define KEY_LEFT 37
#define KEY_UP 38
#define KEY_RIGHT 39
#define KEY_DOWN 40
#define KEY_NUMLOCK_DOWN 98
#define KEY_NUMLOCK_LEFT 100
#define KEY_NUMLOCK_5 101
#define KEY_NUMLOCK_RIGHT 102
#define KEY_NUMLOCK_UP 104
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione dell' Expert |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//---
Print("L'expert con nome ",MQL5InfoString(MQL5_PROGRAM_NAME)," sta girando");
//--- abilita gli eventi di creazione degli oggetti
ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_CREATE,true);
//--- abilita gli eventi di eliminazione degli oggetti
ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_DELETE,true);
//--- l'aggiornamento forzato delle proprietà del chart garantisce la preparazione per l'elaborazio
ChartRedraw();
//---
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| ChartEvent function |
//+--------------------------------------------------------------------------------+
void OnChartEvent(const int id, // Identificatore eventi
const long& lparam, // Parametro evento di tipo long
const double& dparam, // Parametro evento di tipo double
const string& sparam // Parametro evento di tipo stringa
)
{
//--- il bottone sinistro del mouse è stato premuto sul chart
if(id==CHARTEVENT_CLICK)
{
Print("Le coordinate del click del mouse sul chart sono: x = ",lparam," y = ",dparam);
}
//--- il mouse è stato cliccatto sull'oggetto grafico
if(id==CHARTEVENT_OBJECT_CLICK)
{
Print("Il mouse è stato cliccato sull'oggetto con nome'"+sparam+"'");
}
//--- il tasto è stato premuto
if(id==CHARTEVENT_KEYDOWN)
{
switch(lparam)
{
case KEY_NUMLOCK_LEFT: Print("E' stato premuto KEY_NUMLOCK_LEFT"); break;
case KEY_LEFT: Print("E' stato premuto KEY_LEFT"); break;
case KEY_NUMLOCK_UP: Print("E' stato premuto KEY_NUMLOCK_UP"); break;
case KEY_UP: Print("E' stato premuto il tasto KEY_UP"); break;
Per l'evento CHART EVENT_MOUS E_MOVE il parametro stringa @param contiene informazioni sullo
stato della tastiera e dei pulsanti del mouse:
Bit Descrizione
1 S tato del tasto sinistro del mouse
Esempio:
//+------------------------------------------------------------------+
//| Funzione di inizializzazione Expert |
//+------------------------------------------------------------------+
void OnInit()
{
//--- abilita messaggi CHART_EVENT_MOUSE_MOVE
ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,1);
// --- disabilita il menu contestuale del grafico (a destra)
ChartSetInteger(0,CHART_CONTEXT_MENU,0);
// --- disabilita il mirino (tramite il pulsante centrale)
ChartSetInteger(0,CHART_CROSSHAIR_TOOL,0);
//--- l'aggiornamento forzato delle proprietà del chart garantisce la preparazione per l'elaborazio
ChartRedraw();
}
//+------------------------------------------------------------------+
//| MouseState |
//+------------------------------------------------------------------+
string MouseState(uint state)
{
string res;
res+="\nML: " +(((state& 1)== 1)?"DN":"UP"); // mouse sinistra
res+="\nMR: " +(((state& 2)== 2)?"DN":"UP"); // mouse destra
res+="\nMM: " +(((state&16)==16)?"DN":"UP"); // mouse centro
res+="\nMX: " +(((state&32)==32)?"DN":"UP"); // mouse primo tasto X
res+="\nMY: " +(((state&64)==64)?"DN":"UP"); // mouse secondo tasto X
res+="\nSHIFT: "+(((state& 4)== 4)?"DN":"UP"); // tasto shift
res+="\nCTRL: " +(((state& 8)== 8)?"DN":"UP"); // tasto control
return(res);
}
//+------------------------------------------------------------------+
//| ChartEvent function |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
{
if(id==CHARTEVENT_MOUSE_MOVE)
Comment("POINT: ",(int)lparam,",",(int)dparam,"\n",MouseState((uint)sparam));
}
Per l'evento CHART EVENT_MOUS E_W H EEL, i parametri lParam e dparam contengono informazioni
sugli stati dei tasti Ctrl e Shift, dei pulsanti del mouse, delle coordinate del cursore e del valore di
scorrimento della rotellina del mouse. Per una migliore comprensione, esegui questo Ex pert Advisor su
un chart e scorri la rotellina del mouse, mentre premi diversi bottoni e tieni premuti i tasti descritti
nel codice.
//+------------------------------------------------------------------+
void OnInit()
{
//--- Abilitazione dei messaggi di scorrimento della rotellina del mouse
ChartSetInteger(0,CHART_EVENT_MOUSE_WHEEL,1);
//--- L'aggiornamento forzato delle proprietà del chart garantisce la preparazione per l'elaborazio
ChartRedraw();
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| ChartEvent function |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
{
if(id==CHARTEVENT_MOUSE_WHEEL)
{
//--- Considera lo stato dei pulsanti e della rotella del mouse per questo evento
int flg_keys = (int)(lparam>>32); // La flag degli stati dei tasti Ctrl e Shift e de
int x_cursor = (int)(short)lparam; // la coordinata X dove si è verificato l'evento d
int y_cursor = (int)(short)(lparam>>16); // la coordinata Y dove si è verificato l'evento d
int delta = (int)dparam; // il valore totale dello scroll del mouse, si inn
//--- Elaborazione della flag
string str_keys="";
if((flg_keys&0x0001)!=0) str_keys+="LMOUSE ";
if((flg_keys&0x0002)!=0) str_keys+="RMOUSE ";
if((flg_keys&0x0004)!=0) str_keys+="SHIFT ";
if((flg_keys&0x0008)!=0) str_keys+="CTRL ";
if((flg_keys&0x0010)!=0) str_keys+="MMOUSE ";
if((flg_keys&0x0020)!=0) str_keys+="X1MOUSE ";
if((flg_keys&0x0040)!=0) str_keys+="X2MOUSE ";
if(str_keys!="")
str_keys=", keys='"+StringSubstr(str_keys,0,StringLen(str_keys)-1) + "'";
PrintFormat("%s: X=%d, Y=%d, delta=%d%s",EnumToString(CHARTEVENT_MOUSE_WHEEL),x_cursor,y_curs
}
}
//+------------------------------------------------------------------+ /*
Esempio di output
CHARTEVENT_MOUSE_WHEEL: Ctrl pressed: X=193, Y=445, delta=-120
CHARTEVENT_MOUSE_WHEEL: Shift pressed: X=186, Y=446, delta=120
CHARTEVENT_MOUSE_WHEEL: X=178, Y=447, delta=-120
CHARTEVENT_MOUSE_WHEEL: X=231, Y=449, delta=120
CHARTEVENT_MOUSE_WHEEL: MiddleButton pressed: X=231, Y=449, delta=120
CHARTEVENT_MOUSE_WHEEL: LeftButton pressed: X=279, Y=320, delta=-120
CHARTEVENT_MOUSE_WHEEL: RightButton pressed: X=253, Y=330, delta=120 */
Vedi anche
ENUM_TIMEFRAMES
ID Descrizione
PERIOD_CURR ENT T imeframe corrente
PERIOD_M 1 1 minuto
PERIOD_M 2 2 minuti
PERIOD_M 3 3 minuti
PERIOD_M 4 4 minuti
PERIOD_M5 5 minuti
PERIOD_M 6 6 minuti
PERIOD_M 10 10 minuti
PERIOD_M 12 12 minuti
PERIOD_M 15 1 5 minuti
PERIOD_M 20 20 minuti
PERIOD_M 30 30 minuti
PERIOD_H1 1 ora
PERIOD_H2 2 ore
PERIOD_H3 3 ore
PERIOD_H4 4 ore
PERIOD_H6 6 ore
PERIOD_H8 8 ore
PERIOD_H12 12 ore
PERIOD_D1 1 giorno
PERIOD_W 1 1 settimana
PERIOD_M N1 1 mese
Esempio:
string chart_name="test_Object_Chart";
Print("Cerchiamo di creare un oggetto grafico con il nome",chart_name);
//--- Se un tale oggetto non esiste - creiamolo
if(ObjectFind(0,chart_name)<0)ObjectCreate(0,chart_name,OBJ_CHART,0,0,0,0,0);
Identificatori timeseries
Gli identificatori di timeseries sono usati nelle funzioni iH ighest() e iLowest(). Possono essere uguali
ad un valore dell'enumerazione
ENUM_SERIESMODE
Identificatore Descrizione
MODE_OPEN Prezzo di apertura
Vedi anche
PeriodS econds, Periodo, Data ed Ora, Visibilità degli oggetti
" T ipo della Proprietà" significa che questa proprietà è di sola scrittura e non può essere ricevuta.
Le funzioni che definiscono le proprietà del chart sono effettivamente utilizzate per l'invio di comandi
di cambio al chart. S e queste funzioni vengono eseguite correttamente, il comando viene incluso nella
coda comune degli eventi chart. Le modifiche vengono applicate al chart quando si tratta della coda
degli eventi del chart.
Quindi, non aspettatevi un aggiornamento visivo immediato dal chart dopo la chiamata di queste
funzioni. In generale, il chart viene aggiornato automaticamente dal terminale in seguito agli eventi di
cambiamento - l'arrivo di una nuova quotazione, il ridimensionamento della finestra chart, ecc. Usare
la funzione ChartR edraw() per aggiornare forzatamente il chart.
ENUM_CHART_PROPERTY _INTEGER
I mpostando
CHART_KEYBOARD_CONTR OL
su false disabilita lo
scorrimento e il
ridimensionamento del chart
lasciando intatta la possibilità
di ricevere i tasti premendo gli
eventi in OnChartEvent().
modificare rapidamente un
simbolo, un timeframe e la
data della prima barra visibile.
CHART_W INDOW _IS _VIS IBLE V isibilità delle sottofinestre bool r/o modificatore -
numero sottofinestra
CHART_W INDOW _HANDLE Handle della finestra del chart int r/o
(HW ND)
CHART_W INDOW _YDIS TANCE La distanza tra il frame int r/o modificatore -
superiore della sottofinestra numero sottofinestra
grafico-indicatore ed il frame
superiore della finestra grafico-
chart principale, lungo l'asse
verticale Y, in pix el. In caso di
un evento del mouse, le
coordinate del cursore vengono
passate in termini di
coordinate della finestra
grafico-principale, mentre le
coordinate di oggetti grafici in
una finestra indicatore
secondaria vengono impostati
rispetto all'angolo in alto a
sinistra della finestra
secondaria.
Il valore è necessario per
convertire le coordinate
assolute del grafico principale
ENUM_CHART_PROPERTY _DOUBLE
visualizzato solo se lo
slittamento automatico del
chart a destra sul segno di
spunta in entrata è disattivato
(vedere la proprietà
CHART_AUT OS CR OLL). La
barra in una posizione fissa
rimane nello stesso posto
durante lo zoom in e out.
ENUM_CHART_PROPERTY _STRING
Esempio:
int chartMode=ChartGetInteger(0,CHART_MODE);
switch(chartMode)
{
Vedi anche
Esempi di Lavoro con il Chart
Posizionamento Costanti
T re identificatori dall'elenco ENUM _CHART_POS ITION sono i possibili valori del parametro position per
la funzione ChartNavigate().
ENUM_CHART_POSITION
ID Descrizione
CHART_BEGIN I nizio del Grafico (i prezzi più vecchi)
Esempio:
long handle=ChartOpen("EURUSD",PERIOD_H12);
if(handle!=0)
{
ChartSetInteger(handle,CHART_AUTOSCROLL,false);
ChartSetInteger(handle,CHART_SHIFT,true);
ChartSetInteger(handle,CHART_MODE,CHART_LINE);
ResetLastError();
bool res=ChartNavigate(handle,CHART_END,150);
if(!res) Print("Navigazione fallita. Error = ",GetLastError());
ChartRedraw();
}
Rappresentazione Grafico
I prezzi dei grafici possono essere visualizzati in tre modi:
· come barre;
· come candele;
ENUM_CHART_MODE
ID Descrizione
CHART_BARS V isualizzare come una sequenza di barre
Per specificare la modalità di visualizzazione dei volumi nel grafico dei prezzi la funzione
ChartS etInteger(Chart_handle, CHART_S H OW _VOL UMES , Volume_mode) viene utilizzata, quando
volume_mode è uno dei valori dell'enumerazione ENUM _CHART_VOL UME_MODE.
ENUM_CHART_VOLUME_MODE
ID Descrizione
CHART_VOL UME_HIDE I volumi non sono mostrati
Esempio:
//--- Prende l'handle del grafico corrente
long handle=ChartID();
if(handle>0) // se è riuscito, personalizza addizionalmente
{
//--- Disabilita l' autoscroll
ChartSetInteger(handle,CHART_AUTOSCROLL,false);
//--- Imposta l'indendazione del borde destro del grafico
ChartSetInteger(handle,CHART_SHIFT,true);
//--- Mostra come candele
ChartSetInteger(handle,CHART_MODE,CHART_CANDLES);
//--- Scorrere di 100 barre a partire dall'inizio dello storico
ChartNavigate(handle,CHART_CURRENT_POS,100);
//--- Imposta la modalità di visualizzazione volume tick
ChartSetInteger(handle,CHART_SHOW_VOLUMES,CHART_VOLUME_TICK);
}
Vedi anche
ChartOpen, ChartID
La figura seguente mostra il pannello grafico che illustra come la modifica delle proprietà del chart
cambia il suo aspetto. Il click sul pulsante Avanti permette di impostare il nuovo valore della proprietà
appropriata e visualizzare le modifiche nella finestra del grafico.
//+--------------------------------------------------------------------------------+
//| Controlla se un oggetto è un chart. Se è un oggetto grafico, |
//| il risultato è true. Se è un vero chart, la variable risultato |
//| ha il valore di false. |
//+--------------------------------------------------------------------------------+
bool ChartIsObject(bool &result,constlong chart_ID=0)
{
/ --- preparara la variabile per ottenere il valore della proprietà
long value;
//--- resetta il valore dell' errore
ResetLastError();
/ --- ottiene la proprietà chart
if(!ChartGetInteger(chart_ID,CHART_IS_OBJECT,0,value))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
//--- restituisce false
return(false);
}
//--- memorizza il valore della proprietà chart in memoria
result=value;
//--- esecuzione avvenuta
return(true);
}
· CHART_MOUSE_SCROLL è una proprietà di scorrimento del chart usando il tasto sinistro del mouse.
//+-----------------------------------------------------------------------------------------+
//| Controlla se lo scorrimento del chart usando il tasto sinistro del mouse è abilitato |
//+-----------------------------------------------------------------------------------------+
bool ChartMouseScrollGet(bool &result,const long chart_ID=0)
{
/ --- preparara la variabile per ottenere il valore della proprietà
long value;
//--- resetta il valore dell' errore
ResetLastError();
//--- ricevere il valore della proprietà
if(!ChartGetInteger(chart_ID,CHART_MOUSE_SCROLL,0,value))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- memorizza il valore della proprietà chart in memoria
result=value;
//--- esecuzione avvenuta
return(true);
}
//+----------------------------------------------------------------------------------+
//| Abilita/disabilita lo scorrimento del chart usando il bottone sinistro del mouse |
//+----------------------------------------------------------------------------------+
bool ChartMouseScrollSet(const bool value,const long chart_ID=0)
{
//--- resetta il valore dell' errore
ResetLastError();
//--- imposta il valore della proprietà
if(!ChartSetInteger(chart_ID,CHART_MOUSE_SCROLL,0,value))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Controlla se i messaggi concernenti eventi di spostamento ed i click del mouse |
//| vengono inviati a tutte le applicazioni MQL5 sul chart |
//+--------------------------------------------------------------------------------+
//+-----------------------------------------------------------------------------------------+
//| Controlla se i messaggi riguardanti gli eventi di |
//| creazione degli oggetti grafici vengono inviati a tutte le applicazioni mql5 sul chart |
//+-----------------------------------------------------------------------------------------+
bool ChartEventObjectCreateGet(bool &result,const long chart_ID=0)
{
/ --- preparara la variabile per ottenere il valore della proprietà
long value;
//+-----------------------------------------------------------------------------------------+
//| Controlla se i messaggi concernenti l'evento dell'eliminazione |
//| di oggetti grafici, viene inviato a tutte le applicazioni mql5 sul chart |
//+-----------------------------------------------------------------------------------------+
bool ChartEventObjectDeleteGet(bool &result,constlong chart_ID=0)
{
/ --- preparara la variabile per ottenere il valore della proprietà
long value;
//--- resetta il valore dell' errore
ResetLastError();
//--- ricevere il valore della proprietà
if(!ChartGetInteger(chart_ID,CHART_EVENT_OBJECT_DELETE,0,value))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- memorizza il valore della proprietà chart in memoria
result=value;
//--- esecuzione avvenuta
return(true);
}
//+-----------------------------------------------------------------------------------------+
//| Abilita/disabilita la modalità di invio messaggi riguardanti gli eventi di |
//| eliminazione di oggetti grafici a tutte le applicazioni mql5 sul chart |
//+-----------------------------------------------------------------------------------------+
bool ChartEventObjectDeleteSet(const bool value,const long chart_ID=0)
{
//--- resetta il valore dell' errore
ResetLastError();
//--- imposta il valore della proprietà
if(!ChartSetInteger(chart_ID,CHART_EVENT_OBJECT_DELETE,0,value))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
return((ENUM_CHART_MODE)result);
}
//+--------------------------------------------------------------------------------+
//| Imposta il tipo di display del chart (candele, barre o linea) |
//+--------------------------------------------------------------------------------+
bool ChartModeSet(const long value,const long chart_ID=0)
{
//--- resetta il valore dell' errore
ResetLastError();
//--- imposta il valore della proprietà
if(!ChartSetInteger(chart_ID,CHART_MODE,value))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
· CHART_SHIFT - modalità di spostamento del chart dei prezzi dal bordo destro.
//+-------------------------------------------------------------------------------------+
//| Controlla se lo slittamento del chart dei prezzi dal bordo destro è abilitata |
//+-------------------------------------------------------------------------------------+
bool ChartShiftGet(bool &result,const long chart_ID=0)
{
/ --- preparara la variabile per ottenere il valore della proprietà
long value;
//--- resetta il valore dell' errore
ResetLastError();
//--- ricevere il valore della proprietà
if(!ChartGetInteger(chart_ID,CHART_SHIFT,0,value))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- memorizza il valore della proprietà chart in memoria
result=value;
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------------------+
//| Abilita/disabilita la visualizzazione del chart prezzi con uno shift dal bordo destro |
//+--------------------------------------------------------------------------------------------+
bool ChartShiftSet(const bool value,const long chart_ID=0)
{
//--- resetta il valore dell' errore
ResetLastError();
//--- imposta il valore della proprietà
if(!ChartSetInteger(chart_ID,CHART_SHIFT,0,value))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
if(!ChartGetInteger(chart_ID,CHART_SCALEFIX_11,0,value))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- memorizza il valore della proprietà chart in memoria
result=value;
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Abilita/disabilita la modalità scala "1:1" |
//+--------------------------------------------------------------------------------+
bool ChartScaleFix11Set(const bool value,const long chart_ID=0)
{
//--- resetta il valore dell' errore
ResetLastError();
//--- imposta il valore della proprietà
if(!ChartSetInteger(chart_ID,CHART_SCALEFIX_11,0,value))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
· CHART_SCALE_PT_PER_BAR – la modalità di specificazione della scala del chart, in punti per barra.
//+--------------------------------------------------------------------------------+
//| Controlla se la modalità di scala "punti per barra" è abilitata |
//+--------------------------------------------------------------------------------+
bool ChartScalePerBarGet(bool &result,const long chart_ID=0)
{
/ --- preparara la variabile per ottenere il valore della proprietà
long value;
//--- resetta il valore dell' errore
ResetLastError();
//--- ricevere il valore della proprietà
if(!ChartGetInteger(chart_ID,CHART_SCALE_PT_PER_BAR,0,value))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- memorizza il valore della proprietà chart in memoria
result=value;
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Abilita/disabilita la modalità di scala del chart "punti per barra" |
//+--------------------------------------------------------------------------------+
bool ChartScalePerBarSet(const bool value,const long chart_ID=0)
{
//--- resetta il valore dell' errore
ResetLastError();
//--- imposta il valore della proprietà
if(!ChartSetInteger(chart_ID,CHART_SCALE_PT_PER_BAR,0,value))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
· CHART_SHOW _BID_LINE – la proprietà di visualizzazione del valore Bid come linea orizzontale sul
chart.
//+--------------------------------------------------------------------------------+
//| Controlla se la visualizzazione della linea Bid sul chart è abilitata |
//+--------------------------------------------------------------------------------+
bool ChartShowBidLineGet(bool &result,const long chart_ID=0)
{
/ --- preparara la variabile per ottenere il valore della proprietà
long value;
//--- resetta il valore dell' errore
ResetLastError();
//--- ricevere il valore della proprietà
if(!ChartGetInteger(chart_ID,CHART_SHOW_BID_LINE,0,value))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- memorizza il valore della proprietà chart in memoria
result=value;
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Abilita/disabilita la visualizzazione della linea Bid sul chart |
//+--------------------------------------------------------------------------------+
bool ChartShowBidLineSet(const bool value,const long chart_ID=0)
{
//--- resetta il valore dell' errore
ResetLastError();
//--- imposta il valore della proprietà
if(!ChartSetInteger(chart_ID,CHART_SHOW_BID_LINE,0,value))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Controlla se la visualizzazione della linea Ask sul chart è abilitata |
//+--------------------------------------------------------------------------------+
bool ChartShowAskLineGet(bool &result,const long chart_ID=0)
{
/ --- preparara la variabile per ottenere il valore della proprietà
long value;
//--- resetta il valore dell' errore
ResetLastError();
//--- ricevere il valore della proprietà
if(!ChartGetInteger(chart_ID,CHART_SHOW_ASK_LINE,0,value))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- memorizza il valore della proprietà chart in memoria
result=value;
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Abilita/disabilita la visualizzazione della linea Ask sul chart |
//+--------------------------------------------------------------------------------+
bool ChartShowAskLineSet(const bool value,const long chart_ID=0)
{
//--- resetta il valore dell' errore
ResetLastError();
//--- imposta il valore della proprietà
if(!ChartSetInteger(chart_ID,CHART_SHOW_ASK_LINE,0,value))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
· CHART_SHOW _LAST_LINE – la proprietà di visualizzazione valore Last come una linea orizzontale in
un chart.
//+---------------------------------------------------------------------------------------+
//| Controlla se la visualizzazione della linea per l'ultimo prezzo eseguito, è abilitata |
//+---------------------------------------------------------------------------------------+
bool ChartShowLastLineGet(bool &result,const long chart_ID=0)
{
/ --- preparara la variabile per ottenere il valore della proprietà
long value;
//--- resetta il valore dell' errore
ResetLastError();
//--- ricevere il valore della proprietà
if(!ChartGetInteger(chart_ID,CHART_SHOW_LAST_LINE,0,value))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- memorizza il valore della proprietà chart in memoria
result=value;
//--- esecuzione avvenuta
return(true);
}
//+---------------------------------------------------------------------------------------+
//| Abilita/disabilita la visualizzazione della linea per l'ultimo prezzo eseguito |
//+---------------------------------------------------------------------------------------+
bool ChartShowLastLineSet(const bool value,const long chart_ID=0)
{
//--- resetta il valore dell' errore
ResetLastError();
//--- imposta il valore della proprietà
if(!ChartSetInteger(chart_ID,CHART_SHOW_LAST_LINE,0,value))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------------------+
//| Controlla se la visualizzazione dei separatori verticali tra periodi adiacenti è abilitata |
//+--------------------------------------------------------------------------------------------+
bool ChartShowPeriodSeparatorGet(bool &result,const long chart_ID=0)
{
/ --- preparara la variabile per ottenere il valore della proprietà
long value;
//--- resetta il valore dell' errore
ResetLastError();
//--- ricevere il valore della proprietà
if(!ChartGetInteger(chart_ID,CHART_SHOW_PERIOD_SEP,0,value))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- memorizza il valore della proprietà chart in memoria
result=value;
//--- esecuzione avvenuta
return(true);
}
//+---------------------------------------------------------------------------------------+
//| Abilita/disabilita la visualizzazione dei separatori verticali tra periodi adiacenti |
//+---------------------------------------------------------------------------------------+
bool ChartShowPeriodSepapatorSet(const bool value,const long chart_ID=0)
{
//--- resetta il valore dell' errore
ResetLastError();
//--- imposta il valore della proprietà
if(!ChartSetInteger(chart_ID,CHART_SHOW_PERIOD_SEP,0,value))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
{
/ --- preparara la variabile per ottenere il valore della proprietà
long value;
//--- resetta il valore dell' errore
ResetLastError();
//--- ricevere il valore della proprietà
if(!ChartGetInteger(chart_ID,CHART_SHOW_GRID,0,value))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- memorizza il valore della proprietà chart in memoria
result=value;
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Abilita/disabilita la visualizzazione della griglia sul chart |
//+--------------------------------------------------------------------------------+
bool ChartShowGridSet(const bool value,const long chart_ID=0)
{
//--- resetta il valore dell' errore
ResetLastError();
//--- imposta il valore della proprietà
if(!ChartSetInteger(chart_ID,CHART_SHOW_GRID,0,value))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
if(!ChartGetInteger(chart_ID,CHART_SHOW_VOLUMES,0,result))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- restituisce il valore della proprietà chart
return((ENUM_CHART_VOLUME_MODE)result);
}
//+--------------------------------------------------------------------------------+
//| Imposta la modalità di visualizzazione dei volumi sul chart |
//+--------------------------------------------------------------------------------+
bool ChartShowVolumesSet(const long value,const long chart_ID=0)
{
//--- resetta il valore dell' errore
ResetLastError();
//--- imposta il valore della proprietà
if(!ChartSetInteger(chart_ID,CHART_SHOW_VOLUMES,value))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
result=value;
//--- esecuzione avvenuta
return(true);
}
//+---------------------------------------------------------------------------------------+
//| Abilita/disabilita la visualizzazione di descrizioni pop-up di oggetti grafici |
//| quando si tiene il mouse su esse |
//+---------------------------------------------------------------------------------------+
bool ChartShowObjectDescriptionSet(const bool value,const long chart_ID=0)
{
//--- resetta il valore dell' errore
ResetLastError();
//--- imposta il valore della proprietà
if(!ChartSetInteger(chart_ID,CHART_SHOW_OBJECT_DESCR,0,value))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+-------------------------------------------------------------------------------+
//| Ottiene il numero di barre che sono visualizzate (visibili) nel chart |
//+-------------------------------------------------------------------------------+
int ChartVisibleBars(const long chart_ID=0)
{
/ --- preparara la variabile per ottenere il valore della proprietà
long result=-1;
//--- resetta il valore dell' errore
ResetLastError();
//--- ricevere il valore della proprietà
if(!ChartGetInteger(chart_ID,CHART_VISIBLE_BARS,0,result))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- restituisce il valore della proprietà chart
return((int)result);
}
· CHART_W INDOW S_TOTAL definisce il numero totale di finestre chart, tra cui le sottofinestre
indicatori.
//+-------------------------------------------------------------------------------------+
//| Ottiene il numero totale di finestre del chart, tra cui indicatori sottofinestre |
//+-------------------------------------------------------------------------------------+
int ChartWindowsTotal(const long chart_ID=0)
{
/ --- preparara la variabile per ottenere il valore della proprietà
long result=-1;
//--- resetta il valore dell' errore
ResetLastError();
//--- ricevere il valore della proprietà
if(!ChartGetInteger(chart_ID,CHART_WINDOWS_TOTAL,0,result))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- restituisce il valore della proprietà chart
return((int)result);
}
· CHART_W INDOW _Y DISTANCE definisce la distanza in pix el tra il frame superiore della sottofinestra
indicatore ed il frame superiore della finestra principale del chart.
//+--------------------------------------------------------------------------------+
//| Ottiene la distanza in pixel tra il bordo superiore di |
//| Sottoffinestra e bordo superiore della finestra superiore del chart |
//+--------------------------------------------------------------------------------+
int ChartWindowsYDistance(const long chart_ID=0,const int sub_window=0)
{
/ --- preparara la variabile per ottenere il valore della proprietà
long result=-1;
//--- resetta il valore dell' errore
ResetLastError();
//--- ricevere il valore della proprietà
if(!ChartGetInteger(chart_ID,CHART_WINDOW_YDISTANCE,sub_window,result))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- restituisce il valore della proprietà chart
return((int)result);
}
· CHART_FIRST_VISIBLE_BAR restituisce il numero della prima barra visibile sul chart (indicizzazione
barra corrisponde alle timeseries).
//-------------------------------------------------------------------------------------------------
//| Ottiene l'indice della prima barra visibile sul chart | |
//| L'indicizzazione avviene come in timeseries: le ultime barre hanno indice inferiore | //| |
//-------------------------------------------------------------------------------------------------
int ChartFirstVisibleBar(const long chart_ID=0)
{
/ --- preparara la variabile per ottenere il valore della proprietà
long result=-1;
//--- resetta il valore dell' errore
ResetLastError();
//--- ricevere il valore della proprietà
if(!ChartGetInteger(chart_ID,CHART_FIRST_VISIBLE_BAR,0,result))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- restituisce il valore della proprietà chart
return((int)result);
}
{
/ --- preparara la variabile per ottenere il valore della proprietà
long result=-1;
//--- resetta il valore dell' errore
ResetLastError();
//--- ricevere il valore della proprietà
if(!ChartGetInteger(chart_ID,CHART_WIDTH_IN_PIXELS,0,result))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- restituisce il valore della proprietà chart
return((int)result);
}
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
color ChartForeColorGet(const long chart_ID=0)
{
//--- prepara la variabile a ricevere il colore
long result=clrNONE;
//--- resetta il valore dell' errore
ResetLastError();
//--- ricevere il colore degli assi, dekla scala e della linea OHLC
if(!ChartGetInteger(chart_ID,CHART_COLOR_FOREGROUND,0,result))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- restituisce il valore della proprietà chart
return((color)result);
}
//+--------------------------------------------------------------------------------+
//| Imposta il colore degli assi, scala e linea OHLC |
//+--------------------------------------------------------------------------------+
bool ChartForeColorSet(const color clr,const long chart_ID=0)
{
//--- resetta il valore dell' errore
ResetLastError();
//--- imposta il colore degli assi, della scala e della linea OHLC
if(!ChartSetInteger(chart_ID,CHART_COLOR_FOREGROUND,clr))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
{
//--- resetta il valore dell' errore
ResetLastError();
//--- imposta i colori dei volumi e dei livelli di ingresso sul mercato
if(!ChartSetInteger(chart_ID,CHART_COLOR_VOLUME,clr))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
· CHART_COLOR_CHART_UP - colore della barra superiore, la sua ombra ed il bordo del corpo della
candela rialzista.
//+---------------------------------------------------------------------------------------+
//| Ottiene il colore di barra superiore, ombra e bordo (corpo di candela bullish) |
//+---------------------------------------------------------------------------------------+
color ChartUpColorGet(const long chart_ID=0)
{
//--- prepara la variabile a ricevere il colore
long result=clrNONE;
//--- resetta il valore dell' errore
ResetLastError();
//--- riceve il colore della barra superiore, la sua ombra ed il bordo del corpo della candela rial
if(!ChartGetInteger(chart_ID,CHART_COLOR_CHART_UP,0,result))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- restituisce il valore della proprietà chart
return((color)result);
}
//+--------------------------------------------------------------------------------+
//| Imposta il colore di barra superiore, ombra e bordo (corpo di candela bullish) |
//+--------------------------------------------------------------------------------+
bool ChartUpColorSet(const color clr,const long chart_ID=0)
{
//--- resetta il valore dell' errore
ResetLastError();
//--- imposta il colore della barra superiore, la sua ombra ed bordo del corpo di una candela rialz
if(!ChartSetInteger(chart_ID,CHART_COLOR_CHART_UP,clr))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
· CHART_COLOR_CHART_DOW N - colore della barra inferiore, la sua ombra ed bordo del corpo della
candela ribassista.
//+-------------------------------------------------------------------------------+
//| Ottiene il colore di barra inferiore, ombra e bordo (corpo di candela bullish) |
//+-------------------------------------------------------------------------------+
color ChartDownColorGet(const long chart_ID=0)
{
//--- prepara la variabile a ricevere il colore
long result=clrNONE;
//--- resetta il valore dell' errore
ResetLastError();
//--- riceve il colore della barra inferiore, la sua ombra ed il bordo del corpo della candela riba
if(!ChartGetInteger(chart_ID,CHART_COLOR_CHART_DOWN,0,result))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- restituisce il valore della proprietà chart
return((color)result);
}
//+-------------------------------------------------------------------------------+
//| Imposta il colore di barra inferiore, ombra e bordo (corpo di candela bullish) |
//+-------------------------------------------------------------------------------+
bool ChartDownColorSet(const color clr,const long chart_ID=0)
{
//--- resetta il valore dell' errore
ResetLastError();
//--- imposta il colore della barra inferiore, la sua ombra ed il bordo del corpo della candela rib
if(!ChartSetInteger(chart_ID,CHART_COLOR_CHART_DOWN,clr))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- restituisce il valore della proprietà chart
return((color)result);
}
//+--------------------------------------------------------------------------------+
//| Imposta il colore del corpo della candela bullish |
//+--------------------------------------------------------------------------------+
bool ChartBullColorSet(const color clr,const long chart_ID=0)
{
//--- resetta il valore dell' errore
ResetLastError();
//--- imposta il colore del corpo della candela rialzista
if(!ChartSetInteger(chart_ID,CHART_COLOR_CANDLE_BULL,clr))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
color ChartLastColorGet(const long chart_ID=0)
{
//--- prepara la variabile a ricevere il colore
long result=clrNONE;
//--- resetta il valore dell' errore
ResetLastError();
//--- ricevere il colore della lina di prezzo dell'ultimo affare eseguito (Last)
if(!ChartGetInteger(chart_ID,CHART_COLOR_LAST,0,result))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- restituisce il valore della proprietà chart
return((color)result);
}
//+--------------------------------------------------------------------------------+
//| Imposta il colore della linea dell'ultimo affare eseguito |
//+--------------------------------------------------------------------------------+
bool ChartLastColorSet(const color clr,const long chart_ID=0)
{
//--- resetta il valore dell' errore
ResetLastError();
//--- imposta il colore della lina di prezzo dell'ultimo affare eseguito (Last)
if(!ChartSetInteger(chart_ID,CHART_COLOR_LAST,clr))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
· CHART_COLOR_STOP_LEVEL – colore dei livelli di stop order (S top Loss e Take Profit).
//+--------------------------------------------------------------------------------+
//| Ottiene il colore dei livelli di Stop Loss e Take Profit |
//+--------------------------------------------------------------------------------+
color ChartStopLevelColorGet(const long chart_ID=0)
{
//--- prepara la variabile a ricevere il colore
long result=clrNONE;
//--- resetta il valore dell' errore
ResetLastError();
//--- riceve il colore dei livelli degli stop orders (Stop Loss e Take Profit)
if(!ChartGetInteger(chart_ID,CHART_COLOR_STOP_LEVEL,0,result))
{
//+--------------------------------------------------------------------------------+
//| Controlla se i livelli di trading vengono visualizzati sul chart |
//+--------------------------------------------------------------------------------+
bool ChartShowTradeLevelsGet(bool &result,const long chart_ID=0)
{
/ --- preparara la variabile per ottenere il valore della proprietà
long value;
//--- resetta il valore dell' errore
ResetLastError();
//--- ricevere il valore della proprietà
if(!ChartGetInteger(chart_ID,CHART_SHOW_TRADE_LEVELS,0,value))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- memorizza il valore della proprietà chart in memoria
result=value;
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Abilita/Disabilita la visualizzazione dei livelli di trading |
//+--------------------------------------------------------------------------------+
bool ChartShowTradeLevelsSet(const bool value,const long chart_ID=0)
{
//--- resetta il valore dell' errore
ResetLastError();
//--- imposta il valore della proprietà
if(!ChartSetInteger(chart_ID,CHART_SHOW_TRADE_LEVELS,0,value))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+-------------------------------------------------------------------------------+
//| Controlla se consente il trascinamento livelli di trading sul chart, col mouse |
//+-------------------------------------------------------------------------------+
bool ChartDragTradeLevelsGet(bool &result,const long chart_ID=0)
{
/ --- preparara la variabile per ottenere il valore della proprietà
long value;
//--- resetta il valore dell' errore
ResetLastError();
//--- ricevere il valore della proprietà
if(!ChartGetInteger(chart_ID,CHART_DRAG_TRADE_LEVELS,0,value))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- memorizza il valore della proprietà chart in memoria
result=value;
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Abilita/disabilita il trascinamento dei livelli di trading sul chart col mouse |
//+--------------------------------------------------------------------------------+
bool ChartDragTradeLevelsSet(const bool value,const long chart_ID=0)
{
//--- resetta il valore dell' errore
ResetLastError();
//--- imposta il valore della proprietà
if(!ChartSetInteger(chart_ID,CHART_DRAG_TRADE_LEVELS,0,value))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
}
//--- esecuzione avvenuta
return(true);
}
· CHART_SHOW _ONE_CLICK – property of displaying the " One click trading " panel on a chart.
//+------------------------------------------------------------------+
// | Controlla se il pannello "One click trading" viene visualizzato sul chart |
//+------------------------------------------------------------------+
bool ChartShowOneClickPanelGet(bool &result,const long chart_ID=0)
{
//--- prepara la variabile per ottenere il valore della proprietà
long value;
//--- resetta il valore dell' errore
ResetLastError();
//--- riceve il valore della proprietà
if(!ChartGetInteger(chart_ID,CHART_SHOW_ONE_CLICK,0,value))
{
//--- mostra il messaggio d'errore nel journal dell'Expert
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- memorizza il valore della proprietà del chart nella memoria
result=value;
//--- esecuzione con successo
return(true);
}
//+------------------------------------------------------------------+
//| Abilita/disabilita la visualizzazione del pannello "One click trading" |
//| sul chart |
//+------------------------------------------------------------------+
bool ChartShowOneClickPanelSet(const bool value,const long chart_ID=0)
{
//--- resetta il valore dell' errore
ResetLastError();
//--- imposta il valore della proprietà
if(!ChartSetInteger(chart_ID,CHART_SHOW_ONE_CLICK,0,value))
{
//--- mostra il messaggio d'errore nel journal dell'Expert
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- esecuzione con successo
return(true);
}
· CHART_SHIFT_SIZE - grandezza di slittamento della barra zero dal bordo destro in valori
percentuali.
//+-----------------------------------------------------------------+
//| Ottiene la grandezza dello slittamento della barra zero dal bordo sinistro |
//| del chart, in valori percentuali (dal 10% fino al 50%) |
//+-----------------------------------------------------------------+
double ChartShiftSizeGet(const long chart_ID=0)
{
//--- prepara la variabile per ottenere il risultato
double result=EMPTY_VALUE;
//--- resetta il valore dell' errore
ResetLastError();
//--- ricevere il valore della proprietà
if(!ChartGetDouble(chart_ID,CHART_SHIFT_SIZE,0,result))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- restituisce il valore della proprietà chart
return(result);
}
//+---------------------------------------------------------------------------------------+
//| Ottiene la grandezza dello slittamento della barra zero dal bordo destro |
//| del grafico in valori percentuali (dal 10% fino al 50%). |
//| Per abilitare shift mode il valore della proprietà CHART_SHIFT dev'essere true| //| |
//+---------------------------------------------------------------------------------------+
bool ChartShiftSizeSet(const double value,const long chart_ID=0)
{
//--- resetta il valore dell' errore
ResetLastError();
//--- imposta il valore della proprietà
if(!ChartSetDouble(chart_ID,CHART_SHIFT_SIZE,value))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
· CHART_FIX ED_POSITION - la posizione fissata del chart dal bordo sinistro in valore percentuale.
//+----------------------------------------------------------------------------------------+
//| Ottiene il punto della posizione fissa del chart dal bordo sin. (in valori percent.)|
//+----------------------------------------------------------------------------------------+
double ChartFixedPositionGet(const long chart_ID=0)
{
//--- prepara la variabile per ottenere il risultato
double result=EMPTY_VALUE;
//--- resetta il valore dell' errore
ResetLastError();
//--- ricevere il valore della proprietà
if(!ChartGetDouble(chart_ID,CHART_FIXED_POSITION,0,result))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
}
//--- restituisce il valore della proprietà chart
return(result);
}
//+-----------------------------------------------------------------------------------------+
//| Ottiene il punto della posizione fissa del chart dal bordo sin. (in valori percent.) //| |
//| Per visualizzare il punto della posizione fissa del chart, il valore della proprietà |
//| CHART_AUTOSCROLL dev'essere impostato come false |
//+-----------------------------------------------------------------------------------------+
bool ChartFixedPositionSet(const double value,const long chart_ID=0)
{
//--- resetta il valore dell' errore
ResetLastError();
//--- imposta il valore della proprietà
if(!ChartSetDouble(chart_ID,CHART_FIXED_POSITION,value))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Imposta il valore del massimo fissato del chart | |
//| Per cambiare il valore della proprietà, il valore della proprietà |
//| dev'essere preliminarmente impostato come true | |
//+--------------------------------------------------------------------------------+
bool ChartFixedMaxSet(const double value,const long chart_ID=0)
{
//--- resetta il valore dell' errore
ResetLastError();
//--- imposta il valore della proprietà
if(!ChartSetDouble(chart_ID,CHART_FIXED_MAX,value))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
ResetLastError();
//--- imposta il valore della proprietà
if(!ChartSetDouble(chart_ID,CHART_FIXED_MIN,value))
{
//--- visualizza il messaggio di errore nel journal Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+------------------------------------------------------------------+
//| Definisce se la finestra corrente del chart è massimizzata |
//+------------------------------------------------------------------+
bool ChartWindowsIsMaximized(bool &result,const long chart_ID=0)
{
//--- prepara la variabile per ricevere il valore della proprietà
long value;
//--- resetta il valore dell'errore
ResetLastError();
//--- riceve il valore della proprietà
if(!ChartGetInteger(chart_ID,CHART_IS_MAXIMIZED))
{
//--- mostra un messaggio d'errore nel log degli Experts
Print(__FUNCTION__+", Error Code = ",GetLastError());
return(false);
}
//--- memorizza il valore della proprietà del chart nella variabile
result=value;
//--- esecuzione con successo
return(true);
}
#define X_PROPERTY_NAME_2 345 // coordinate x del nome della proprietà nella seconda e terza col
#define X_PROPERTY_VALUE_2 550 // coordinate x del valore della proprietà nella seconda e terza c
#define X_BUTTON_1 285 // coordinate x del bottone nella prima colonna
#define X_BUTTON_2 700 // coordinate x del bottone nella seconda colonna
#define Y_PROPERTY_1 30 // coordinate y dell'inizio della prima e seconda colonna
#define Y_PROPERTY_2 286 // coordinate y dell'inizion della terza colonna
#define Y_DISTANCE 16 // distanza assiale y tra le linee
#define LAST_PROPERTY_NUMBER 111 // numero dell'ultima proprietà grafica
//--- parametri di input
input color InpFirstColor=clrDodgerBlue; // Colore delle righe dispari
input color InpSecondColor=clrGoldenrod; // Colore delle righe pari
//--- variabili ed arrays
CChartObjectLabel ExtLabelsName[]; // etichetta per visualizzazione dei nomi delle proprietà
CChartObjectLabel ExtLabelsValue[]; // etichetta per visualizzazione dei valori delle proprietà
CChartObjectButton ExtButtons[]; // bottoni
int ExtNumbers[]; // indici delle proprietà
string ExtNames[]; // nomi delle proprietà
uchar ExtDataTypes[]; // tipi di dato delle proprietà (integer, double, string)
uint ExtGroupTypes[]; // array che memorizza i dati sulla appartenenza delle proprie
uchar ExtDrawTypes[]; // array che memorizza i dati sul tipo di proprietà display
double ExtMaxValue[]; // massimo valori delle proprietà che sono possibili quando si
double ExtMinValue[]; // minimi valori delle proprietà che sono possibili quando si
double ExtStep[]; // steps per il cambio delle proprietà
int ExtCount; // numero totale di tutte le proprietà
color ExtColors[2]; // array di colori per la visualizzazione delle righe
string ExtComments[2]; // array di commenti (per la priprietà CHART_COMMENT)
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- visualizza un commento sul grafico
Comment("SomeComment");
//--- memorizza i colori nell'array per potervi passare tra essi in un secondo momento
ExtColors[0]=InpFirstColor;
ExtColors[1]=InpSecondColor;
//--- memorizza i commenti nell'array per potervi passare tra essi in un secondo momento
ExtComments[0]="FirstComment";
ExtComments[1]="SecondComment";
//--- prepara e visualizza il pannello di controllo per la gestione delle proprietà del chart
if(!PrepareControls())
return(INIT_FAILED);
//--- esecuzione avvenuta
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione dell'expert |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- rimuove il commento sul chart
Comment("");
}
//+--------------------------------------------------------------------------------+
//| Handler di un evento chart |
//+--------------------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
//--- controlla l'evento del clic sull'oggetto chart
if(id==CHARTEVENT_OBJECT_CLICK)
{
//--- divide il nome dell'oggetto per separatore
string obj_name[];
StringSplit(sparam,'_',obj_name);
//--- controlla se l'oggetto è un bottone
if(obj_name[0]=="Button")
{
//--- riceve l'indice del bottone
int index=(int)StringToInteger(obj_name[1]);
//--- rilascia il bottone
ExtButtons[index].State(false);
//--- imposta il nuovo valore della proprietà a seconda del suo tipo
if(ExtDataTypes[index]=='I')
ChangeIntegerProperty(index);
if(ExtDataTypes[index]=='D')
ChangeDoubleProperty(index);
if(ExtDataTypes[index]=='S')
ChangeStringProperty(index);
}
}
//--- ri-disegna i valori delle proprietà
RedrawProperties();
ChartRedraw();
}
//+--------------------------------------------------------------------------------+
//| Cambia la proprietà integer del chart |
//+--------------------------------------------------------------------------------+
void ChangeIntegerProperty(const int index)
{
//--- riceve il valore corrente della proprietà
long value=ChartGetInteger(0,(ENUM_CHART_PROPERTY_INTEGER)ExtNumbers[index]);
//--- definisce il seguente valore della proprietà
switch(ExtDrawTypes[index])
{
case 'C':
value=GetNextColor((color)value);
break;
default:
value=(long)GetNextValue((double)value,index);
break;
}
//--- imposta il nuovo valore della proprietà
ChartSetInteger(0,(ENUM_CHART_PROPERTY_INTEGER)ExtNumbers[index],0,value);
}
//+--------------------------------------------------------------------------------+
//| Cambia la proprietà double del chart |
//+--------------------------------------------------------------------------------+
void ChangeDoubleProperty(const int index)
{
//--- riceve il valore corrente della proprietà
double value=ChartGetDouble(0,(ENUM_CHART_PROPERTY_DOUBLE)ExtNumbers[index]);
//--- definisce il seguente valore della proprietà
value=GetNextValue(value,index);
//--- imposta il nuovo valore della proprietà
ChartSetDouble(0,(ENUM_CHART_PROPERTY_DOUBLE)ExtNumbers[index],value);
}
//+--------------------------------------------------------------------------------+
//| Cambia la proprietà string del chart |
//+--------------------------------------------------------------------------------+
void ChangeStringProperty(const int index)
{
//--- variabile statica per il passaggio all'interno dell'array ExtComments
static uint comment_index=1;
//--- indice di cambiamento per ricevere un altro commento
comment_index=1-comment_index;
//--- imposta il nuovo valore della proprietà
ChartSetString(0,(ENUM_CHART_PROPERTY_STRING)ExtNumbers[index],ExtComments[comment_index]);
}
//+--------------------------------------------------------------------------------+
//| Ottiene il prossimo valore della proprietà |
//+--------------------------------------------------------------------------------+
double GetNextValue(const double value,const int index)
{
if(value+ExtStep[index]<=ExtMaxValue[index])
return(value+ExtStep[index]);
else
return(ExtMinValue[index]);
}
//+--------------------------------------------------------------------------------+
//| Ottiene il prossimo colore per la proprietà di tipo colore |
//+--------------------------------------------------------------------------------+
color GetNextColor(const color clr)
{
//--- restituisce i seguenti valori del colore
switch(clr)
{
case clrWhite: return(clrRed);
case clrRed: return(clrGreen);
case clrGreen: return(clrBlue);
case clrBlue: return(clrBlack);
default: return(clrWhite);
}
}
//+--------------------------------------------------------------------------------+
//| Re-disegna i valori della proprietà |
//+--------------------------------------------------------------------------------+
void RedrawProperties(void)
{
//--- testo valore della proprietà
string text;
long value;
//--- loop del numero delle proprietà
for(int i=0;i<ExtCount;i++)
{
text="";
switch(ExtDataTypes[i])
{
case 'I':
//--- riceve il corrente valore della proprietà
if(!ChartGetInteger(0,(ENUM_CHART_PROPERTY_INTEGER)ExtNumbers[i],0,value))
break;
//--- testo integer della proprietà
switch(ExtDrawTypes[i])
{
//--- proprietà colore
case 'C':
text=(string)((color)value);
break;
//--- proprietà booleana
case 'B':
text=(string)((bool)value);
break;
//--- proprietà di enumerazione ENUM_CHART_MODE
case 'M':
text=EnumToString((ENUM_CHART_MODE)value);
break;
//--- proprietà di enumerazione ENUM_CHART_VOLUME_MODE
case 'V':
text=EnumToString((ENUM_CHART_VOLUME_MODE)value);
break;
//--- numero tipo int
default:
text=IntegerToString(value);
break;
}
break;
case 'D':
//--- testo proprietà double
text=DoubleToString(ChartGetDouble(0,(ENUM_CHART_PROPERTY_DOUBLE)ExtNumbers[i]),4);
break;
case 'S':
//--- testo proprietà string
text=ChartGetString(0,(ENUM_CHART_PROPERTY_STRING)ExtNumbers[i]);
break;
}
//--- valore della prorpietà display
ExtLabelsValue[i].Description(text);
}
}
//+--------------------------------------------------------------------------------+
//| Crea il pannello per gestire le proprietà del chart |
//+--------------------------------------------------------------------------------+
bool PrepareControls(void)
{
//--- alloca la memoria per array con una riseva
MemoryAllocation(LAST_PROPERTY_NUMBER+1);
//--- variabili
int i=0; // variable loop
int col_1=0; // numero di proprietà nella prima colonna
int col_2=0; // numero di proprietà nella seconda colonna
int col_3=0; // numero di proprietà nella terza colonna
//--- numero corrente della proprità - 0
ExtCount=0;
//--- visualizzazione per le proprietà nel loop
while(i<=LAST_PROPERTY_NUMBER)
{
//--- immagazzina il corrente numero della proprietà
ExtNumbers[ExtCount]=i;
//--- incrementa il valore della variabile loop
i++;
//--- controlla se c'è una proprietà con tale numero
if(CheckNumber(ExtNumbers[ExtCount],ExtNames[ExtCount],ExtDataTypes[ExtCount],ExtGroupTypes[E
{
//--- crea elementi di controllo per la proprietà
switch(ExtGroupTypes[ExtCount])
{
case 1:
//--- crea etichette d un bottone per la proprietà
if(!ShowProperty(ExtCount,0,X_PROPERTY_NAME_1,X_PROPERTY_VALUE_1,X_BUTTON_1,Y_PROPER
return(false);
//--- il numero degli elementi nella prima colonna è aumentato
col_1++;
break;
case 2:
//--- crea etichette d un bottone per la proprietà
if(!ShowProperty(ExtCount,1,X_PROPERTY_NAME_2,X_PROPERTY_VALUE_2,X_BUTTON_2,Y_PROPER
return(false);
//--- il numero degli elementi nella seconda colonna è aumentato
col_2++;
break;
case 3:
//--- crea solo etichette per la proprietà
if(!ShowProperty(ExtCount,2,X_PROPERTY_NAME_2,X_PROPERTY_VALUE_2,0,Y_PROPERTY_2+col_
return(false);
//--- il numero degli elementi nella terza colonna è aumentato
col_3++;
break;
}
//--- definisce il valore della proprietà massimo e minimo e lo step
GetMaxMinStep(ExtNumbers[ExtCount],ExtMaxValue[ExtCount],ExtMinValue[ExtCount],ExtStep[Ext
//--- incrementa il numero delle proprietà
ExtCount++;
}
}
//--- libera la memoria non usata dagli array
MemoryAllocation(ExtCount);
//--- ri-disegna i valori delle proprietà
RedrawProperties();
ChartRedraw();
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Alloca la memoria per gli array |
//+--------------------------------------------------------------------------------+
void MemoryAllocation(const int size)
{
ArrayResize(ExtLabelsName,size);
ArrayResize(ExtLabelsValue,size);
ArrayResize(ExtButtons,size);
ArrayResize(ExtNumbers,size);
ArrayResize(ExtNames,size);
ArrayResize(ExtDataTypes,size);
ArrayResize(ExtGroupTypes,size);
ArrayResize(ExtDrawTypes,size);
ArrayResize(ExtMaxValue,size);
ArrayResize(ExtMinValue,size);
ArrayResize(ExtStep,size);
}
//+--------------------------------------------------------------------------------+
//| Controlla se l'indice della proprietà appartiene ad uno di quelli dell' |
CheckFirstGroup(property_number,group_type,draw_type);
}
//+-------------------------------------------------------------------------------+
//| Controlla se la proprietà appartiene al terzo gruppo e |
//| definisce il suo tipo di visualizzazione in caso di risposta positiva |
//+-------------------------------------------------------------------------------+
bool CheckThirdGroup(const int property_number,uint &group_type,uchar &draw_type)
{
//--- controlla se la proprietà appartiene al terzo gruppo
switch(property_number)
{
//--- proprietà booleane
case CHART_IS_OBJECT:
case CHART_WINDOW_IS_VISIBLE:
draw_type='B';
break;
//--- proprietà integer
case CHART_VISIBLE_BARS:
case CHART_WINDOWS_TOTAL:
case CHART_WINDOW_HANDLE:
case CHART_WINDOW_YDISTANCE:
case CHART_FIRST_VISIBLE_BAR:
case CHART_WIDTH_IN_BARS:
case CHART_WIDTH_IN_PIXELS:
draw_type='I';
break;
//--- proprietà double
case CHART_PRICE_MIN:
case CHART_PRICE_MAX:
draw_type='D';
break;
//--- in realtà, questa proprietà è un comando di visualizzazione del chart in cima a tutt
//--- non vi è alcuna necessità di applicare questo pannello, siccome la finestra sarà sem
//--- in cima ad altre prima che noi la usiamo
case CHART_BRING_TO_TOP:
draw_type=' ';
break;
//--- la proprietà non appartiene al terzo gruppo
default:
return(false);
}
//--- la proprietà appartiene al terzo gruppo
group_type=3;
return(true);
}
//+-------------------------------------------------------------------------------+
//| Controlla se la proprietà appartiene al secondo gruppo e |
//| definisce il suo tipo di visualizzazione in caso di risposta positiva |
//+-------------------------------------------------------------------------------+
if(!lbl.Description(text)) return(false);
if(!lbl.FontSize(10)) return(false);
if(!lbl.Color(clr)) return(false);
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Crea bottoni |
//+--------------------------------------------------------------------------------+
bool ButtonCreate(CChartObjectButton &btn,const string name,
const int x,const int y)
{
if(!btn.Create(0,"Button_"+name,0,x,y,50,15)) return(false);
if(!btn.Description("Next")) return(false);
if(!btn.FontSize(10)) return(false);
if(!btn.Color(clrBlack)) return(false);
if(!btn.BackColor(clrWhite)) return(false);
if(!btn.BorderColor(clrBlack)) return(false);
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Definisce il massimo ed il minimo valore e step delle proprietà |
//+--------------------------------------------------------------------------------+
void GetMaxMinStep(const int property_number,double &max,double &min,double &step)
{
double value;
//--- imposta i valori a seconda del tipo di proprietà
switch(property_number)
{
case CHART_SCALE:
max=5;
min=0;
step=1;
break;
case CHART_MODE:
case CHART_SHOW_VOLUMES:
max=2;
min=0;
step=1;
break;
case CHART_SHIFT_SIZE:
max=50;
min=10;
step=2.5;
break;
case CHART_FIXED_POSITION:
max=90;
min=0;
step=15;
break;
case CHART_POINTS_PER_BAR:
max=19;
min=1;
step=3;
break;
case CHART_FIXED_MAX:
value=ChartGetDouble(0,CHART_FIXED_MAX);
max=value*1.25;
min=value;
step=value/32;
break;
case CHART_FIXED_MIN:
value=ChartGetDouble(0,CHART_FIXED_MIN);
max=value;
min=value*0.75;
step=value/32;
break;
case CHART_HEIGHT_IN_PIXELS:
max=700;
min=520;
step=30;
break;
//--- valori default
default:
max=1;
min=0;
step=1;
}
}
Costanti Oggetti
Ci sono 44 oggetti grafici che possono essere creati e visualizzati nel chart dei prezzi. T utte le
costanti per lavorare con gli oggetti sono divise in 9 gruppi:
· Oggetti G ann - costanti sull'andamento del vantaglio Gann e della griglia Gann;
· W eb colors – costanti dei colori web predefiniti;
· W ingdings – codici dei caratteri del font W ingdings.
Tipi di oggetti
Quando un oggetto grafico viene creato utilizzando la funzione ObjectCreate(), è necessario
specificare il tipo di oggetto creato, che può essere uno dei valori dell'enumerazione ENUM _OBJECT .
Ulteriori specifiche delle proprietà dell'oggetto sono possibili utilizzando le funzioni per lavorare con
oggetti grafici.
ENUM_OBJECT
ID Descrizione
OBJ_VL INE Linea verticale
OBJ_TRIANGLE T riangolo
ID Descrizione
OBJ_ARR OW _THUM B_DOW N Pollice giu
OBJ_ARR OW F reccia
OBJ_BUTT ON B ottone
OBJ_CHART G rafico
OBJ_BIT M AP B itmap
OBJ_EDIT Modifica
corrispondente ad un evento
nel calendario economico
la progettazione
dell'interfaccia grafica
personalizzata.
OBJ_VLINE
Linea verticale.
Nota
Quando si disegna una linea verticale, è possibile impostare la modalità di visualizzazione della linea
per tutte le finestre chart (di proprietà OBJPR OP_RAY).
Esempio
Il seguente script crea e sposta la linea verticale sul chart. Funzioni speciali sono state sviluppate
per creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste funzioni " come
è" nelle proprie applicazioni.
//--- descrizione
#property description "Lo script disegna l'oggetto grafico \"Linea Verticale\" ."
#property description "La data del punto di ancoraggio è impostata in percentuale dello"
#property description "spessoore in barre della finestra chart."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="VLine"; // Nome della linea
input int InpDate=25; // Data evento, %
input color InpColor=clrRed; // Colore della Linea
input ENUM_LINE_STYLE InpStyle=STYLE_DASH; // Stile della linea
input int InpWidth=3; // Spessore della linea
input bool InpBack=false; // Sottofondo linea
input bool InpSelection=true; // Evdenzia movimento
input bool InpRay=true; // Continuazione della linea verso il basso
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Sposta la linea verticale |
//+--------------------------------------------------------------------------------+
bool VLineMove(const long chart_ID=0, // ID del chart
const string name="VLine", // nome della linea
datetime time=0) // orario della linea
{
//--- se l'orario della linea non è impostato, sposta la linea all'ultima barra
if(!time)
time=TimeCurrent();
//--- resetta il valore dell' errore
ResetLastError();
//--- sposta la linea verticale
if(!ObjectMove(chart_ID,name,0,time,0))
{
Print(__FUNCTION__,
": fallimento nello spostare la linea verticale! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Elimina la linea verticale |
//+--------------------------------------------------------------------------------+
bool VLineDelete(const long chart_ID=0, // ID del chart
const string name="VLine") // nome della linea
{
//--- resetta il valore dell' errore
ResetLastError();
//--- elimina la linea verticale
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": fallimento nell'eliminare la linea verticale! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
OBJ_HLINE
Linea Orizzontale.
Esempio
Il seguente script crea e sposta la linea orizzontale sul chart. Funzioni speciali sono state sviluppate
per creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste funzioni " come
è" nelle proprie applicazioni.
//--- descrizione
#property description "Lo script disegna l'oggetto grafico \"Linea orizzontale\" ."
#property description "Il prezzo del punto di ancoraggio è impostato in percentuale dell'altezza de
#property description "finestra del chart."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="HLine"; // Nome della Linea
input int InpPrice=25; // Prezzo della Linea, %
input color InpColor=clrRed; // Colore della Linea
input ENUM_LINE_STYLE InpStyle=STYLE_DASH; // Stile della linea
input int InpWidth=3; // Spessore della linea
input bool InpBack=false; // Sottofondo linea
input bool InpSelection=true; // Evdenzia movimento
input bool InpHidden=true; // Nascosto nella lista oggetti
input long InpZOrder=0; // Priorità per il click del mouse
//+--------------------------------------------------------------------------------+
//| Crea la linea orizzontale |
//+--------------------------------------------------------------------------------+
//--- array per memorizzare i valori dei prezzi che devono essere usati
//--- per impostare e cambiare le coordinate del punto di ancoraggio della linea
double price[];
//--- allocazione della memoria
ArrayResize(price,accuracy);
/--- riempie l'array dei prezzi
//--- trova i valori più alti e più bassi del chart
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definisce un cambio di step del prezzo e riempie l'array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definisce i punti per disegnare la linea
int p=InpPrice*(accuracy-1)/100;
//--- crea una linea orizzontale
if(!HLineCreate(0,InpName,0,price[p],InpColor,InpStyle,InpWidth,InpBack,
InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- redisegna il chart ed attende per 1 secondo
ChartRedraw();
Sleep(1000);
//--- ora, sposta la linea
//---contatore del ciclo
int v_steps=accuracy/2;
//--- sposta la linea
for(int i=0;i<v_steps;i++)
{
//--- usa il seguente valore
if(p<accuracy-1)
p+=1;
//--- sposta il punto
if(!HLineMove(0,InpName,price[p]))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
}
//--- 1 secondo di ritardo
Sleep(1000);
//--- elimina dal chart
HLineDelete(0,InpName);
ChartRedraw();
//--- 1 secondo di ritardo
Sleep(1000);
//---
}
OBJ_TREND
T rend Line.
Nota
Per le " T rend Line" , è possibile specificare la modalità della sua continuazione a destra e/o a
sinistra (proprietà OBJPR OP_RAY_RIGHT ed OBJPR OP_RAY_LEFT rispettivamente).
Esempio
Il seguente script crea e sposta la trend linesul chart. Funzioni speciali sono state sviluppate per
creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste funzioni " come è"
nelle proprie applicazioni.
//--- descrizione
#property description "Lo script disegna l'oggetto grafico \"Trend Line\"."
#property description "Le coordinate del punto di ancoraggio sono impostate in percentuale"
#property description " della grandezza della finestra chart."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="Trend"; // Nome della linea
input int InpDate1=35; // Data del 1mo punto, in %
input int InpPrice1=60; // Prezzo del 1mo punto, in%
input int InpDate2=65; // data del 2ndo punto, %
input int InpPrice2=40; // Prezzo del 2ndo punto, in %
input color InpColor=clrRed; // Colore della Linea
input ENUM_LINE_STYLE InpStyle=STYLE_DASH; // Stile della linea
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": fallimento nell'eliminare una trendline! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Controlla i valori dei punti di ancoraggio della trendline ed imposta i |
//| valori di default per quelli vuoti |
//+--------------------------------------------------------------------------------+
void ChangeTrendEmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2)
{
//--- se l'orario del primo punto non è impostato, sarà sulla barra corrente
if(!time1)
time1=TimeCurrent();
//--- se il prezzo del punto non è impostato, avrà un valore Bid
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- se l'orario del secondo punto non è impostato, è posizionato 9 barre meno dalla seconda
if(!time2)
{
//--- array per la ricezione dell'orario di apertura delle ultime 10 barre
datetime temp[10];
CopyTime(Symbol(),Period(),time1,10,temp);
//--- imposta il secondo punto, 9 barre in meno dalla prima
time2=temp[0];
}
//--- se il prezzo del secondo punto non è impostato, è uguale a quello del primo punto
if(!price2)
price2=price1;
}
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- imposta la correttezza dei parametri di input
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100)
{
Print("Error! Valori non corretti dei parametri di input!");
return;
}
//--- Numero di barre visibili nella finestra del chart
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
}
//--- sposta il secondo punto di ancoraggio, verticalmente
for(int i=0;i<v_steps;i++)
{
//--- usa il seguente valore
if(p2<accuracy-1)
p2+=1;
//--- sposta il punto
if(!TrendPointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
}
//--- ritardo di mezzo secondo
Sleep(500);
//---contatore del ciclo
int h_steps=bars/2;
//--- sposta entrambi i punti di ancoraggio, orizzontalmente allo stesso orario
for(int i=0;i<h_steps;i++)
{
//--- usa i seguenti valori
if(d1<bars-1)
d1+=1;
if(d2>1)
d2-=1;
//--- slitta i punti
if(!TrendPointChange(0,InpName,0,date[d1],price[p1]))
return;
if(!TrendPointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
// 0.03 secondi di ritardo
Sleep(30);
}
//--- 1 secondo di ritardo
Sleep(1000);
OBJ_TRENDBYANGLE
T rendline per Angolo.
Nota
Per le " T rend Line per Angolo" , è possibile specificare la modalità della sua continuazione a destra
e/o a sinistra (proprietà OBJPR OP_RAY_RIGHT ed OBJPR OP_RAY_LEFT rispettivamente).
S ia angolo e le coordinate del secondo punto di ancoraggio possono essere utilizzate per impostare
la pendenza della linea.
Esempio
Il seguente script crea e sposta la trend linesul chart. Funzioni speciali sono state sviluppate per
creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste funzioni " come è"
nelle proprie applicazioni.
//--- descrizione
#property description "Lo script disegna l'oggetto grafico \"Trend Line Angolata\"."
#property description "Le coordinate del punto di ancoraggio sono impostate in percentuale della gr
#property description "finestra del chart."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="Trend"; // Nome della linea
input int InpDate1=50; // data del 1mo punto, %
input int InpPrice1=75; // prezzo del 1mo punto, %
input int InpAngle=0; // Angolo di pendenza della linea
input color InpColor=clrRed; // Colore della Linea
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- mostra in primo piano (false) o sottofondo (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- abilitare (true) o disabilitare (false) il modo di spostare la linea con freccia, con il mous
//--- quando si crea un oggetto grafico utilizzando la funzione ObjectCreate, l'oggetto non può ess
//--- evidenziato e mosso, per default. All'interno di questo metodo, la selezione dei parametri
//--- è true per default, il che consente di evidenziare e spostare l'oggetto
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- abilita (true) o disabilita (false) la modalità di continuazione della visualizzazione della
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_LEFT,ray_left);
//--- abilita (true) o disabilita (false) la modalità di continuazione della visualizzazione della
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
//--- nascondi (true) o mostra (falso) il nome di oggetto grafico nella lista degli oggetti
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- imposta la priorità per ricevere l'evento di un clic del mouse nel grafico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Cambia i punti di ancoraggio delle coordinate delle trendline |
//+--------------------------------------------------------------------------------+
bool TrendPointChange(const long chart_ID=0, // ID del chart
const string name="TrendLine", // nome dellal linea
datetime time=0, // coordinate tempo, del punto di ancoraggio
double price=0) // coordinate prezzo, del punto di ancoraggio
{
//--- se il punto della posizione non è impostato, spostarlo nella barra corrente che ha il prezzo
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- resetta il valore dell' errore
ResetLastError();
//--- sposta il punto di ancoraggio della trendline
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
": fallimento nello spostare il punto di ancoraggio! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Cambia l'angolo di pendenza della trendline |
//+--------------------------------------------------------------------------------+
bool TrendAngleChange(const long chart_ID=0, // ID del chart
CopyTime(Symbol(),Period(),time1,10,second_point_time);
time2=second_point_time[0];
price2=price1;
}
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- imposta la correttezza dei parametri di input
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100)
{
Print("Error! Valori non corretti dei parametri di input!");
return;
}
//--- Numero di barre visibili nella finestra del chart
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- grandezza dell'array prezzo
int accuracy=1000;
//--- array per la memorizzazione dei valori di data e prezzo da essere usati
//--- per impostare e cambiare i punti delle coordinate di ancoraggio della linea
datetime date[];
double price[];
//--- allocazione della memoria
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- riempie l'array delle date
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Fallimento nella copia dei valori tempo! Error code = ",GetLastError());
return;
}
/--- riempie l'array dei prezzi
//--- trova i valori più alti e più bassi del chart
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definisce un cambio di step del prezzo e riempie l'array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definisce i punti per disegnare la linea
int d1=InpDate1*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
//--- crea una trend line
if(!TrendByAngleCreate(0,InpName,0,date[d1],price[p1],InpAngle,InpColor,InpStyle,
InpWidth,InpBack,InpSelection,InpRayLeft,InpRayRight,InpHidden,InpZOrder))
{
return;
}
//--- redisegna il chart ed attende per 1 secondo
ChartRedraw();
Sleep(1000);
//--- ora, sposta e ruota la linea
//---contatore del ciclo
int v_steps=accuracy/2;
//--- sposta il punto di ancoraggio e cambia l'angolo di pendenza della linea
for(int i=0;i<v_steps;i++)
{
//--- usa il seguente valore
if(p1>1)
p1-=1;
//--- sposta il punto
if(!TrendPointChange(0,InpName,date[d1],price[p1]))
return;
if(!TrendAngleChange(0,InpName,18*(i+1)))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
}
//--- 1 secondo di ritardo
Sleep(1000);
//--- elimina dal chart
TrendDelete(0,InpName);
ChartRedraw();
//--- 1 secondo di ritardo
Sleep(1000);
//---
}
OBJ_CYCLES
Linee Ciclo.
Nota
La distanza tra le linee è impostata da coordinate temporali dei due punti di ancoraggio dell'oggetto.
Esempio
Il seguente script crea e sposta le linee ciclo sul chart. Funzioni speciali sono state sviluppate per
creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste funzioni " come è"
nelle proprie applicazioni.
//--- descrizione
#property description "Lo Script crea le linee ciclo sul chart."
#property description "Coordinate dei punti di ancoraggio sono impostare in percentuale"
#property description "percentuale della grandezza della finestra chart."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="Cycles"; // nome dell'oggetto
input int InpDate1=10; // data del 1mo punto, %
input int InpPrice1=45; // prezzo del 1mo punto, %
input int InpDate2=20; // data del 2ndo punto, %
input int InpPrice2=55; // prezzo del 2ndo punto, %
input color InpColor=clrRed; // Colore delle linee ciclo
input ENUM_LINE_STYLE InpStyle=STYLE_DOT; // Stile delle linee ciclo
input int InpWidth=1; // Spessore delle linee ciclo
//--- imposta la priorità per ricevere l'evento di un clic del mouse nel grafico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Sposta il punto di ancoraggio |
//+--------------------------------------------------------------------------------+
bool CyclesPointChange(const long chart_ID=0, // ID del chart
const string name="Cycles", // nome dell'oggetto
const int point_index=0, // indice del punto di ancoraggio
datetime time=0, // coordinate del punto di ancoraggio tempo
double price=0) // coordinate del punto di ancoraggio prezzo
{
//--- se il punto della posizione non è impostato, spostarlo nella barra corrente che ha il prezzo
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- resetta il valore dell' errore
ResetLastError();
//--- sposta il punto di ancoraggio
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
": fallimento nello spostare il punto di ancoraggio! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Elimina le linee ciclo |
//+--------------------------------------------------------------------------------+
bool CyclesDelete(const long chart_ID=0, // ID del chart
const string name="Cycles") // nome dell'oggetto
{
//--- resetta il valore dell' errore
ResetLastError();
//--- elimina le linee ciclo
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": fallimento nell'eliminare le linee ciclo! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Imposta i valori dei punti di ancoraggio delle linee ciclo ed imposta i |
//| valori di default per quelli vuoti |
//+--------------------------------------------------------------------------------+
void ChangeCyclesEmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2)
{
//--- se l'orario del primo punto non è impostato, sarà sulla barra corrente
if(!time1)
time1=TimeCurrent();
//--- se il prezzo del punto non è impostato, avrà un valore Bid
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- se l'orario del secondo punto non è impostato, è posizionato 9 barre meno dalla seconda
if(!time2)
{
//--- array per la ricezione dell'orario di apertura delle ultime 10 barre
datetime temp[10];
CopyTime(Symbol(),Period(),time1,10,temp);
//--- imposta il secondo punto, 9 barre in meno dalla prima
time2=temp[0];
}
//--- se il prezzo del secondo punto non è impostato, è uguale a quello del primo punto
if(!price2)
price2=price1;
}
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- imposta la correttezza dei parametri di input
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100)
{
Print("Error! Valori non corretti dei parametri di input!");
return;
}
//--- Numero di barre visibili nella finestra del chart
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- grandezza dell'array prezzo
int accuracy=1000;
//--- array per la memorizzazione dei valori di data e prezzo da essere usati
//--- per impostare e cambiare le coordinate dei punti di ancoraggio delle linee ciclo
datetime date[];
double price[];
//--- allocazione della memoria
ArrayResize(date,bars);
ArrayResize(price,accuracy);
OBJ_ARROW ED_LINE
Linea con freccia
Esempio
Il seguente script crea e sposta una linea con freccia sul chart. Funzioni speciali sono state
sviluppate per creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste
funzioni " come è" nelle proprie applicazioni.
//--- descrizione
#property description "Lo script disegna l'oggetto grafico \"Linea con freccia\" ."
#property description "Le coordinate del punto di ancoraggio sono impostate in percentuale"
#property description " della grandezza della finestra chart."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="ArrowedLine"; // nome della Linea
input int InpDate1=35; // Data del 1mo punto, in %
input int InpPrice1=60; // Prezzo del 1mo punto, in%
input int InpDate2=65; // Data del 2ndo punto, in %
input int InpPrice2=40; // Prezzo del 2ndo punto, in %
input color InpColor=clrRed; // Colore della linea
input ENUM_LINE_STYLE InpStyle=STYLE_DASH; // Stile della linea
input int InpWidth=2; // Spessore della linea
input bool InpBack=false; // Linea di sottofondo
input bool InpSelection=true; // Evidenzia spostamento
input bool InpHidden=true; // Nascosto nella lista oggetti
input long InpZOrder=0; // Priorità per il click del mouse
//+--------------------------------------------------------------------------------+
//| Crea un linea con freccia, dalle coordinate date |
//+--------------------------------------------------------------------------------+
bool ArrowedLineCreate(const long chart_ID=0, // ID del chart
const string name="ArrowedLine", // nome della linea
const int sub_window=0, // indice sottofinestra
datetime time1=0, // orario del primo punto
double price1=0, // prezzo del primo punto
datetime time2=0, // orario del secondo punto
double price2=0, // prezzo del secondo punto
const color clr=clrRed, // colore della linea
const ENUM_LINE_STYLE style=STYLE_SOLID, // stile della linea
const int width=1, // spessore della linea
const bool back=false, // in sottofondo
const bool selection=true, // evidenzia movimento
const bool hidden=true, // nascosto nella lista oggetti
const long z_order=0) // priorità per il click del mouse
{
//--- imposta coordinate punto di ancoraggio se non sono impostate
ChangeArrowedLineEmptyPoints(time1,price1,time2,price2);
//--- resetta il valore dell' errore
ResetLastError();
//--- crea una linea con freccia dalle coordinate date
if(!ObjectCreate(chart_ID,name,OBJ_ARROWED_LINE,sub_window,time1,price1,time2,price2))
{
Print(__FUNCTION__,
": fallimento nel creare la linea con freccia! Error code = ",GetLastError());
return(false);
}
//--- imposta colore della linea
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- imposta lo stile della linea
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- larghezza della linea
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- mostra in primo piano (false) o sottofondo (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- abilitare (true) o disabilitare (false) il modo di spostare la linea con freccia, con il mous
//--- quando si crea un oggetto grafico utilizzando la funzione ObjectCreate, l'oggetto non può ess
//--- evidenziato e mosso, per default. All'interno di questo metodo, la selezione dei parametri
//--- è true per default, il che consente di evidenziare e spostare l'oggetto
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- nascondi (true) o mostra (falso) il nome di oggetto grafico nella lista degli oggetti
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- imposta la priorità per ricevere l'evento di un clic del mouse nel grafico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Sposta il punto di ancoraggio della linea con freccia |
//+--------------------------------------------------------------------------------+
bool ArrowedLinePointChange(const long chart_ID=0, // ID del chart
const string name="ArrowedLine", // nome della linea
const int point_index=0, // indice del punto di ancoraggio
datetime time=0, // coordinate tempo, del punto di anco
double price=0) // coordinate prezzo, del punto di anc
{
//--- se il punto della posizione non è impostato, spostarlo nella barra corrente che ha il prezzo
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- resetta il valore dell' errore
ResetLastError();
//--- sposta il punto di ancoraggio della linea
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
": fallimento nello spostare il punto di ancoraggio! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| La funzione rimuove la linea con freccia dal chart |
//+--------------------------------------------------------------------------------+
bool ArrowedLineDelete(const long chart_ID=0, // ID del chart
const string name="ArrowedLine") // nome della linea
{
//--- resetta il valore dell' errore
ResetLastError();
//--- elimina una linea con freccia
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": fallimento nel creare la linea con freccia! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Controlla i valori del punto di ancoraggio ed imposta i valori di default |
//| per quelli vuoti |
//+--------------------------------------------------------------------------------+
OBJ_CHANNEL
Canale Equidistante
Nota
Per un canale equidistante, è possibile specificare la modalità della sua continuazione a destra e/o a
sinistra (proprietà OBJPR OP_RAY_RIGHT ed OBJPR OP_RAY_LEFT rispettivamente). Può essere anche
impostata la modalità di riempimento del canale con colore.
Esempio
Il seguente script crea e muove un canale equidistante sul chart. Funzioni speciali sono state
sviluppate per creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste
funzioni " come è" nelle proprie applicazioni.
//--- descrizione
#property description "Script draws \"Equidistant Channel\" oggetto grafico."
#property description "Le coordinate del punto di ancoraggio sono impostate in percentuale della gr
#property description "finestra del chart."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="Channel"; // Nome del canale
input int InpDate1=25; // data del 1mo punto, %
input int InpPrice1=60; // Prezzo del 1mo punto, in%
input int InpDate2=65; // data del 2ndo punto, %
input int InpPrice2=80; // prezzo del 2ndo punto, %
input int InpDate3=30; // data del 3zo punto, %
//+--------------------------------------------------------------------------------+
//| Elimina il canale |
//+--------------------------------------------------------------------------------+
bool ChannelDelete(const long chart_ID=0, // ID del chart
const string name="Channel") // nome del canale
{
//--- resetta il valore dell' errore
ResetLastError();
//--- elimina il canale
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": fallimento nell'eliminare il canale! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+---------------------------------------------------------------------------------------+
//| Controlla i valori dei punti di ancoraggio del canale ed impostare i valori di default|
//| per quelli vuoti |
//+---------------------------------------------------------------------------------------+
void ChangeChannelEmptyPoints(datetime &time1,double &price1,datetime &time2,
double &price2,datetime &time3,double &price3)
{
//--- se l'orario del secondo(destro) punto non è impostato, sarà sulla barra corrente
if(!time2)
time2=TimeCurrent();
//--- se il prezzo del secondo punto non è impostato, avrà un valore Bid
if(!price2)
price2=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- se l'orario del primo(sinistro) punto non è impostato, è posizionato 9 barre meno dalla secon
if(!time1)
{
//--- array per la ricezione dell'orario di apertura delle ultime 10 barre
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//--- imposta il primo punto 9 barre a sinistra dalla seconda
time1=temp[0];
}
//--- se il prezzo del primo punto non è impostato, lo sposta di 300 punti in più rispetto al secon
if(!price1)
price1=price2+300*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
//--- se l'orario del terzo punto non è impostato, esso coincide con quello del primo punto
if(!time3)
time3=time1;
//--- se il prezzo del terzo punto non è impostato, è uguale a quello del secondo punto
if(!price3)
price3=price2;
}
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- imposta la correttezza dei parametri di input
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100 ||
InpDate3<0 || InpDate3>100 || InpPrice3<0 || InpPrice3>100)
{
Print("Error! Valori non corretti dei parametri di input!");
return;
}
//--- Numero di barre visibili nella finestra del chart
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- grandezza dell'array prezzo
int accuracy=1000;
//--- array per la memorizzazione dei valori di data e prezzo da essere usati
//--- per impostare e modificare le coordinate dei punti di ancoraggio del canale"
datetime date[];
double price[];
//--- allocazione della memoria
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- riempie l'array delle date
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Fallimento nella copia dei valori tempo! Error code = ",GetLastError());
return;
}
/--- riempie l'array dei prezzi
//--- trova i valori più alti e più bassi del chart
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definisce un cambio di step del prezzo e riempie l'array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definisce i punti per disegnare il canale
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int d3=InpDate3*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
int p3=InpPrice3*(accuracy-1)/100;
//--- crea il canale equidistante
if(!ChannelCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],date[d3],price[p3],InpColor,
InpStyle,InpWidth,InpFill,InpBack,InpSelection,InpRayLeft,InpRayRight,InpHidden,InpZOrder))
{
return;
}
//--- redisegna il chart ed attende per 1 secondo
ChartRedraw();
Sleep(1000);
//--- ora, sposta i punti di ancoraggio del canale
//---contatore del ciclo
int h_steps=bars/6;
//--- sposta il secondo punto di ancoraggio
for(int i=0;i<h_steps;i++)
{
//--- usa il seguente valore
if(d2<bars-1)
d2+=1;
//--- sposta il punto
if(!ChannelPointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
// 0.05 secondi di ritardo
Sleep(50);
}
//--- 1 secondo di ritardo
Sleep(1000);
//--- move the first anchor point
for(int i=0;i<h_steps;i++)
{
//--- usa il seguente valore
if(d1>1)
d1-=1;
//--- sposta il punto
if(!ChannelPointChange(0,InpName,0,date[d1],price[p1]))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
// 0.05 secondi di ritardo
Sleep(50);
}
//--- 1 secondo di ritardo
Sleep(1000);
//---contatore del ciclo
int v_steps=accuracy/10;
//--- sposta il terzo punto di ancoraggio
for(int i=0;i<v_steps;i++)
{
//--- usa il seguente valore
if(p3>1)
p3-=1;
//--- sposta il punto
if(!ChannelPointChange(0,InpName,2,date[d3],price[p3]))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
}
//--- 1 secondo di ritardo
Sleep(1000);
//--- elimina il canale dal chart
ChannelDelete(0,InpName);
ChartRedraw();
//--- 1 secondo di ritardo
Sleep(1000);
//---
}
OBJ_STDDEVCHANNEL
Canale di Deviazione S trandard.
Nota
Per il " Canale di Deviazione S trandard" , è possibile specificare la modalità della sua continuazione a
destra e/o a sinistra (proprietà OBJPR OP_RAY_RIGHT ed OBJPR OP_RAY_LEFT rispettivamente). Può
essere anche impostata la modalità di riempimento del canale con colore.
OBJPR OP_DEVIATION la proprietà è utilizzata per cambiare il valore della deviazione del canale.
Esempio
Il seguente script crea e sposta un Canale di R egressione Lineare sul chart. Funzioni speciali sono
state sviluppate per creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare
queste funzioni " come è" nelle proprie applicazioni.
//--- descrizione
#property description "Lo Script disegna l'oggetto grafico \"Canale di Deviazione Standard\"."
#property description "Le coordinate del punto di ancoraggio sono impostate in percentuale della gr
#property description "finestra del chart."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="StdDevChannel"; // Nome del Canale
input int InpDate1=10; // data del 1mo punto, %
input int InpDate2=40; // data del 2ndo punto, %
input double InpScale=1.0; // Deviazione
input color InpColor=clrRed; // Colore del canale
ObjectSetInteger(chart_ID,name,OBJPROP_FILL,fill);
//--- mostra in primo piano (false) o sottofondo (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- abilita (true) o disabilita (false) la modalità di evidenzia del canale per lo spostamento
//--- quando si crea un oggetto grafico utilizzando la funzione ObjectCreate, l'oggetto non può ess
//--- evidenziato e mosso, per default. All'interno di questo metodo, la selezione dei parametri
//--- è true per default, il che consente di evidenziare e spostare l'oggetto
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- abilita (true) o disabilita (false) la modalità di continuazione del display del canale a sin
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_LEFT,ray_left);
//--- abilita (true) o disabilita (false) la modalità di continuazione del display del canale a des
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
//--- nascondi (true) o mostra (falso) il nome di oggetto grafico nella lista degli oggetti
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- imposta la priorità per ricevere l'evento di un clic del mouse nel grafico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Sposta il punto di ancoraggio del canale |
//+--------------------------------------------------------------------------------+
bool StdDevChannelPointChange(const long chart_ID=0, // ID del chart
const string name="Channel", // nome del canale
const int point_index=0, // indice del punto di ancoraggio
datetime time=0, // coordinate tempo, del punto di ancora
{
//--- se l'orario non è impostato, sposta il punto sulla barra corrente
if(!time)
time=TimeCurrent();
//--- resetta il valore dell' errore
ResetLastError();
//--- sposta il punto di ancoraggio
if(!ObjectMove(chart_ID,name,point_index,time,0))
{
Print(__FUNCTION__,
": fallimento nello spostare il punto di ancoraggio! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Cambia la deviazione del canale |
//+--------------------------------------------------------------------------------+
bool StdDevChannelDeviationChange(const long chart_ID=0, // ID del chart
const string name="Channel", // nome del canale
const double deviation=1.0) // deviation
{
//--- resetta il valore dell' errore
ResetLastError();
//--- cambia l'angolo di pendenza della trendline
if(!ObjectSetDouble(chart_ID,name,OBJPROP_DEVIATION,deviation))
{
Print(__FUNCTION__,
": fallimento nel cambiare la deviazione del canale! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Elimina il canale |
//+--------------------------------------------------------------------------------+
bool StdDevChannelDelete(const long chart_ID=0, // ID del chart
const string name="Channel") // nome del canale
{
//--- resetta il valore dell' errore
ResetLastError();
//--- elimina il canale
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": fallimento nell'eliminare il canale! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+---------------------------------------------------------------------------------------+
//| Controlla i valori dei punti di ancoraggio del canale ed impostare i valori di default|
//| per quelli vuoti |
//+---------------------------------------------------------------------------------------+
void ChangeChannelEmptyPoints(datetime &time1,datetime &time2)
{
//--- se l'orario del secondo punto non è impostato, sarà sulla barra corrente
if(!time2)
time2=TimeCurrent();
//--- se l'orario del primo punto non è impostato, è posizionato 9 barre meno dalla seconda
if(!time1)
{
//--- array per la ricezione dell'orario di apertura delle ultime 10 barre
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//--- imposta il primo punto 9 barre a sinistra dalla seconda
time1=temp[0];
}
}
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- imposta la correttezza dei parametri di input
if(InpDate1<0 || InpDate1>100 ||
InpDate2<0 || InpDate2>100)
{
Print("Error! Valori non corretti dei parametri di input!");
return;
}
//--- Numero di barre visibili nella finestra del chart
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- grandezza dell'array prezzo
int accuracy=1000;
//--- array per la memorizzazione dei valori di data e prezzo da essere usati
//--- per impostare e modificare le coordinate dei punti di ancoraggio del canale"
datetime date[];
double price[];
//--- allocazione della memoria
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- riempie l'array delle date
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Fallimento nella copia dei valori tempo! Error code = ",GetLastError());
return;
}
/--- riempie l'array dei prezzi
//--- trova i valori più alti e più bassi del chart
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definisce un cambio di step del prezzo e riempie l'array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definisce i punti per disegnare il canale
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
//--- crea la deviazione standard del canale
if(!StdDevChannelCreate(0,InpName,0,date[d1],date[d2],InpDeviation,InpColor,InpStyle,
InpWidth,InpFill,InpBack,InpSelection,InpRayLeft,InpRayRight,InpHidden,InpZOrder))
{
return;
}
//--- redisegna il chart ed attende per 1 secondo
ChartRedraw();
Sleep(1000);
//--- ora, il canale orizzontalmente sulla destra ed espanso
//---contatore del ciclo
int h_steps=bars/2;
//--- sposta il canale
for(int i=0;i<h_steps;i++)
{
//--- usa i seguenti valori
if(d1<bars-1)
d1+=1;
if(d2<bars-1)
d2+=1;
//--- move the anchor points
if(!StdDevChannelPointChange(0,InpName,0,date[d1]))
return;
if(!StdDevChannelPointChange(0,InpName,1,date[d2]))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
// 0.05 secondi di ritardo
Sleep(50);
}
//--- 1 secondo di ritardo
Sleep(1000);
//---contatore del ciclo
double v_steps=InpDeviation*2;
//--- espande il canale
for(double i=InpDeviation;i<v_steps;i+=10.0/accuracy)
{
if(!StdDevChannelDeviationChange(0,InpName,i))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
}
//--- 1 secondo di ritardo
Sleep(1000);
//--- elimina il canale dal chart
StdDevChannelDelete(0,InpName);
ChartRedraw();
//--- 1 secondo di ritardo
Sleep(1000);
//---
OBJ_REGRESSION
Canale di R egressione Lineare.
Nota
Per il " Canale di R egressione Lineare" , è possibile specificare la modalità della sua continuazione a
destra e/o a sinistra (proprietà OBJPR OP_RAY_RIGHT ed OBJPR OP_RAY_LEFT rispettivamente). Può
essere anche impostata la modalità di riempimento del canale con colore.
Esempio
Il seguente script crea e muove un canale di regressione lineare sul chart. Funzioni speciali sono
state sviluppate per creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare
queste funzioni " come è" nelle proprie applicazioni.
//--- descrizione
#property description "Lo Script disegna l'oggetto grafico \"Canale di Regressione Lineare\"."
#property description "Le coordinate del punto di ancoraggio sono impostate in percentuale della gr
#property description "finestra del chart."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="Regression"; // Nome del canale
input int InpDate1=10; // data del 1mo punto, %
input int InpDate2=40; // data del 2ndo punto, %
input color InpColor=clrRed; // Colore del canale
input ENUM_LINE_STYLE InpStyle=STYLE_DASH; // Stile delle linee del canale
input int InpWidth=2; // Spessore delle linee del canale
//--- evidenziato e mosso, per default. All'interno di questo metodo, la selezione dei parametri
//--- è true per default, il che consente di evidenziare e spostare l'oggetto
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- abilita (true) o disabilita (false) la modalità di continuazione del display del canale a sin
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_LEFT,ray_left);
//--- abilita (true) o disabilita (false) la modalità di continuazione del display del canale a des
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
//--- nascondi (true) o mostra (falso) il nome di oggetto grafico nella lista degli oggetti
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- imposta la priorità per ricevere l'evento di un clic del mouse nel grafico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Sposta il punto di ancoraggio del canale |
//+--------------------------------------------------------------------------------+
bool RegressionPointChange(const long chart_ID=0, // ID del chart
const string name="Channel", // nome del canale
const int point_index=0, // indice del punto di ancoraggio
datetime time=0, // coordinate tempo, del punto di ancoraggi
{
//--- se l'orario non è impostato, sposta il punto sulla barra corrente
if(!time)
time=TimeCurrent();
//--- resetta il valore dell' errore
ResetLastError();
//--- sposta il punto di ancoraggio
if(!ObjectMove(chart_ID,name,point_index,time,0))
{
Print(__FUNCTION__,
": fallimento nello spostare il punto di ancoraggio! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Elimina il canale |
//+--------------------------------------------------------------------------------+
bool RegressionDelete(const long chart_ID=0, // ID del chart
const string name="Channel") // nome del canale
{
//--- resetta il valore dell' errore
ResetLastError();
//--- elimina il canale
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": fallimento nell'eliminare il canale! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+---------------------------------------------------------------------------------------+
//| Controlla i valori dei punti di ancoraggio del canale ed impostare i valori di default|
//| per quelli vuoti |
//+---------------------------------------------------------------------------------------+
void ChangeRegressionEmptyPoints(datetime &time1,datetime &time2)
{
//--- se l'orario del secondo punto non è impostato, sarà sulla barra corrente
if(!time2)
time2=TimeCurrent();
//--- se l'orario del primo punto non è impostato, è posizionato 9 barre meno dalla seconda
if(!time1)
{
//--- array per la ricezione dell'orario di apertura delle ultime 10 barre
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//--- imposta il primo punto 9 barre a sinistra dalla seconda
time1=temp[0];
}
}
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- imposta la correttezza dei parametri di input
if(InpDate1<0 || InpDate1>100 ||
InpDate2<0 || InpDate2>100)
{
Print("Error! Valori non corretti dei parametri di input!");
return;
}
//--- Numero di barre visibili nella finestra del chart
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- grandezza dell'array prezzo
int accuracy=1000;
//--- array per la memorizzazione dei valori di data e prezzo da essere usati
//--- per impostare e modificare le coordinate dei punti di ancoraggio del canale"
datetime date[];
double price[];
//--- allocazione della memoria
ArrayResize(date,bars);
ArrayResize(price,accuracy);
Sleep(50);
}
//--- 1 secondo di ritardo
Sleep(1000);
//--- elimina il canale dal chart
RegressionDelete(0,InpName);
ChartRedraw();
//--- 1 secondo di ritardo
Sleep(1000);
//---
}
OBJ_PITCHFORK
Pitchfork di Andrew.
Nota
Per le Andrews ' Pitchfork , è possibile specificare la modalità della sua continuazione a destra e/o a
sinistra (proprietà OBJPR OP_RAY_RIGHT ed OBJPR OP_RAY_LEFT rispettivamente).
Esempio
Il seguente script crea e sposta le Andrews ’ Pitchfork sul chart. Funzioni speciali sono state
sviluppate per creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste
funzioni " come è" nelle proprie applicazioni.
//--- descrizione
#property description "Lo script disegna l'oggetto grafico \" Andrews’ Pitchfork\" ."
#property description "Le coordinate del punto di ancoraggio sono impostate in percentuale"
#property description " della grandezza della finestra chart."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="Pitchfork"; // Nome della Pitchfork
input int InpDate1=14; // data del 1mo punto, %
input int InpPrice1=40; // prezzo del 1mo punto, %
input int InpDate2=18; // data del 2ndo punto, %
input int InpPrice2=50; // prezzo del 2ndo punto, %
input int InpDate3=18; // data del 3zo punto, %
input int InpPrice3=30; // prezzo del 3zo punto, %
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- abilita (true) o disabilita (false) la modalità di evidenzia delle pitchfork per lo spostamen
//--- quando si crea un oggetto grafico utilizzando la funzione ObjectCreate, l'oggetto non può ess
//--- evidenziato e mosso, per default. All'interno di questo metodo, la selezione dei parametri
//--- è true per default, il che consente di evidenziare e spostare l'oggetto
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- abilita (true) o disabilita (false) la modalità di continuazione della visualizzazione della
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_LEFT,ray_left);
//--- abilita (true) o disabilita (false) la modalità di continuazione della visualizzazione della
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
//--- nascondi (true) o mostra (falso) il nome di oggetto grafico nella lista degli oggetti
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- imposta la priorità per ricevere l'evento di un clic del mouse nel grafico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Imposta il numero di livelli delle Andrews' Pitchfork ed i loro parametri |
//+--------------------------------------------------------------------------------+
bool PitchforkLevelsSet(int levels, // numero di linee di livello
double &values[], // valore delle linee livello
color &colors[], // colore delle linee livello
ENUM_LINE_STYLE &styles[], // stile delle linee livello
int &widths[], // spessore delle linee livello
const long chart_ID=0, // ID del chart
const string name="Pitchfork") // nome della pitchfork
{
//--- verifica la grandezza dell'array
if(levels!=ArraySize(colors) || levels!=ArraySize(styles) ||
levels!=ArraySize(widths) || levels!=ArraySize(widths))
{
Print(__FUNCTION__,": la lungezza dell'array non corrisponde al numero di livelli, errore!");
return(false);
}
//--- set the number of levels
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELS,levels);
//--- imposta le proprietà dei livelli nel loop
for(int i=0;i<levels;i++)
{
//--- valore dei livelli
ObjectSetDouble(chart_ID,name,OBJPROP_LEVELVALUE,i,values[i]);
//--- colore dei livelli
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELCOLOR,i,colors[i]);
//--- stile dei livelli
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELSTYLE,i,styles[i]);
//--- spessore dei livelli
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELWIDTH,i,widths[i]);
}
//+-------------------------------------------------------------------------------+
//| Controlla i valori dei punti di ancoraggio della Andrews' Pitchfork ed imposta|
//| i valori di default per quelli vuoti |
//+-------------------------------------------------------------------------------+
void ChangeChannelEmptyPoints(datetime &time1,double &price1,datetime &time2,
double &price2,datetime &time3,double &price3)
{
//--- se l'orario del secondo punto (superiore destro) non è impostato, sarà sulla barra corrente
if(!time2)
time2=TimeCurrent();
//--- se il prezzo del secondo punto non è impostato, avrà un valore Bid
if(!price2)
price2=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- se l'orario del primo(sinistro) punto non è impostato, è posizionato 9 barre meno dalla secon
if(!time1)
{
//--- array per la ricezione dell'orario di apertura delle ultime 10 barre
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//--- imposta il primo punto 9 barre a sinistra dalla seconda
time1=temp[0];
}
//--- se il prezzo del primo punto non è impostato, lo sposta di 200 punti sotto al secondo
if(!price1)
price1=price2-200*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
//--- se l'orario del terzo punto non è impostato, esso coincide con quello del secondo punto
if(!time3)
time3=time2;
//--- se il prezzo del terzo punto non è impostato, lo sposta di 300 punti in meno rispetto al prim
if(!price3)
price3=price1-200*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
}
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- imposta la correttezza dei parametri di input
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100 ||
InpDate3<0 || InpDate3>100 || InpPrice3<0 || InpPrice3>100)
{
Print("Error! Valori non corretti dei parametri di input!");
return;
}
//--- Numero di barre visibili nella finestra del chart
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- grandezza dell'array prezzo
int accuracy=1000;
//--- array per la memorizzazione dei valori di data e prezzo da essere usati
//--- per impostare e cambiare le coordinate dei punti di ancoraggio delle Andrews' Pitchfork
datetime date[];
double price[];
//--- allocazione della memoria
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- riempie l'array delle date
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Fallimento nella copia dei valori tempo! Error code = ",GetLastError());
return;
}
/--- riempie l'array dei prezzi
//--- trova i valori più alti e più bassi del chart
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definisce un cambio di step del prezzo e riempie l'array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definisce i punti per disegnare le Andrews' Pitchfork
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int d3=InpDate3*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
int p3=InpPrice3*(accuracy-1)/100;
//--- crea la pitchfork
if(!PitchforkCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],date[d3],price[p3],
InpColor,InpStyle,InpWidth,InpBack,InpSelection,InpRayLeft,InpRayRight,InpHidden,InpZOrder))
{
return;
}
//--- redisegna il chart ed attende per 1 secondo
ChartRedraw();
Sleep(1000);
//--- ora, sposta i punti di ancoraggio della pitchfork
//---contatore del ciclo
int v_steps=accuracy/10;
//--- move the first anchor point
for(int i=0;i<v_steps;i++)
{
//--- usa il seguente valore
if(p1>1)
p1-=1;
//--- sposta il punto
if(!PitchforkPointChange(0,InpName,0,date[d1],price[p1]))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
}
//--- 1 secondo di ritardo
Sleep(1000);
//---contatore del ciclo
int h_steps=bars/8;
//--- sposta il terzo punto di ancoraggio
for(int i=0;i<h_steps;i++)
{
//--- usa il seguente valore
if(d3<bars-1)
d3+=1;
//--- sposta il punto
if(!PitchforkPointChange(0,InpName,2,date[d3],price[p3]))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
//--- ridisegna il chart
ChartRedraw();
// 0.05 secondi di ritardo
Sleep(50);
}
//--- 1 secondo di ritardo
Sleep(1000);
//---contatore del ciclo
v_steps=accuracy/10;
//--- sposta il secondo punto di ancoraggio
for(int i=0;i<v_steps;i++)
{
//--- usa il seguente valore
if(p2>1)
p2-=1;
//--- sposta il punto
if(!PitchforkPointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
}
//--- 1 secondo di ritardo
Sleep(1000);
//--- elimina la pitchfork dal chart
PitchforkDelete(0,InpName);
ChartRedraw();
//--- 1 secondo di ritardo
Sleep(1000);
//---
}
OBJ_GANNLINE
Linea di Gann.
Nota
Per la " Linea di Gann" , è possibile specificare la modalità della sua continuazione a destra e/o a
sinistra (proprietà OBJPR OP_RAY_RIGHT ed OBJPR OP_RAY_LEFT rispettivamente).
Entrambi gli ancogli di Gann con una scala e coordinate del secondo punto di ancoraggio possono
essere usate per impostare la pendenza della linea.
Esempio
Il seguente script crea e sposta la griglia di Gann sul chart. Funzioni speciali sono state sviluppate
per creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste funzioni " come
è" nelle proprie applicazioni.
//--- descrizione
#property description "Lo script disegna l'oggetto grafico \"Linea di Gann\" ."
#property description "Le coordinate del punto di ancoraggio sono impostate in percentuale"
#property description " della grandezza della finestra chart."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="GannLine"; // Nome della Linea
input int InpDate1=20; // data del 1mo punto, %
input int InpPrice1=75; // prezzo del 1mo punto, %
input int InpDate2=80; // data del 2ndo punto, %
input double InpAngle=0.0; // Angolo di Gann
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- imposta lo stile della linea
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- larghezza della linea
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- mostra in primo piano (false) o sottofondo (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- abilita (true) o disabilita (false) la modalità di evidenziazione delle linee per il loro spo
//--- quando si crea un oggetto grafico utilizzando la funzione ObjectCreate, l'oggetto non può ess
//--- evidenziato e mosso, per default. All'interno di questo metodo, la selezione dei parametri
//--- è true per default, il che consente di evidenziare e spostare l'oggetto
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- abilita (true) o disabilita (false) la modalità di continuazione della visualizzazione della
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_LEFT,ray_left);
//--- abilita (true) o disabilita (false) la modalità di continuazione della visualizzazione della
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
//--- nascondi (true) o mostra (falso) il nome di oggetto grafico nella lista degli oggetti
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- imposta la priorità per ricevere l'evento di un clic del mouse nel grafico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Sposta i punti di ancoraggio della Linea di Gann |
//+--------------------------------------------------------------------------------+
bool GannLinePointChange(const long chart_ID=0, // ID del chart
const string name="GannLine", // nome della linea
const int point_index=0, // indice del punto di ancoraggio
datetime time=0, // coordinate tempo, del punto di ancoraggio
double price=0) // coordinate di prezzo del punto di ancor
{
//--- se il punto della posizione non è impostato, spostarlo nella barra corrente che ha il prezzo
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- resetta il valore dell' errore
ResetLastError();
//--- sposta il punto di ancoraggio della linea
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
": fallimento nello spostare il punto di ancoraggio! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Cambia l'angolo di Gann |
//+--------------------------------------------------------------------------------+
bool GannLineAngleChange(const long chart_ID=0, // ID del chart
const string name="GannLine", // nome della linea
const double angle=1.0) // Angolo di Gann
{
//--- resetta il valore dell' errore
ResetLastError();
//--- cambia l'angolo di Gann
if(!ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle))
{
Print(__FUNCTION__,
": fallimento nel cambiare l'angolo di Gann! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Cambia la scala della Linea di Gann |
//+--------------------------------------------------------------------------------+
bool GannLineScaleChange(const long chart_ID=0, // ID del chart
const string name="GannLine", // nome della linea
const double scale=1.0) // scala
{
//--- resetta il valore dell' errore
ResetLastError();
//--- cambia la scala (numero di pips per barra)
if(!ObjectSetDouble(chart_ID,name,OBJPROP_SCALE,scale))
{
Print(__FUNCTION__,
": fallimento nel cambiare la scala! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| La funzione rimuove La Linea di Gann dal chart |
//+--------------------------------------------------------------------------------+
bool GannLineDelete(const long chart_ID=0, // ID del chart
const string name="GannLine") // nome della linea
{
//--- resetta il valore dell' errore
ResetLastError();
//--- elimina la linea di Gann
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": fallimento nell'eliminare la \"Linea di Gann\"! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Controlla i valori dei punti di ancoraggio della Griglia di Gann ed imposta i |
//| valori di default per quelli vuoti |
//+--------------------------------------------------------------------------------+
void ChangeGannLineEmptyPoints(datetime &time1,double &price1,datetime &time2)
{
//--- se l'orario del secondo punto non è impostato, sarà sulla barra corrente
if(!time2)
time2=TimeCurrent();
//--- se l'orario del primo punto non è impostato, è posizionato 9 barre meno dalla seconda
if(!time1)
{
//--- array per la ricezione dell'orario di apertura delle ultime 10 barre
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//--- imposta il primo punto 9 barre a sinistra dalla seconda
time1=temp[0];
}
//--- se il prezzo del punto non è impostato, avrà un valore Bid
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- imposta la correttezza dei parametri di input
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100)
{
Print("Error! Valori non corretti dei parametri di input!");
return;
}
//--- Numero di barre visibili nella finestra del chart
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- grandezza dell'array prezzo
int accuracy=1000;
//--- array per la memorizzazione dei valori di data e prezzo da essere usati
//--- per impostare e cambiare i punti delle coordinate di ancoraggio della linea
datetime date[];
double price[];
//--- allocazione della memoria
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- riempie l'array delle date
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Fallimento nella copia dei valori tempo! Error code = ",GetLastError());
return;
}
/--- riempie l'array dei prezzi
//--- trova i valori più alti e più bassi del chart
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definisce un cambio di step del prezzo e riempie l'array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definisce i punti per disegnare la Linea di Gann
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
//--- crea la Linea di Gann
if(!GannLineCreate(0,InpName,0,date[d1],price[p1],date[d2],InpAngle,InpScale,InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpRayLeft,InpRayRight,InpHidden,InpZOrder))
{
return;
}
//--- redisegna il chart ed attende per 1 secondo
ChartRedraw();
Sleep(1000);
//--- ora, sposta il punto di ancoraggio della linea e cambia l'angolo
//---contatore del ciclo
int v_steps=accuracy/2;
//--- sposta il primo punto di ancoraggio, verticalmente
for(int i=0;i<v_steps;i++)
{
//--- usa il seguente valore
if(p1>1)
p1-=1;
//--- sposta il punto
if(!GannLinePointChange(0,InpName,0,date[d1],price[p1]))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
}
//--- ritardo di mezzo secondo
Sleep(500);
//--- definisce il corrente valore dell'angolo di Gann (cambiato
//--- dopo aver spostato il primo punto di ancoraggio)
double curr_angle;
if(!ObjectGetDouble(0,InpName,OBJPROP_ANGLE,0,curr_angle))
return;
//---contatore del ciclo
v_steps=accuracy/8;
//--- cambia l'angolo di Gann
for(int i=0;i<v_steps;i++)
{
if(!GannLineAngleChange(0,InpName,curr_angle-0.05*i))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
}
//--- 1 secondo di ritardo
Sleep(1000);
//--- elimina la linea dal chart
GannLineDelete(0,InpName);
ChartRedraw();
//--- 1 secondo di ritardo
Sleep(1000);
//---
}
OBJ_GANNFAN
Ventagli di Gann.
Nota
Per i Ventagli di Gann, è possibile specificare il tipo di trend dall'enumerazione
ENUM _GANN_DIR ECTION. R egolando il valore di scala (OBJPR OP_S CALE), è possibile cambiare
l'angolo di inclinazione delle linee ventaglio.
Esempio
Il seguente script crea e sposta il Ventaglio di Gann sul chart. Funzioni speciali sono state sviluppate
per creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste funzioni " come
è" nelle proprie applicazioni.
//--- descrizione
#property description "Lo Script disegna l'oggetto grafico \"Ventaglio di Gann\"."
#property description "Le coordinate del punto di ancoraggio sono impostate in percentuale"
#property description " della grandezza della finestra chart."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="GannFan"; // Nome dell'oggetto
input int InpDate1=15; // data del 1mo punto, %
input int InpPrice1=25; // prezzo del 1mo punto, %
input int InpDate2=85; // data del 2ndo punto, %
input double InpScale=2.0; // Scala
input bool InpDirection=false; // Direzione del Trend
//--- abilita (true) o disabilita (false) la modalità di evidenzia del venglio per lo spostamento
//--- quando si crea un oggetto grafico utilizzando la funzione ObjectCreate, l'oggetto non può ess
//--- evidenziato e mosso, per default. All'interno di questo metodo, la selezione dei parametri
//--- è true per default, il che consente di evidenziare e spostare l'oggetto
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- nascondi (true) o mostra (falso) il nome di oggetto grafico nella lista degli oggetti
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- imposta la priorità per ricevere l'evento di un clic del mouse nel grafico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Sposta il punto di ancoraggio del Ventaglio di Gann |
//+--------------------------------------------------------------------------------+
bool GannFanPointChange(const long chart_ID=0, // ID del chart
const string name="GannFan", // nome del ventaglio
const int point_index=0, // indice del punto di ancoraggio
datetime time=0, // coordinate del punto di ancoraggio tempo
double price=0) // coordinate prezzo, del punto di ancoraggio
{
//--- se il punto della posizione non è impostato, spostarlo nella barra corrente che ha il prezzo
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- resetta il valore dell' errore
ResetLastError();
//--- sposta il punto di ancoraggio del ventaglio
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
": fallimento nello spostare il punto di ancoraggio! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Cambia la scala del Ventaglio di Gann |
//+--------------------------------------------------------------------------------+
bool GannFanScaleChange(const long chart_ID=0, // ID del chart
const string name="GannFan", // nome del ventaglio
const double scale=1.0) // scala
{
//--- resetta il valore dell' errore
ResetLastError();
//--- cambia la scala (numero di pips per barra)
if(!ObjectSetDouble(chart_ID,name,OBJPROP_SCALE,scale))
{
Print(__FUNCTION__,
": fallimento nel cambiare la scala! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Cambia la direzione del trend del Ventaglio di Gann |
//+--------------------------------------------------------------------------------+
bool GannFanDirectionChange(const long chart_ID=0, // ID del chart
const string name="GannFan", // nome del ventaglio
const bool direction=true, // direzione del trend
{
//--- resetta il valore dell' errore
ResetLastError();
//--- cambia la direzione del trend del Ventaglio di Gann
if(!ObjectSetInteger(chart_ID,name,OBJPROP_DIRECTION,direction))
{
Print(__FUNCTION__,
": fallimento nel cambiare la direzione del trend! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| La funzione rimuove il Ventaglio di Gann dal chart |
//+--------------------------------------------------------------------------------+
bool GannFanDelete(const long chart_ID=0, // ID del chart
const string name="GannFan", // nome del ventaglio
{
//--- resetta il valore dell' errore
ResetLastError();
//--- elimina il Ventaglio di Gann
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": fallimento nell'eliminare il \"Ventaglio di Gann\"! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Controlla i valori dei punti di ancoraggio degli del Ventaglio di Gann ed imposta i |
//| valori di default per quelli vuoti |
//+--------------------------------------------------------------------------------+
void ChangeGannFanEmptyPoints(datetime &time1,double &price1,datetime &time2)
{
//--- se l'orario del secondo punto non è impostato, sarà sulla barra corrente
if(!time2)
time2=TimeCurrent();
//--- se l'orario del primo punto non è impostato, è posizionato 9 barre meno dalla seconda
if(!time1)
{
//--- array per la ricezione dell'orario di apertura delle ultime 10 barre
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//--- imposta il primo punto 9 barre a sinistra dalla seconda
time1=temp[0];
}
//--- se il prezzo del punto non è impostato, avrà un valore Bid
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- imposta la correttezza dei parametri di input
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100)
{
Print("Error! Valori non corretti dei parametri di input!");
return;
}
//--- Numero di barre visibili nella finestra del chart
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- grandezza dell'array prezzo
int accuracy=1000;
//--- array per la memorizzazione dei valori di data e prezzo da essere usati
//--- per impostare e cambiare le coordinate dei punti di ancoraggio del Ventaglio
datetime date[];
double price[];
//--- allocazione della memoria
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- riempie l'array delle date
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Fallimento nella copia dei valori tempo! Error code = ",GetLastError());
return;
}
ChartRedraw();
//--- 1 secondo di ritardo
Sleep(1000);
//---
}
OBJ_GANNGRID
G riglia di Gann.
Nota
Per le Griglie di Gann, è possibile specificare il tipo di trend dall'enumerazione
ENUM _GANN_DIR ECTION. R egolando il valore di scala (OBJPR OP_S CALE), è possibile cambiare
l'angolo di inclinazione delle linee della griglia.
Esempio
Il seguente script crea e sposta la griglia di Gann sul chart. Funzioni speciali sono state sviluppate
per creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste funzioni " come
è" nelle proprie applicazioni.
//--- descrizione
#property description "Lo Script disegna l'oggetto grafico \"Griglia di Gann\"."
#property description "Le coordinate del punto di ancoraggio sono impostate in percentuale"
#property description " della grandezza della finestra chart."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="GannGrid"; // Nome della Griglia
input int InpDate1=15; // data del 1mo punto, %
input int InpPrice1=25; // prezzo del 1mo punto, %
input int InpDate2=35; // data del 2ndo punto, %
input double InpScale=3.0; // Scala
input bool InpDirection=false; // Direzione del Trend
//--- abilita (true) o disabilita (false) la modalità di evidenziazione delle griglie per il loro s
//--- quando si crea un oggetto grafico utilizzando la funzione ObjectCreate, l'oggetto non può ess
//--- evidenziato e mosso, per default. All'interno di questo metodo, la selezione dei parametri
//--- è true per default, il che consente di evidenziare e spostare l'oggetto
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- nascondi (true) o mostra (falso) il nome di oggetto grafico nella lista degli oggetti
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- imposta la priorità per ricevere l'evento di un clic del mouse nel grafico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Sposta i punti di ancoraggio della Griglia di Gann |
//+--------------------------------------------------------------------------------+
bool GannGridPointChange(const long chart_ID=0, // ID del chart
const string name="ArrowBuy", // nome della griglia
const int point_index=0, // indice del punto di ancoraggio
datetime time=0, // coordinate tempo, del punto di ancoraggio
double price=0) // coordinate di prezzo del punto di ancorag
{
//--- se il punto della posizione non è impostato, spostarlo nella barra corrente che ha il prezzo
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- resetta il valore dell' errore
ResetLastError();
//--- sposta i punti di ancoraggio della griglia
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
": fallimento nello spostare il punto di ancoraggio! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Cambia la Scala della Griglia di Gann |
//+--------------------------------------------------------------------------------+
bool GannGridScaleChange(const long chart_ID=0, // ID del chart
const string name="GannGrid", // griglie
const double scale=1.0) // scala
{
//--- resetta il valore dell' errore
ResetLastError();
//--- cambia la scala (numero di pips per barra)
if(!ObjectSetDouble(chart_ID,name,OBJPROP_SCALE,scale))
{
Print(__FUNCTION__,
": fallimento nel cambiare la scala! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Cambia la direzione del trend delle Griglie di Gann |
//+--------------------------------------------------------------------------------+
bool GannGridDirectionChange(const long chart_ID=0, // ID del chart
const string name="ArrowBuy", // nome della griglia
const bool direction=true, // direzione del trend
{
//--- resetta il valore dell' errore
ResetLastError();
//--- cambia la direzione del trend delle Griglie di Gann
if(!ObjectSetInteger(chart_ID,name,OBJPROP_DIRECTION,direction))
{
Print(__FUNCTION__,
": fallimento nel cambiare la direzione del trend! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| La funzione rimuove il Ventaglio di Gann dal chart |
//+--------------------------------------------------------------------------------+
bool GannGridDelete(const long chart_ID=0, // ID del chart
const string name="ArrowBuy", // nome della griglia
{
//--- resetta il valore dell' errore
ResetLastError();
//--- elimina la Griglia di Gann
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": fallimento nell'eliminare la \"Griglia di Gann\"! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Controlla i valori dei punti di ancoraggio degli della Griglia di Gann ed imposta i |
//| valori di default per quelli vuoti |
//+--------------------------------------------------------------------------------+
void ChangeGannGridEmptyPoints(datetime &time1,double &price1,datetime &time2)
{
//--- se l'orario del secondo punto non è impostato, sarà sulla barra corrente
if(!time2)
time2=TimeCurrent();
//--- se l'orario del primo punto non è impostato, è posizionato 9 barre meno dalla seconda
if(!time1)
{
//--- array per la ricezione dell'orario di apertura delle ultime 10 barre
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//--- imposta il primo punto 9 barre a sinistra dalla seconda
time1=temp[0];
}
//--- se il prezzo del punto non è impostato, avrà un valore Bid
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- imposta la correttezza dei parametri di input
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100)
{
Print("Error! Valori non corretti dei parametri di input!");
return;
}
//--- Numero di barre visibili nella finestra del chart
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- grandezza dell'array prezzo
int accuracy=1000;
//--- array per la memorizzazione dei valori di data e prezzo da essere usati
//--- per impostare e cambiare i punti delle coordinate di ancoraggio della griglia
datetime date[];
double price[];
//--- allocazione della memoria
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- riempie l'array delle date
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Fallimento nella copia dei valori tempo! Error code = ",GetLastError());
return;
}
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
// 0.05 secondi di ritardo
Sleep(50);
}
//--- 1 secondo di ritardo
Sleep(1000);
//--- cambia la direzione del trend della griglia in discendente
GannGridDirectionChange(0,InpName,true);
//--- redisegna il chart
ChartRedraw();
//--- 1 secondo di ritardo
Sleep(1000);
//--- elimina la griglia dal chart
GannGridDelete(0,InpName);
ChartRedraw();
//--- 1 secondo di ritardo
Sleep(1000);
//---
}
OBJ_FIBO
R itracciamenti di Fibonacci.
Nota
Per i " R itracciamenti di Fibonacci" , è possibile specificare la modalità della sua continuazione a
destra e/o a sinistra (proprietà OBJPR OP_RAY_RIGHT ed OBJPR OP_RAY_LEFT rispettivamente).
Esempio
Il seguente script crea e sposta i R itracciamenti di Fibonacci sul chart. Funzioni speciali sono state
sviluppate per creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste
funzioni " come è" nelle proprie applicazioni.
//--- descrizione
#property description "Lo Script disegna l'oggetto grafico \"Ritracciamenti di Fibonacci\"."
#property description "Le coordinate del punto di ancoraggio sono impostate in percentuale"
#property description " della grandezza della finestra chart."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="FiboLevels"; // Nome dell'oggetto
input int InpDate1=10; // data del 1mo punto, %
input int InpPrice1=65; // prezzo del 1mo punto, %
input int InpDate2=90; // data del 2ndo punto, %
input int InpPrice2=85; // prezzo del 2ndo punto, %
input color InpColor=clrRed; // Colore degli oggetti
//--- evidenziato e mosso, per default. All'interno di questo metodo, la selezione dei parametri
//--- è true per default, il che consente di evidenziare e spostare l'oggetto
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- abilita (true) o disabilita (false) la modalità di continuazione della visualizzazione dell'o
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_LEFT,ray_left);
//--- abilita (true) o disabilita (false) la modalità di continuazione della visualizzazione dell'o
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
//--- nascondi (true) o mostra (falso) il nome di oggetto grafico nella lista degli oggetti
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- imposta la priorità per ricevere l'evento di un clic del mouse nel grafico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Imposta il numero di livelli ed i loro parametri |
//+--------------------------------------------------------------------------------+
bool FiboLevelsSet(int levels, // numero di linee livello
double &values[], // valore delle linee livello
color &colors[], // colore delle linee livello
ENUM_LINE_STYLE &styles[], // stile delle linee livello
int &widths[], // spessore delle linee livello
const long chart_ID=0, // ID del chart
const string name="FiboLevels", // nome dell'oggetto
{
//--- verifica la grandezza dell'array
if(levels!=ArraySize(colors) || levels!=ArraySize(styles) ||
levels!=ArraySize(widths) || levels!=ArraySize(widths))
{
Print(__FUNCTION__,": la lungezza dell'array non corrisponde al numero di livelli, errore!");
return(false);
}
//--- set the number of levels
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELS,levels);
//--- imposta le proprietà dei livelli nel loop
for(int i=0;i<levels;i++)
{
//--- valore dei livelli
ObjectSetDouble(chart_ID,name,OBJPROP_LEVELVALUE,i,values[i]);
//--- colore dei livelli
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELCOLOR,i,colors[i]);
//--- stile dei livelli
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELSTYLE,i,styles[i]);
//--- spessore dei livelli
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELWIDTH,i,widths[i]);
//--- descrizione dei livelli
ObjectSetString(chart_ID,name,OBJPROP_LEVELTEXT,i,DoubleToString(100*values[i],1));
}
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Fallimento nella copia dei valori tempo! Error code = ",GetLastError());
return;
}
/--- riempie l'array dei prezzi
//--- trova i valori più alti e più bassi del chart
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definisce un cambio di step del prezzo e riempie l'array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definisce i punti per disegnare i Ritracciamenti di Fibonacci
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
//--- crea un oggetto
if(!FiboLevelsCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpRayLeft,InpRayRight,InpHidden,InpZOrder))
{
return;
}
//--- redisegna il chart ed attende per 1 secondo
ChartRedraw();
Sleep(1000);
//--- ora, sposta i punti di ancoraggio
//---contatore del ciclo
int v_steps=accuracy*2/5;
//--- move the first anchor point
for(int i=0;i<v_steps;i++)
{
//--- usa il seguente valore
if(p1>1)
p1-=1;
//--- sposta il punto
if(!FiboLevelsPointChange(0,InpName,0,date[d1],price[p1]))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
}
//--- 1 secondo di ritardo
Sleep(1000);
//---contatore del ciclo
v_steps=accuracy*4/5;
OBJ_FIBOTIMES
F ibonacci T ime Zones (zone temporali).
Nota
Per le" Fibonacci T ime Zones " , è possibile specificare il numero di linee-livello, il loro valore e colore.
Esempio
Il seguente script crea e sposta le Fibonacci T ime Zones sul chart. Funzioni speciali sono state
sviluppate per creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Imposta il numero di livelli ed i loro parametri |
//+--------------------------------------------------------------------------------+
bool FiboTimesLevelsSet(int levels, // numero di linee livello
double &values[], // valore delle linee livello
color &colors[], // colore delle linee livello
ENUM_LINE_STYLE &styles[], // stile delle linee livello
int &widths[], // spessore delle linee livello
const long chart_ID=0, // ID del chart
const string name="FiboTimes", // nome dell'oggetto
{
//--- verifica la grandezza dell'array
if(levels!=ArraySize(colors) || levels!=ArraySize(styles) ||
levels!=ArraySize(widths) || levels!=ArraySize(widths))
{
Print(__FUNCTION__,": la lungezza dell'array non corrisponde al numero di livelli, errore!");
return(false);
}
//--- set the number of levels
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELS,levels);
//--- imposta le proprietà dei livelli nel loop
for(int i=0;i<levels;i++)
{
//--- valore dei livelli
ObjectSetDouble(chart_ID,name,OBJPROP_LEVELVALUE,i,values[i]);
//--- colore dei livelli
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELCOLOR,i,colors[i]);
//--- stile dei livelli
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELSTYLE,i,styles[i]);
//--- spessore dei livelli
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELWIDTH,i,widths[i]);
//--- descrizione dei livelli
ObjectSetString(chart_ID,name,OBJPROP_LEVELTEXT,i,DoubleToString(values[i],1));
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Sposta i punti di ancoraggio delleFibonacci Time Zones |
//+--------------------------------------------------------------------------------+
bool FiboTimesPointChange(const long chart_ID=0, // ID del chart
const string name="FiboTimes", // nome dell'oggetto
const int point_index=0, // indice del punto di ancoraggio
datetime time=0, // coordinate orarie del punto di ancoragg
double price=0) // coordinate di prezzo del punto di ancor
{
//--- se il punto della posizione non è impostato, spostarlo nella barra corrente che ha il prezzo
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- resetta il valore dell' errore
ResetLastError();
//--- sposta il punto di ancoraggio
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
": fallimento nello spostare il punto di ancoraggio! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Elimina le Fibonacci Time Zones |
//+--------------------------------------------------------------------------------+
bool FiboTimesDelete(const long chart_ID=0, // ID del chart
const string name="FiboTimes", // nome dell'oggetto
{
//--- resetta il valore dell' errore
ResetLastError();
//--- elimina l'oggetto
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": fallimento nell'eliminare le \"Fibonacci Time Zones\"! Error code = ",GetLastError()
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Controlla i valori delle Fibonacci Time zones ed |
//| imposta i valore di default per quelle vuote |
//+--------------------------------------------------------------------------------+
void ChangeFiboTimesEmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2)
{
//--- se l'orario del primo punto non è impostato, sarà sulla barra corrente
if(!time1)
time1=TimeCurrent();
//--- se il prezzo del punto non è impostato, avrà un valore Bid
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- se l'orario del secondo punto non è impostato, è posizionato 2 barre meno dalla seconda
if(!time2)
{
//--- array per la ricezione dell'orario di apertura delle ultime 3 barre
datetime temp[3];
CopyTime(Symbol(),Period(),time1,3,temp);
//--- imposta il primo punto 2 barre a sinistra dalla seconda
time2=temp[0];
}
//--- se il prezzo del secondo punto non è impostato, è uguale a quello del primo punto
if(!price2)
price2=price1;
}
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- imposta la correttezza dei parametri di input
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100)
{
Print("Error! Valori non corretti dei parametri di input!");
return;
}
//--- Numero di barre visibili nella finestra del chart
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- grandezza dell'array prezzo
int accuracy=1000;
//--- array per la memorizzazione dei valori di data e prezzo da essere usati
//--- per impostare e cambiare le coordinate dei punti di ancoraggio delle Fibonacci Time Zones
datetime date[];
double price[];
//--- allocazione della memoria
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- riempie l'array delle date
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Fallimento nella copia dei valori tempo! Error code = ",GetLastError());
return;
}
/--- riempie l'array dei prezzi
//--- trova i valori più alti e più bassi del chart
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definisce un cambio di step del prezzo e riempie l'array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definisce i punti per disegnare le Fibonacci Time Zones
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
//--- crea un oggetto
if(!FiboTimesCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],
InpColor,InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- redisegna il chart ed attende per 1 secondo
ChartRedraw();
Sleep(1000);
//--- ora, sposta i punti di ancoraggio
//---contatore del ciclo
int h_steps=bars*2/5;
//--- sposta il secondo punto di ancoraggio
for(int i=0;i<h_steps;i++)
{
//--- usa il seguente valore
if(d2<bars-1)
d2+=1;
//--- sposta il punto
if(!FiboTimesPointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
// 0.05 secondi di ritardo
Sleep(50);
}
//--- 1 secondo di ritardo
Sleep(1000);
//---contatore del ciclo
h_steps=bars*3/5;
//--- move the first anchor point
for(int i=0;i<h_steps;i++)
{
//--- usa il seguente valore
if(d1<bars-1)
d1+=1;
//--- sposta il punto
if(!FiboTimesPointChange(0,InpName,0,date[d1],price[p1]))
return;
OBJ_FIBOFAN
Ventagli di Fibonacci.
Nota
Per i entagli di Fibonacci" , è possibile specificare il numero di linee-livello, il loro valore e colore.
"V
Esempio
Il seguente script crea e sposta il Ventaglio di Fibonacci sul chart. Funzioni speciali sono state
sviluppate per creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste
//--- descrizione
#property description "Lo Script disegna l'oggetto grafico \"Ventaglio di Fibonacci\"."
#property description "Le coordinate del punto di ancoraggio sono impostate in percentuale"
#property description " della grandezza della finestra chart."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="FiboFan"; // Nome dell'oggetto
input int InpDate1=10; // data del 1mo punto, %
input int InpPrice1=25; // prezzo del 1mo punto, %
input int InpDate2=30; // data del 2ndo punto, %
input int InpPrice2=50; // prezzo del 2ndo punto, %
input color InpColor=clrRed; // Colore della linea Ventaglio
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // Stile della linea
input int InpWidth=2; // Spessore della linea
//--- imposta la priorità per ricevere l'evento di un clic del mouse nel grafico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Imposta il numero di livelli ed i loro parametri |
//+--------------------------------------------------------------------------------+
bool FiboFanLevelsSet(int levels, // numero di linee livello
double &values[], // valore delle linee livello
color &colors[], // colore delle linee livello
ENUM_LINE_STYLE &styles[], // stile delle linee livello
int &widths[], // spessore delle linee livello
const long chart_ID=0, // ID del chart
const string name="FiboFan", // nome del ventaglio
{
//--- verifica la grandezza dell'array
if(levels!=ArraySize(colors) || levels!=ArraySize(styles) ||
levels!=ArraySize(widths) || levels!=ArraySize(widths))
{
Print(__FUNCTION__,": la lungezza dell'array non corrisponde al numero di livelli, errore!");
return(false);
}
//--- set the number of levels
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELS,levels);
//--- imposta le proprietà dei livelli nel loop
for(int i=0;i<levels;i++)
{
//--- valore dei livelli
ObjectSetDouble(chart_ID,name,OBJPROP_LEVELVALUE,i,values[i]);
//--- colore dei livelli
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELCOLOR,i,colors[i]);
//--- stile dei livelli
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELSTYLE,i,styles[i]);
//--- spessore dei livelli
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELWIDTH,i,widths[i]);
//--- descrizione dei livelli
ObjectSetString(chart_ID,name,OBJPROP_LEVELTEXT,i,DoubleToString(100*values[i],1));
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Sposta i punti di ancoraggio del Ventaglio di Fibonacci |
//+--------------------------------------------------------------------------------+
bool FiboFanPointChange(const long chart_ID=0, // ID del chart
const string name="FiboFan", // nome del ventaglio
const int point_index=0, // indice del punto di ancoraggio
datetime time=0, // coordinate del punto di ancoraggio tempo
price2=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- se l'orario del primo punto non è impostato, è posizionato 9 barre meno dalla seconda
if(!time1)
{
//--- array per la ricezione dell'orario di apertura delle ultime 10 barre
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//--- imposta il primo punto 9 barre a sinistra dalla seconda
time1=temp[0];
}
//--- se il prezzo del primo punto non è impostato, lo sposta di 200 punti sotto al secondo
if(!price1)
price1=price2-200*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
}
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- imposta la correttezza dei parametri di input
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100)
{
Print("Error! Valori non corretti dei parametri di input!");
return;
}
//--- Numero di barre visibili nella finestra del chart
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- grandezza dell'array prezzo
int accuracy=1000;
//--- array per la memorizzazione dei valori di data e prezzo da essere usati
//--- per impostare e cambiare le coordinate dei punti di ancoraggio del Ventaglio di Fibonacci
datetime date[];
double price[];
//--- allocazione della memoria
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- riempie l'array delle date
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Fallimento nella copia dei valori tempo! Error code = ",GetLastError());
return;
}
/--- riempie l'array dei prezzi
//--- trova i valori più alti e più bassi del chart
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definisce un cambio di step del prezzo e riempie l'array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definisce i punti per disegnare il Ventaglio di Fibonacci
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
//--- crea un oggetto
if(!FiboFanCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],
InpColor,InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- redisegna il chart ed attende per 1 secondo
ChartRedraw();
Sleep(1000);
//--- ora, sposta i punti di ancoraggio del ventaglio
//---contatore del ciclo
int v_steps=accuracy/2;
//--- move the first anchor point
for(int i=0;i<v_steps;i++)
{
//--- usa il seguente valore
if(p1<accuracy-1)
p1+=1;
//--- sposta il punto
if(!FiboFanPointChange(0,InpName,0,date[d1],price[p1]))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
}
//--- 1 secondo di ritardo
Sleep(1000);
//---contatore del ciclo
int h_steps=bars/4;
//--- sposta il secondo punto di ancoraggio
for(int i=0;i<h_steps;i++)
{
//--- usa il seguente valore
if(d2<bars-1)
d2+=1;
//--- sposta il punto
if(!FiboFanPointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
// 0.05 secondi di ritardo
Sleep(50);
}
//--- 1 secondo di ritardo
Sleep(1000);
//--- elimina l'oggetto dal chart
FiboFanDelete(0,InpName);
ChartRedraw();
//--- 1 secondo di ritardo
Sleep(1000);
//---
}
OBJ_FIBOARC
A rchi di Fibonacci.
Nota
Per gli " Archi di Fibonacci" , è possibile specificare la modalità di visualizzazione dell'intera ellisse. Il
raggio di curvatura può essere specificato modificando la scala e le coordinate dei punti di
ancoraggio.
Esempio
Il seguente script crea e sposta gli Archi di Fibonacci Arcs sul chart. Funzioni speciali sono state
sviluppate per creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste
funzioni " come è" nelle proprie applicazioni.
//--- descrizione
#property description "Lo Script disegna l'oggetto grafico \"Archi di Fibonacci\"."
#property description "Le coordinate del punto di ancoraggio sono impostate in percentuale"
#property description " della grandezza della finestra chart."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="FiboArc"; // Nome dell'oggetto
input int InpDate1=25; // data del 1mo punto, %
input int InpPrice1=25; // prezzo del 1mo punto, %
input int InpDate2=35; // data del 2ndo punto, %
input int InpPrice2=55; // prezzo del 2ndo punto, %
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- mostra in primo piano (false) o sottofondo (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- abilita (true) o disabilita (false) la modalità di evidenzia degli archi per lo spostamento
//--- quando si crea un oggetto grafico utilizzando la funzione ObjectCreate, l'oggetto non può ess
//--- evidenziato e mosso, per default. All'interno di questo metodo, la selezione dei parametri
//--- è true per default, il che consente di evidenziare e spostare l'oggetto
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- nascondi (true) o mostra (falso) il nome di oggetto grafico nella lista degli oggetti
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- imposta la priorità per ricevere l'evento di un clic del mouse nel grafico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Imposta il numero di livelli ed i loro parametri |
//+--------------------------------------------------------------------------------+
bool FiboArcLevelsSet(int levels, // numero di linee livello
double &values[], // valore delle linee livello
color &colors[], // colore delle linee livello
ENUM_LINE_STYLE &styles[], // stile delle linee livello
int &widths[], // spessore delle linee livello
const long chart_ID=0, // ID del chart
const string name="FiboArc", // nome dell'oggetto
{
//--- verifica la grandezza dell'array
if(levels!=ArraySize(colors) || levels!=ArraySize(styles) ||
levels!=ArraySize(widths) || levels!=ArraySize(widths))
{
Print(__FUNCTION__,": la lungezza dell'array non corrisponde al numero di livelli, errore!");
return(false);
}
//--- set the number of levels
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELS,levels);
//--- imposta le proprietà dei livelli nel loop
for(int i=0;i<levels;i++)
{
//--- valore dei livelli
ObjectSetDouble(chart_ID,name,OBJPROP_LEVELVALUE,i,values[i]);
//--- colore dei livelli
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELCOLOR,i,colors[i]);
//--- stile dei livelli
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELSTYLE,i,styles[i]);
//--- spessore dei livelli
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELWIDTH,i,widths[i]);
//--- descrizione dei livelli
ObjectSetString(chart_ID,name,OBJPROP_LEVELTEXT,i,DoubleToString(100*values[i],1));
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Sposta i punti di ancoraggio degli Archi di Fibonacci |
//+--------------------------------------------------------------------------------+
bool FiboArcPointChange(const long chart_ID=0, // ID del chart
const string name="FiboArc", // nome dell'oggetto
const int point_index=0, // indice del punto di ancoraggio
datetime time=0, // coordinate del punto di ancoraggio tempo
double price=0) // coordinate prezzo, del punto di ancoraggio
{
//--- se il punto della posizione non è impostato, spostarlo nella barra corrente che ha il prezzo
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- resetta il valore dell' errore
ResetLastError();
//--- sposta il punto di ancoraggio
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
": fallimento nello spostare il punto di ancoraggio! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Elimina gli Archi di Fibonacci |
//+--------------------------------------------------------------------------------+
bool FiboArcDelete(const long chart_ID=0, // ID del chart
const string name="FiboArc", // nome dell'oggetto
{
//--- resetta il valore dell' errore
ResetLastError();
//--- elimina l'oggetto
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": fallimento nell'eliminare gli \"Archi di Fibonacci\"! Error code = ",GetLastError())
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Controlla i valori dei punti di ancoraggio degli Archi di Fibonacci ed imposta i |
//| valori di default per quelli vuoti |
//+--------------------------------------------------------------------------------+
void ChangeFiboArcEmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2)
{
//--- se l'orario del secondo punto non è impostato, sarà sulla barra corrente
if(!time2)
time2=TimeCurrent();
//--- se il prezzo del secondo punto non è impostato, avrà un valore Bid
if(!price2)
price2=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- se l'orario del primo punto non è impostato, è posizionato 9 barre meno dalla seconda
if(!time1)
{
//--- array per la ricezione dell'orario di apertura delle ultime 10 barre
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//--- imposta il primo punto 9 barre a sinistra dalla seconda
time1=temp[0];
}
//--- se il prezzo del primo punto non è impostato, lo sposta di 300 punti sotto al secondo
if(!price1)
price1=price2-300*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
}
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- imposta la correttezza dei parametri di input
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100)
{
Print("Error! Valori non corretti dei parametri di input!");
return;
}
//--- Numero di barre visibili nella finestra del chart
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- grandezza dell'array prezzo
int accuracy=1000;
//--- array per la memorizzazione dei valori di data e prezzo da essere usati
//--- per impostare e cambiare le coordinate dei punti di ancoraggio degli Archi di Fibonacci
datetime date[];
double price[];
//--- allocazione della memoria
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- riempie l'array delle date
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Fallimento nella copia dei valori tempo! Error code = ",GetLastError());
return;
}
/--- riempie l'array dei prezzi
//--- trova i valori più alti e più bassi del chart
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definisce un cambio di step del prezzo e riempie l'array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definisce i punti per disegnare gli Archi di Fibonacci
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
//--- crea un oggetto
if(!FiboArcCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],InpScale,
InpFullEllipse,InpColor,InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- redisegna il chart ed attende per 1 secondo
ChartRedraw();
Sleep(1000);
//--- ora, sposta i punti di ancoraggio
//---contatore del ciclo
int v_steps=accuracy/5;
//--- move the first anchor point
for(int i=0;i<v_steps;i++)
{
//--- usa il seguente valore
if(p1<accuracy-1)
p1+=1;
//--- sposta il punto
if(!FiboArcPointChange(0,InpName,0,date[d1],price[p1]))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
}
//--- 1 secondo di ritardo
Sleep(1000);
//---contatore del ciclo
int h_steps=bars/5;
//--- sposta il secondo punto di ancoraggio
for(int i=0;i<h_steps;i++)
{
//--- usa il seguente valore
if(d2<bars-1)
d2+=1;
//--- sposta il punto
if(!FiboArcPointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
// 0.05 secondi di ritardo
Sleep(50);
}
//--- 1 secondo di ritardo
Sleep(1000);
//--- elimina l'oggetto dal chart
FiboArcDelete(0,InpName);
ChartRedraw();
//--- 1 secondo di ritardo
Sleep(1000);
//---
}
OBJ_FIBOCHANNEL
Canale di Fibonacci.
Nota
Per il " Canale di Fibonacci" , è possibile specificare la modalità della sua continuazione a destra e/o a
sinistra (proprietà OBJPR OP_RAY_RIGHT ed OBJPR OP_RAY_LEFT rispettivamente).
Esempio
Il seguente script crea e sposta il Canale di Fibonacci sul chart. Funzioni speciali sono state
sviluppate per creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste
funzioni " come è" nelle proprie applicazioni.
//--- descrizione
#property description "Lo Script disegna l'oggetto grafico \"Canale di Fibonacci\"."
#property description "Le coordinate del punto di ancoraggio sono impostate in percentuale"
#property description " della grandezza della finestra chart."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="FiboChannel"; // Nome del canale
input int InpDate1=20; // data del 1mo punto, %
input int InpPrice1=10; // prezzo del 1mo punto, %
input int InpDate2=60; // data del 2ndo punto, %
input int InpPrice2=30; // prezzo del 2ndo punto, %
input int InpDate3=20; // data del 3zo punto, %
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELWIDTH,i,widths[i]);
//--- descrizione dei livelli
ObjectSetString(chart_ID,name,OBJPROP_LEVELTEXT,i,DoubleToString(100*values[i],1));
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Sposta i punti di ancoraggio del Canale di Fibonacci |
//+--------------------------------------------------------------------------------+
bool FiboChannelPointChange(const long chart_ID=0, // ID del chart
const string name="FiboChannel", // nome del canale
const int point_index=0, // indice del punto di ancoraggio
datetime time=0, // coordinate tempo, del punto di anco
double price=0) // coordinate prezzo, del punto di anc
{
//--- se il punto della posizione non è impostato, spostarlo nella barra corrente che ha il prezzo
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- resetta il valore dell' errore
ResetLastError();
//--- sposta il punto di ancoraggio
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
": fallimento nello spostare il punto di ancoraggio! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Elimina il canale |
//+--------------------------------------------------------------------------------+
bool FiboChannelDelete(const long chart_ID=0, // ID del chart
const string name="FiboChannel", // nome del canale
{
//--- resetta il valore dell' errore
ResetLastError();
//--- elimina il canale
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": fallimento nell'eliminare il \"Canale di Fibonacci\"! Error code = ",GetLastError())
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Controlla i valori dei punti di ancoraggio del Canale di Fibonacci ed imposta i|
//| valori di default per quelli vuoti |
//+--------------------------------------------------------------------------------+
void ChangeFiboChannelEmptyPoints(datetime &time1,double &price1,datetime &time2,
double &price2,datetime &time3,double &price3)
{
//--- se l'orario del secondo(destro) punto non è impostato, sarà sulla barra corrente
if(!time2)
time2=TimeCurrent();
//--- se il prezzo del secondo punto non è impostato, avrà un valore Bid
if(!price2)
price2=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- se l'orario del primo(sinistro) punto non è impostato, è posizionato 9 barre meno dalla secon
if(!time1)
{
//--- array per la ricezione dell'orario di apertura delle ultime 10 barre
datetime temp[10];
CopyTime(Symbol(),Period(),time2,10,temp);
//--- imposta il primo punto 9 barre a sinistra dalla seconda
time1=temp[0];
}
//--- se il prezzo del primo punto non è impostato, lo sposta di 300 punti in più rispetto al secon
if(!price1)
price1=price2+300*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
//--- se l'orario del terzo punto non è impostato, esso coincide con quello del primo punto
if(!time3)
time3=time1;
//--- se il prezzo del terzo punto non è impostato, è uguale a quello del secondo punto
if(!price3)
price3=price2;
}
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- imposta la correttezza dei parametri di input
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100 ||
InpDate3<0 || InpDate3>100 || InpPrice3<0 || InpPrice3>100)
{
Print("Error! Valori non corretti dei parametri di input!");
return;
}
//--- Numero di barre visibili nella finestra del chart
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
OBJ_EXPANSION
Espansioni di Fibonacci.
Nota
Per le " Espansioni di Fibonacci" , è possibile specificare la modalità della sua continuazione a destra
e/o a sinistra ( proprietà OBJPR OP_RAY_RIGHT e OBJPR OP_RAY_LEFT rispettivamente).
Esempio
Il seguente script crea e sposta le Espansioni di Fibonacci sul grafico. Funzioni speciali sono state
sviluppate per creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste
funzioni " come è" nelle proprie applicazioni.
//--- descrizione
#property description "Lo Script disegna l'oggetto grafico \"Espansioni di Fibonacci\"."
#property description "Le coordinate del punto di ancoraggio sono impostate in percentuale"
#property description " della grandezza della finestra chart."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="FiboExpansion"; // Nome dell'oggetto
input int InpDate1=10; // data del 1mo punto, %
input int InpPrice1=55; // prezzo del 1mo punto, %
input int InpDate2=30; // data del 2ndo punto, %
input int InpPrice2=10; // prezzo del 2ndo punto, %
input int InpDate3=80; // data del 3zo punto, %
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELWIDTH,i,widths[i]);
//--- descrizione dei livelli
ObjectSetString(chart_ID,name,OBJPROP_LEVELTEXT,i,"FE "+DoubleToString(100*values[i],1));
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Sposta i punti di ancoraggio delle Espansioni di Fibonacci |
//+--------------------------------------------------------------------------------+
bool FiboExpansionPointChange(const long chart_ID=0, // ID del chart
const string name="FiboExpansion", // nome oggetto
const int point_index=0, // indice punto di ancoraggio
datetime time=0, // coordinate orarie del punto di
double price=0) // coorinate prezzo, del punto di
{
//--- se il punto della posizione non è impostato, spostarlo nella barra corrente che ha il prezzo
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- resetta il valore dell' errore
ResetLastError();
//--- sposta il punto di ancoraggio
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
": fallimento nello spostare il punto di ancoraggio! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Elimina le Espansioni di Fibonacci |
//+--------------------------------------------------------------------------------+
bool FiboExpansionDelete(const long chart_ID=0, // ID del chart
const string name="FiboExpansion") // nome dell'oggetto
{
//--- resetta il valore dell' errore
ResetLastError();
//--- elimina l'oggetto
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": fallimento nell'eliminare le \"Espansioni di Fibonacci\"! Error code = ",GetLastErro
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Controlla i valori dei punti di ancoraggio delle Espansioni di Fibonacci ed imposta|
//| valori di default per quelli vuoti |
//+--------------------------------------------------------------------------------+
void ChangeFiboExpansionEmptyPoints(datetime &time1,double &price1,datetime &time2,
double &price2,datetime &time3,double &price3)
{
//--- se l'orario del terzo (destro) punto non è impostato, sarà sulla barra corrente
if(!time3)
time3=TimeCurrent();
//--- if the third point's price is not set, it will have Bid value
if(!price3)
price3=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- se l'orario del primo(sinistro) punto non è impostato, è localizzato 9 barre a sinistra dalla
//--- array per ricevere l'orario di apertura delle ultime 10 barre
datetime temp[];
ArrayResize(temp,10);
if(!time1)
{
CopyTime(Symbol(),Period(),time3,10,temp);
//--- imposta il primo punto 9 barre a sinistra dalla seconda
time1=temp[0];
}
//--- se il prezzo del primo punto non è impostato, è uguale a quello del terzo punto
if(!price1)
price1=price3;
//--- se l'orario del secondo punto non è impostato, è posizionato 7 barre meno dalla terza
if(!time2)
time2=temp[2];
//--- se il prezzo del secondo punto non è impostato, lo sposta di 250 punti in meno rispetto al pr
if(!price2)
price2=price1-250*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
}
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- imposta la correttezza dei parametri di input
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100 ||
InpDate3<0 || InpDate3>100 || InpPrice3<0 || InpPrice3>100)
{
Print("Error! Valori non corretti dei parametri di input!");
return;
}
//--- Numero di barre visibili nella finestra del chart
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- grandezza dell'array prezzo
int accuracy=1000;
//--- array per la memorizzazione dei valori di data e prezzo da essere usati
//--- per impostare e cambiare i punti delle coordinate di ancoraggio dell'oggetto
datetime date[];
double price[];
//--- allocazione della memoria
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- riempie l'array delle date
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Fallimento nella copia dei valori tempo! Error code = ",GetLastError());
return;
}
/--- riempie l'array dei prezzi
//--- trova i valori più alti e più bassi del chart
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definisce un cambio di step del prezzo e riempie l'array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definisce i punti per disegnare le Espansioni di Fibonacci
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int d3=InpDate3*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
int p3=InpPrice3*(accuracy-1)/100;
//--- crea le Espansioni di Fibonacci
if(!FiboExpansionCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],date[d3],price[p3],
InpColor,InpStyle,InpWidth,InpBack,InpSelection,InpRayLeft,InpRayRight,InpHidden,InpZOrder))
{
return;
}
//--- redisegna il chart ed attende per 1 secondo
ChartRedraw();
Sleep(1000);
//--- ora, sposta i punti di ancoraggio
//---contatore del ciclo
int v_steps=accuracy/10;
//--- move the first anchor point
for(int i=0;i<v_steps;i++)
{
//--- usa il seguente valore
if(p1>1)
p1-=1;
//--- sposta il punto
if(!FiboExpansionPointChange(0,InpName,0,date[d1],price[p1]))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
}
//--- 1 secondo di ritardo
Sleep(1000);
//---contatore del ciclo
v_steps=accuracy/2;
//--- sposta il terzo punto di ancoraggio
for(int i=0;i<v_steps;i++)
{
//--- usa il seguente valore
if(p3>1)
p3-=1;
//--- sposta il punto
if(!FiboExpansionPointChange(0,InpName,2,date[d3],price[p3]))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
}
//--- 1 secondo di ritardo
Sleep(1000);
//---contatore del ciclo
v_steps=accuracy*4/5;
//--- sposta il secondo punto di ancoraggio
for(int i=0;i<v_steps;i++)
{
//--- usa il seguente valore
if(p2<accuracy-1)
p2+=1;
//--- sposta il punto
if(!FiboExpansionPointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
}
//--- 1 secondo di ritardo
Sleep(1000);
//--- elimina l'oggetto dal chart
FiboExpansionDelete(0,InpName);
ChartRedraw();
//--- 1 secondo di ritardo
Sleep(1000);
//---
}
OBJ_ELLIOTW AVE5
Onda Movente di Elliott.
Nota
Per l' " Onda Movente di Elliott" , è possibile abilitare /disabilitare la modalità di connessione dei
punti per righe (OBJPR OP_DRAW L INES property), cos ì come impostare il livello di posizione dell'onda
(dall'enumarazione ENUM _ELL IOT_W AVE_DEGR EE).
Esempio
Il seguente scripe crea e sposta l'onda movente di Elliot sul chart. Funzioni speciali sono state
sviluppate per creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste
//--- descrizione
#property description "Lo script disegna l'oggetto grafico \"Onda Movente di Elliott\"."
#property description "Le coordinate del punto di ancoraggio sono impostate in percentuale della gr
#property description "finestra del chart."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="ElliotWave5"; // Nome Oggetto
input int InpDate1=10; // data del 1mo punto, %
input int InpPrice1=90; // prezzo del 1mo punto, %
input int InpDate2=20; // data del secondo punto, %
input int InpPrice2=40; // prezzo del 2ndo punto, %
input int InpDate3=30; // data del 3zo punto, %
": fallimento nel creare l' \"Onda Movente di Elliott\"! Error code = ",GetLastError())
return(false);
}
//--- imposta grado (grandezza onda)
ObjectSetInteger(chart_ID,name,OBJPROP_DEGREE,degree);
//--- abilita (true) o disabilita (false) la modalità di visualizzazione delle righe
ObjectSetInteger(chart_ID,name,OBJPROP_DRAWLINES,draw_lines);
//--- imposta il colore dell'oggetto
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- imposta lo stile delle linee
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- imposta lo spessore delle linee
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- mostra in primo piano (false) o sottofondo (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- abilita (true) o disabilita (false) la modalità di evidenzia del canale per lo spostamento
//--- quando si crea un oggetto grafico utilizzando la funzione ObjectCreate, l'oggetto non può ess
//--- evidenziato e mosso, per default. All'interno di questo metodo, la selezione dei parametri
//--- è true per default, il che consente di evidenziare e spostare l'oggetto
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- nascondi (true) o mostra (falso) il nome di oggetto grafico nella lista degli oggetti
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- imposta la priorità per ricevere l'evento di un clic del mouse nel grafico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Sposta il punto di ancoraggio dell' Onda Movente di Elliott |
//+--------------------------------------------------------------------------------+
bool ElliotWave5PointChange(const long chart_ID=0, // ID del chart
const string name="ElliotWave5", // nome dell'oggetto
const int point_index=0, // indice del punto di ancoraggio
datetime time=0, // coordinate tempo, del punto di anco
double price=0) // coordinate prezzo, del punto di anc
{
//--- se il punto della posizione non è impostato, spostarlo nella barra corrente che ha il prezzo
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- resetta il valore dell' errore
ResetLastError();
//--- sposta il punto di ancoraggio
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
": fallimento nello spostare il punto di ancoraggio! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Elimina l'Onda Movente di Elliott |
//+--------------------------------------------------------------------------------+
bool ElliotWave5Delete(const long chart_ID=0, // ID del chart
const string name="ElliotWave5") // nome dell'oggetto
{
//--- resetta il valore dell' errore
ResetLastError();
//--- elimina l'oggetto
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": fallimento nell'eliminare l' \"Onda Movente di Elliott\"! Error code = ",GetLastErro
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Imposta i valori del punto di ancoraggio dell' Onda Movente di Elliott |
//| imposta i valore di default per quelle vuote |
//+--------------------------------------------------------------------------------+
void ChangeElliotWave5EmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2,
datetime &time3,double &price3,
datetime &time4,double &price4,
datetime &time5,double &price5)
{
//--- array per ricevere l'orario di apertura delle ultime 10 barre
datetime temp[];
ArrayResize(temp,10);
//--- ricezione dati
CopyTime(Symbol(),Period(),TimeCurrent(),10,temp);
//--- riceve il valore di un punto sul corrente chart
double point=SymbolInfoDouble(Symbol(),SYMBOL_POINT);
//--- se l'orario del primo punto non è impostato, sarà 0 barre dietro dall'ultima barra
if(!time1)
time1=temp[0];
//--- se il prezzo del punto non è impostato, avrà un valore Bid
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- se l'orario del secondo punto non è impostato, sarà 7 barre dietro dall'ultima barra
if(!time2)
time2=temp[2];
//--- se il prezzo del secondo punto non è impostato, lo sposta di 300 punti in meno rispetto al pr
if(!price2)
price2=price1-300*point;
//--- se l'orario del terzo punto non è impostato, sarà 5 barre dietro dall'ultima barra
if(!time3)
time3=temp[4];
//--- se il prezzo del terzo punto non è impostato, lo sposta di 200 punti in meno rispetto al prim
if(!price3)
price3=price1-250*point;
//--- se l'orario del quarto punto non è impostato, sarà 3 barre dietro dall'ultima barra
if(!time4)
time4=temp[6];
//--- se il prezzo del quarto punto non è impostato, lo sposta di 550 punti in meno rispetto al pri
if(!price4)
price3=price1-200*point;
//--- se l'orario del primo punto non è impostato, sarà sulla barra corrente
if(!time5)
time5=temp[9];
//--- se il prezzo del terzo punto non è impostato, lo sposta di 250 punti in meno rispetto al prim
if(!price5)
price5=price1-450*point;
}
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- imposta la correttezza dei parametri di input
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100 ||
InpDate3<0 || InpDate3>100 || InpPrice3<0 || InpPrice3>100 ||
InpDate4<0 || InpDate4>100 || InpPrice4<0 || InpPrice4>100 ||
InpDate5<0 || InpDate5>100 || InpPrice5<0 || InpPrice5>100)
{
Print("Error! Valori non corretti dei parametri di input!");
return;
}
//--- Numero di barre visibili nella finestra del chart
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- grandezza dell'array prezzo
int accuracy=1000;
//--- array per la memorizzazione dei valori di data e prezzo da essere usati
//--- per impostare e cambiare i punti delle coordinate di ancoraggio dell'oggetto
datetime date[];
double price[];
//--- allocazione della memoria
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- riempie l'array delle date
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Fallimento nella copia dei valori tempo! Error code = ",GetLastError());
return;
}
/--- riempie l'array dei prezzi
//--- trova i valori più alti e più bassi del chart
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definisce un cambio di step del prezzo e riempie l'array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definisce i punti per disegnare l'Onda Movente di Elliott
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int d3=InpDate3*(bars-1)/100;
int d4=InpDate4*(bars-1)/100;
int d5=InpDate5*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
int p3=InpPrice3*(accuracy-1)/100;
int p4=InpPrice4*(accuracy-1)/100;
int p5=InpPrice5*(accuracy-1)/100;
//--- Crea l'Onda Movente di Elliott
if(!ElliotWave5Create(0,InpName,0,date[d1],price[p1],date[d2],price[p2],date[d3],price[p3],
date[d4],price[p4],date[d5],price[p5],InpDegree,InpDrawLines,InpColor,InpStyle,InpWidth,
InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- redisegna il chart ed attende per 1 secondo
ChartRedraw();
Sleep(1000);
//--- ora, sposta i punti di ancoraggio
//---contatore del ciclo
int v_steps=accuracy/5;
//--- sposta il quinto punto di ancoraggio
for(int i=0;i<v_steps;i++)
{
//--- usa il seguente valore
if(p5<accuracy-1)
p5+=1;
//--- sposta il punto
if(!ElliotWave5PointChange(0,InpName,4,date[d5],price[p5]))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
}
//--- 1 secondo di ritardo
Sleep(1000);
//---contatore del ciclo
v_steps=accuracy/5;
//--- sposta il secondo ed il terzo punto di ancoraggio
for(int i=0;i<v_steps;i++)
{
//--- usa i seguenti valori
if(p2<accuracy-1)
p2+=1;
if(p3>1)
p3-=1;
//--- slitta i punti
if(!ElliotWave5PointChange(0,InpName,1,date[d2],price[p2]))
return;
if(!ElliotWave5PointChange(0,InpName,2,date[d3],price[p3]))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
}
//--- 1 secondo di ritardo
Sleep(1000);
//---contatore del ciclo
v_steps=accuracy*4/5;
//--- sposta il primo ed il quarto punto di ancoraggio
for(int i=0;i<v_steps;i++)
{
//--- usa i seguenti valori
if(p1>1)
p1-=1;
if(p4<accuracy-1)
p4+=1;
//--- slitta i punti
if(!ElliotWave5PointChange(0,InpName,0,date[d1],price[p1]))
return;
if(!ElliotWave5PointChange(0,InpName,3,date[d4],price[p4]))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
}
//--- 1 secondo di ritardo
Sleep(1000);
//--- elimina l'oggetto dal chart
ElliotWave5Delete(0,InpName);
ChartRedraw();
//--- 1 secondo di ritardo
Sleep(1000);
//---
}
OBJ_ELLIOTW AVE3
Onda Correttiva di Elliott.
Nota
Per l' " Onda Correttiva di Elliott" , è possibile abilitare /disabilitare la modalità di connessione dei
punti per righe (OBJPR OP_DRAW L INES property), cos ì come impostare il livello di posizione dell'onda
(dall'enumarazione ENUM _ELL IOT_W AVE_DEGR EE).
Esempio
Il seguente scripe crea e sposta l'onda correttiva di Elliot sul chart. Funzioni speciali sono state
sviluppate per creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste
//--- descrizione
#property description "Lo script disegna l'oggetto grafico \"Onda Correttiva di Elliott\"."
#property description "Le coordinate del punto di ancoraggio sono impostare in percentuale della fi
#property description "grandezza."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="ElliotWave3"; // Nome oggetto
input int InpDate1=10; // data del 1mo punto, %
input int InpPrice1=90; // prezzo del 1mo punto, %
input int InpDate2=30; // data del secondo punto, %
input int InpPrice2=10; // prezzo del 2ndo punto, %
input int InpDate3=50; // data del 3zo punto, %
return;
}
//--- redisegna il chart ed attende per 1 secondo
ChartRedraw();
Sleep(1000);
//--- ora, sposta i punti di ancoraggio
//---contatore del ciclo
int v_steps=accuracy/5;
//--- sposta il terzo punto di ancoraggio
for(int i=0;i<v_steps;i++)
{
//--- usa il seguente valore
if(p3<accuracy-1)
p3+=1;
//--- sposta il punto
if(!ElliotWave3PointChange(0,InpName,2,date[d3],price[p3]))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
}
//--- 1 secondo di ritardo
Sleep(1000);
//---contatore del ciclo
v_steps=accuracy*4/5;
//--- sposta il primo ed il secondo punto di ancoraggio
for(int i=0;i<v_steps;i++)
{
//--- usa i seguenti valori
if(p1>1)
p1-=1;
if(p2<accuracy-1)
p2+=1;
//--- slitta i punti
if(!ElliotWave3PointChange(0,InpName,0,date[d1],price[p1]))
return;
if(!ElliotWave3PointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
}
//--- 1 secondo di ritardo
Sleep(1000);
//--- elimina l'oggetto dal chart
ElliotWave3Delete(0,InpName);
ChartRedraw();
//--- 1 secondo di ritardo
Sleep(1000);
//---
}
OBJ_RECTANGLE
R ettangolo.
Nota
Per il rettangolo, la modalità di riempimento con colore può essere impostata utilizzando la
proprietà OBJPR OP_FILL.
Esempio
Il seguente script crea e sposta il rettangolo sul chart. Funzioni speciali sono state sviluppate per
creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste funzioni " come è"
nelle proprie applicazioni.
//--- descrizione
#property description "Lo Script crea il rettangolo nel chart."
#property description "Anchor point coordinates are set in"
#property description "percentuale della grandezza della finestra chart."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="Rectangle"; // Nome del rettangolo
input int InpDate1=40; // data del 1mo punto, %
input int InpPrice1=40; // prezzo del 1mo punto, %
input int InpDate2=60; // data del 2ndo punto, %
input int InpPrice2=60; // prezzo del 2ndo punto, %
input color InpColor=clrRed; // Colore della linea
input ENUM_LINE_STYLE InpStyle=STYLE_DASH; // Stile delle linee del rettangolo
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Controlla i valori dei punti di ancoraggio del rettangolo ed imposta |
//| valori di default per quelli vuoti |
//+--------------------------------------------------------------------------------+
void ChangeRectangleEmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2)
{
//--- se l'orario del primo punto non è impostato, sarà sulla barra corrente
if(!time1)
time1=TimeCurrent();
//--- se il prezzo del punto non è impostato, avrà un valore Bid
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- se l'orario del secondo punto non è impostato, è posizionato 9 barre meno dalla seconda
if(!time2)
{
//--- array per la ricezione dell'orario di apertura delle ultime 10 barre
datetime temp[10];
CopyTime(Symbol(),Period(),time1,10,temp);
//--- imposta il secondo punto, 9 barre in meno dalla prima
time2=temp[0];
}
//--- se il prezzo del secondo punto non è impostato, lo sposta di 300 punti in meno rispetto al pr
if(!price2)
price2=price1-300*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
}
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- imposta la correttezza dei parametri di input
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100)
{
Print("Error! Valori non corretti dei parametri di input!");
return;
}
//--- Numero di barre visibili nella finestra del chart
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- grandezza dell'array prezzo
int accuracy=1000;
//--- array per la memorizzazione dei valori di data e prezzo da essere usati
//--- per impostare e cambiare i punti delle coordinate di ancoraggio del rettangolo
datetime date[];
double price[];
//--- allocazione della memoria
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- riempie l'array delle date
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Fallimento nella copia dei valori tempo! Error code = ",GetLastError());
return;
}
/--- riempie l'array dei prezzi
//--- trova i valori più alti e più bassi del chart
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definisce un cambio di step del prezzo e riempie l'array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definisce i punti per disegnare il rettangolo
int d1=InpDate1*(bars-1)/100;
int d2=InpDate2*(bars-1)/100;
int p1=InpPrice1*(accuracy-1)/100;
int p2=InpPrice2*(accuracy-1)/100;
//--- crea il rettangolo
if(!RectangleCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],InpColor,
InpStyle,InpWidth,InpFill,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- redisegna il chart ed attende per 1 secondo
ChartRedraw();
Sleep(1000);
//--- ora, sposta i punti di ancoraggio del rettangolo
//---contatore del ciclo
int h_steps=bars/2;
//--- sposta i punti di ancoraggio
for(int i=0;i<h_steps;i++)
{
//--- usa i seguenti valori
if(d1<bars-1)
d1+=1;
if(d2>1)
d2-=1;
//--- slitta i punti
if(!RectanglePointChange(0,InpName,0,date[d1],price[p1]))
return;
if(!RectanglePointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
// 0.05 secondi di ritardo
Sleep(50);
}
//--- 1 secondo di ritardo
Sleep(1000);
//---contatore del ciclo
int v_steps=accuracy/2;
//--- sposta i punti di ancoraggio
for(int i=0;i<v_steps;i++)
{
//--- usa i seguenti valori
if(p1<accuracy-1)
p1+=1;
if(p2>1)
p2-=1;
//--- slitta i punti
if(!RectanglePointChange(0,InpName,0,date[d1],price[p1]))
return;
if(!RectanglePointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
}
//--- 1 secondo di ritardo
Sleep(1000);
//--- elimina il rettangolo dal chart
RectangleDelete(0,InpName);
ChartRedraw();
//--- 1 secondo di ritardo
Sleep(1000);
//---
}
OBJ_TRIANGLE
T riangolo.
Nota
Per il triangolo, la modalità di riempimento con colore può essere impostata utilizzando la proprietà
OBJPR OP_FILL.
Esempio
Il seguente script crea e sposta il triangolo sul chart. Funzioni speciali sono state sviluppate per
creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste funzioni " come è"
nelle proprie applicazioni.
//--- descrizione
#property description "Lo script crea il triangolo sul chart."
#property description "Anchor point coordinates are set in"
#property description "percentuale della grandezza della finestra chart."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="Triangle"; // Nome del triangolo
input int InpDate1=25; // data del 1mo punto, %
input int InpPrice1=50; // prezzo del 1mo punto, %
input int InpDate2=70; // data del 2ndo punto, %
input int InpPrice2=70; // prezzo del 2ndo punto, %
input int InpDate3=65; // data del 3zo punto, %
input int InpPrice3=20; // prezzo del 3zo punto, %
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- abilita (true) o disabilita (false) la modalità di evidenziazione del triangolo per il suo sp
//--- quando si crea un oggetto grafico utilizzando la funzione ObjectCreate, l'oggetto non può ess
//--- evidenziato e mosso, per default. All'interno di questo metodo, la selezione dei parametri
//--- è true per default, il che consente di evidenziare e spostare l'oggetto
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- nascondi (true) o mostra (falso) il nome di oggetto grafico nella lista degli oggetti
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- imposta la priorità per ricevere l'evento di un clic del mouse nel grafico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Sposta i punti di ancoraggio del triangolo |
//+--------------------------------------------------------------------------------+
bool TrianglePointChange(const long chart_ID=0, // ID del chart
const string name="Triangle", // nome del triangolo
const int point_index=0, // indice del punto di ancoraggio
datetime time=0, // coordinate tempo, del punto di ancoraggio
double price=0) // coordinate di prezzo del punto di ancor
{
//--- se il punto della posizione non è impostato, spostarlo nella barra corrente che ha il prezzo
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- resetta il valore dell' errore
ResetLastError();
//--- sposta il punto di ancoraggio
if(!ObjectMove(chart_ID,name,point_index,time,price))
{
Print(__FUNCTION__,
": fallimento nello spostare il punto di ancoraggio! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Delete the triangle |
//+--------------------------------------------------------------------------------+
bool TriangleDelete(const long chart_ID=0, // ID del chart
const string name="Triangle") // nome del triangolo
{
//--- resetta il valore dell' errore
ResetLastError();
//--- elimina il triangolo
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": fallimento nell'eliminare l'ellisse! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Controlla i valori dei punti di ancoraggio del triangoloo ed imposta i |
//| valori di default per quelli vuoti |
//+--------------------------------------------------------------------------------+
void ChangeTriangleEmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2,
datetime &time3,double &price3)
{
//--- se l'orario del primo punto non è impostato, sarà sulla barra corrente
if(!time1)
time1=TimeCurrent();
//--- se il prezzo del punto non è impostato, avrà un valore Bid
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- se l'orario del secondo punto non è impostato, è posizionato 9 barre meno dalla seconda
if(!time2)
{
//--- array per la ricezione dell'orario di apertura delle ultime 10 barre
datetime temp[10];
CopyTime(Symbol(),Period(),time1,10,temp);
//--- imposta il secondo punto, 9 barre in meno dalla prima
time2=temp[0];
}
//--- se il prezzo del secondo punto non è impostato, lo sposta di 300 punti in meno rispetto al pr
if(!price2)
price2=price1-300*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
//--- se l'orario del terzo punto non è impostato, coincide con la data del secondo punto
if(!time3)
time3=time2;
//--- se il prezzo del terzo punto non è impostato, è uguale a quello del primo punto
if(!price3)
price3=price1;
}
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- imposta la correttezza dei parametri di input
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
if(!TrianglePointChange(0,InpName,2,date[d3],price[p3]))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
}
//--- 1 secondo di ritardo
Sleep(1000);
//--- elimina il triangolo dal grafico
TriangleDelete(0,InpName);
ChartRedraw();
//--- 1 secondo di ritardo
Sleep(1000);
//---
}
OBJ_ELLIPSE
Ellisse.
Nota
Per ellisse, la modalità di riempimento con colore può essere impostata utilizzando la proprietà
OBJPR OP_FILL.
Esempio
Il seguente script crea e sposta l'ellisse sul chart. Funzioni speciali sono state sviluppate per creare e
modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste funzioni " come è" nelle
proprie applicazioni.
//--- descrizione
#property description "Lo Script crea l'ellisse nel chart."
#property description "Vengono impostate le coordinate dei punti di ancoraggio"
#property description "percentuale della grandezza della finestra chart."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="Ellisse"; // Nome dell'Ellisse
input int InpDate1=30; // data del 1mo punto, %
input int InpPrice1=20; // prezzo del 1mo punto, %
input int InpDate2=70; // data del 2ndo punto, %
input int InpPrice2=80; // prezzo del 2ndo punto, %
input int InpDate3=50; // data del 3zo punto, %
input int InpPrice3=60; // prezzo del 3zo punto, %
input color InpColor=clrRed; // Colore dell'ellisse
{
Print(__FUNCTION__,
": fallimento nell'eliminare un ellisse! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Controlla i valori dei punti di ancoraggio dell'ellisse ed imposta i valori di default |
//| per quelli vuoti |
//+--------------------------------------------------------------------------------+
void ChangeEllipseEmptyPoints(datetime &time1,double &price1,
datetime &time2,double &price2,
datetime &time3,double &price3)
{
//--- se l'orario del primo punto non è impostato, sarà sulla barra corrente
if(!time1)
time1=TimeCurrent();
//--- se il prezzo del punto non è impostato, avrà un valore Bid
if(!price1)
price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- se l'orario del secondo punto non è impostato, è posizionato 9 barre meno dalla seconda
if(!time2)
{
//--- array per la ricezione dell'orario di apertura delle ultime 10 barre
datetime temp[10];
CopyTime(Symbol(),Period(),time1,10,temp);
//--- imposta il secondo punto, 9 barre in meno dalla prima
time2=temp[0];
}
//--- se il prezzo del secondo punto non è impostato, lo sposta di 300 punti in meno rispetto al pr
if(!price2)
price2=price1-300*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
//--- se l'orario del terzo punto non è impostato, coincide con la data del secondo punto
if(!time3)
time3=time2;
//--- se il prezzo del terzo punto non è impostato, è uguale a quello del primo punto
if(!price3)
price3=price1;
}
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- imposta la correttezza dei parametri di input
if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||
InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100 ||
int v_steps=accuracy/5;
//--- sposta il primo ed il secondo punto di ancoraggio
for(int i=0;i<v_steps;i++)
{
//--- usa i seguenti valori
if(p1<accuracy-1)
p1+=1;
if(p2>1)
p2-=1;
//--- slitta i punti
if(!EllipsePointChange(0,InpName,0,date[d1],price[p1]))
return;
if(!EllipsePointChange(0,InpName,1,date[d2],price[p2]))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
}
//--- 1 secondo di ritardo
Sleep(1000);
//---contatore del ciclo
int h_steps=bars/5;
//--- sposta il terzo punto di ancoraggio
for(int i=0;i<h_steps;i++)
{
//--- usa il seguente valore
if(d3>1)
d3-=1;
//--- sposta il punto
if(!EllipsePointChange(0,InpName,2,date[d3],price[p3]))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
// 0.05 secondi di ritardo
Sleep(50);
}
//--- 1 secondo di ritardo
Sleep(1000);
//--- elimina l'ellisse dal grafico
EllipseDelete(0,InpName);
ChartRedraw();
//--- 1 secondo di ritardo
Sleep(1000);
//---
OBJ_ARROW _THUMB_UP
S egno Pollice S u.
Nota
La posizione del Punto di ancoraggio relativa al segno può essere scelta tra l'enumerazione
ENUM _ARR OW _ANCH OR .
Segni larghi (più di 5) possono essere creati solo impostando l'appropriato valore della proprietà
OBJPR OP_W IDTH quando si scrive un codice in MetaEditor.
Esempio
Il seguente script crea e muove il segno di Pollice S u sul chart. Funzioni speciali sono state
sviluppate per creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste
funzioni " come è" nelle proprie applicazioni.
//--- descrizione
#property description "Lo script disegna il segno di \"Pollice Su\"."
#property description "Le coordinate del punto di ancoraggio sono impostate in percentuale"
#property description " della grandezza della finestra chart."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="ThumbUp"; // Nome del segno
input int InpDate=75; // data del punto di ancoraggio, in %
input int InpPrice=25; // Anchor point price in %
input ENUM_ARROW_ANCHOR InpAnchor=ANCHOR_TOP; // Tipo di ancoraggio
input color InpColor=clrRed; // Colore del segno
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- nascondi (true) o mostra (falso) il nome di oggetto grafico nella lista degli oggetti
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- imposta la priorità per ricevere l'evento di un clic del mouse nel grafico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Sposta il punto di ancoraggio |
//+--------------------------------------------------------------------------------+
bool ArrowThumbUpMove(const long chart_ID=0, // ID del chart
const string name="ThumbUp", // nome oggetto
datetime time=0, // coordinate tempo, del punto di ancoraggio
double price=0) // coordinate prezzo, del punto di ancoraggio
{
//--- se il punto della posizione non è impostato, spostarlo nella barra corrente che ha il prezzo
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- resetta il valore dell' errore
ResetLastError();
//--- sposta il punto di ancoraggio
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
": fallimento nello spostare il punto di ancoraggio! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Cambia il tipo di segno di ancoraggio Pollice Su |
//+--------------------------------------------------------------------------------+
bool ArrowThumbUpAnchorChange(const long chart_ID=0, // ID del chart
const string name="ThumbUp", // nome oggetto
const ENUM_ARROW_ANCHOR anchor=ANCHOR_TOP) // tipo di ancoraggio
{
//--- resetta il valore dell' errore
ResetLastError();
//--- cambia il tipo di ancora
if(!ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor))
{
Print(__FUNCTION__,
": fallimento nel cambiare il tipo di ancora! Error code = ",GetLastError());
return(false);
}
//--- array per la memorizzazione dei valori di data e prezzo da essere usati
//--- per impostare e cambiare le coordinate del segno di ancoraggio
datetime date[];
double price[];
//--- allocazione della memoria
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- riempie l'array delle date
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Fallimento nella copia dei valori tempo! Error code = ",GetLastError());
return;
}
/--- riempie l'array dei prezzi
//--- trova i valori più alti e più bassi del chart
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definisce un cambio di step del prezzo e riempie l'array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definisce i punti per disegnare il segno
int d=InpDate*(bars-1)/100;
int p=InpPrice*(accuracy-1)/100;
//--- crea il segno di Pollice Su sul chart
if(!ArrowThumbUpCreate(0,InpName,0,date[d],price[p],InpAnchor,InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- redisegna il chart ed attende per 1 secondo
ChartRedraw();
Sleep(1000);
//--- ora, sposta il punto di ancoraggio e modificare la sua posizione rispetto al segno
//---contatore del ciclo
int h_steps=bars/4;
//--- sposta il punto di ancoraggio
for(int i=0;i<h_steps;i++)
{
//--- usa il seguente valore
if(d>1)
d-=1;
//--- sposta il punto
if(!ArrowThumbUpMove(0,InpName,date[d],price[p]))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
OBJ_ARROW _THUMB_DOW N
S egno Pollice Giu.
Nota
La posizione del Punto di ancoraggio relativa al segno può essere scelta tra l'enumerazione
ENUM _ARR OW _ANCH OR .
Segni larghi (più di 5) possono essere creati solo impostando l'appropriato valore della proprietà
OBJPR OP_W IDTH quando si scrive un codice in MetaEditor.
Esempio
Il seguente script crea e muove il segno di Pollice Giù sul chart. Funzioni speciali sono state
sviluppate per creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste
funzioni " come è" nelle proprie applicazioni.
//--- descrizione
#property description "Lo script disegna il segno di \"Pollice Giu\"."
#property description "Le coordinate del punto di ancoraggio sono impostate in percentuale"
#property description " della grandezza della finestra chart."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="ThumbDown"; // nome del segno
input int InpDate=25; // Data del punto di ancoraggio in %
input int InpPrice=75; // Punto di ancoraggio "prezzo", in %
input ENUM_ARROW_ANCHOR InpAnchor=ANCHOR_BOTTOM; // tipo di ancoraggio
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- nascondi (true) o mostra (falso) il nome di oggetto grafico nella lista degli oggetti
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- imposta la priorità per ricevere l'evento di un clic del mouse nel grafico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Sposta il punto di ancoraggio |
//+--------------------------------------------------------------------------------+
bool ArrowThumbDownMove(const long chart_ID=0, // ID del chart
const string name="ThumbDown", // nome oggetto
datetime time=0, // coordinate orarie del punto di ancoraggio
double price=0) // coordinate di prezzo del punto di ancorag
{
//--- se il punto della posizione non è impostato, spostarlo nella barra corrente che ha il prezzo
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- resetta il valore dell' errore
ResetLastError();
//--- sposta il punto di ancoraggio
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
": fallimento nello spostare il punto di ancoraggio! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Cambia il tipo di segno di ancoraggio Pollice Giu |
//+--------------------------------------------------------------------------------+
bool ArrowThumbDownAnchorChange(const long chart_ID=0, // ID del chart
const string name="ThumbDown", // nome oggetto
const ENUM_ARROW_ANCHOR anchor=ANCHOR_TOP) // tipo di ancoraggio
{
//--- resetta il valore dell' errore
ResetLastError();
//--- cambia il tipo di ancora
if(!ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor))
{
Print(__FUNCTION__,
": fallimento nel cambiare il tipo di ancora! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Elimina il segno di Pollice Giu |
//+--------------------------------------------------------------------------------+
bool ArrowThumbDownDelete(const long chart_ID=0, // ID del chart
const string name="ThumbDown", // nome del segno
{
//--- resetta il valore dell' errore
ResetLastError();
//--- elimina il segno
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": fallimento nell'eliminazione del segno \"Pollice Giu\"! Error code = ",GetLastError(
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Controlla i valori di punto di ancoraggio ed imposta i valori di default |
//| per quelli vuoti |
//+--------------------------------------------------------------------------------+
void ChangeArrowEmptyPoint(datetime &time,double &price)
{
//--- se il tempo del punto non è impostato, sarà sulla barra corrente
if(!time)
time=TimeCurrent();
//--- se il prezzo del punto non è impostato, avrà un valore Bid
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- imposta la correttezza dei parametri di input
if(InpDate<0 || InpDate>100 || InpPrice<0 || InpPrice>100)
{
Print("Error! Valori non corretti dei parametri di input!");
return;
}
//--- Numero di barre visibili nella finestra del chart
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- grandezza dell'array prezzo
int accuracy=1000;
//--- array per la memorizzazione dei valori di data e prezzo da essere usati
//--- per impostare e cambiare le coordinate del segno di ancoraggio
datetime date[];
double price[];
//--- allocazione della memoria
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- riempie l'array delle date
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Fallimento nella copia dei valori tempo! Error code = ",GetLastError());
return;
}
/--- riempie l'array dei prezzi
//--- trova i valori più alti e più bassi del chart
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definisce un cambio di step del prezzo e riempie l'array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definisce i punti per disegnare il segno
int d=InpDate*(bars-1)/100;
int p=InpPrice*(accuracy-1)/100;
//--- crea il segno di Pollice Giu sul chart
if(!ArrowThumbDownCreate(0,InpName,0,date[d],price[p],InpAnchor,InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- redisegna il chart ed attende per 1 secondo
ChartRedraw();
Sleep(1000);
//--- ora, sposta il punto di ancoraggio e modificare la sua posizione rispetto al segno
//---contatore del ciclo
int h_steps=bars/4;
//--- sposta il punto di ancoraggio
for(int i=0;i<h_steps;i++)
{
//--- usa il seguente valore
if(d<bars-1)
d+=1;
//--- sposta il punto
if(!ArrowThumbDownMove(0,InpName,date[d],price[p]))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
// 0.05 secondi di ritardo
Sleep(50);
}
//--- 1 secondo di ritardo
Sleep(1000);
//---contatore del ciclo
int v_steps=accuracy/4;
//--- sposta il punto di ancoraggio
for(int i=0;i<v_steps;i++)
{
//--- usa il seguente valore
if(p>1)
p-=1;
//--- sposta il punto
if(!ArrowThumbDownMove(0,InpName,date[d],price[p]))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
}
//--- cambia la locazione del punto di ancoraggio relativa al segno
ArrowThumbDownAnchorChange(0,InpName,ANCHOR_TOP);
//--- redisegna il chart
ChartRedraw();
//--- 1 secondo di ritardo
Sleep(1000);
//--- elimina il segno dal chart
ArrowThumbDownDelete(0,InpName);
ChartRedraw();
//--- 1 secondo di ritardo
Sleep(1000);
//---
}
OBJ_ARROW _UP
S egno Freccia S u.
Nota
La posizione del Punto di ancoraggio relativa al segno può essere scelta tra l'enumerazione
ENUM _ARR OW _ANCH OR .
Segni larghi (più di 5) possono essere creati solo impostando l'appropriato valore della proprietà
OBJPR OP_W IDTH quando si scrive un codice in MetaEditor.
Esempio
Il seguente script crea e muove il segno di Freccia S u sul chart. Funzioni speciali sono state
sviluppate per creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste
funzioni " come è" nelle proprie applicazioni.
//--- descrizione
#property description "Lo script disegna il segno di \"Freccia Su\"."
#property description "Le coordinate del punto di ancoraggio sono impostate in"
#property description "percentuale della grandezza della finestra chart."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="ArrowUp"; // Nome del segno
input int InpDate=25; // Anchor point date in %
input int InpPrice=25; // Anchor point price in %
input ENUM_ARROW_ANCHOR InpAnchor=ANCHOR_TOP; // Tipo di ancoraggio
input color InpColor=clrRed; // Colore del segno
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- nascondi (true) o mostra (falso) il nome di oggetto grafico nella lista degli oggetti
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- imposta la priorità per ricevere l'evento di un clic del mouse nel grafico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Sposta il punto di ancoraggio |
//+--------------------------------------------------------------------------------+
bool ArrowUpMove(const long chart_ID=0, // ID del chart
const string name="ArrowUp", // nome oggetto
datetime time=0, // coordinate del punto di ancoraggio tempo
double price=0) // anchor point price coordinate
{
//--- se il punto della posizione non è impostato, spostarlo nella barra corrente che ha il prezzo
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- resetta il valore dell' errore
ResetLastError();
//--- sposta il punto di ancoraggio
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
": fallimento nello spostare il punto di ancoraggio! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Cambia il tipo di segno di ancoraggio Freccia Giu |
//+--------------------------------------------------------------------------------+
bool ArrowUpAnchorChange(const long chart_ID=0, // ID del chart
const string name="ArrowUp", // nome oggetto
const ENUM_ARROW_ANCHOR anchor=ANCHOR_TOP) // tipo di ancoraggio
{
//--- resetta il valore dell' errore
ResetLastError();
//--- cambia la posizione del punto di ancoraggio
if(!ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor))
{
Print(__FUNCTION__,
": fallimento nel cambiare il tipo di ancora! Error code = ",GetLastError());
return(false);
}
//--- array per la memorizzazione dei valori di data e prezzo da essere usati
//--- per impostare e cambiare le coordinate del segno di ancoraggio
datetime date[];
double price[];
//--- allocazione della memoria
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- riempie l'array delle date
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Fallimento nella copia dei valori tempo! Error code = ",GetLastError());
return;
}
/--- riempie l'array dei prezzi
//--- trova i valori più alti e più bassi del chart
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definisce un cambio di step del prezzo e riempie l'array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definisce i punti per disegnare il segno
int d=InpDate*(bars-1)/100;
int p=InpPrice*(accuracy-1)/100;
//--- crea il segno di Freccia Su sul chart
if(!ArrowUpCreate(0,InpName,0,date[d],price[p],InpAnchor,InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- redisegna il chart ed attende per 1 secondo
ChartRedraw();
Sleep(1000);
//--- ora, sposta il punto di ancoraggio e modificare la sua posizione rispetto al segno
//---contatore del ciclo
int v_steps=accuracy/2;
//--- sposta il punto di ancoraggio
for(int i=0;i<v_steps;i++)
{
//--- usa il seguente valore
if(p<accuracy-1)
p+=1;
//--- sposta il punto
if(!ArrowUpMove(0,InpName,date[d],price[p]))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
OBJ_ARROW _DOW N
S egno Freccia Giù
Nota
La posizione del Punto di ancoraggio relativa al segno può essere scelta tra l'enumerazione
ENUM _ARR OW _ANCH OR .
Segni larghi (più di 5) possono essere creati solo impostando l'appropriato valore della proprietà
OBJPR OP_W IDTH quando si scrive un codice in MetaEditor.
Esempio
Il seguente script crea e muove il segno di Freccia Giù sul grafico. F unzioni speciali sono state
sviluppate per creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste
funzioni " come è" nelle proprie applicazioni.
//--- descrizione
#property description "Lo script disegna il segno di \"Freccia Giù\"."
#property description "Le coordinate del punto di ancoraggio sono impostate in"
#property description "percentuale della grandezza della finestra chart."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="ArrowDown"; // nome del segno
input int InpDate=75; // Punto di ancoraggio "data", in %
input int InpPrice=75; // Punto di ancoraggio "prezzo", in %
input ENUM_ARROW_ANCHOR InpAnchor=ANCHOR_BOTTOM; // Tipo di ancora
input color InpColor=clrRed; // Colore del segno
input ENUM_LINE_STYLE InpStyle=STYLE_DOT; // Stile bordo linea
//--- nascondi (true) o mostra (falso) il nome di oggetto grafico nella lista degli oggetti
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- imposta la priorità per ricevere l'evento di un clic del mouse nel grafico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Sposta il punto di ancoraggio |
//+--------------------------------------------------------------------------------+
bool ArrowDownMove(const long chart_ID=0, // ID del chart
const string name="ArrowDown", // nome dell'oggetto
datetime time=0, // coordinate orarie del punto di ancoraggio
double price=0) // coordinate di prezzo del punto di ancoraggio
{
//--- se il punto della posizione non è impostato, spostarlo nella barra corrente che ha il prezzo
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- resetta il valore dell' errore
ResetLastError();
//--- sposta il punto di ancoraggio
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
": fallimento nello spostare il punto di ancoraggio! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Cambia il tipo di segno di ancoraggio Freccia Giu |
//+--------------------------------------------------------------------------------+
bool ArrowDownAnchorChange(const long chart_ID=0, // ID del chart
const string name="ArrowDown", // nome dell'oggetto
const ENUM_ARROW_ANCHOR anchor=ANCHOR_TOP) // tipo di ancoraggio
{
//--- resetta il valore dell' errore
ResetLastError();
//--- cambia la posizione del punto di ancoraggio
if(!ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor))
{
Print(__FUNCTION__,
": fallimento nel cambiare il tipo di ancora! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Elimina il segno di Freccia Giù |
//+--------------------------------------------------------------------------------+
bool ArrowDownDelete(const long chart_ID=0, // ID del chart
const string name="ArrowDown") // nome del segno
{
//--- resetta il valore dell' errore
ResetLastError();
//--- elimina il segno
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": fallimento nell'eliminazione del segno \"Freccia Giu\"! Error code = ",GetLastError(
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Controlla i valori di punto di ancoraggio ed imposta i valori di default |
//| per quelli vuoti |
//+--------------------------------------------------------------------------------+
void ChangeArrowEmptyPoint(datetime &time,double &price)
{
//--- se il tempo del punto non è impostato, sarà sulla barra corrente
if(!time)
time=TimeCurrent();
//--- se il prezzo del punto non è impostato, avrà un valore Bid
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- imposta la correttezza dei parametri di input
if(InpDate<0 || InpDate>100 || InpPrice<0 || InpPrice>100)
{
Print("Error! Valori non corretti dei parametri di input!");
return;
}
//--- Numero di barre visibili nella finestra del chart
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- grandezza dell'array prezzo
int accuracy=1000;
//--- array per la memorizzazione dei valori di data e prezzo da essere usati
ChartRedraw();
}
//--- 1 secondo di ritardo
Sleep(1000);
//--- cambia la locazione del punto di ancoraggio relativa al segno
ArrowDownAnchorChange(0,InpName,ANCHOR_TOP);
//--- redisegna il chart
ChartRedraw();
//--- 1 secondo di ritardo
Sleep(1000);
//--- elimina il segno dal chart
ArrowDownDelete(0,InpName);
ChartRedraw();
//--- 1 secondo di ritardo
Sleep(1000);
//---
}
OBJ_ARROW _STOP
S egno di S top.
Nota
La posizione del Punto di ancoraggio relativa al segno può essere scelta tra l'enumerazione
ENUM _ARR OW _ANCH OR .
Segni larghi (più di 5) possono essere creati solo impostando l'appropriato valore della proprietà
OBJPR OP_W IDTH quando si scrive un codice in MetaEditor.
Esempio
Il seguente script crea e muove il segno di S top sul chart. Funzioni speciali sono state sviluppate per
creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste funzioni " come è"
nelle proprie applicazioni.
//--- descrizione
#property description "Lo script disegna il segno di \"Stop\"."
#property description "Le coordinate del punto di ancoraggio sono impostate in"
#property description "percentuale della grandezza della finestra chart."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="ArrowStop"; // Nome del segno
input int InpDate=10; // Data de punto di ancoraggio in %
input int InpPrice=50; // prezzo del punto di ancoraggio, in %
input ENUM_ARROW_ANCHOR InpAnchor=ANCHOR_BOTTOM; // tipo di ancoraggio
input color InpColor=clrRed; // Colore del segno
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- nascondi (true) o mostra (falso) il nome di oggetto grafico nella lista degli oggetti
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- imposta la priorità per ricevere l'evento di un clic del mouse nel grafico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Sposta il punto di ancoraggio |
//+--------------------------------------------------------------------------------+
bool ArrowStopMove(const long chart_ID=0, // ID del chart
const string name="ArrowStop", // nome dell'oggetto
datetime time=0, // coordinate orarie del punto di ancoraggio
double price=0) // coordinate di prezzo del punto di ancoraggio
{
//--- se il punto della posizione non è impostato, spostarlo nella barra corrente che ha il prezzo
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- resetta il valore dell' errore
ResetLastError();
//--- sposta il punto di ancoraggio
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
": fallimento nello spostare il punto di ancoraggio! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Cambia il tipo di segno di ancoraggio Stop |
//+--------------------------------------------------------------------------------+
bool ArrowStopAnchorChange(const long chart_ID=0, // ID del chart
const string name="ArrowStop", // nome dell'oggetto
const ENUM_ARROW_ANCHOR anchor=ANCHOR_TOP) // posizione punto di ancorag
{
//--- resetta il valore dell' errore
ResetLastError();
//--- cambia il tipo di ancora
if(!ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor))
{
Print(__FUNCTION__,
": fallimento nel cambiare il tipo di ancora! Error code = ",GetLastError());
return(false);
}
//--- array per la memorizzazione dei valori di data e prezzo da essere usati
//--- per impostare e cambiare le coordinate del segno di ancoraggio
datetime date[];
double price[];
//--- allocazione della memoria
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- riempie l'array delle date
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Fallimento nella copia dei valori tempo! Error code = ",GetLastError());
return;
}
/--- riempie l'array dei prezzi
//--- trova i valori più alti e più bassi del chart
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definisce un cambio di step del prezzo e riempie l'array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definisce i punti per disegnare il segno
int d=InpDate*(bars-1)/100;
int p=InpPrice*(accuracy-1)/100;
//--- creare il segno Stop sul chart
if(!ArrowStopCreate(0,InpName,0,date[d],price[p],InpAnchor,InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- redisegna il chart ed attende per 1 secondo
ChartRedraw();
Sleep(1000);
//--- ora, sposta il punto di ancoraggio e modificare la sua posizione rispetto al segno
//---contatore del ciclo
int h_steps=bars*2/5;
//--- sposta il punto di ancoraggio
for(int i=0;i<h_steps;i++)
{
//--- usa il seguente valore
if(d<bars-1)
d+=1;
//--- sposta il punto
if(!ArrowStopMove(0,InpName,date[d],price[p]))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
OBJ_ARROW _CHECK
S egno di Controllo.
Nota
La posizione del Punto di ancoraggio relativa al segno può essere scelta tra l'enumerazione
ENUM _ARR OW _ANCH OR .
Segni larghi (più di 5) possono essere creati solo impostando l'appropriato valore della proprietà
OBJPR OP_W IDTH quando si scrive un codice in MetaEditor.
Esempio
Il seguente script crea e muove il segno di Check sul grafico. Funzioni speciali sono state sviluppate
per creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste funzioni " come
è" nelle proprie applicazioni.
//--- descrizione
#property description "Lo script disegna il segno \"Check\"."
#property description "Le coordinate del punto di ancoraggio sono impostate in"
#property description "percentuale della grandezza della finestra chart."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="ArrowCheck"; // Nome del segno
input int InpDate=10; // data del punto di ancoraggio, in %
input int InpPrice=50; // prezzo del punto di ancoraggio, in %
input ENUM_ARROW_ANCHOR InpAnchor=ANCHOR_TOP; // Tipo di ancoraggio
input color InpColor=clrRed; // Colore del segno
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- nascondi (true) o mostra (falso) il nome di oggetto grafico nella lista degli oggetti
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- imposta la priorità per ricevere l'evento di un clic del mouse nel grafico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Sposta il punto di ancoraggio |
//+--------------------------------------------------------------------------------+
bool ArrowCheckMove(const long chart_ID=0, // ID del chart
const string name="ArrowCheck", // nome oggetto
datetime time=0, // coordinate tempo, del punto di ancoraggio
double price=0) // coordinate prezzo, del punto di ancoraggio
{
//--- se il punto della posizione non è impostato, spostarlo nella barra corrente che ha il prezzo
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- resetta il valore dell' errore
ResetLastError();
//--- sposta il punto di ancoraggio
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
": fallimento nello spostare il punto di ancoraggio! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Cambia il tipo di ancoraggio Check |
//+--------------------------------------------------------------------------------+
bool ArrowCheckAnchorChange(const long chart_ID=0, // ID del chart
const string name="ArrowCheck", // nome oggetto
const ENUM_ARROW_ANCHOR anchor=ANCHOR_TOP) // tipo di ancora
{
//--- resetta il valore dell' errore
ResetLastError();
//--- cambia il tipo di ancora
if(!ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor))
{
Print(__FUNCTION__,
": fallimento nel cambiare il tipo di ancora! Error code = ",GetLastError());
return(false);
}
//--- array per la memorizzazione dei valori di data e prezzo da essere usati
//--- per impostare e cambiare le coordinate del segno di ancoraggio
datetime date[];
double price[];
//--- allocazione della memoria
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- riempie l'array delle date
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Fallimento nella copia dei valori tempo! Error code = ",GetLastError());
return;
}
/--- riempie l'array dei prezzi
//--- trova i valori più alti e più bassi del chart
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definisce un cambio di step del prezzo e riempie l'array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definisce i punti per disegnare il segno
int d=InpDate*(bars-1)/100;
int p=InpPrice*(accuracy-1)/100;
//--- creare il segno Check sul chart
if(!ArrowCheckCreate(0,InpName,0,date[d],price[p],InpAnchor,InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- redisegna il chart ed attende per 1 secondo
ChartRedraw();
Sleep(1000);
//--- ora, sposta il punto di ancoraggio e modificare la sua posizione rispetto al segno
//---contatore del ciclo
int h_steps=bars*2/5;
//--- sposta il punto di ancoraggio
for(int i=0;i<h_steps;i++)
{
//--- usa il seguente valore
if(d<bars-1)
d+=1;
//--- sposta il punto
if(!ArrowCheckMove(0,InpName,date[d],price[p]))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
OBJ_ARROW _LEFT_PRICE
Etichetta Prezzo a S inistra
Esempio
Il seguente script crea e sposta l'etichetta prezzo sinistra, sul chart. Funzioni speciali sono state
sviluppate per creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste
funzioni " come è" nelle proprie applicazioni.
//--- descrizione
#property description "Lo Script crea l'etichetta prezzo sinistra sul chart."
#property description "Le coordinate del punto di ancoraggio sono impostate in"
#property description "percentuale della grandezza della finestra chart."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="LeftPrice"; // Nome dell'etichetta prezzo
input int InpDate=100; // data del punto di ancoraggio in %
input int InpPrice=10; // prezzo del punto di ancoraggio in %
input color InpColor=clrRed; // Colore dell'etichetta del prezzo
input ENUM_LINE_STYLE InpStyle=STYLE_SOLID; // stile del bordo della linea
input int InpWidth=2; // grandezza dell'etichetta prezzo
input bool InpBack=false; // sottofondo etichetta
input bool InpSelection=true; // evidenza spostamento
input bool InpHidden=true; // Nascosta nella lista oggetti
input long InpZOrder=0; // Priorità per il click del mouse
//+--------------------------------------------------------------------------------+
//| Crea l'etichetta prezzo a sinistra |
//+--------------------------------------------------------------------------------+
bool ArrowLeftPriceCreate(const long chart_ID=0, // ID del chart
const string name="LeftPrice", // nome dell'etichetta prezzo
const int sub_window=0, // indice sottofinestra
datetime time=0, // orario del punto di ancoraggi
double price=0, // prezzo del punto di ancoraggi
const color clr=clrRed, // colore dell'etichetta prezzo
const ENUM_LINE_STYLE style=STYLE_SOLID, // stile del bordo della linea
const int width=1, // grandezza dell'etichetta del
const bool back=false, // in sottofondo
const bool selection=true, // evidenza movimento
const bool hidden=true, // nascosto nella lista oggetti
const long z_order=0) // priorità per il click del mou
{
//--- imposta coordinate punto di ancoraggio se non sono impostate
ChangeArrowEmptyPoint(time,price);
//--- resetta il valore dell' errore
ResetLastError();
//--- crea l'etichetta prezzo
if(!ObjectCreate(chart_ID,name,OBJ_ARROW_LEFT_PRICE,sub_window,time,price))
{
Print(__FUNCTION__,
": fallimento nella creazione dell'etichetta prezzo a sinistra! Error code = ",GetLastE
return(false);
}
//--- imposta il colore dell'etichetta
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- imposta lo stile del bordo linea
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- imposta lo spessore dell'etichetta
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- mostra in primo piano (false) o sottofondo (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- abilita (true) o disabilita (false) il modo di spostamento dell'etichetta con il mouse
//--- quando si crea un oggetto grafico utilizzando la funzione ObjectCreate, l'oggetto non può ess
//--- evidenziato e mosso, per default. All'interno di questo metodo, la selezione dei parametri
//--- è true per default, il che consente di evidenziare e spostare l'oggetto
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- nascondi (true) o mostra (falso) il nome di oggetto grafico nella lista degli oggetti
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- imposta la priorità per ricevere l'evento di un clic del mouse nel grafico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Sposta il punto di ancoraggio |
//+--------------------------------------------------------------------------------+
}
//--- redisegna il chart ed attende per 1 secondo
ChartRedraw();
Sleep(1000);
//--- ora, sposta il punto di ancoraggio
//---contatore del ciclo
int v_steps=accuracy*4/5;
//--- sposta il punto di ancoraggio
for(int i=0;i<v_steps;i++)
{
//--- usa il seguente valore
if(p<accuracy-1)
p+=1;
//--- sposta il punto
if(!ArrowLeftPriceMove(0,InpName,date[d],price[p]))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
}
//--- 1 secondo di ritardo
Sleep(1000);
//--- elimina l'etichetta dal chart
ArrowLeftPriceDelete(0,InpName);
ChartRedraw();
//--- 1 secondo di ritardo
Sleep(1000);
//---
}
OBJ_ARROW _RIGHT_PRICE
Etichetta, prezzo destra.
Esempio
Il seguente script crea e sposta l' etichetta prezzo a destra, sul chart. Funzioni speciali sono state
sviluppate per creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste
funzioni " come è" nelle proprie applicazioni.
//--- descrizione
#property description "Lo Script crea l'etichetta prezzo destra sul chart."
#property description "Le coordinate del punto di ancoraggio sono impostate in"
#property description "percentuale della grandezza della finestra chart."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="RightPrice"; // Nome dell'etichetta prezzo
input int InpDate=0; // data del punto di ancoraggio, in %
input int InpPrice=90; // prezzo del punto di ancoraggio in %
input color InpColor=clrRed; // Colore dell'etichetta del prezzo
input ENUM_LINE_STYLE InpStyle=STYLE_SOLID; // stile del bordo della linea
input int InpWidth=2; // grandezza dell'etichetta prezzo
input bool InpBack=false; // sottofondo etichetta
input bool InpSelection=true; // evidenza spostamento
input bool InpHidden=true; // Nascosta nella lista oggetti
input long InpZOrder=0; // Priorità per il click del mouse
//+--------------------------------------------------------------------------------+
//| Crea l'etichetta prezzo a destra |
//+--------------------------------------------------------------------------------+
bool ArrowRightPriceCreate(const long chart_ID=0, // ID del chart
const string name="RightPrice", // nome dell'etichetta prezzo
const int sub_window=0, // indice sottofinestra
datetime time=0, // orario punto di ancoraggio
double price=0, // prezzo del punto di ancoragg
const color clr=clrRed, // colore dell'etichetta prezzo
const ENUM_LINE_STYLE style=STYLE_SOLID, // stile del bordo della linea
const int width=1, // grandezza dell'etichetta del
const bool back=false, // in sottofondo
const bool selection=true, // evidenza movimento
const bool hidden=true, // nascosto nella lista oggetti
const long z_order=0) // priorità per il click del mo
{
//--- imposta coordinate punto di ancoraggio se non sono impostate
ChangeArrowEmptyPoint(time,price);
//--- resetta il valore dell' errore
ResetLastError();
//--- crea l'etichetta prezzo
if(!ObjectCreate(chart_ID,name,OBJ_ARROW_RIGHT_PRICE,sub_window,time,price))
{
Print(__FUNCTION__,
": fallimento nella creazione dell'etichetta prezzo a destra! Error code = ",GetLastErr
return(false);
}
//--- imposta il colore dell'etichetta
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- imposta lo stile del bordo linea
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- imposta lo spessore dell'etichetta
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- mostra in primo piano (false) o sottofondo (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- abilita (true) o disabilita (false) il modo di spostamento dell'etichetta con il mouse
//--- quando si crea un oggetto grafico utilizzando la funzione ObjectCreate, l'oggetto non può ess
//--- evidenziato e mosso, per default. All'interno di questo metodo, la selezione dei parametri
//--- è true per default, il che consente di evidenziare e spostare l'oggetto
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- nascondi (true) o mostra (falso) il nome di oggetto grafico nella lista degli oggetti
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- imposta la priorità per ricevere l'evento di un clic del mouse nel grafico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Sposta il punto di ancoraggio |
//+--------------------------------------------------------------------------------+
}
//--- redisegna il chart ed attende per 1 secondo
ChartRedraw();
Sleep(1000);
//--- ora, sposta il punto di ancoraggio
//---contatore del ciclo
int v_steps=accuracy*4/5;
//--- sposta il punto di ancoraggio
for(int i=0;i<v_steps;i++)
{
//--- usa il seguente valore
if(p>1)
p-=1;
//--- sposta il punto
if(!ArrowRightPriceMove(0,InpName,date[d],price[p]))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
}
//--- 1 secondo di ritardo
Sleep(1000);
//--- elimina l'etichetta dal chart
ArrowRightPriceDelete(0,InpName);
ChartRedraw();
//--- 1 secondo di ritardo
Sleep(1000);
//---
}
OBJ_ARROW _BUY
S egno Buy.
Esempio
Il seguente script crea e muove il segno Buy sul grafico. Funzioni speciali sono state sviluppate per
creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste funzioni " come è"
nelle proprie applicazioni.
//--- descrizione
#property description "Lo Script disegna segni \"Buy\" nella finestra chart."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input color InpColor=C'3,95,172'; // Colore dei segni
//+--------------------------------------------------------------------------------+
//| Crea il segno Buy |
//+--------------------------------------------------------------------------------+
bool ArrowBuyCreate(const long chart_ID=0, // ID del chart
const string name="ArrowBuy", // nome del segno
const int sub_window=0, // indice sottofinestra
datetime time=0, // orario del punto di ancoraggio
double price=0, // prezzo del punto di ancoraggio
const color clr=C'3,95,172', // colore del segno
const ENUM_LINE_STYLE style=STYLE_SOLID, // stile linea (quando evidenziata)
const int width=1, // spessore linea (quando evidenziata)
const bool back=false, // in sottofondo
const bool selection=false, // evidenziazione di spostamento
{
Print(__FUNCTION__,
": fallimento nello spostare il punto di ancoraggio! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Elimina il segno di Buy |
//+--------------------------------------------------------------------------------+
bool ArrowBuyDelete(const long chart_ID=0, // ID del chart
const string name="ArrowBuy") // nome del segno
{
//--- resetta il valore dell' errore
ResetLastError();
//--- elimina il segno
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": fallimento nell'eliminazione del segno \"Buy\"! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Controlla i valori di punto di ancoraggio ed imposta i valori di default |
//| per quelli vuoti |
//+--------------------------------------------------------------------------------+
void ChangeArrowEmptyPoint(datetime &time,double &price)
{
//--- se il tempo del punto non è impostato, sarà sulla barra corrente
if(!time)
time=TimeCurrent();
//--- se il prezzo del punto non è impostato, avrà un valore Bid
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
datetime date[]; // array per memorizzare le date di barre visibili
double low[]; // array per memorizzare i prezzi Low delle barre visibili
double high[]; // array memorizzare i prezzi High di barre visibili
//--- Numero di barre visibili nella finestra del chart
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
OBJ_ARROW _SELL
S egno di S ell.
Esempio
Il seguente script crea e sposta il segno di S ell sul chart. Funzioni speciali sono state sviluppate per
creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste funzioni " come è"
nelle proprie applicazioni.
//--- descrizione
#property description "Script draws \"Sell\" segni nella finestra del chart."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input color InpColor=C'225,68,29'; // Colore dei segni
//+--------------------------------------------------------------------------------+
//| Crea il segno Sell |
//+--------------------------------------------------------------------------------+
bool ArrowSellCreate(const long chart_ID=0, // ID del chart
const string name="ArrowSell", // nome del segno
const int sub_window=0, // indice sottofinestra
datetime time=0, // orario punto di ancoraggio
double price=0, // prezzo punto di ancoraggio
const color clr=C'225,68,29', // colore del segno
const ENUM_LINE_STYLE style=STYLE_SOLID, // stile linea (quando evidenziata)
const int width=1, // spessore linea (quando evidenziata
const bool back=false, // in sottofondo
const bool selection=false, // evidenzia per muovere
{
Print(__FUNCTION__,
": fallimento nello spostare il punto di ancoraggio! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Elimina il segno Sell |
//+--------------------------------------------------------------------------------+
bool ArrowSellDelete(const long chart_ID=0, // ID del chart
const string name="ArrowSell") // nome del segno
{
//--- resetta il valore dell' errore
ResetLastError();
//--- elimina il segno
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": fallimento nell'eliminazione del segno \"Sell\"! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Controlla i valori di punto di ancoraggio ed imposta i valori di default |
//| per quelli vuoti |
//+--------------------------------------------------------------------------------+
void ChangeArrowEmptyPoint(datetime &time,double &price)
{
//--- se il tempo del punto non è impostato, sarà sulla barra corrente
if(!time)
time=TimeCurrent();
//--- se il prezzo del punto non è impostato, avrà un valore Bid
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
datetime date[]; // array per memorizzare le date di barre visibili
double low[]; // array per memorizzare i prezzi Low delle barre visibili
double high[]; // array memorizzare i prezzi High di barre visibili
//--- Numero di barre visibili nella finestra del chart
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
OBJ_ARROW
Oggetto Freccia.
Nota
La posizione del punto di ancoraggio relativa all'oggetto può essere selezionata da
ENUM _ARR OW _ANCH OR .
Frecce grandi (più di 5) possono essere create solo impostando l'appropriato valore della proprietà
OBJPR OP_W IDTH quando si scrive un codice MetaEditor.
I l tipo freccia necessaria può essere selezionata impostando uno dei codici simbolo del carattere
W ingdings.
Esempio
Lo script che segue crea un oggetto Arrow sul grafico e cambia il suo tipo. Funzioni speciali sono
state sviluppate per creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare
queste funzioni " come è" nelle proprie applicazioni.
//--- descrizione
#property description "Lo script crea una freccia casuale nella finestra chart."
#property description "Le coordinate del punto di ancoraggio sono impostate in"
#property description "percentuale della grandezza della finestra chart."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="Arrow"; // Nome della freccia
input int InpDate=50; // data del punto di ancoraggio in %
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- abilita (true) o disabilita (false) la modalità di spostare la freccia con il mouse
//--- quando si crea un oggetto grafico utilizzando la funzione ObjectCreate, l'oggetto non può ess
//--- evidenziato e mosso, per default. All'interno di questo metodo, la selezione dei parametri
//--- è true per default, il che consente di evidenziare e spostare l'oggetto
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- nascondi (true) o mostra (falso) il nome di oggetto grafico nella lista degli oggetti
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- imposta la priorità per ricevere l'evento di un clic del mouse nel grafico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Sposta il punto di ancoraggio |
//+--------------------------------------------------------------------------------+
bool ArrowMove(const long chart_ID=0, // ID del chart
const string name="Arrow", // nome dell'oggetto
datetime time=0, // coordinate orario, del punto di ancoraggio
double price=0) // coordinate prezzo, del punto di ancoraggio
{
//--- se il punto della posizione non è impostato, spostarlo nella barra corrente che ha il prezzo
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- resetta il valore dell' errore
ResetLastError();
//--- sposta il punto di ancoraggio
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
": fallimento nello spostare il punto di ancoraggio! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Modifica il codice freccia |
//+--------------------------------------------------------------------------------+
bool ArrowCodeChange(const long chart_ID=0, // ID del chart
const string name="Arrow", // nome dell'oggetto
const uchar code=252) // codice freccia
{
//--- resetta il valore dell' errore
ResetLastError();
//--- cambia il codice freccia
if(!ObjectSetInteger(chart_ID,name,OBJPROP_ARROWCODE,code))
{
Print(__FUNCTION__,
": fallimento nel cambiare il codice freccia! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Cambia il tipo di ancoraggio |
//+--------------------------------------------------------------------------------+
bool ArrowAnchorChange(const long chart_ID=0, // ID del chart
const string name="Arrow", // nome dell'oggetto
const ENUM_ARROW_ANCHOR anchor=ANCHOR_TOP) // tipo di ancoraggio
{
//--- resetta il valore dell' errore
ResetLastError();
//--- cambia il tipo di ancora
if(!ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor))
{
Print(__FUNCTION__,
": fallimento nel cambiare il tipo di ancora! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//--- creare una freccia |
//+--------------------------------------------------------------------------------+
bool ArrowDelete(const long chart_ID=0, // ID del chart
const string name="Arrow") // nome della freccia
{
//--- resetta il valore dell' errore
ResetLastError();
//--- elimina la freccia
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": fallimento nell'eliminare la freccia! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Controlla i valori di punto di ancoraggio ed imposta i valori di default |
//| per quelli vuoti |
//+--------------------------------------------------------------------------------+
void ChangeArrowEmptyPoint(datetime &time,double &price)
{
//--- se il tempo del punto non è impostato, sarà sulla barra corrente
if(!time)
time=TimeCurrent();
//--- se il prezzo del punto non è impostato, avrà un valore Bid
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- imposta la correttezza dei parametri di input
if(InpDate<0 || InpDate>100 || InpPrice<0 || InpPrice>100)
{
Print("Error! Valori non corretti dei parametri di input!");
return;
}
//--- Numero di barre visibili nella finestra del chart
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- grandezza dell'array prezzo
int accuracy=1000;
//--- array per la memorizzazione dei valori di data e prezzo da essere usati
//--- per impostare e cambiare le coordinate del segno di ancoraggio
datetime date[];
double price[];
//--- allocazione della memoria
ArrayResize(date,bars);
ArrayResize(price,accuracy);
//--- riempie l'array delle date
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Fallimento nella copia dei valori tempo! Error code = ",GetLastError());
return;
}
/--- riempie l'array dei prezzi
//--- trova i valori più alti e più bassi del chart
double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- definisce un cambio di step del prezzo e riempie l'array
double step=(max_price-min_price)/accuracy;
for(int i=0;i<accuracy;i++)
price[i]=min_price+i*step;
//--- definisce i punti per disegnare la freccia
int d=InpDate*(bars-1)/100;
int p=InpPrice*(accuracy-1)/100;
//--- crea la freccia sul grafico
if(!ArrowCreate(0,InpName,0,date[d],price[p],32,InpAnchor,InpColor,
InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- redisegna il chart
ChartRedraw();
//--- considera tutti i casi di creazione delle frecce in loop
for(int i=33;i<256;i++)
{
if(!ArrowCodeChange(0,InpName,(uchar)i))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
// ritardo di mezzo secondo
Sleep(500);
}
//--- 1 secondo di ritardo
Sleep(1000);
//--- elimina la freccia dal grafico
ArrowDelete(0,InpName);
ChartRedraw();
//--- 1 secondo di ritardo
Sleep(1000);
//---
}
OBJ_TEXT
Oggetto T esto
Nota
La posizione del punto di ancoraggio relativa al testo può essere scelta dall'enumerazione
ENUM _ANCH OR_POINT . È inoltre possibile modificare la pendenza del testo con la
proprietàOBJPR OP_ANGLE.
Esempio
Il seguente script crea diversi oggetti T esto sul chart. Funzioni speciali sono state sviluppate per
creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste funzioni " come è"
nelle proprie applicazioni.
//--- descrizione
#property description "Lo script crea l'oggetto grafico \"Testo\"."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpFont="Arial"; // Font
input int InpFontSize=10; // Grandezza del font
input color InpColor=clrRed; // Colore
input double InpAngle=90.0; // Angolo di pendenza in gradi
input ENUM_ANCHOR_POINT InpAnchor=ANCHOR_LEFT; // Tipo di ancora
input bool InpBack=false; // Oggetto di sottofondo
input bool InpSelection=false; // Evidenzia di movimento
input bool InpHidden=true; // Nascosta nella lista oggetti
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- imposta la priorità per ricevere l'evento di un clic del mouse nel grafico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Sposta il punto di ancoraggio |
//+--------------------------------------------------------------------------------+
bool TextMove(const long chart_ID=0, // ID del chart
const string name="Text", // nome dell'oggetto
datetime time=0, // coordinate tempo, del punto di ancoraggio
double price=0) // coordinate prezzo del punto di ancoraggio
{
//--- se il punto della posizione non è impostato, spostarlo nella barra corrente che ha il prezzo
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- resetta il valore dell' errore
ResetLastError();
//--- sposta il punto di ancoraggio
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
": fallimento nello spostare il punto di ancoraggio! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Cambia il testo dell'oggetto |
//+--------------------------------------------------------------------------------+
bool TextChange(const long chart_ID=0, // ID del chart
const string name="Text", // nome dell'oggetto
const string text="Text") // testo
{
//--- resetta il valore dell' errore
ResetLastError();
//--- cambia il testo dell'oggetto
if(!ObjectSetString(chart_ID,name,OBJPROP_TEXT,text))
{
Print(__FUNCTION__,
": fallimento nel cambiare il testo! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Elimina l'oggetto Testo |
//+--------------------------------------------------------------------------------+
bool TextDelete(const long chart_ID=0, // ID del chart
const string name="Text") // nome dell'oggetto
{
//--- resetta il valore dell' errore
ResetLastError();
//--- elimina l'oggetto
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": fallimento nell'eliminare l'oggetto \"Testo\"! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Controlla i valori di punto di ancoraggio ed imposta i valori di default |
//| per quelli vuoti |
//+--------------------------------------------------------------------------------+
void ChangeTextEmptyPoint(datetime &time,double &price)
{
//--- se il tempo del punto non è impostato, sarà sulla barra corrente
if(!time)
time=TimeCurrent();
//--- se il prezzo del punto non è impostato, avrà un valore Bid
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
datetime date[]; // array per memorizzare le date di barre visibili
double low[]; // array per memorizzare i prezzi Low delle barre visibili
double high[]; // array memorizzare i prezzi High di barre visibili
//--- Numero di barre visibili nella finestra del chart
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- allocazione della memoria
ArrayResize(date,bars);
ArrayResize(low,bars);
ArrayResize(high,bars);
//--- riempie l'array delle date
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Fallimento nella copia dei valori tempo! Error code = ",GetLastError());
return;
}
//--- riempie l'array dei prezzi Low
if(CopyLow(Symbol(),Period(),0,bars,low)==-1)
{
Print("Fallimento nel copiare i valori dei prezzi Low! Error code = ",GetLastError());
return;
}
//--- riempie l'array di prezzi High
if(CopyHigh(Symbol(),Period(),0,bars,high)==-1)
{
Print("Fallimento nel copiare i valori dei prezzi High! Error code = ",GetLastError());
return;
}
//--- definisce quanto spesso il testo viene visualizzato
int scale=(int)ChartGetInteger(0,CHART_SCALE);
//--- definisce lo step
int step=1;
switch(scale)
{
case 0:
step=12;
break;
case 1:
step=6;
break;
case 2:
step=4;
break;
case 3:
step=2;
break;
}
//--- crea il testo per i valori High e Low delle barre (con i gaps)
for(int i=0;i<bars;i+=step)
{
//--- crea il testo
if(!TextCreate(0,"TextHigh_"+(string)i,0,date[i],high[i],DoubleToString(high[i],5),InpFont,In
InpColor,InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
if(!TextCreate(0,"TextLow_"+(string)i,0,date[i],low[i],DoubleToString(low[i],5),InpFont,InpFo
InpColor,-InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
OBJ_LABEL
Oggetto Etichetta.
Nota
La posizione del punto di ancoraggio relativa all'etichetta può essere scelta dall'enumerazione
ENUM _ANCH OR_POINT . Le coordinate del punto di ancoraggio sono fissate in pix el.
Esempio
Il seguente script crea e sposta l'oggetto Modifica sul grafico. Funzioni speciali sono state sviluppate
per creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste funzioni " come
è" nelle proprie applicazioni.
//--- descrizione
#property description "Lo script crea l'oggetto grafico \"Etichetta\"."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="Label"; // Nome Etichetta
input int InpX=150; // distanza asse X
input int InpY=150; // distanza asse Y
input string InpFont="Arial"; // Font
input int InpFontSize=14; // Grandezza del Font
input color InpColor=clrRed; // Colore
input double InpAngle=0.0; // Angolo di inclinazione in gradi
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- memorizza le coordinate dell'etichetta nelle variabili locali
int x=InpX;
int y=InpY;
//--- grandezza della finestra chart
long x_distance;
long y_distance;
//--- imposta la grandezza della finestra
if(!ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0,x_distance))
{
Print("Fallimento nell'ottenere la grandezza del chart! Error code = ",GetLastError());
return;
}
if(!ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0,y_distance))
{
Print("Fallimento nell'ottenere l'altezza del chart! Error code = ",GetLastError());
return;
}
//--- imposta la correttezza dei parametri di input
if(InpX<0 || InpX>x_distance-1 || InpY<0 || InpY>y_distance-1)
{
Print("Error! Valori non corretti dei parametri di input!");
return;
}
//--- prepara il testo iniziale per l'etichetta
string text;
StringConcatenate(text,"Upper left corner: ",x,",",y);
//--- crea un'etichetta di testo sul chart
if(!LabelCreate(0,InpName,0,InpX,InpY,CORNER_LEFT_UPPER,text,InpFont,InpFontSize,
InpColor,InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- redisegna il chart ed attende per mezzo secondo
ChartRedraw();
Sleep(500);
//--- sposta l'etichetta e modifica il testo, simultaneamente
//--- numero di iterazioni per assi
int h_steps=(int)(x_distance/2-InpX);
int v_steps=(int)(y_distance/2-InpY);
//--- sposta l'etichetta verso il basso
for(int i=0;i<v_steps;i++)
{
//--- cambia le coordinate
y+=2;
//--- sposta l'etichetta e cambia il suo testo
MoveAndTextChange(x,y,"Angolo sinistro superiore: ");
}
//--- ritardo di mezzo secondo
Sleep(500);
//--- sposta l'etichetta sulla destra
for(int i=0;i<h_steps;i++)
{
//--- cambia le coordinate
x+=2;
//--- sposta l'etichetta e cambia il suo testo
MoveAndTextChange(x,y,"Angolo sinistro superiore: ");
}
//--- ritardo di mezzo secondo
Sleep(500);
//--- sposta l'etichetta verso l'alto
for(int i=0;i<v_steps;i++)
{
//--- cambia le coordinate
y-=2;
//--- sposta l'etichetta e cambia il suo testo
MoveAndTextChange(x,y,"Angolo sinistro superiore: ");
}
//--- ritardo di mezzo secondo
Sleep(500);
//--- sposta l'etichetta a sinistra
for(int i=0;i<h_steps;i++)
{
//--- cambia le coordinate
x-=2;
//--- sposta l'etichetta e cambia il suo testo
MoveAndTextChange(x,y,"Angolo sinistro superiore: ");
}
//--- ritardo di mezzo secondo
Sleep(500);
//--- ora, sposta il punto cambiando l'angolo di ancoraggio
//--- spostandolo verso l'angolo inferiore sinistro
if(!LabelChangeCorner(0,InpName,CORNER_LEFT_LOWER))
return;
//--- cambia il testo dell'etichetta
StringConcatenate(text,"Lower left corner: ",x,",",y);
if(!LabelTextChange(0,InpName,text))
return;
//--- redraw the chart and wait for two seconds
ChartRedraw();
Sleep(2000);
//--- spostato all'angolo inferiore destro
if(!LabelChangeCorner(0,InpName,CORNER_RIGHT_LOWER))
return;
//--- cambia il testo dell'etichetta
StringConcatenate(text,"Lower right corner: ",x,",",y);
if(!LabelTextChange(0,InpName,text))
return;
//--- redraw the chart and wait for two seconds
ChartRedraw();
Sleep(2000);
//--- spostato all'angolo superiore destro
if(!LabelChangeCorner(0,InpName,CORNER_RIGHT_UPPER))
return;
//--- cambia il testo dell'etichetta
StringConcatenate(text,"Upper right corner: ",x,",",y);
if(!LabelTextChange(0,InpName,text))
return;
//--- redraw the chart and wait for two seconds
ChartRedraw();
Sleep(2000);
//--- spostandolo all'angolo superiore sinistro
if(!LabelChangeCorner(0,InpName,CORNER_LEFT_UPPER))
return;
//--- cambia il testo dell'etichetta
StringConcatenate(text,"Upper left corner: ",x,",",y);
if(!LabelTextChange(0,InpName,text))
return;
//--- redraw the chart and wait for two seconds
ChartRedraw();
Sleep(2000);
//--- elimina l'etichetta
LabelDelete(0,InpName);
//--- redisegna il chart ed attende per mezzo secondo
ChartRedraw();
Sleep(500);
//---
}
//+--------------------------------------------------------------------------------+
//| La funzione sposta l'oggetto e cambia il suo testo |
//+--------------------------------------------------------------------------------+
bool MoveAndTextChange(const int x,const int y,string text)
{
//--- sposta l'etichetta
if(!LabelMove(0,InpName,x,y))
return(false);
//--- cambia il testo dell'etichetta
StringConcatenate(text,text,x,",",y);
if(!LabelTextChange(0,InpName,text))
return(false);
//--- verifica se il funzionamento dello script è stato forzatamente disattivato
if(IsStopped())
return(false);
//--- redisegna il chart
ChartRedraw();
OBJ_BUTTON
Oggetto bottone.
Nota
Le coordinate del punto di ancoraggio sono impostate in pix els. È possibile selezionare l'angolo di
ancoraggio del bottone da ENUM _BAS E_CORNER .
Esempio
The following script creates and moves Button object on the chart. F unzioni speciali sono state
sviluppate per creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste
funzioni " come è" nelle proprie applicazioni.
//--- descrizione
#property description "Lo Script crea il bottone sul chart."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="Button"; // Nome bottone
input ENUM_BASE_CORNER InpCorner=CORNER_LEFT_UPPER; // Angolo del chart per l'ancoraggio
input string InpFont="Arial"; // Font
input int InpFontSize=14; // Grandezza Font
input color InpColor=clrBlack; // Colore del testo
input color InpBackColor=C'236,233,216'; // Colore sottofondo
input color InpBorderColor=clrNONE; // Colore bordo
input bool InpState=false; // Premuto/Rilasciato
input bool InpBack=false; // Oggetto sottofondo
input bool InpSelection=false; // Evidenzia movimento
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- imposta colore di background
ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr);
//--- imposta colore del bordo
ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr);
//--- mostra in primo piano (false) o sottofondo (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- set button state
ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state);
//--- abilita (true) o disabilita (false) la modalità di movimento del bottone con il mouse
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- nascondi (true) o mostra (falso) il nome di oggetto grafico nella lista degli oggetti
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- imposta la priorità per ricevere l'evento di un clic del mouse nel grafico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Sposta il bottone |
//+--------------------------------------------------------------------------------+
bool ButtonMove(const long chart_ID=0, // ID del chart
const string name="Button", // nome del bottone
const int x=0, // coordinate X
const int y=0) // coordinate Y
{
//--- resetta il valore dell' errore
ResetLastError();
//--- sposta il bottone
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x))
{
Print(__FUNCTION__,
": fallimento nello spostamento delle coordinate X del bottone! Error code = ",GetLastE
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y))
{
Print(__FUNCTION__,
": fallimento nello spostamento delle coordinate Y del bottone! Error code = ",GetLastE
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Cambia la grandezza del bottone |
//+--------------------------------------------------------------------------------+
bool ButtonChangeSize(const long chart_ID=0, // ID del chart
ResetLastError();
//--- cambia il testo dell'oggetto
if(!ObjectSetString(chart_ID,name,OBJPROP_TEXT,text))
{
Print(__FUNCTION__,
": fallimento nel cambiare il testo! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Elimina il bottone |
//+--------------------------------------------------------------------------------+
bool ButtonDelete(const long chart_ID=0, // ID del chart
const string name="Button") // nome del bottone
{
//--- resetta il valore dell' errore
ResetLastError();
//--- elimina il bottone
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": fallimento nell'eliminare il bottone! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- grandezza della finestra chart
long x_distance;
long y_distance;
//--- imposta la grandezza della finestra
if(!ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0,x_distance))
{
Print("Fallimento nell'ottenere la grandezza del chart! Error code = ",GetLastError());
return;
}
if(!ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0,y_distance))
{
Print("Fallimento nell'ottenere l'altezza del chart! Error code = ",GetLastError());
return;
}
//--- definisce lo step per il cambio della grandezza del bottone
int x_step=(int)x_distance/32;
int y_step=(int)y_distance/32;
//--- imposta le coordinate del bottone e la sua grandezza
int x=(int)x_distance/32;
int y=(int)y_distance/32;
int x_size=(int)x_distance*15/16;
int y_size=(int)y_distance*15/16;
//--- crea il bottone
if(!ButtonCreate(0,InpName,0,x,y,x_size,y_size,InpCorner,"Press",InpFont,InpFontSize,
InpColor,InpBackColor,InpBorderColor,InpState,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- redisegna il chart
ChartRedraw();
//--- riduce il bottone nel loop
int i=0;
while(i<13)
{
//--- ritardo di mezzo secondo
Sleep(500);
//--- commuta il bottone allo stato premuto
ObjectSetInteger(0,InpName,OBJPROP_STATE,true);
//--- ridisegna il chart ed aspetta 0.2 secondi
ChartRedraw();
Sleep(200);
//--- ridefinisce le coordinate e la grandezza del bottone
x+=x_step;
y+=y_step;
x_size-=x_step*2;
y_size-=y_step*2;
//--- riduce il bottone
ButtonMove(0,InpName,x,y);
ButtonChangeSize(0,InpName,x_size,y_size);
//--- riporta indietro lo stato del bottone a rilasciato
ObjectSetInteger(0,InpName,OBJPROP_STATE,false);
//--- ridisegna il chart
ChartRedraw();
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- incrementa il contatore del loop
i++;
}
//--- ritardo di mezzo secondo
Sleep(500);
//--- elimina il bottone
ButtonDelete(0,InpName);
ChartRedraw();
OBJ_CHART
Oggetto Chart.
Nota
Le coordinate del punto di ancoraggio sono impostate in pix els. Puoi selezionare l'angolo di
ancoraggio dall'enumerazione ENUM _BAS E_CORNER .
Simbolo, periodo e la scala possono essere selezionati per l'oggetto Chart. Modalità di
visualizzazione della scala di prezzo e data possono anche essere attivate/disattivate.
Esempio
Lo script che segue crea e sposta l'ogetto Chart sul chart(grafico). F unzioni speciali sono state
sviluppate per creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste
funzioni " come è" nelle proprie applicazioni.
//--- descrizione
#property description "Script creates \"Chart\" object."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="Chart"; // Nome dell'oggetto
input string InpSymbol="EURUSD"; // Simbolo
input ENUM_TIMEFRAMES InpPeriod=PERIOD_H1; // Periodo
input ENUM_BASE_CORNER InpCorner=CORNER_LEFT_UPPER; // Angolo di ancoraggio
input int InpScale=2; // Scala
input bool InpDateScale=true; // Mostra scala temporale
input bool InpPriceScale=true; // Mostra scala prezzo
ObjectSetString(chart_ID,name,OBJPROP_SYMBOL,symbol);
//--- imposta il periodo
ObjectSetInteger(chart_ID,name,OBJPROP_PERIOD,period);
//--- imposta la scala
ObjectSetInteger(chart_ID,name,OBJPROP_CHART_SCALE,scale);
//--- mostra (true) o nascondi (false) la scala temporale
ObjectSetInteger(chart_ID,name,OBJPROP_DATE_SCALE,date_scale);
//--- mostra (true) o nascondi (false) la scala prezzo
ObjectSetInteger(chart_ID,name,OBJPROP_PRICE_SCALE,price_scale);
//--- imposta il colore del bordo quando è abilitata la modalità di evidenziazione
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- imposta lo stile del bordo della linea quando la modalità di evidenzia dell'oggetto è abilita
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- imposta la grandezza di un punto di ancoraggio per lo spostamento di un oggetto
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,point_width);
//--- mostra in primo piano (false) o sottofondo (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- abilita (true) o disabilita (false) il modo di spostamento dell'etichetta con il mouse
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- nascondi (true) o mostra (falso) il nome di oggetto grafico nella lista degli oggetti
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- imposta la priorità per ricevere l'evento di un clic del mouse nel grafico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Imposta il simoboli ed il timeframe per l'oggetto del Chart |
//+--------------------------------------------------------------------------------+
bool ObjectChartSetSymbolAndPeriod(const long chart_ID=0, // ID del chart (non que
const string name="Chart", // nome dell'oggetto
const string symbol="EURUSD", // simbolo
const ENUM_TIMEFRAMES period=PERIOD_H1) // time frame
{
//--- resetta il valore dell' errore
ResetLastError();
//--- imposta il simobolo e timeframe dell'oggetto Chart
if(!ObjectSetString(chart_ID,name,OBJPROP_SYMBOL,symbol))
{
Print(__FUNCTION__,
": fallimento nell'impostare un simbolo per l'oggetto \"Chart\"! Error code = ",GetLast
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_PERIOD,period))
{
Print(__FUNCTION__,
": fallimento nell'impostare un periodo per l'oggetto \"Chart\"! Error code = ",GetLast
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Sposta l'oggetto Chart |
//+--------------------------------------------------------------------------------+
bool ObjectChartMove(const long chart_ID=0, // ID del Chart (non quello dell'oggetto Chart)
const string name="Chart", // nome dell'oggetto
const int x=0, // coordinate X
const int y=0) // coordinate Y
{
//--- resetta il valore dell' errore
ResetLastError();
//--- sposta l'oggetto
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x))
{
Print(__FUNCTION__,
": fallimento nello spostare le coordinate X dell'oggetto \"Chart\"! Error code = ",Get
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y))
{
Print(__FUNCTION__,
": fallimento nello spostare le coordinate Y dell'oggetto \"Chart\"! Error code = ",Get
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Cambia la grandezza dell'oggetto Chart |
//+--------------------------------------------------------------------------------+
bool ObjectChartChangeSize(const long chart_ID=0, // ID del chart (non quello dell'oggetto Char
const string name="Chart", // nome dell'oggetto
const int width=300, // spessore
const int height=200) // altezza
{
//--- resetta il valore dell' errore
ResetLastError();
//--- cambia la grandezza dell'oggetto
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width))
{
Print(__FUNCTION__,
": fallimento nel cambiare lo spessore dell'oggetto \"Chart\"! Error code = ",GetLastEr
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height))
{
Print(__FUNCTION__,
": fallimento nel cambiare l'altezza dell'oggetto \"Chart\"! Error code = ",GetLastErro
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Restituisce l'ID dell'oggetto Chart |
//+--------------------------------------------------------------------------------+
long ObjectChartGetID(const long chart_ID=0, // ID del chart (non quello dell'oggetto Chart)
const string name="Chart") // nome dell'oggetto
{
//--- prepara la variabile per ottenere l'ID dell'oggetto Chart
long id=-1;
//--- resetta il valore dell' errore
ResetLastError();
//--- ottiene l' ID
if(!ObjectGetInteger(chart_ID,name,OBJPROP_CHART_ID,0,id))
{
Print(__FUNCTION__,
": fallimento nell'ottenere l'ID dell'oggetto \"Chart\"! Error code = ",GetLastError())
}
//--- restituisce il risultato
return(id);
}
//+--------------------------------------------------------------------------------+
//| Elimina l'oggetto Chart |
//+--------------------------------------------------------------------------------+
bool ObjectChartDelete(const long chart_ID=0, // ID del chart (non quello dell'oggetto Chart)
const string name="Chart") // nome dell'oggetto
{
//--- resetta il valore dell' errore
ResetLastError();
//--- elimina il bottone
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": fallimento nell'eliminare l'oggetto \"Chart\"! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
Sleep(1000);
//--- distende l'oggetto Chart
int steps=(int)MathMin(x_distance*7/16,y_distance*7/16);
for(int i=0;i<steps;i++)
{
//--- resize
x_size+=1;
y_size+=1;
if(!ObjectChartChangeSize(0,InpName,x_size,y_size))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart ed attende 0.01 secondi
ChartRedraw();
Sleep(10);
}
//--- ritardo di mezzo secondo
Sleep(500);
//--- cambia il timeframe del chart
if(!ObjectChartSetSymbolAndPeriod(0,InpName,InpSymbol,PERIOD_M1))
return;
ChartRedraw();
//--- tre secondi di ritardo
Sleep(3000);
//--- elimina l'oggetto
ObjectChartDelete(0,InpName);
ChartRedraw();
//--- aspetta per 1 secondo
Sleep(1000);
//---
}
OBJ_BITMAP
Oggetto Bitmap
Nota
Per oggetti Bitmap, puoi selezionare l'ambito di visibilità di un'immagine.
Esempio
Lo script che segue crea diversi bitmaps sul chart. Funzioni speciali sono state sviluppate per creare
e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste funzioni " come è" nelle
proprie applicazioni.
//--- descrizione
#property description "Gli Script creano un bitmap nella finestra del chart."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpFile="\\Images\\dollar.bmp"; // Nome del file del Bitmap
input int InpWidth=24; // Ambito di visibilità, coordinate X
input int InpHeight=24; // Ambito di visibilità, coordinate Y
input int InpXOffset=4; // Ambito di visibilità, slittamento sull'ass
input int InpYOffset=4; // Ambito di visibilità, slittamento sull'ass
input color InpColor=clrRed; // Colore del bordo quando evidenziato
input ENUM_LINE_STYLE InpStyle=STYLE_SOLID; // Stile della linea quando viene evidenziata
input int InpPointWidth=1; // Grandezza punto da muovere
input bool InpBack=false; // Oggetto di sottofondo
input bool InpSelection=false; // Evidenzia di movimento
//--- di eseguire uno slittamento da quest' area visualizzando un'altra parte dell'immagine
ObjectSetInteger(chart_ID,name,OBJPROP_XOFFSET,x_offset);
ObjectSetInteger(chart_ID,name,OBJPROP_YOFFSET,y_offset);
//--- imposta il colore del bordo quando è abilitata la modalità di evidenziazione
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- imposta lo stile del bordo della linea quando la modalità di evidenzia dell'oggetto è abilita
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- imposta la grandezza di un punto di ancoraggio per lo spostamento di un oggetto
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,point_width);
//--- mostra in primo piano (false) o sottofondo (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- abilita (true) o disabilita (false) il modo di spostamento dell'etichetta con il mouse
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- nascondi (true) o mostra (falso) il nome di oggetto grafico nella lista degli oggetti
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- imposta la priorità per ricevere l'evento di un clic del mouse nel grafico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Imposta una nuova immagine per il bitmap |
//+--------------------------------------------------------------------------------+
bool BitmapSetImage(const long chart_ID=0, // ID del chart
const string name="Bitmap", // nome del bitmap
const string file="") // percorso del file
{
//--- resetta il valore dell' errore
ResetLastError();
//--- imposta il percorso al file dell'immagine
if(!ObjectSetString(chart_ID,name,OBJPROP_BMPFILE,file))
{
Print(__FUNCTION__,
": fallimento nel caricare l'immagine! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Sposta un bitmap nella finestra del chart |
//+--------------------------------------------------------------------------------+
bool BitmapMove(const long chart_ID=0, // ID del chart
const string name="Bitmap", // nome del bitmap
datetime time=0, // orario del punto di ancoraggio
double price=0) // prezzo del punto di ancoraggio
{
//--- se il punto della posizione non è impostato, spostarlo nella barra corrente che ha il prezzo
if(!time)
time=TimeCurrent();
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- resetta il valore dell' errore
ResetLastError();
//--- sposta il punto di ancoraggio
if(!ObjectMove(chart_ID,name,0,time,price))
{
Print(__FUNCTION__,
": fallimento nello spostare il punto di ancoraggio! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Cambia la grandezza dell'ambito visibilità (bitmap) |
//+--------------------------------------------------------------------------------+
bool BitmapChangeSize(const long chart_ID=0, // ID del chart
const string name="Bitmap", // nome del bitmap
const int width=0, // spessore del bitmap
const int height=0) // altezza del bitmap
{
//--- resetta il valore dell' errore
ResetLastError();
//--- cambia la grandezza del bitmap
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width))
{
Print(__FUNCTION__,
": fallimento nel cambiare lo spessore del bitmap! Error code = ",GetLastError());
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height))
{
Print(__FUNCTION__,
": fallimento nel cambiare l'altezza del bitmap! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+----------------------------------------------------------------------------------+
//| Cambia le coordinate dell'angolo superiore sinistro dell'ambito di visibilità |
//+----------------------------------------------------------------------------------+
bool BitmapMoveVisibleArea(const long chart_ID=0, // ID del chart
const string name="Bitmap", // nome del bitmap
const int x_offset=0, // ambito di visibilità coordinate X
const int y_offset=0) // ambito di visibilità coordinate Y
{
//--- resetta il valore dell' errore
ResetLastError();
//--- cambia le coordinate dell'ambito di visibilità
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XOFFSET,x_offset))
{
Print(__FUNCTION__,
": fallimento nel cambiare le coordinate X dell'ambito di visibilità! Error code = ",Ge
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YOFFSET,y_offset))
{
Print(__FUNCTION__,
": fallimento nel cambiare le coordinate Y dell'ambito di visibilità! Error code = ",Ge
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Elimina il bitmap |
//+--------------------------------------------------------------------------------+
bool BitmapDelete(const long chart_ID=0, // ID del chart
const string name="Bitmap") // nome del bitmap
{
//--- resetta il valore dell' errore
ResetLastError();
//--- elimina l'etichetta
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": fallimento nell'eliminazione del bitmap! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Controlla i valori di punto di ancoraggio ed imposta i valori di default |
//| per quelli vuoti |
//+--------------------------------------------------------------------------------+
void ChangeBitmapEmptyPoint(datetime &time,double &price)
{
//--- se il tempo del punto non è impostato, sarà sulla barra corrente
if(!time)
time=TimeCurrent();
//--- se il prezzo del punto non è impostato, avrà un valore Bid
if(!price)
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
}
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
datetime date[]; // array per memorizzare le date delle barre visibili
double close[]; // array per memorizzare i prezzi Close
//--- nome del file bitmap
string file="\\Images\\dollar.bmp";
//--- Numero di barre visibili nella finestra del chart
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- allocazione della memoria
ArrayResize(date,bars);
ArrayResize(close,bars);
//--- riempie l'array delle date
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Fallimento nella copia dei valori tempo! Error code = ",GetLastError());
return;
}
//--- riempie l'array dei prezzi Close
if(CopyClose(Symbol(),Period(),0,bars,close)==-1)
{
Print("Fallimento nel copiare i valori dei prezzi Close! Error code = ",GetLastError());
return;
}
//--- definisce quanto spesso devono essere visualizzate le immagini
int scale=(int)ChartGetInteger(0,CHART_SCALE);
//--- definisce lo step
int step=1;
switch(scale)
{
case 0:
step=27;
break;
case 1:
step=14;
break;
case 2:
step=7;
break;
case 3:
step=4;
break;
case 4:
step=2;
break;
}
//--- crea bitmap per valori High e Low delle barre (con i gap)
for(int i=0;i<bars;i+=step)
{
//--- crea i bitmaps
if(!BitmapCreate(0,"Bitmap_"+(string)i,0,date[i],close[i],InpFile,InpWidth,InpHeight,InpXOffs
InpYOffset,InpColor,InpStyle,InpPointWidth,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
// 0.05 secondi di ritardo
Sleep(50);
}
//--- ritardo di mezzo secondo
Sleep(500);
//--- elimina il segno Sell
for(int i=0;i<bars;i+=step)
{
if(!BitmapDelete(0,"Bitmap_"+(string)i))
return;
if(!BitmapDelete(0,"Bitmap_"+(string)i))
return;
//--- ridisegna il chart
ChartRedraw();
// 0.05 secondi di ritardo
Sleep(50);
}
//---
}
OBJ_BITMAP_LABEL
Oggetto Etichetta Bitmap.
Nota
La posizione del punto di ancoraggio relativa all'etichetta può essere scelta dall'enumerazione
ENUM _ANCH OR_POINT . Le coordinate del punto di ancoraggio sono fissate in pix el.
Puoi anche selezionare l'angolo di ancoraggio bitmap dall'enumerazione ENUM _BAS E_CORNER .
Esempio
Lo script che segue crea diversi bitmaps sul chart. Funzioni speciali sono state sviluppate per creare
e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste funzioni " come è" nelle
proprie applicazioni.
//--- descrizione
#property description "Lo script crea l'oggetto \"Bitmap Label\" ."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="BmpLabel"; // nome dell'Etichetta
input string InpFileOn="\\Images\\dollar.bmp"; // Nome del file per modalità On
input string InpFileOff="\\Images\\euro.bmp"; // Nome del File per modalità Off
input bool InpState=false; // Etichetta premuta/rilasciata
input ENUM_BASE_CORNER InpCorner=CORNER_LEFT_UPPER; // Angolo del chart per l'ancoraggio
input ENUM_ANCHOR_POINT InpAnchor=ANCHOR_CENTER; // Tipo di ancoraggio
input color InpColor=clrRed; // Colore del bordo quando si evidanzia
Print(__FUNCTION__,
": fallimento nel caricare l'immagine per la modalità Off! Error code = ",GetLastError(
return(false);
}
//--- imposta le coordinate dell'etichetta
ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
//--- imposta ambito di visibilità per l'immagine; se i valori dello spessore o dell'altezza
//--- eccedono lo spessore e l'altezza(rispettivamente) di un'immagine sorgente,
//--- essa non viene disegnata; in caso contrario
//--- solo la parte corrispondente di questi valori viene disegnata
ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
//--- imposta la parte di un'immagine che dev'essere visualizzata nell'ambito visibilità
//--- la parte di default è la parte superiore sinistra dell'immagine; i valori permettono
//--- di eseguire uno slittamento da quest' area visualizzando un'altra parte dell'immagine
ObjectSetInteger(chart_ID,name,OBJPROP_XOFFSET,x_offset);
ObjectSetInteger(chart_ID,name,OBJPROP_YOFFSET,y_offset);
//--- definisce lo status dell'etichetta (premuta o rilasciata)
ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state);
//--- imposta l'angolo del chart, relativo a quali punti coordinate vengono definiti
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
//--- imposta il tipo di ancora
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//--- imposta il colore del bordo quando è abilitata la modalità di evidenziazione
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- imposta lo stile del bordo della linea quando la modalità di evidenzia dell'oggetto è abilita
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- imposta la grandezza di un punto di ancoraggio per lo spostamento di un oggetto
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,point_width);
//--- mostra in primo piano (false) o sottofondo (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- abilita (true) o disabilita (false) il modo di spostamento dell'etichetta con il mouse
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- nascondi (true) o mostra (falso) il nome di oggetto grafico nella lista degli oggetti
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- imposta la priorità per ricevere l'evento di un clic del mouse nel grafico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Imposta una nuova immagine per l'oggetto Etichetta Bitmap |
//+--------------------------------------------------------------------------------+
bool BitmapLabelSetImage(const long chart_ID=0, // ID del chart
const string name="BmpLabel", // nome dell'etichetta
const int on_off=0, // modificatore (On o Off)
const string file="") // percorso del file
{
//--- resetta il valore dell' errore
ResetLastError();
//--- imposta il percorso al file dell'immagine
if(!ObjectSetString(chart_ID,name,OBJPROP_BMPFILE,on_off,file))
{
Print(__FUNCTION__,
": fallimento nel caricare l'immagine! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Sposta l'oggetto Etichetta Bitmap |
//+--------------------------------------------------------------------------------+
bool BitmapLabelMove(const long chart_ID=0, // ID del chart
const string name="BmpLabel", // nome etichetta
const int x=0, // coordinate X
const int y=0) // coordinate Y
{
//--- resetta il valore dell' errore
ResetLastError();
//--- sposta l'oggetto
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x))
{
Print(__FUNCTION__,
": fallimento nello spostamento delle coordinate X dell'oggetto! Error code = ",GetLast
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y))
{
Print(__FUNCTION__,
": fallimento nello spostamento della coordinata Y dell'oggetto! Error code = ",GetLast
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Cambia grandezza ambito di visibilità (oggetto) |
//+--------------------------------------------------------------------------------+
bool BitmapLabelChangeSize(const long chart_ID=0, // ID del chart
const string name="BmpLabel", // nome dell'etichetta
const int width=0, // spessore della linea
const int height=0) // altezza dell'etichetta
{
//--- resetta il valore dell' errore
ResetLastError();
ResetLastError();
//--- elimina l'etichetta
if(!ObjectDelete(chart_ID,name))
{
Print(__FUNCTION__,
": fallimento nell'eliminazione dell'oggetto \"Bitmap label\"! Error code = ",GetLastEr
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- grandezza della finestra chart
long x_distance;
long y_distance;
//--- imposta la grandezza della finestra
if(!ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0,x_distance))
{
Print("Fallimento nell'ottenere la grandezza del chart! Error code = ",GetLastError());
return;
}
if(!ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0,y_distance))
{
Print("Fallimento nell'ottenere l'altezza del chart! Error code = ",GetLastError());
return;
}
//--- definisce le coordinate dell'etichetta bitmap
int x=(int)x_distance/2;
int y=(int)y_distance/2;
//--- imposta la grandezza dell'etichetta e le coordinate dell'ambito di visibilità
int width=32;
int height=32;
int x_offset=0;
int y_offset=0;
//--- imposta l'etichetta bitmap al centro della finestra
if(!BitmapLabelCreate(0,InpName,0,x,y,InpFileOn,InpFileOff,width,height,x_offset,y_offset,InpSta
InpCorner,InpAnchor,InpColor,InpStyle,InpPointWidth,InpBack,InpSelection,InpHidden,InpZOrder)
{
return;
}
//--- ridisegna il chart e ne attende un secondo
ChartRedraw();
Sleep(1000);
//--- cambio dell'ambito di visibilità dell'etichetta nel loop
for(int i=0;i<6;i++)
{
//--- cambia la grandezza dell'ambito di visibilità
width--;
height--;
if(!BitmapLabelChangeSize(0,InpName,width,height))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
// 0.3 secondi di ritardo
Sleep(300);
}
//--- 1 secondo di ritardo
Sleep(1000);
//--- cambia le coordinate dell'ambito di visibilità nel loop
for(int i=0;i<2;i++)
{
//--- cambia le coordinate dell'ambito di visibilità
x_offset++;
y_offset++;
if(!BitmapLabelMoveVisibleArea(0,InpName,x_offset,y_offset))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il chart
ChartRedraw();
// 0.3 secondi di ritardo
Sleep(300);
}
//--- 1 secondo di ritardo
Sleep(1000);
//--- elimina l'etichetta
BitmapLabelDelete(0,InpName);
ChartRedraw();
//--- 1 secondo di ritardo
Sleep(1000);
//---
}
OBJ_EDIT
Oggetto Modifica.
Nota
Le coordinate del punto di ancoraggio sono impostate in pix els. Puoi selezionare l'angolo di
ancoraggio Modifica dall'enumerazione ENUM _BAS E_CORNER .
È anche possibile selezionare uno dei tipi di allineamento del testo all'interno di Modifica
dall'enumerazione ENUM _AL IGN_MODE.
Esempio
Il seguente script crea e sposta l'oggetto Modifica sul grafico. Funzioni speciali sono state sviluppate
per creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste funzioni " come
è" nelle proprie applicazioni.
//--- descrizione
#property description "Lo Script crea l'oggetto \"Modifica\" ."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="Edit"; // Nome dell'oggetto
input string InpText="Text"; // Testo dell'oggetto
input string InpFont="Arial"; // Font
input int InpFontSize=14; // Grandezza Font
input ENUM_ALIGN_MODE InpAlign=ALIGN_CENTER; // Tipo di allineamento testo
input bool InpReadOnly=false; // Permesso di modifica
input ENUM_BASE_CORNER InpCorner=CORNER_LEFT_UPPER; // Angolo del chart per l'ancoraggio
input color InpColor=clrBlack; // Colore del testo
}
if(!ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0,y_distance))
{
Print("Fallimento nell'ottenere l'altezza del chart! Error code = ",GetLastError());
return;
}
//--- definisce lo step per cambiare il campo Modifica
int x_step=(int)x_distance/64;
//--- imposta le coordinate del campo Modifica e la sua grandezza
int x=(int)x_distance/8;
int y=(int)y_distance/2;
int x_size=(int)x_distance/8;
int y_size=InpFontSize*2;
//--- memorizza il testo nella variabile locale
string text=InpText;
//--- crea il campo modifica
if(!EditCreate(0,InpName,0,x,y,x_size,y_size,InpText,InpFont,InpFontSize,InpAlign,InpReadOnly,
InpCorner,InpColor,InpBackColor,InpBorderColor,InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- redisegna il chart ed attende per 1 secondo
ChartRedraw();
Sleep(1000);
//--- allunga il campo Modifica
while(x_size-x<x_distance*5/8)
{
//--- incrementa lo spessore del campo Modifica
x_size+=x_step;
if(!EditChangeSize(0,InpName,x_size,y_size))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- ridisegna il grafico ed attende per 0.05 secondi
ChartRedraw();
Sleep(50);
}
//--- ritardo di mezzo secondo
Sleep(500);
//--- cambia il testo
for(int i=0;i<20;i++)
{
//--- aggiunge "+" all'inizio ed alla fine
text="+"+text+"+";
if(!EditTextChange(0,InpName,text))
return;
//--- controlla se l'operazione dello script è stata disabilitata per forza
if(IsStopped())
return;
//--- redisegna il chart ed attende per 0.1 secondi
ChartRedraw();
Sleep(100);
}
//--- ritardo di mezzo secondo
Sleep(500);
//--- elimina il campo modifica
EditDelete(0,InpName);
ChartRedraw();
//--- aspetta per 1 secondo
Sleep(1000);
//---
}
OBJ_EVENT
Oggetto Evento.
Nota
Quando si passa il mouse sopra l'evento, viene visualizzato il testo.
Esempio
Lo script che segue crea e sposta l' oggetto Evento sul chart. Funzioni speciali sono state sviluppate
per creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste funzioni " come
è" nelle proprie applicazioni.
//--- descrizione
#property description "Lo script disegna l'oggetto grafico \"Evento\"."
#property description "La data del punto di ancoraggio è impostata in percentuale dello"
#property description "spessoore in barre della finestra chart."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="Event"; // Nome evento
input int InpDate=25; // Data evento, %
input string InpText="Text"; // Testo Evento
input color InpColor=clrRed; // Colore Evento
input int InpWidth=1; // Grandezza del punto quando evidenziato
input bool InpBack=false; // Sottofondo evento
input bool InpSelection=false; // Evidenzia movimento
input bool InpHidden=true; // Nascosto nella lista oggetti
Print(__FUNCTION__,
": fallimento nell'eliminare l'oggetto \"Evento\"! Error code = ",GetLastError());
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- imposta la correttezza dei parametri di input
if(InpDate<0 || InpDate>100)
{
Print("Error! Valori non corretti dei parametri di input!");
return;
}
//--- Numero di barre visibili nella finestra del chart
int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- array per memorizzare i valori data che devono essere usati
//--- per impostare e cambiare i punti di ancoraggio degli oggetti Evento
datetime date[];
//--- allocazione della memoria
ArrayResize(date,bars);
//--- riempie l'array delle date
ResetLastError();
if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
{
Print("Fallimento nella copia dei valori tempo! Error code = ",GetLastError());
return;
}
//--- definisce i punti per creare un'oggetto
int d=InpDate*(bars-1)/100;
//--- crea l'oggetto Evento
if(!EventCreate(0,InpName,0,InpText,date[d],InpColor,InpWidth,
InpBack,InpSelection,InpHidden,InpZOrder))
{
return;
}
//--- redisegna il chart ed attende per 1 secondo
ChartRedraw();
Sleep(1000);
//--- ora, sposta l'oggetto
//---contatore del ciclo
int h_steps=bars/2;
//--- sposta l'oggetto
for(int i=0;i<h_steps;i++)
{
OBJ_RECTANGLE_LABEL
R ectangle Label object.
Nota
Le coordinate del punto di ancoraggio sono impostate in pix els. Puoi selezionare l'angolo di
ancoraggio dell'etichetta rettangolo dall'enumerazione ENUM _BAS E_CORNER . Il tipo di bordo
dell'etichetta rettangolo può essere selezionato dall'enumerazione ENUM _BORDER_TYPE.
Esempio
Il seguente script crea e sposta l'etichetta R ettangolo sul grafico. Funzioni speciali sono state
sviluppate per creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste
funzioni " come è" nelle proprie applicazioni.
//--- descrizione
#property description "Lo script crea l'oggetto grafico \"Etichetta Rettangolo \"."
//--- mostra la finestra dei parametri di input durante il lancio dello script
#property script_show_inputs
//--- parametri di input dello script
input string InpName="Label"; // Nome Etichetta
input color InpBackColor=clrSkyBlue; // Colore di sottofondo
input ENUM_BORDER_TYPE InpBorder=BORDER_FLAT; // Tipo di bordo
input ENUM_BASE_CORNER InpCorner=CORNER_LEFT_UPPER; // Angolo del chart per l'ancoraggio
input color InpColor=clrDarkBlue; // Colore del bordo piatto (Flat)
input ENUM_LINE_STYLE InpStyle=STYLE_SOLID; // Stile del bordo piatto (Flat)
input int InpLineWidth=3; // Spessore del bordo piatto (Flat)
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- imposta lo spessore del bordo piatto
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,line_width);
//--- mostra in primo piano (false) o sottofondo (true)
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- abilita (true) o disabilita (false) il modo di spostamento dell'etichetta con il mouse
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- nascondi (true) o mostra (falso) il nome di oggetto grafico nella lista degli oggetti
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- imposta la priorità per ricevere l'evento di un clic del mouse nel grafico
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Sposta l'etichetta rettangolo |
//+--------------------------------------------------------------------------------+
bool RectLabelMove(const long chart_ID=0, // ID del chart
const string name="RectLabel", // nome dell'etichetta
const int x=0, // coordinate X
const int y=0) // coordinate Y
{
//--- resetta il valore dell' errore
ResetLastError();
//--- sposta l'etichetta rettangolo
if(!ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x))
{
Print(__FUNCTION__,
": fallimento nello spostamento delle coordinate X dell'etichetta! Error code = ",GetLa
return(false);
}
if(!ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y))
{
Print(__FUNCTION__,
": fallimento nello spostamento della coordinata Y dell'etichetta! Error code = ",GetLa
return(false);
}
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Cambia lo spessore dell'etichetta rettangolo |
//+--------------------------------------------------------------------------------+
bool RectLabelChangeSize(const long chart_ID=0, // ID del chart
const string name="RectLabel", // nome dell'etichetta
const int width=50, // spessore della linea
const int height=18) // altezza dell'etichetta
{
Object Properties
Graphical objects can have various properties depending on the object type. Values of object
properties are set up and received by corresponding functions for work ing with graphical objects.
All objects used in technical analysis are bound to the time and price coordinates : trendline, channels,
Fibonacci tools, etc. But there is a number of aux iliary obj ects intended to improve the user interface
that are bound to the always visible part of a chart (main chart windows or indicator subwindows):
ON
AP only)
Label ANGLE_L
ABEL
specified. Can be one of the 4 values of the ENUM _BAS E_CORNER enumeration;
· OBJPROP_ANCHOR – defines the anchor point in object itself and can be one of the
9 values of the
ENUM _ANCH OR_POINT enumeration. Coordinates in pix els are specified from this very point to
selected chart corner;
· OBJPROP_ANGLE – defines the object rotation angle counterclockwise.
Le funzioni che definiscono le proprietà degli oggetti grafici, nonché le operazioni ObjectCreate() e
ObjectMove() per creare e spostare gli oggetti lungo il chart vengono effettivamente utilizzate per
l'invio di comandi al chart. S e queste funzioni vengono eseguite correttamente, il comando viene
incluso nella coda comune degli eventi chart. Alterazioni visive nelle proprietà degli oggetti grafici
vengono implementate quando si maneggia la coda degli eventi del grafico.
Quindi, non aspettatevi un aggiornamento visivo immediato di oggetti grafici dopo la chiamata di
queste funzioni. I n generale, gli oggetti grafici sul chart vengono aggiornati automaticamente dal
ENUM_OBJECT_PROPERTY _INTEGER
note)
OBJPR OP_CHART_S CALE La scala per l'oggetto Chart int value in the range 0–5
OBJPR OP_CORNER L 'angolo del chart per collegare ENUM _BAS E_CORNER
un oggetto grafico
Quando si utilizzano operazioni del chart per l'oggetto " Chart" (OBJ_CHART ), vengono inflitte le
seguenti limitazioni:
È possibile impostare una modalità speciale di visualizzazione dell'immagine per gli oggetti
OBJ_BIT M AP_L ABEL e OBJ_BIT M AP. In questa modalità, viene visualizzata solo una parte
dell'immagine originale (a cui è applicata una zona visibile rettangolare), mentre il resto dell'immagine
diventa invisibile. La grandezza di questa area dovrebbe essere impostata utilizzando le proprietà
OBJPR OP_XS IZE e OBJPR OP_YS IZE. L 'area visibile può essere " spostata" solo all'interno l'immagine
originale utilizzando le proprietà OBJPR OP_XOFFS ET e OBJPR OP_YOFFS ET .
For the fix ed-sized objects : OBJ_BUTT ON, OBJ_R ECTANGLE_L ABEL, OBJ_EDIT and OBJ_CHART
properties OBJPR OP_XDIS TANCE and OBJPR OP_YDIS TANCE set the position of the top left point of the
object relative to the chart corner (OBJPR OP_CORNER ), from which the X and Y coordinates will be
counted in pix els.
ENUM_OBJECT_PROPERTY _DOUBLE
ENUM_OBJECT_PROPERTY _STRING
OBJPR OP_BMPFILE Il nome del file-BMPper Bitmap string modifier: 0-state ON,
Label. Vedi anche R isorse 1-state O FF
Per l' Oggetto OBJ_R ECTANGLE_L ABEL (" Label R ettangolo" ) può essere impostata una delle tre
modalità di design, a cui i seguenti valori di ENUM _BORDER_TYPE corrispondono.
ENUM_BORDER_TY PE
Identificatore Descrizione
B ORDER_FL AT F orma piatta
Per l'oggetto OBJ_EDIT (" Modifica" ) e per la funzione ChartS creenS hot(), è possibile specificare il tipo
di allineamento orizzontale utilizzando i valori dell'enumerazione ENUM _AL IGN_MODE.
ENUM_ALIGN_MODE
Identificatore Descrizione
A L IGN_LEFT L 'allineamento a sinistra
Esempio:
#define UP "\x0431"
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//---
string label_name="my_OBJ_LABEL_object";
if(ObjectFind(0,label_name)<0)
{
Print("Oggetto",label_name," non trovato. Error code = ",GetLastError());
//--- crea oggetto Label
ObjectCreate(0,label_name,OBJ_LABEL,0,0,0);
//--- imposta coordinate X
ObjectSetInteger(0,label_name,OBJPROP_XDISTANCE,200);
//--- imposta coordinate Y
ObjectSetInteger(0,label_name,OBJPROP_YDISTANCE,300);
//--- definisce il colore del testo
ObjectSetInteger(0,label_name,OBJPROP_COLOR,clrWhite);
//--- definisce il testo per l'oggetto Label
ObjectSetString(0,label_name,OBJPROP_TEXT,UP);
//--- definisce il font
ObjectSetString(0,label_name,OBJPROP_FONT,"Wingdings");
//--- definisce grandezza font
ObjectSetInteger(0,label_name,OBJPROP_FONTSIZE,10);
//--- 45 gradi di rotazione in senso orario
ObjectSetDouble(0,label_name,OBJPROP_ANGLE,-45);
//--- disabilita il mouse per la selezione
ObjectSetInteger(0,label_name,OBJPROP_SELECTABLE,false);
//--- lo disegna su un chart
ChartRedraw(0);
}
}
ON
AP only)
Label ANGLE_L
ABEL
specified. Can be one of the 4 values of the ENUM _BAS E_CORNER enumeration;
· OBJPROP_ANCHOR – defines the anchor point in object itself and can be one of the values of the
9
ENUM _ANCH OR_POINT enumeration. Coordinates in pix els are specified from this very point to
selected chart corner;
· OBJPROP_ANGLE – defines the object rotation angle counterclockwise.
La variante necessaria può essere specificata usando la funzione ObjectS etInteger(Chart_handle,
object_name, OBJPR OP_ANCH OR , Anchor_point_mode), dove anchor_point_mode è uno dei valori di
ENUM _ANCH OR_POINT .
ENUM_ANCHOR_POINT
ID Descrizione
AN CH OR_LEFT_UPPER Punto di ancoraggio in alto a sinistra
ID Descrizione
CH OR_LEFT
AN Punto di ancoraggio a sinistra nel centro
CH OR_LEFT_LOW ER
AN Punto di ancoraggio nell'angolo in basso a
sinistra
CH OR_LOW ER
AN Punto di ancoraggio sotto sotto nel centro
CH OR_RIGHT_LOW ER
AN Punto di ancoraggio nell'angolo in basso a
destra
CH OR_RIGHT
AN Punto di ancoraggio a destra al centro
CH OR_RIGHT_UPPER
AN Punto di ancoraggio in alto a destra
CH OR_UPPER
AN Punto di ancoraggio sopra nel centro
CH OR_CENT ER
AN Punto di ancoraggio strettamente nel centro
dell'oggetto
The OBJ_BUTT ON, OBJ_R ECTANGLE_L ABEL, OBJ_EDIT and OBJ_CHART objects have a fix ed anchor
point in the upper left corner (ANCH OR_LEFT_UPPER ).
Esempio:
string text_name="my_OBJ_TEXT_object";
if(ObjectFind(0,text_name)<0)
{
Print("Object ",text_name," non trovato. Error code = ",GetLastError());
//--- Ottiene il prezzo massimo del grafico
double chart_max_price=ChartGetDouble(0,CHART_PRICE_MAX,0);
//--- Crea etichetta dell'oggetto
ObjectCreate(0,text_name,OBJ_TEXT,0,TimeCurrent(),chart_max_price);
//--- Imposta colore del testo
ObjectSetInteger(0,text_name,OBJPROP_COLOR,clrWhite);
//--- Imposta colore background
ObjectSetInteger(0,text_name,OBJPROP_BGCOLOR,clrGreen);
//--- Imposta il testo per l'oggetto grafico Etichetta
ObjectSetString(0,text_name,OBJPROP_TEXT,TimeToString(TimeCurrent()));
//--- Imposta font del testo
ObjectSetString(0,text_name,OBJPROP_FONT,"Trebuchet MS");
//--- Imposta la grandezza del font
ObjectSetInteger(0,text_name,OBJPROP_FONTSIZE,10);
//--- Associazione all'angolo supriore destro
ObjectSetInteger(0,text_name,OBJPROP_ANCHOR,ANCHOR_RIGHT_UPPER);
//--- Ruota di 90 gradi in senso antiorario
ObjectSetDouble(0,text_name,OBJPROP_ANGLE,90);
//--- Proibisce la selezione dell'oggetto dal mouse
ObjectSetInteger(0,text_name,OBJPROP_SELECTABLE,false);
//--- ridisegna oggetto
ChartRedraw(0);
}
G li oggetti grafici Freccia (OBJ_ARR OW ) hanno solo 2 modi di collegamento delle loro coordinate. G li
identificatori sono elencati in ENUM _ARR OW _ANCH OR .
ENUM_ARROW _ANCHOR
ID Descrizione
CH OR_T OP
AN A ncoraggio sul lato superiore
CH OR_BOTT OM
AN A ncoraggio sul lato inferiore
Esempio:
voidOnStart()
{
//--- Array ausiliari
double Ups[],Downs[];
datetime Time[];
//--- Imposta gli array come timeseries
ArraySetAsSeries(Ups,true);
ArraySetAsSeries(Downs,true);
ArraySetAsSeries(Time,true);
//--- Crea l'handle dell' Indicatore Fractals
int FractalsHandle=iFractals(NULL,0);
Print("FractalsHandle = ",FractalsHandle);
//-- Imposta il valore di Last error (ultimo errore) a Zero
ResetLastError();
//--- Prova a copiare i valori dell'indicatore
int copied=CopyBuffer(FractalsHandle,0,0,1000,Ups);
if(copied<=0)
{
Print("Impossibile copiare i frattali superiori. Error = ",GetLastError());
return;
}
ResetLastError();
//--- Prova a copiare i valori dell'indicatore
copied=CopyBuffer(FractalsHandle,1,0,1000,Downs);
if(copied<=0)
{
Print("Impossibile copiare i frattali inferiori. Error = ",GetLastError());
return;
}
ResetLastError();
//--- Copia le timeseries contenenti le aperture delle ultime 1000
copied=CopyTime(NULL,0,0,1000,Time);
if(copied<=0)
{
Print("Impossibile copiare i valori Opening Time delle ultime 1000 barre");
return;
}
ON
AP only)
Label ANGLE_L
AB EL
specified. Can be one of the 4 values of the ENUM _BAS E_CORNER enumeration;
· OBJPROP_ANCHOR – defines the anchor point in object itself and can be one of the
9 values of the
ENUM _ANCH OR_POINT enumeration. Coordinates in pix els are specified from this very point to
selected chart corner;
· OBJPROP_ANGLE – defines the object rotation angle counterclockwise.
Per specificare l'angolo del grafico, da cui le coordinate X e Y vengono misurate in pix el, utilizzare
ObjectS etInteger(ChartID, nome, OBJPR OP_CORNER , chart_corner ), Dove:
ENUM_BASE_CORNER
ID Descrizione
CORNER_LEFT_UPPER Il centro delle coordinate è nell'angolo superiore
sinistro del grafico
Esempio:
void CreateLabel(long chart_id,
string name,
int chart_corner,
int anchor_point,
string text_label,
int x_ord,
int y_ord)
{
//---
if(ObjectCreate(chart_id,name,OBJ_LABEL,0,0,0))
{
ObjectSetInteger(chart_id,name,OBJPROP_CORNER,chart_corner);
ObjectSetInteger(chart_id,name,OBJPROP_ANCHOR,anchor_point);
ObjectSetInteger(chart_id,name,OBJPROP_XDISTANCE,x_ord);
ObjectSetInteger(chart_id,name,OBJPROP_YDISTANCE,y_ord);
ObjectSetString(chart_id,name,OBJPROP_TEXT,text_label);
}
else
Print("Failed to create the object OBJ_LABEL ",name,", Error code = ", GetLastError());
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
int height=(int)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0);
int width=(int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0);
string arrows[4]={"LEFT_UPPER","RIGHT_UPPER","RIGHT_LOWER","LEFT_LOWER"};
CreateLabel(0,arrows[0],CORNER_LEFT_UPPER,ANCHOR_LEFT_UPPER,arrows[0],50,50);
CreateLabel(0,arrows[1],CORNER_RIGHT_UPPER,ANCHOR_RIGHT_UPPER,arrows[1],50,50);
CreateLabel(0,arrows[2],CORNER_RIGHT_LOWER,ANCHOR_RIGHT_LOWER,arrows[2],50,50);
CreateLabel(0,arrows[3],CORNER_LEFT_LOWER,ANCHOR_LEFT_LOWER,arrows[3],50,50);
}
ID Valore Descrizione
OBJ_NO_PERIODS 0 L 'oggetto non viene disegnato
in tutti i timeframes
ID Valore Descrizione
OBJ_PERIOD_H6 0x00008000 L 'oggetto viene disegnato nel
grafico 6-ore
La visibilità delle flags può essere combinata con il simbolo " |" , per esempio, la combinazione di flag
OBJ_PERIOD_M 10 | OBJ_PERIOD_H4 significa che l'oggetto sarà visibile sui timeframes a 10-minuti e
4-ore.
Esempio:
voidOnStart()
{
//---
string highlevel="PreviousDayHigh";
string lowlevel="PreviousDayLow";
double prevHigh; // Il Massimo(High) del giorno precedente
double prevLow; // Il Minimo(Low) del giorno precedente
double highs[],lows[]; // Array per Massimo e Minimo
Vedi anche
PeriodS econds, Period, T imeframes dei Grafici, Data ed Ora
ENUM_ELLIOT_W AVE_DEGREE
ID Descrizione
ELL IOTT_GRAND_S UPER CYCLE G rand S upercycle
Esempio:
for(int i=0;i<ObjectsTotal(0);i++)
{
string currobj=ObjectName(0,i);
if((ObjectGetInteger(0,currobj,OBJPROP_TYPE)==OBJ_ELLIOTWAVE3) ||
((ObjectGetInteger(0,currobj,OBJPROP_TYPE)==OBJ_ELLIOTWAVE5)))
{
//--- imposta i livelli di marking in INTERMEDIATE
ObjectSetInteger(0,currobj,OBJPROP_DEGREE,ELLIOTT_INTERMEDIATE);
//--- mostra linee tra i tops delle onde
ObjectSetInteger(0,currobj,OBJPROP_DRAWLINES,true);
//--- imposta il colore della linea
ObjectSetInteger(0,currobj,OBJPROP_COLOR,clrBlue);
//--- imposta lo spessore della linea
ObjectSetInteger(0,currobj,OBJPROP_WIDTH,5);
//--- imposta descrizione
ObjectSetString(0,currobj,OBJPROP_TEXT,"test script");
}
}
Oggetti Gann
Per gli oggetti Gann Fan (OBJ_GANNFAN) e le Gann Grid (OBJ_GANNGRID) è possibile specificare due
valori dell'enumerazione ENUM _GANN_DIR ECTION che impostano la direzione del trend.
ENUM_GANN_DIRECTION
ID Descrizione
P
GANN_U _TR END Linea corrispondente alla linea di trend rialzista
Per impostare la scala della linea principale, come 1x1, utilizzare la funzione
ObjectS etDouble(Chart_handle, gann_object_name, OBJPR OP_S CALE, S cala), dove:
int bars_on_chart=ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- Crea un array, per scrivere il tempo di apertura di ogni barra
datetime Time[];
//--- Dispone l' accesso al array come quello delle TimeSeries
ArraySetAsSeries(Time,true);
//--- Ora copia i dati delle barre visibili nel grafico in questo array
int times=CopyTime(NULL,0,0,bars_on_chart,Time);
if(times<=0)
{
Print("Non posso copiare l'array con l'orario di apertura!");
return;
}
//--- Preparazioni preliminari completate
I W eb Colors
Le costanti seguenti colori sono definite per il tipo color:
clrLightSe clrDarkViol clrFire Bric clrM edium clrM edium clrChocola clrCrimson clrSteelBlu
aGreen et k Violet Red S eaGreen te e
clrGoldenr clrM edium clrLawn Gr clrCadetBl clrDarkOrc clrYello wG clrLime Gre clrOrange
od S pringGre een ue hid reen en Red
en
clrDarkOra clrOrange clrGold clrYello w clrChartre clrLime clrSpringG clrAqua
nge use reen
clrDeepSk clrBlue clrM agent clrRed clrGray clrSlate Gra clrPeru clrBlue Viol
yB lue a y et
clrLightSla clrDeepPin clrM edium clrDodgerB clrTurquoi clrRo yalBlu clrSlate Blu clrDarkKha
te Gray k Tur q uoise lue se e e ki
clrIndian R clrM edium clrGreen Y clrM edium clrDarkSea clrTomato clrRosyBro clrOrchid
ed Orchid ello w Aq uamarin Green wn
e
clrM edium clrPale Viol clrCoral clrCornflo clrDarkGra clrSandyBr clrM edium clrTan
Purple etRed wer B lue y o wn S late B lue
Il colore può essere impostato su un oggetto utilizzando la funzione ObjectS etInteger(). Per impostare
il colore di indicatori personalizzati viene utilizzata la funzione PlotIndexS etInteger(). Per ottenere
valori del colore ci sono funzioni simili ObjectGetInteger() e PlotIndexGetInteger().
Esempio:
//---- impostazioni indicatore
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots 3
#property indicator_type1 DRAW_LINE
#property indicator_type2 DRAW_LINE
#property indicator_type3 DRAW_LINE
#property indicator_color1 clrBlue
#property indicator_color2 clrRed
#property indicator_color3 clrLime
W ingdings
Esempio:
voidOnStart()
{
//---
string up_arrow="up_arrow";
datetime time=TimeCurrent();
double lastClose[1];
int close=CopyClose(Symbol(),Period(),0,1,lastClose); // Ottiene il prezzo di Chiusura(Close
//--- Se il prezzo è stato ottenuto
if(close>0)
{
ObjectCreate(0,up_arrow,OBJ_ARROW,0,0,0,0,0); // Crea una freccia
ObjectSetInteger(0,up_arrow,OBJPROP_ARROWCODE,241); // Imposta il codice della freccia
ObjectSetInteger(0,up_arrow,OBJPROP_TIME,time); // Imposta orario
ObjectSetDouble(0,up_arrow,OBJPROP_PRICE,lastClose[0]);// Imposta prezzo
ChartRedraw(0); // Disegna ora la freccia
}
else
Print("Impossibile ottenere l'ultimo prezzo di Chiusura(Close)!");
}
Indicators Constants
Ci sono 37 indicatori tecnici predefiniti, che possono essere usati in programmi scritti nel linguaggio
MQL5. Inoltre, vi è la possibilità di creare indicatori personalizzati utilizzando la funzione iCustom().
T utte le costanti richieste per tale sono divise in 5 gruppi :
· Costanti di prezzo - per selezionare il tipo di prezzo o volume, in cui viene calcolato un indicatore;
· Linee indicatore - I dentificatori di buffer indicatore quando si accede utilizzando i valori degli
indicatori CopyBuffer();
· G li stili di disegno - per indicare uno dei 18 tipi di disegno ed impostare lo stile di disegno linea;
· Proprietà indicatori personalizzati sono utilizzate in funzioni per lavorare con indicatori custom;
· Itipi di indicatori sono utilizzati per specificare il tipo di indicatore tecnico durante la creazione di
un handle con IndicatorCreate();
· I dentificatori di tipi di dati vengono utilizzati per specificare il tipo di dati passati in un array di tipo
M qlParam nella funzione IndicatorCreate().
Price Constants
Icalcoli di indicatori tecnici richiedono valori di prezzo e/o valori di volumi, sui quali i calcoli verranno
eseguiti. Ci sono 7 identificatori predefiniti dall'enumerazione ENUM _APPL IED_PRICE, utilizzati per
specificare il prezzo base per il calcolo desiderato.
ENUM_APPLIED_PRICE
ID Descrizione
PRICE_CLOS E Prezzo di chiusura
Se il volume viene utilizzata nei calcoli, è necessario specificare uno dei due valori dell'enumerazione
ENUM _APPL IED_VOL UME.
ENUM_APPLIED_VOLUME
ID Descrizione
VOL UME_TICK T ick volume
L 'indicatore tecnico iS tochastic() può essere calcolato in due modi diversi per:
ENUM_STO_PRICE
ID Descrizione
ST O_LOW HIGH I l calcolo si basa sui prezzi inferiore/superiore
Se un indicatore tecnico usa per i calcoli i dati prezzo, il tipo di cui viene impostato
ENUM _APPL IED_PRICE, quindi la gestione di qualsiasi indicatore (costruita nel terminale o scritta da un
utente) può essere utilizzata come la serie prezzo di ingresso. In questo caso, i valori del buffer zero
del indicatore verranno utilizzati per i calcoli. In questo modo è facile costruire i valori di un indicatore
utilizzando i valori di un altro indicatore. L 'handle di un indicatore personalizzato viene creato
chiamando la funzione iCustom().
Esempio:
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots 2
//--- parametri di input
input int RSIperiod=14; // Periodo per il calcolo dell'RSI
input int Smooth=8; // Periodo smussamento RSI
input ENUM_MA_METHOD meth=MODE_SMMA; // Metodo di smussamento
//---- disegna RSI
#property indicator_label1 "RSI"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//---- disegna RSI_Smoothed
#property indicator_label2 "RSI_Smoothed"
#property indicator_type2 DRAW_LINE
#property indicator_color2 clrNavy
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//--- buffers indicatore
double RSIBuffer[]; // Qui conserviamo i valori di RSI
double RSI_SmoothedBuffer[]; // Qui ci saranno i valori smussati di RSI
int RSIhandle; // Handle dell' indicatore RSI
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
void OnInit()
{
//--- mappatura buffers indicatore
SetIndexBuffer(0,RSIBuffer,INDICATOR_DATA);
SetIndexBuffer(1,RSI_SmoothedBuffer,INDICATOR_DATA);
IndicatorSetString(INDICATOR_SHORTNAME,"iRSI");
IndicatorSetInteger(INDICATOR_DIGITS,2);
//---
RSIhandle=iRSI(NULL,0,RSIperiod,PRICE_CLOSE);
//---
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const int begin,
const double &price[]
)
Metodi di smussamento
Molti indicatori tecnici si basano su vari metodi di smussamento della serie di prezzi. Alcuni indicatori
tecnici standard richiedono la specificazione del tipo smussamento come parametro di input. Per
specificare il tipo desiderato di smussamento, vengono utilizzati identificatori elencati
nell'enumerazione ENUM _M A_METH OD.
ENUM_MA_METHOD
ID Descrizione
MODE_S M A Media semplice
Esempio:
double ExtJaws[];
double ExtTeeth[];
double ExtLips[];
//--- handles per medie mobili
int ExtJawsHandle;
int ExtTeethHandle;
int ExtLipsHandle;
//--- ottenere gli handle di MA
ExtJawsHandle=iMA(NULL,0,JawsPeriod,0,MODE_SMMA,PRICE_MEDIAN);
ExtTeethHandle=iMA(NULL,0,TeethPeriod,0,MODE_SMMA,PRICE_MEDIAN);
ExtLipsHandle=iMA(NULL,0,LipsPeriod,0,MODE_SMMA,PRICE_MEDIAN);
Linee Indicatori
A lcuni indicatori tecnici hanno diversi buffers disegnati nel grafico. La numerazione dei buffer
indicatori inizia con 0. Durante la copia di valori degli indicatori che utilizzano la funzione CopyBuffer()
in un array del tipo double, per alcuni indicatori si può indicare l'identificatore di un buffer copiato
anziché il suo numero.
I dentificatori di linee indicatore ammissibili quando si copiano i valori di ADX() e ADXW ().
J
KI UNS EN_L INE 1 Linea Kijun-sen
Drawing Styles
Quando si crea un indicatore personalizzato, è possibile specificare uno dei 18 tipi di grafico tracciato
(come visualizzato nella finestra del grafico principale o una sottofinestra grafico), i cui valori sono
specificati nella enumerazione ENUM _DRAW _TYPE.
A seconda dello stile di disegno, potrebbe essere necessario 1-4 valori buffer (contrassegnato come
INDI C AT O R_DATA ). S e uno stile ammette l'alternarsi dinamico dei colori (tutti gli stili contengono
COLOR E nei loro nomi), quindi avrete bisogno di un altro buffer di colore (tipo indicato
INDI C AT O R_COLO R_INDEX). I buffer di colore sono sempre tenuti dopo buffer valore corrispondente
allo stile.
ENUM_DRAW _TY PE
DRAW _ IN L E Linea 1 0
dello zero
buffer indicatore
permettono la sezione
verticale sulla barra
two levels
sequenza di barre
sequenza di candele
W multicolori
ES
Per perfezionare la visualizzazione del tipo di disegno selezionato, vengono utilizzati identificatori
elencati in ENUM _PLOT_PR OPERTY.
ENUM_PLOT_PROPERTY _INTEGER
PLOT_L INE_S TYLE S tile di Disegno della linea ENUM _L INE_S TYLE
ENUM_PLOT_PROPERTY _DOUBLE
ENUM_PLOT_PROPERTY _STRING
5 stili possono essere utilizzati per disegnare linee in indicatori personalizzati. Essi sono validi solo per
lo spessore della linea 0 o 1.
ENUM_LINE_STY LE
ID Descrizione
S TYLE_S OL ID Linea continua
Per impostare lo stile di disegno linea ed il tipo di disegno, viene utilizzata la funzione
PlotIndexS etInteger(). Per le Estensioni di Fibonacci lo spessore e lo stile di disegno dei livelli può
essere indicato con la funzione ObjectS etInteger().
Esempio:
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
ENUM_INDEX BUFFER_TY PE
ID Descrizione
INDI CAT OR_DATA D ati per disegnare
ENUM_CUSTOMIND_PROPERTY _INTEGER
level number
INDI CAT OR_LEVEL S TYLE S tile della linea di livello ENUM _L INE_S TYLE modifier =
level number
INDI CAT OR_LEVEL W IDTH S pessore della linea di livello int modifier =
level number
ENUM_CUSTOMIND_PROPERTY _DOUBLE
level number
ENUM_CUSTOMIND_PROPERTY _STRING
level number
Esempi:
//--- impostazioni indicatore
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots 2
#property indicator_type1 DRAW_LINE
#property indicator_type2 DRAW_LINE
#property indicator_color1 clrLightSeaGreen
#property indicator_color2 clrRed
//--- parametri di input
extern int KPeriod=5;
extern int DPeriod=3;
extern int Slowing=3;
//--- buffers indicatore
double MainBuffer[];
double SignalBuffer[];
double HighesBuffer[];
double LowesBuffer[];
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
void OnInit()
{
//--- mappatura buffers indicatore
SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);
SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);
SetIndexBuffer(2,HighesBuffer,INDICATOR_CALCULATIONS);
SetIndexBuffer(3,LowesBuffer,INDICATOR_CALCULATIONS);
//--- imposta precisione
IndicatorSetInteger(INDICATOR_DIGITS,2);
//--- imposta livelli
IndicatorSetInteger(INDICATOR_LEVELS,2);
IndicatorSetDouble(INDICATOR_LEVELVALUE,0,20);
IndicatorSetDouble(INDICATOR_LEVELVALUE,1,80);
//--- imposta massimo e minimo per sottofinestra
IndicatorSetDouble(INDICATOR_MINIMUM,0);
IndicatorSetDouble(INDICATOR_MAXIMUM,100);
//--- imposta la prima barra da quell' indice sarà disegnato
PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,KPeriod+Slowing-2);
PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,KPeriod+Slowing+DPeriod);
//--- imposta stile STYLE_DOT per seconda linea
PlotIndexSetInteger(1,PLOT_LINE_STYLE,STYLE_DOT);
//--- nome per DataWindow e indicatore di etichetta sottofinestra
IndicatorSetString(INDICATOR_SHORTNAME,"Stoch("+KPeriod+","+DPeriod+","+Slowing+")");
PlotIndexSetString(0,PLOT_LABEL,"Main");
PlotIndexSetString(1,PLOT_LABEL,"Signal");
//--- imposta il valore di disegno della linea come vuoto
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0.0);
//--- inizializzazione fatta
}
Quando si crea un indicatore di tipo IND_CUS T OM, il campo tipo del primo elemento di un array di
parametri di input M qlParam deve avere il valore TYPE_S TRING dell'enumerazione ENUM _DATATYPE,
mentre il campo valore_stringa del primo elemento deve contenere il nome dell'indicatore
personalizzato.
ENUM_INDICATOR
Identificatore Indicatore
IND_A C A ccelerator Oscillator
IND_AD A ccumulation/Distribution
Identificatore Indicatore
IND_GAT OR G ator Oscillator
IND_ M A CD M A CD
IND_ OS M A OsM A
IND_S AR Parabolic S AR
ENUM_DATATY PE
TY PE_CHAR char
TY PE_UCHAR uchar
TY PE_COLOR color
TY PE_INT int
TY PE_UINT uint
TY PE_LONG long
TY PE_ULONG ulong
TY PE_FLOAT float
TY PE_DOUBLE double
Ciascun elemento della matrice descrive il corrispondente parametro input di un indicatore tecnico
creato, quindi il tipo e l'ordine degli elementi dell'array deve essere rigorosamente mantenuto in
conformità con la descrizione.
Environment State
Le costanti che descrivono l'attuale ambiente di runtime di un programma-mql5 sono suddivise in
gruppi:
· Proprietà del programma-mql5 eseguite - proprietà dei programmi mql5, che aiutano a controllare la
sua esecuzione;
· Proprietà del simbolo - ottiene informazioni su un simbolo;
ENUM_TERMINAL_INFO_INTEGER
Push
T ER M INAL _KEYS TAT E_UP S tato del tasto " Freccia S u" int
T ER M INAL _KEYS TAT E_RIGHT S tato del tasto " Freccia Destra" int
T ER M INAL _KEYS TAT E_DOW N S tato del tasto " Freccia Giu" int
T ER M INAL _KEYS TAT E_S HIFT S tato del tasto " S hift" int
T ER M INAL _KEYS TAT E_CONTR O S tato del tasto " Ctrl" int
L
T ER M INAL _KEYS TAT E_MENU S tato del tasto " W indows " int
T ER M INAL _KEYS TAT E_CAPS LO S tato del tasto " CapsLock" int
CK
T ER M INAL _KEYS TAT E_NUMLOC S tato del tasto " BlocNum" int
K
T ER M INAL _KEYS TAT E_S CR LOC S tato del tasto " S crollLock" int
K
T ER M INAL _KEYS TAT E_ENT ER S tato del tasto " Invio" int
T ER M INAL _KEYS TAT E_INS ERT S tato del tasto " Ins " int
T ER M INAL _KEYS TAT E_DELET E S tato del tasto " Canc" int
T ER M INAL _KEYS TAT E_H OME S tato del tasto " H ome" int
T ER M INAL _KEYS TAT E_END S tato del tasto " Fine" int
T ER M INAL _KEYS TAT E_PAGEUP S tato del tasto " Pag S u" int
T ER M INAL _KEYS TAT E_PAGEDO S tato del tasto " Pag Giu" int
WN
T ER M INAL _KEYS TAT E_ES CAPE S tato del tasto " Esc" int
La chiamata a T erminalInfoInteger(T ER M INAL _KEYS TAT E_XXX) restituisce lo stesso stato codice della
chiave come GetKeyS tate() nella funzione in M S DN.
Nell'esempio qui sopra, la risorsa grafica appare la stessa su monitor con caratteristiche di risoluzione
differenti. La grandezza degli elementi di controllo (bottoni, finestre di dialogo, ecc.) corrisponde
all'impostazione della personlizzazione.
ENUM_TERMINAL_INFO_DOUBLE
N on è un'indicazione della
q ualità della connessione tra un
particolare terminale ed un
trade server, poiché la
percentuale viene calcolata per
l'intera attività di rete, inclusa
l'attività di sistema e di
back groud.
I l valore
T ER M INAL _R ETRANS M IS S ION
viene richiesto dal sistema
operativo una volta al minuto.
I l terminale in sè non calcola
questo valore.
Le operazioni sui file possono essere eseguite solo in due directory; i percorsi corrispondenti possono
essere ottenuti utilizzando la richiesta per le proprietà T ER M INAL _DATA_PATH e
T ER M INA L _COMMO NDATA_PATH .
ENUM_TERMINAL_INFO_STRING
Per una migliore comprensione dei percorsi memorizzati nelle proprietà di T ER M INAL _PATH ,
T ER M INA L _DATA_PATH e parametri T ER M INA L _COMMO NDATA_PATH , si consiglia di eseguire lo script,
che restituirà questi valori per la copia corrente del terminale client, installato sul computer
Come risultato dell'esecuzione dello script nel Journal degli Ex perts si vedrà un messaggio, come il
seguente:
ENUM_MQL_INFO_INTEGER
MQL _PR OGRAM _TYPE T ipo di programma MQL5 ENUM _PR OGRAM _TYPE
MQL _L ICENS E_TYPE Tipo di licenza del modulo EX5. ENUM _L ICENS E_TYPE
La licenza si riferisce al modulo
EX5, da cui viene effettuata
una richiesta utilizzando
MQL InfoInteger
(MQL _L ICENS E_TYPE).
ENUM_MQL_INFO_STRING
ENUM_PROGRAM_TY PE
Identificatore Descrizione
PR OGRAM _S CRIPT S cript
ENUM_LICENSE_TY PE
Identificatore Descrizione
L ICENS E_FR EE U na versione gratuita ed illimitata
Esempio:
ENUM_PROGRAM_TYPE mql_program=(ENUM_PROGRAM_TYPE)MQLInfoInteger(MQL_PROGRAM_TYPE);
switch(mql_program)
{
case PROGRAM_SCRIPT:
{
Print(__FILE__+" is script");
break;
}
case PROGRAM_EXPERT:
{
Print(__FILE__+" is Expert Advisor");s
break;
}
case PROGRAM_INDICATOR:
{
Print(__FILE__+" is custom indicator");
break;
}
default:Print("MQL5 type value is ",mql_program);
//---
Print("MQLInfoInteger(MQL_MEMORY_LIMIT)=", MQLInfoInteger(MQL_MEMORY_LIMIT), " MB");
Print("MQLInfoInteger(MQL_MEMORY_USED)=", MQLInfoInteger(MQL_MEMORY_USED), " MB");
Print("MQLInfoInteger(MQL_HANDLES_USED)=", MQLInfoInteger(MQL_HANDLES_USED), " handles");
ENUM_SY MBOL_INFO_INTEGER
SY M BOL _INDUS TRY The industry or the economy ENUM _S YM BOL _INDUS TRY
branch to which the s ymbol
belongs
SY M BOL _ORDER_GT C_MODE S cadenza degli ordini S top Loss ENUM _S YM BOL _ORDER_GT C_M
o T ak e Profit, se O DE
S YM BOL _EXPIRATI O N_MO DE=S Y
ENUM_SY MBOL_INFO_DOUBLE
SYM BOL _TRADE_TICK_VAL UE_L Prezzo tick calcolato per una double
OS S posizione in perdita
lotti.
La funzione
S ymbolI nfoMarginR ate()
La funzione
S ymbolI nfoMarginR ate()
Calcolo base:
· Se il margine iniziale
(S YM BOL _M ARGIN_INITIAL) è
specificato per un simbolo, il
margine coperto(hedged)
viene specificato come
valore assoluto (in termini
monetari).
1%
ENUM_SY MBOL_INFO_STRING
SYM BOL _S ECT OR_NAME The sector of the economy to w hich string
the financial s ymbol belongs
SYM BOL _INDUS TRY_NAME The industry branch or the industry string
to which the financial s ymbol
belongs
pow(EURGBP,0.3056) *
pow(EUR JPY,0.1891) *
pow(EUR CHF,0.1113) *
pow(EURS EK,0.0785)
I dentification Number).
L 'International S ecurities
U n chart dei prezzi dei simboli può essere basato su prezzi Bid o Last. Il prezzo scelto per i chart dei
simboli influenza anche la generazione e la visualizzazione di barre nel terminale. I valori possibili
della proprietà S YM BOL _CHART_MODE sono descritti in ENUM _S YM BOL _CHART_MODE
ENUM_SY MBOL_CHART_MODE
Identificatore Descrizione
SY M BOL _CHART_MODE_BID Le barre si basano sui prezzi Bid
Per ogni simbolo, possono essere specificate diverse modalità di espirazione di ordini pendenti. Una
flag viene è abbinata a ciascuna modalità. Le flags possono essere combinati utilizzando l'operazione
di logicaOR (||), per esempio, S YM BOL _EXPIRATION_GT C|S YM BOL _EXPIRATION_S PECIFIED. Al fine di
verificare se una determinata modalità è consentita per il simbolo, il risultato della logica AND (&)
dovrebbe essere confrontato con la modalità flag.
Se è specificato il flag S YM BOL _EXPIRATION_S PECIFIED per un simbolo, allora durante l'invio di un
ordine pendente, è possibile specificare il momento fino a che che questo ordine pendente sarà valido.
Esempio:
//+--------------------------------------------------------------------------------+
//| Controlla se la modalità di espirazione specificata è consentita |
//+--------------------------------------------------------------------------------+
bool IsExpirationTypeAllowed(string symbol,int exp_type)
{
//--- Ottiene il valore della proprietà che descrive le modalità di espirazione ammessa
int expiration=(int)SymbolInfoInteger(symbol,SYMBOL_EXPIRATION_MODE);
//--- Restituisce true, se la modalità exp_type è consentita
return((expiration&exp_type)==exp_type);
}
ENUM_SY MBOL_ORDER_GTC_MODE
Identificatore Descrizione
SYM BOL _ORDERS _GT C G li ordini pendenti e i livelli di S top Loss /T ak e
Profit sono validi per un periodo illimitato fino
alla loro cancellazione esplicita
SYM BOL _ORDERS _DAIL Y_EXCL UDING_S T OPS Quando cambia un giorno trade, vengono
eliminati solo gli ordini pendenti, mentre i livelli
di S top Loss e T ak e Profit vengono mantenuti.
Quando si invia un ordine, è possibile specificare il criterio di riempimento per il volume impostato nel
l'ordine. Le modalità di riempimento ordine ammesse per ogni simbolo sono indicate nella tabella. È
possibile impostare diverse modalità di un simbolo dalla combinazione di flags. I flag possono essere
combinati dal funzionamento della logica OR (|), ad esempio,S YM BOL _FILL ING_FOK |
S YM BOL _FI LL ING_I OC. A l fine di verificare se una determinata modalità è consentita per il simbolo, il
risultato dell' AND logico (&) dovrebbe essere confrontato con la modalità flag.
uno strumento
finanziario non è
attualmente
disponibile sul
mercato, l'ordine non
verrà eseguito. Il
Nella modalità di esecuzione a R ichiesta ed Istantanea, per gli ordini di mercato viene sempre usata la
policy di riempimento Fill or Kill, e la policy R eturn viene sempra usata per gli ordini limit. In questo
caso, quando si inviano ordini usando OrderS end o OrderS endAs ync, non è necessario specificare un
criterio di riempimento per essi.
N elle modalità di esecuzione Mark et ed Ex change la polocy R eturn è sempre consentito per tutti i tipi
di ordine. Per scoprire se le altre policy sono ammesse, utilizzare le proprietà S YM BOL _FILL ING_FOK e
S YM BOL _FI LL ING_I OC.
Esempio:
//+--------------------------------------------------------------------------------+
//| Controlla se la modalità di riempimento specificata è consentita |
//+--------------------------------------------------------------------------------+
bool IsFillingTypeAllowed(string symbol,int fill_type)
{
//--- Ottiene il valore della proprietà che descrive le modalità di riempimento consentite
int filling=(int)SymbolInfoInteger(symbol,SYMBOL_FILLING_MODE);
//--- Restituisce true, se la modalità fill_type è consentita
return((filling & fill_type)==fill_type);
}
Quando si invia una richiesta di trade usando la funzione OrderS end() , un tipo di ordine
dall'enumerazione ENUM _ORDER_TYPE deve essere specificato per alcune operazioni. Non tutti i tipi di
ordini possono essere consentiti per uno specifico simbolo. S YM BOL _ORDER_MODE la proprietà
descrive le flags dei tipi di ordine consentiti.
M BOL _ORDER_L IM IT
SY 2 G li ordini Limit sono ammessi
(Buy Limit e S ell Limit)
M BOL _ORDER_S T OP
SY 4 Ordini di S top sono ammessi
(Buy S top e S ell S top)
M BOL _ORDER_S L
SY 16 S top Loss è consentito
M BOL _ORDER_T P
SY 32 T ak e Profit è consentito
Esempio:
//+--------------------------------------------------------------------------------+
//| La funzione stampa i tipi di ordine consentiti per il simoblo |
//+--------------------------------------------------------------------------------+
void Check_SYMBOL_ORDER_MODE(string symbol)
{
//--- riceve il valore della proprietà che descrivendo i tipi di ordine consentiti
int symbol_order_mode=(int)SymbolInfoInteger(symbol,SYMBOL_ORDER_MODE);
//--- controlla ordini di mercato (Market Execution)
if((SYMBOL_ORDER_MARKET&symbol_order_mode)==SYMBOL_ORDER_MARKET)
Print(symbol+": Gli ordini di Mercato sono consentiti (Buy e Sell)");
//--- controlla Ordini Limit
if((SYMBOL_ORDER_LIMIT&symbol_order_mode)==SYMBOL_ORDER_LIMIT)
Print(symbol+": Ordini Buy Limit e Sell Limit sono consentiti");
//--- controlla Ordini di Stop
if((SYMBOL_ORDER_STOP&symbol_order_mode)==SYMBOL_ORDER_STOP)
Print(symbol+": Ordini Buy Stop e Sell Stop sono consentiti");
//--- controlla ordini Stop Limit
if((SYMBOL_ORDER_STOP_LIMIT&symbol_order_mode)==SYMBOL_ORDER_STOP_LIMIT)
Print(symbol+": Ordini Buy Stop Limit e Sell Stop Limit sono consentiti");
//--- controlla se il piazzare ordini Stop Loss è consentito
if((SYMBOL_ORDER_SL&symbol_order_mode)==SYMBOL_ORDER_SL)
Print(symbol+":Ordini Stop Loss sono consentiti");
//--- controlla se piazzare ordini Take Profit è consentito
if((SYMBOL_ORDER_TP&symbol_order_mode)==SYMBOL_ORDER_TP)
Print(symbol+":Ordini Take Profit sono consentiti");
//---
}
L 'enumerazione ENUM _S YM BOL _CALC_MODE viene utilizzata per ottenere informazioni su come i
requisiti di margine per un simbolo vengono calcolati.
ENUM_SY MBOL_CALC_MODE
Profitto: (prezzo_close -
prezzo_open ) *
Grandezza_contratto * Lotti
considerazione la leva
Profitto: (prezzo_close -
prezzo_open) *
Grandezza_Contratto * Lotti
Profitto: (prezzo_close -
prezzo_open) * PrezzoT ick /
Profitto: (prezzo_close -
prezzo_open ) *
Grandezza_Contratto * Lotti
SYM BOL _CALC_MODE_CFDIND Modalità indici CFD - calcolo del Margine: (Lotti *
EX margine e del profitto per indici GrandezzaContratto *
T asso_del_Margine
Profitto: (prezzo_close -
prezzo_open ) *
Grandezza_Contratto * Lotti
T asso_del_Margine
Profitto: (prezzo_close -
prezzo_open ) *
Grandezza_Contratto * Lotti
Profitto: (prezzo_close -
prezzo_open) * Lotti *
PrezzoT ick / GrandezzaT ick
MarginDiscount secondo le
seguenti regole: Profitto: (prezzo_close -
1. S e il prezzo di una posizione prezzo_open) * Lotti *
long (ordine di acquisto buy) è PrezzoT ick / GrandezzaT ick
inferiore al prezzo stimato,
MarginDiscount = Lotti *
((PriceS ettle-PrezzoOrdine) *
((PrezzoOrdine-PriceS ettle) *
Grandezza_Contratto +
I nteresseMaturato * Lotti *
GrandezzaContratto
Profitto: (prezzo_close -
prezzo_open) *
Grandezza_Contratto * Lotti
Grandezza_Contratto +
I nteresseMaturato * Lotti *
GrandezzaContratto
Ci sono diversi modi di scambio di simboli. Le informazioni sulle modalità di trading di un certo
simbolo si riflettono nei valori dell'enumerazione ENUM _S YM BOL _TRADE_MODE.
ENUM_SY MBOL_TRADE_MODE
Identificatore Descrizione
SY M BOL _TRADE_MODE_DIS ABLED I l trade è disabilitato per il simbolo
Possibili modalità di esecuzione di un affare per un certo simbolo sono definiti nell'enumerazione
ENUM _S YM BOL _TRADE_EXECUTION.
Identificatore Descrizione
SY M BOL _TRADE_EXECUTION_R EQUES T Esecuzione a richiesta
valuta di deposito client, allora i valori di tali parametri sono specificati come una somma di denaro
nella valuta di deposito del cliente.
Identificatore Descrizione
SY M BOL _S W AP_MODE_DIS ABLED Sw ap disabilitato (senza s wap)
Identificatore Descrizione
SY M BOL _S W AP_MODE_CURR ENCY_S YM BOL G li s wap vengono caricati in denaro nella valuta
di base del simbolo
SY M BOL _S W AP_MODE_CURR ENCY_M ARGIN Gli s wap vengono caricati in denaro nella valuta
margine del simbolo
SY M BOL _S W AP_MODE_INT ER ES T_CURR ENT Gli s wap vengono caricati come interesse
specifico annuale del prezzo di uno strumento al
calcolo dello s wap (l'anno standard della banca è
360 giorni)
SY M BOL _S W AP_MODE_R EOPEN_CURR ENT G li s wap vengono caricati dalla riapertura delle
posizioni. Al termine di una giornata di trading
la posizione viene chiusa. Il giorno dopo viene
riaperto dai punti +/- specificati del prezzo di
chiusura (parametri S YM BOL _S W AP_LONG e
S YM BOL _S W A P_S H O RT )
I valori dell'enumerazione ENUM _DAY_OF_W EEK vengono utilizzati per specificare i giorni della
settimana.
Identificatore Descrizione
S UNDAY D omenica
MONDAY Lunedi
E
TU S DAY Martedì
FRIDAY V enerdì
S ATURDAY S abato
sottostante (beni, titoli, futures, ecc.) ad un prezzo specificato prima o prima di una data specifica.
Le seguenti enumerazioni descrivono le proprietà delle opzioni, tra cui il tipo di opzione e il diritto che
ne derivano.
ENUM_SY MBOL_OPTION_RIGHT
Identificatore Descrizione
SY M BOL _OPTION_RIGHT_CALL n opzione di chiamata (call) ti consente di
U '
ENUM_SY MBOL_OPTION_MODE
Identificatore Descrizione
SY M BOL _OPTION_MODE_EUR OPEAN L 'opzione europea può essere esercitata solo in
una data specifica (scadenza, data di
esecuzione, data di consegna)
Financial instruments are categorized by sectors of the economy. An economic sector is a part of
economic activity which has specific characteristics, economic goals, functions and behavior, which
allow separating this sector from other parts of the economy. ENUM _S YM BOL _S ECT OR lists the
economic sectors which a trading instruments can belong to.
ID Description
S ECT OR_UNDEFINED U ndefined
ID Description
S ECT OR_ENERGY Energ y
Each financial instrument can be assigned to a specific type of industry or economy branch. An
industry is a branch of an economy that produces a closely related set of raw materials, goods, or
services. ENUM _S YM BOL _INDUS TRY lists industries which a trading instrument can belong to.
ID Description
INDUS TRY_UND FIN D E E U ndefined
B asic materials
Communication services
ID Description
E
INDUS TRY_ADV RTIS ING A dvertising agencies
P L
INDUS TRY_ UB IS HING Publishing
Consumer cyclical
L
INDUS TRY_ UXURY_G OODS Lux ury goods
ID Description
INDUS TRY_TRAV EL _S ERVICES T ravel services
Consumer defensive
E E
INDUS TRY_B V RAG S _BR E EW ERS B everages - Brewers
E E
INDUS TRY_B V RAG S _N E ON_ALCO B everages - Non-alcoholic
E E E
INDUS TRY_B V RAG S _W IN RI E ES B everages - W ineries and distilleries
Energ y
INDUS TRY_ OIL _GAS _DRILL ING Oil and gas drilling
INDUS TRY_ OIL _GAS _EP Oil and gas ex traction and processing
INDUS TRY_ OIL _GAS _EQUIPMENT Oil and gas equipment and services
INDUS TRY_ OIL _GAS _INT EGRAT ED Oil and gas integrated
INDUS TRY_ OIL _GAS _M IDS TR EAM Oil and gas midstream
INDUS TRY_ OIL _GAS _R EFINING Oil and gas refining and mark eting
F inance
ID Description
INDUS TRY_ CLOS E_END_FUND_EQUITY Closed-end fund - Equity
H ealthcare
INDUS TRY_DRUGS _ M ANUFACTUR ERS _S PEC D rugs manufacturers - S pecialty and generic
I ndustrials
ID Description
E
INDUS TRY_BUS IN S S _ EQUIPMENT B usiness equipment and supplies
E
INDUS TRY_ NGIN EERING_CONS TRUCTION Engineering and construction
R eal estate
INDUS TRY_R EAL _ES TAT E_DIVERS IFIED R eal estate - Diversified
INDUS TRY_R EAL _ES TAT E_S ERVICES R eal estate services
ID Description
INDUS TRY_R EIT_OFFICE R EIT - Office
T echnolog y
U tilities
Proprietà Account
Per ottenere informazioni sul corrente account ci sono diverse funzioni: AccountInfoInteger(),
A ccountI nfoDouble() e A ccountI nfoS tring(). I valori dei parametri delle funzioni possono accettare i
ENUM_ACCOUNT_INFO_INTEGER
A CCOUNT_M ARGIN_S O_MODE Modalità per l'impostazione del ENUM _ACCOUNT_S T OPOUT_MO
margine minimo consentito DE
ENUM_ACCOUNT_INFO_DOUBLE
espressa in percentuale o in
valuta di deposito
espressa in percentuale o in
valuta di deposito
ENUM_ACCOUNT_INFO_STRING
Ci sono diversi tipi di account che possono essere aperti su un trade server. Il tipo di account in cui un
programma mql5 è in esecuzione può essere scoperto mediante l'enumerazione
ENUM _ACCOUNT_TRADE_MODE.
ENUM_ACCOUNT_TRADE_MODE
Identificatore Descrizione
A CCOUNT_TRADE_MODE_DEMO A ccount demo
N el caso in cui l'equità non è sufficiente a mantenere le posizioni aperte, avviene la situazione di S top
Out, vale a dire che si verifica la chiusura forzata. Il livello di margine minimo al quale si verifica lo
S top Out può essere impostato in percentuale o in termini monetari. Per individuare la modalità
ENUM_ACCOUNT_STOPOUT_MODE
Identificatore Descrizione
A CCOUNT_S T OPOUT_MODE_PER CENT Modalità di stop out dell' account in termini
percentuali
ENUM_ACCOUNT_MARGIN_MODE
Identifier Description
A CCOUNT_M ARGIN_MODE_R ETAIL _NETTING Utilizzato per i mercati OT C per interpretare le
posizioni nella modalità " netting " (può esistere
una sola posizione per un simbolo). Il margine
viene calcolato in base al tipo di simbolo
(S YM BOL _TRADE_CALC_MODE).
A CCOUNT_M ARGIN_MODE_R ETAIL _H EDGING U tilizzato per i mercati valutari in cui sono
possibili posizioni individuali (hedging, possono
esistere più posizioni per un simbolo). Il
margine viene calcolato in base al tipo di
simbolo (S YM BOL _TRADE_CALC_MODE) tenendo
conto del margine coperto
(S YM BOL _M ARGIN_H EDGED).
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- Nome della società
string company=AccountInfoString(ACCOUNT_COMPANY);
//--- Nome del cliente
string name=AccountInfoString(ACCOUNT_NAME);
//--- Numero dell'account
long login=AccountInfoInteger(ACCOUNT_LOGIN);
//--- Nome del server
string server=AccountInfoString(ACCOUNT_SERVER);
//--- Valuta dell' account
string currency=AccountInfoString(ACCOUNT_CURRENCY);
//--- Account demo, contest o reale
ENUM_ACCOUNT_TRADE_MODE account_type=(ENUM_ACCOUNT_TRADE_MODE)AccountInfoInteger(ACCOUNT_TRADE_M
//--- Ora trasformiamo il valore dell'enumerazione in una forma comprensibile
string trade_mode;
switch(account_type)
{
case ACCOUNT_TRADE_MODE_DEMO:
trade_mode="demo";
break;
case ACCOUNT_TRADE_MODE_CONTEST:
trade_mode="contest";
break;
default:
trade_mode="real";
break;
}
//--- Lo Stop Out è impostato in percentuale o in denaro
ENUM_ACCOUNT_STOPOUT_MODE stop_out_mode=(ENUM_ACCOUNT_STOPOUT_MODE)AccountInfoInteger(ACCOUNT_MA
//--- Ottiene il valore dei livelli quando si verificano il Margin Call e lo Stop Out
double margin_call=AccountInfoDouble(ACCOUNT_MARGIN_SO_CALL);
double stop_out=AccountInfoDouble(ACCOUNT_MARGIN_SO_SO);
//--- Mostra brevi informazioni sull'account
PrintFormat("L'account del cliente '%s' #%d %s aperto '%s' sul server '%s'",
nome,login, trade_mode,società,server);
PrintFormat("Valuta dell'account - %s, i livelli di MarginCall e StopOut sono impostati in %s",
currency,(stop_out_mode==ACCOUNT_STOPOUT_MODE_PERCENT)?"percentage":" money");
PrintFormat("MarginCall=%G, StopOut=%G",margin_call,stop_out);
}
Statistiche Testing
Dopo che il test è finito, vengono calcolati diversi parametri delle statistiche di risultati di trading. I
valori dei parametri possono essere ottenuti utilizzando la funzione T esterS tatistics(), specificando il
parametro ID dall'enumerazione ENUM _S TATIS TICS .
Anche se due tipi di parametri (int e double) vengono utilizzati per il calcolo delle statistiche, la
funzione restituisce tutti i valori in forma double. T utti i valori statistici di tipo double vengono
espressi nella valuta di deposito di default, se non diversamente specificato.
ENUM_STATISTICS
ID Descrizione di un Tipo
parametro statistico
S TAT_INITIA L _DEPOS IT I l valore del deposito iniziale double
zero
ID Descrizione di un Tipo
parametro statistico
S TAT_ M AX_CONW INS Il profitto totale della più lunga double
serie di trades profittevoli
ID Descrizione di un Tipo
parametro statistico
al momento del drowdown
massimo del bilancio in
percentuale
(S TAT_BAL ANCE_DDR EL _PER CE
NT ).
S TAT_GR O S S _LO S S . S e
S TAT_GR O S S _LO S S =0, il
fattore di profitto è pari a
DBL _M AX
ID Descrizione di un Tipo
parametro statistico
S TAT_BA L ANCE_DD
Costanti di Trade
V arie costanti utilizzate la programmazione di strategie di trading sono suddivise nei seguenti gruppi:
ENUM_SERIES_INFO_INTEGER
S ERIES _T ER M INAL _FIRS TDAT E La prima data nello storico del datetime
simbolo nel terminale client,
indipendentemente dal
timeframe
Proprietà Ordini
Le richieste per eseguire le operazioni di trade vengono formalizzate come ordini. Ogni ordine ha una
serie di proprietà per la lettura. Le informazioni su di essi possono essere ottenute utilizzando le
funzioni OrderGet...() e H istoryOrderGet...().
ENUM_ORDER_PROPERTY _INTEGER
ENUM_ORDER_PROPERTY _DOUBLE
ENUM_ORDER_PROPERTY _STRING
Quando si invia una richiesta di trade usando la funzione OrderS end(), alcune operazioni richiedono
l'indicazione del tipo di ordine. Il tipo di ordine viene specificato nel campo tipo della struttura speciale
M qlT radeR equest, e può accettare valori dell'enumerazione ENUM _ORDER_TYPE.
ENUM_ORDER_TY PE
Identificatore Descrizione
ORDER_TYPE_BUY Ordine di mercato Buy
Identificatore Descrizione
ORDER_TYPE_S ELL _L IM IT Ordine pendente S ell Limit
Ogni ordine ha uno status che descrive il suo stato. Per ottenere informazioni, utilizzare
OrderGetInteger() oppure H istoryOrderGetInteger() con il modificatore ORDER_S TAT E. I valori
consentiti vengono memorizzati nell' enumerazione ENUM _ORDER_S TAT E.
ENUM_ORDER_STATE
Identificatore Descrizione
ORDER_S TAT E_S TART ED Ordine controllato, ma non ancora accettato dal
brok er
ORDER_S TAT E_R EQUES T_ADD L ' ordine è stato registrato (piazzato al trading
s ystem)
ORDER_S TAT E_R EQUES T_MODIFY L 'ordine è stato modificato (cambio dei suoi
parametri)
ORDER_S TAT E_R EQUES T_CANCEL L 'ordine è stato eliminato (eliminato dal trading
s ystem)
Quando si invia una richiesta di trade con la funzione OrderS end(), la policy di filling può essere
impostata per un ordine nel campo type_filling della struttura speciale M qlT radeR equest. S ono
consentiti valori dell'enumerazione ENUM _ORDER_TYPE_FILL ING. Per ottenere il valore di questa
ENUM_ORDER_TY PE_FILLING
Identificatore Descrizione
ORDER_FILL ING_FOK Questa politica di filling significa che un ordine
può essere riempito solo nella quantità
specificata. S e la quantità necessaria di uno
strumento finanziario non è attualmente
disponibile sul mercato, l'ordine non verrà
eseguito. Il volume richiesto può essere
riempito con diverse offerte disponibili sul
mercato al momento.
ORDER_FILL ING_R ETURN Questa policy viene utilizzata solo per ordini di
mercato (ORDER_TYPE_BUY e
ORDER_TYPE_S ELL), ordini limit e stop limit
(ORDER_TYPE_BUY_L IM IT ,
ORDER_TYPE_S ELL _L IM IT ,
ORDER_TYPE_BUY_S T OP_L IM IT e
ORDER_TYPE_S ELL _S T OP_L IM IT ) e solo per i
simboli con esecuzione Mark et o Ex change. In
caso il riempimento di un ordine a mercato o
ordine limit con volume rimanente parziale non
venga annullato, ma ulteriormente elaborato.
Per l'attivazione degli ordini
ORDER_TYPE_BUY_S T OP_L IM IT e
ORDER_TYPE_S ELL _S T OP_L IM IT , viene creato
un corrispondente limit order
ORDER_TYPE_BUY_L IM IT/ORDER_TYPE_S ELL _L I
M IT con l'esecuzione ORDER_FILL ING_R ETURN.
Il periodo di validità dell'ordine può essere impostato nel campo type_time della speciale struttura
M qlT radeR equest durante l'invio di una richiesta di trade con la funzione OrderS end(). I valori
dell'enumerazione ENUM _ORDER_TYPE_TIME sono ammessi. Per ottenere il valore di questa proprietà
utilizzare la funzione OrderGetInteger() oppure H istoryOrderGetInteger() con il modificatore
ORDER_TYPE_TIME.
ENUM_ORDER_TY PE_TIME
Identificatore Descrizione
ORDER_TIME_GT C B uona fino a cancellazione ordine
La ragione per l'immissione dell'ordine è contenuta nella proprietà ORDER_R EAS ON. Un ordine può
essere posizionato da un programma MQL5, da un'applicazione mobile, a seguito di S topOut, ecc. I
valori possibili di ORDER_R EAS ON sono descritti nell'enumerazione ENUM _ORDER_R EAS ON.
ENUM_ORDER_REASON
Identificatore Descrizione
ORDER_R EAS ON_CL IENT L 'ordine è stato piazzato da un terminale
des k top
Proprietà Posizione
L ' esecuzione di operazioni di trade provoca l'apertura di una posizione, cambiando il suo volume e/o
direzione, o la sua scomparsa. Le operazioni di trade vengono effettuate sulla base di ordini, inviati
dalla funzione OrderS end() sottoforma di richieste di trade. Per ogni strumento finanziario (simbolo) è
possibile solo una posizione aperta. Una posizione ha un insieme di proprietà disponibili per la lettura
da parte delle funzioni PositionGet...().
ENUM_POSITION_PROPERTY _INTEGER
L 'identificatore posizione è
specificato in ogni ordine
(ORDER_POS ITION_ID) ed
affare (DEAL _POS ITION_ID)
usati per aprirla, modificarla o
chiuderla. Usare questa
POS ITION_R EAS ON La ragione per aprire una ENUM _POS ITION_R EAS ON
posizione
ENUM_POSITION_PROPERTY _DOUBLE
ENUM_POSITION_PROPERTY _STRING
La direzione di una posizione aperta (buy o sell) è definita dal valore dell'enumerazione
ENUM _POS ITION_TYPE. Per ottenere il tipo di una posizione aperta utilizzare la funzione
PositionGetInteger() con il modificatore POS ITION_TYPE.
ENUM_POSITION_TY PE
Identificatore Descrizione
POS ITION_TYPE_BUY B y u
La ragione per aprire una posizione è contenuta nella proprietà POS ITION_R EAS ON. Una posizione può
essere a seguito dell'attivazione di un ordine da un terminale des k top, da un'applicazione mobile, da
un Ex pert Advisor, ecc. I possibili valori di POS ITION_R EAS ON sono descritti nell'enumerazione
ENUM _POS ITION_R EAS ON.
ENUM_POSITION_REASON
Identificatore Descrizione
POS ITION_R EAS ON_CL IENT La posizione è stata aperta a seguito
dell'attivazione di un ordine piazzato da un
terminale des k top
Identificatore Descrizione
POS ITION_R EAS ON_EXPERT La posizione è stata aperta a seguito
dell'attivazione di un ordine piazzato da un
programma MQL5, ad esempio un Ex pert
A dvisor o uno S cript
Proprietà Affari(Deal)
Un affare è il riflesso del fatto dell'esecuzione di un' operazione di trade basata su un ordine che
contiene una richiesta di trade. Each trade is described by properties that allow to obtain information
about it. Per leggere i valori delle proprietà, vengono utilizzate le funzioni del tipo H istoryDealGet...(),
che restituiscono valori delle enumerazioni corrispondenti.
ENUM_DEAL_PROPERTY _INTEGER
E L _ORDER
D A A ffare numero d'ordine long
E L _TIME
D A Orario affare datetime
E L _TIME_M S C
D A Il tempo di esecuzione di un long
affare in millisecondi dal
01. 01. 1970
E L _TYPE
D A T ipo Affare ENUM _DEAL _TYPE
E L _ENTRY
D A Entry dell'affare - ingresso in, ENUM _DEAL _ENTRY
ingresso out, inversione
E L _M AGIC
D A Numero magico dell' affare long
(vedi ORDER_M AGIC)
E L _R EAS ON
D A La ragione o la fonte per ENUM _DEAL _R EAS ON
l'esecuzione degli affari
E L _POS ITION_ID
D A Identificatore di posizione, nell' long
apertura, modifica o chiusura
di ciò a cui questo affare
prende parte. Ogni posizione
ha un identificatore univoco
che viene assegnato a tutti gli
affari eseguiti per il simbolo
durante l'intero ciclo di vita
della posizione.
ENUM_DEAL_PROPERTY _DOUBLE
E L _PRICE
D A Prezzo affare double
E L _COMM IS S ION
D A Prezzo commissione double
E L _PR OFIT
D A Profitto affare double
E L _FEE
D A Le commissioni per effettuare double
un affare vengono addebitate
subito dopo aver eseguito
l'affare
E L _S L
D A S top Loss level double
· Entry and reversal deals use
the S top Loss values from
the original order based on
which the position was
opened or reversed
· Ex it deals use the S top Loss
of a position as at the time
of position closing
E L _T P
D A T ak e Profit level double
· Entry and reversal deals use
the T ak e Profit values from
the original order based on
which the position was
opened or reversed
· Ex it deals use the T ak e
Profit value of a position as
at the time of position
closing
ENUM_DEAL_PROPERTY _STRING
E L _COMMENT
D A Commento affare string
Ogni affare è caratterizzato da un tipo, i valori consentiti sono elencati in ENUM _DEAL _TYPE. Per
ottenere informazioni sul tipo di operazione, utilizzare la funzione H istoryDealGetInteger() con il
modificatore DEAL _TYPE.
ENUM_DEAL_TY PE
Identificatore Descrizione
E L _TYPE_BUY
D A B y u
E L _TYPE_S ELL
D A S ell
Identificatore Descrizione
E L _TYPE_BAL ANCE
D A B alance
E L _TYPE_CR EDIT
D A Credit
E L _TYPE_CHARGE
D A Carico aggiuntivo
E L _TYPE_CORR ECTION
D A Correzione
E L _TYPE_BONUS
D A B onus
E L _TYPE_COMM IS S ION
D A Commissione aggiuntiva
E L _TYPE_COMM IS S ION_DAIL Y
D A Commissione giornaliera
E L _TYPE_COMM IS S ION_MONTH L Y
D A Commissione mensile
E L _TYPE_COMM IS S ION_AGENT_DAIL Y
D A Commissione agente giornaliero
E L _TYPE_COMM IS S ION_AGENT_MONTH L Y
D A Commissione agente mensile
E L _TYPE_INT ER ES T
D A T asso d'interesse
E L _TYPE_BUY_CANCELED
D A A ffare buy annullato Non ci può essere una
situazione in cui un affare precedentemente
eseguito venga annullato. In questo caso, il tipo
di affare precedentemente eseguito
(DEAL_TYPE_BUY) viene cambiato in
DEA L _TYPE_BUY_C ANCELED, ed il suo
profitto/perdita viene reso a zero. Il precedente
profitto/perdita ottenuti vengono
caricati/prelevati usando un' operazione di
bilanciamento separata.
E L _DIVIDEND
D A Operazioni di dividendo
E L _DIVIDEND_FRANKED
D A Operazioni di dividendi frante (non tassabili)
E L _TAX
D A A ddebiti tasse
Gli affari differiscono non solo per i loro tipi impostati in ENUM _DEAL _TYPE, ma anche nel modo in cui
cambiano le posizioni. Questa può essere una semplice posizione di apertura, o l'accumulo di una
posizione precedentemente aperta (ingresso di mercato), chiusura di posizione da un affare opposto di
Tutte queste situazioni sono descritte da valori dell'enumerazione ENUM _DEAL _ENTRY. Per ricevere
queste informazioni su un affare, utilizzare la funzione H istoryDealGetInteger() con il modificatore
DEA L _ENTRY.
ENUM_DEAL_ENTRY
Identificatore Descrizione
E L _ENTRY_IN
D A Entry in
E L _ENTRY_OUT
D A Entry out
E L _ENTRY_INOUT
D A R everse
E L _ENTRY_OUT_BY
D A Chiude una posizione da una opposta
La ragione dell'esecuzione degli affari è contenuta nella proprietà DEAL _R EAS ON. Un affare può essere
eseguito in seguito all'avvio di un ordine piazzato da un'applicazione mobile o da un programma MQL5,
nonché come risultato dell'evento S topOut, del calcolo del margine di variazione, ecc. I valori possibili
di DEAL _R EAS ON sono descritti nell'enumerazione ENUM _DEAL _R EAS ON. Per gli affari non-di-trading
derivanti dal bilancio, credito, commissioni e altre operazioni, DEAL _R EAS ON_CL IENT è indicato come
motivo.
ENUM_DEAL_REASON
Identificatore Descrizione
E L _R EAS ON_CL IENT
D A L 'affare è stato eseguita in seguito
all'attivazione di un ordine piazzato da un
terminale des k top
E L _R EAS ON_MOBILE
D A L 'affare è stato eseguito in seguito
all'attivazione di un ordine piazzato da
un'applicazione mobile
E L _R EAS ON_W EB
D A L 'affare è stato eseguito in seguito
all'attivazione di un ordine piazzato dalla
piattaforma web
E L _R EAS ON_EXPERT
D A L 'affare è stato eseguito in seguito
all'attivazione di un ordine piazzato da un
programma MQL5, ad esempio un Ex pert
A dvisor o uno S cript
E L _R EAS ON_S L
D A L 'affare è stato eseguito in seguito
all'attivazione dello S top Loss
E L _R EAS ON_T P
D A L 'affare è stato eseguito in seguito
all'attivazione del T ak e Profit
Identificatore Descrizione
E L _R EAS ON_S O
D A L 'affare è stato eseguito in seguito
all'attivazione dell'evento S top Out
E L _R EAS ON_S PL IT
D A L 'affare è stato eseguito dopo la ripartizione
(riduzione dei prezzi) di uno strumento, che
aveva una posizione aperta durante l'annuncio
split
ENUM_TRADE_REQUEST_ACTIONS
Identificazione Descrizione
E
TRAD _A CTION_DEAL Piazza un ordine di trade per un' esecuzione
immediata con i parametri specificati (ordine di
mercato)
E
TRAD _A CTION_PENDING Piazza un ordine di trade per l' esecuzione in
condizioni specifiche (ordine pendente)
E
TRAD _A CTION_S L T P Modifica i valori S top Loss e T ak e Profit di una
posizione aperta
E
TRAD _A CTION_MODIFY Modifica i parametri dell' ordine effettuato in
precedenza
E
TRAD _A CTION_R EMOVE Elimina l'ordine pendnete piazzato in precedenza
E
TRAD _A CTION_CLOS E_BY Chiude una posizione da una opposta
Esempio per TRADE_ACTION_DEAL, operazione di trade per aprire una posizione Buy:
Esempio di E
TRAD _A CTION_DEAL, operazione di trade per aprire la posizione S ell:
Esempio di E
TRAD _A CTION_DEAL, operazione di trade per chiudere la posizione:
}
}
//+------------------------------------------------------------------+
Esempio di E
TRAD _A CTION_PENDING, operazione di trade per piazzare un ordine pendente:
Esempio per TRADE_ACTION_S L T P, operazione di trade per la modifica dei valori di S top Loss e T ak e
Profit di una posizione aperta:
Esempio per TRADE_ACTION_MODIFY, operazione di trade per la modifica dei livelli di prezzo degli
ordini pendenti:
request.sl = NormalizeDouble(price-offset*point,digits);
request.price =NormalizeDouble(price,digits); // prezzo d'apertura n
}
else if(type==ORDER_TYPE_SELL_STOP)
{
price = SymbolInfoDouble(Symbol(),SYMBOL_ASK)-offset*point;
request.tp = NormalizeDouble(price-offset*point,digits);
request.sl = NormalizeDouble(price+offset*point,digits);
request.price =NormalizeDouble(price,digits); // prezzo d'apertura n
}
//--- invia la richiesta
if(!OrderSend(request,result))
PrintFormat("OrderSend errore %d",GetLastError()); // se impossibile inviare la richie
//--- informazioni riguardo l'operazione
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order)
//--- azzera la richiesta ed i risultanti valori
ZeroMemory(request);
ZeroMemory(result);
}
}
}
//+------------------------------------------------------------------+
Esempio per TRADE_ACTION_R EMOVE, operazione di trade per eliminare ordini pendenti:
Esempio per E
TRAD _A CTION_CLOS E_BY, operazione di trade per chiudere posizioni da posizioni
opposte:
· I nviare una richiesta di trade da ualsiasi applicazione MQL5 nel terminale client utilizzando le
q
Per esempio, quando si invia un ordine di acquisto di mercato, esso viene gestito, un ordine di
acquisto appropriata viene creato per l'account, l'ordine quindi viene eseguito e rimosso dalla lista di
quelli aperti, e poi viene aggiunto alla cronistoria ordini, un appropriato aff viene aggiunto alla
cronistoria ed una nuova posizione viene creata. T utte queste azioni sono transazioni di trade.
Per lasciare che un programmatore possa monitorare le azioni eseguite in relazione a un account di
trade, viene fornita la funzione OnT radeT ransaction . Questo handler permette di ottenere transazioni
di trade applicate ad un account in applicazioni MQL5. La descrizione della transazione di trade è
presentata nel primo parametro di OnT radeT ransaction utilizzando la struttura M qlT radeT ransaction.
Il tipo di transazione di trade viene immesso nel parametro tipo della struttura M qlT radeT ransaction.
Possibili tipi di transazioni di trade vengono descritte dall'enumerazione seguente:
ENUM_TRADE_TRANSACTION_TY PE
Identificatore Descrizione
E
TRAD _TRANS A CTION_ORDER_ADD L 'aggiunta di un nuovo ordine aperto.
E
TRAD _TRANS A CTION_ORDER_UPDAT E Aggiornamento di un ordine aperto. Gli
aggiornamenti includono non solo le evidenti
modifiche dal terminale client o dal lato trade
server, ma anche cambiamenti dello stato di un
ordine quando lo si imposta (ad esempio,
passaggio da ORDER_S TAT E_S TART ED a
ORDER_S TAT E_PL ACED o da
ORDER_S TAT E_PL ACED a
ORDER_S TAT E_PARTIAL, ecc).
E
TRAD _TRANS A CTION_ORDER_DELET E La rimozione di un ordine dalla lista di quelli
aperti. Un ordine può essere eliminato da quelli
aperti a seguito dell' impostazione di un'
Identificatore Descrizione
appropriata richiesta o esecuzione
(riempimento) e spostandosi nella cronistoria.
E
TRAD _TRANS A CTION_DEAL _ADD Aggiunta di un affare per la cronistoria. L 'azione
viene eseguita come risultato di un' esecuzione
di ordine o l'esecuzione di operazioni su un saldo
del conto.
E
TRAD _TRANS A CTION_DEAL _UPDAT E A ggiornamento di un affare nella cronistoria. Ci
possono essere casi in cui un accordo applicato
in precedenza viene modificato su un server.
Per esempio, un accordo è stato cambiato in un
sistema commerciale esterno (scambio) in cui
era precedentemente trasferito da un brok er.
E
TRAD _TRANS A CTION_DEAL _DELET E Eliminazione di un affare dalla cronistoria. Ci
possono essere casi in cui un accordo
precedentemente eseguito viene eliminato da un
server. Per esempio, un accordo è stato
eliminato in un sistema di trade esterno
(scambio) in cui era precedentemente trasferito
da un brok er.
E
TRAD _TRANS A CTION_HIS T ORY_ADD Aggiunta di un ordine allo storico come risultato
di esecuzione o cancellazione.
E
TRAD _TRANS A CTION_HIS T ORY_UPDAT E Modifica un ordine situato nella storia ordini.
Questo tipo viene fornito per migliorare la
funzionalità sul lato trade server.
E
TRAD _TRANS A CTION_HIS T ORY_DELET E Deleting an order from the orders history.
Questo tipo viene fornito per migliorare la
funzionalità sul lato trade server.
E
TRAD _TRANS A CTION_POS ITION Modifica di una posizione non correlata ad
un'esecuzione di affare. Questo tipo di
transazione mostra che una posizione è stata
modificata dal lato trade server. Volume della
posizione, prezzo di apertura, S top Loss e T ak e
Profit possono essere modificati. I dati sulle
modifiche vengono inviati nella struttura
M qlT radeT ransaction tramite l'handler
OnT radeT ransaction. La modifica della posizione
(aggiunta, modifica o chiusura), come risultato
dell'esecuzione di un affare, non porta al
verificarsi della transazione
TRADE_TRANS A C TI O N_PO S ITI O N.
E
TRAD _TRANS A CTION_R EQUES T La notifica del fatto che una richiesta di trade
sia stata elaborata dal server e ed il risultato
dell'elaborazione sia stato ricevuto. S olo il
campo tipo (tipo di transazione di trade) deve
Identificatore Descrizione
essere analizzato per tali operazioni nella
struttura M qlT radeT ransaction. Il secondo e
terzo parametro di OnT radeT ransaction
(richiesta e risultato) devono essere analizzati
per ulteriori dati.
A seconda del tipo di transazione di trade, vari parametri vengono riempiti nella struttura
M qlT radeT ransaction descrivendola. Una descrizione dettagliata dei dati presentati è mostrata in
" S truttura di una transazione di T rade" .
Vedi anche
S trutture di una T ransazione di T rade, OnT radeT ransaction
Per ottenere informazioni sullo stato corrente del DOM dal mezzo MQL5, vengono utilizzate le funzioni
Mark etBookGet(), che pongono la " schermata" DOM nell'array di strutture M qlBookInfo. Ciascun
elemento della matrice nel campo field contiene informazioni sulla direzione dell 'ordine - il valore
dell'enumerazione ENUM _BOOK_TYPE.
ENUM_BOOK_TY PE
Identificatore Descrizione
B OOK_TYPE_S ELL Ordine di S ell(Offerta)
Vedi anche
Le strutture e le classi, S truttura del DOM, T ipi di operazioni di T rade, Informazioni di Mercato
ENUM_SIGNAL_BASE_DOUBLE
ID Descrizione
S IGNA L _BAS E_BAL ANCE A ccount: bilancio
ENUM_SIGNAL_BASE_INTEGER
ID Descrizione
S IGNA L _BAS E_DAT E_PUBL IS H ED Data di pubblicazione (la data di quando è
diventato disponibile per la sottoscrizione)
ENUM_SIGNAL_BASE_STRING
ID Descrizione
S IGNA L _BAS E_AUTH OR_LOGIN Login Autore
ID Descrizione
S IGNA L _BAS E_BR OKER N ome del Brok er (società)
ENUM_SIGNAL_INFO_INTEGER
ID Descrizione
S IGNA L _INFO_CONFIR M ATIONS _DIS ABLED The flag enables s ynchronization ithout
w
confirmation dialog
S IGNA L _INFO_S UBS CRIPTION_ENABLED " Copy trades by subscription" permission flag
S IGNA L _INFO_T ER M S _AGR EE F lag " Acconsento ai termini di uso del servizio
S egnali"
ENUM_SIGNAL_INFO_DOUBLE
ID Descrizione
S IGNA L _INFO_EQUITY_L IM IT Limite equità
Enumerazione di proprietà di tipo <li1>string </li1><t2> delle impostazioni di copia dei segnali:</t2>
ENUM_SIGNAL_INFO_STRING
ID Descrizione
S IGNA L _INFO_NAME N ome del segnale
Vedi anche
S egnali di T rade
Named Constants
T utte le costanti utilizzate in MQL5 possono essere suddivise nei seguenti gruppi:
Constant Descrizione
__DAT E__ Compilazione di file senza orario (ore, minuti e
secondi sono uguali a 0)
L E
__ IN __ N umero di riga nel codice sorgente, in cui si trova
la macro
P
__ ATH__ Un percorso assoluto del file che è attualmente in
fase di compilazione
Constant Descrizione
T he ex ample below shows how the compiler
handles the source code and replaces all instances
of __COUNT ER__ it meets with sequentially
increasing values.
Esempio:
#property copyright "Copyright © 2009, MetaQuotes Software Corp."
#property link "https://www.metaquotes.net"
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione dell' Expert |
//+--------------------------------------------------------------------------------+
void OnInit()
{
//--- un esempio di output dati in fase di inizializzazione Expert Advisor
Print(" __FUNCTION__ = ",__FUNCTION__," __LINE__ = ",__LINE__);
//--- impostare l'intervallo tra gli eventi timer
EventSetTimer(5);
//---
}
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione Expert |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- un esempio di informazioni output alla deinizializzazione Expert Advisor
Print(" __FUNCTION__ = ",__FUNCTION__," __LINE__ = ",__LINE__);
//---
}
//+--------------------------------------------------------------------------------+
//| Funzione tick dell'Expert |
//+--------------------------------------------------------------------------------+
void OnTick()
{
//--- output informazioni al ricevimento tick
Print(" __FUNCTION__ = ",__FUNCTION__," __LINE__ = ",__LINE__);
Print(" __FUNCTION__ = ",__FUNCTION__," __LINE__ = ",__LINE__);
test1(__FUNCTION__);
test2();
//---
}
//+--------------------------------------------------------------------------------+
//| test1 |
//+--------------------------------------------------------------------------------+
void test1(string par)
{
//--- output informazioni all'interno della funzione
Print(" __FUNCTION__ = ",__FUNCTION__," __LINE__ = ",__LINE__," par=",par);
}
//+--------------------------------------------------------------------------------+
//| test2 |
//+--------------------------------------------------------------------------------+
void test2()
{
//--- output informazioni all'interno della funzione
Print(" __FUNCTION__ = ",__FUNCTION__," __LINE__ = ",__LINE__);
}
//+--------------------------------------------------------------------------------+
//| OnTimer event handler |
//+--------------------------------------------------------------------------------+
void OnTimer()
{
//---
Print(" __FUNCTION__ = ",__FUNCTION__," __LINE__ = ",__LINE__);
test1(__FUNCTION__);
}
T he ex ample for learning how to work with the __COUNT ER__ macro
//--- create a macro for a quick display of the expression and its value in the journal
#define print(expr) Print(#expr,"=",expr)
//--- define the MACRO_COUNTER custom macro via the predefined __COUNTER__ macro
#define MACRO_COUNTER __COUNTER__
//--- set the input value of the variable using the __COUNTER__ macro
input int InpVariable = __COUNTER__;
//--- set the value of the global variable using the __COUNTER__ macro before defining the function
int ExtVariable = __COUNTER__;
//+------------------------------------------------------------------+
//| the function returns the __COUNTER__ value |
//+------------------------------------------------------------------+
int GlobalFunc(void)
{
return(__COUNTER__);
}
//+------------------------------------------------------------------+
//| the template function returns the __COUNTER__ value |
//+------------------------------------------------------------------+
template<typename T>
int GlobalTemplateFunc(void)
{
return(__COUNTER__);
}
//+------------------------------------------------------------------+
//| the structure with the method returning __COUNTER__ |
//+------------------------------------------------------------------+
struct A
{
int dummy; // not used
int Method(void)
{
return(__COUNTER__);
}
};
//+------------------------------------------------------------------+
//| the template structure with the method returning __COUNTER__ |
//+------------------------------------------------------------------+
template<typename T>
struct B
{
int dummy; // not used
int Method(void)
{
return(__COUNTER__);
}
};
//+------------------------------------------------------------------+
//| the structure with the template method returning __COUNTER__ |
//+------------------------------------------------------------------+
struct C
{
int dummy; // not used
template<typename T>
int Method(void)
{
return(__COUNTER__);
}
};
//+------------------------------------------------------------------+
//| the function #2, which returns the __COUNTER__ value |
//+------------------------------------------------------------------+
int GlobalFunc2(void)
{
return(__COUNTER__);
}
//+------------------------------------------------------------------+
//--- let's have another look at __COUNTER__ in the macro and the global variable
print(MACRO_COUNTER); // the value has changed
print(ExtGlobal2);
}
//--- set the value of the global variable using the __COUNTER__ macro after defining the functions
int ExtGlobal2 = __COUNTER__;
//+------------------------------------------------------------------+
/* Result
__COUNTER__=3
InpVariable=0
ExtVariable=1
GlobalFunc()=5
GlobalFunc()=5
GlobalTemplateFunc<int>()=8
GlobalTemplateFunc<int>()=8
GlobalTemplateFunc<double>()=9
GlobalFunc2()=7
GlobalFunc2()=7
a1.Method()=6
a2.Method()=6
b1.Method()=10
b2.Method()=10
b3.Method()=11
c1.Method<int>()=12
c1.Method<double>()=13
c2.Method<int>()=12
__COUNTER__=4
ExtGlobal2=2
*/
Mathematical Constants
Costanti speciali contenenti valori sono riservate per alcune espressioni matematiche. Queste costanti
possono essere utilizzate in qualsiasi luogo del programma invece di calcolare i valori usando funzioni
matematiche.
M _L N2 ln(2) .
0 693147180 559945309417
M _L N10 ln(10) . 5 5
2 302 8 09299404 68402 5
M _PI pi . 5
3 141 926 3 8979323846 5 5
M _PI_4 pi/4 . 5
0 78 398163397448309616
M _1_PI 1/ pi .
0 318309886183790671 38 5
M _2_PI 2/ pi .
0 636619772367 81343076 5
M _S QRT2 s qrt(2) . 5
1 414213 6237309 04880 5
M _S QRT1_2 1/ q s rt(2) .
0 707106781186 47 24401 5 5
Esempio:
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- stampa i valori delle costanti
Print("M_E = ",DoubleToString(M_E,16));
Print("M_LOG2E = ",DoubleToString(M_LOG2E,16));
Print("M_LOG10E = ",DoubleToString(M_LOG10E,16));
Print("M_LN2 = ",DoubleToString(M_LN2,16));
Print("M_LN10 = ",DoubleToString(M_LN10,16));
Print("M_PI = ",DoubleToString(M_PI,16));
Print("M_PI_2 = ",DoubleToString(M_PI_2,16));
Print("M_PI_4 = ",DoubleToString(M_PI_4,16));
Print("M_1_PI = ",DoubleToString(M_1_PI,16));
Print("M_2_PI = ",DoubleToString(M_2_PI,16));
Print("M_2_SQRTPI = ",DoubleToString(M_2_SQRTPI,16));
Print("M_SQRT2 = ",DoubleToString(M_SQRT2,16));
Print("M_SQRT1_2 = ",DoubleToString(M_SQRT1_2,16));
tipo double)
L
DB _DIG N umero di cifre decimali 1 5
significative per il tipo double
L
F T_ M IN Minimo valore positivo, che . 5
1 17 4943 1 5 e-38
può essere rappresentato dal
tipo float
L
F T_ M AX V alore massimo, che può .
3 402823466 e+38
essere rappresentato dal tipo
float
L
F T_ EPS ILON V alore minimo, che soddisfa la .
1 192092896 –07 e
condizione:
1. 0+DBL _EPS I LO N != 1. 0 (per il
tipo float)
L
F T_DIG N umero di cifre decimali 6
L
F T_ M ANT_DIG Conteggio Bits nella mantissa 24
L
F T_ M AX_10_EXP Massimo valore decimale del 38
L
F T_ M IN_10_EXP V alore decimale minimo del -37
grado dell'esponente per il tipo
float
L
F T_ M IN_EXP V alore binario minimo del (-125)
grado dell' esponente per il
tipo float
Esempio:
voidOnStart()
{
//--- stampa i valori costanti
printf("CHAR_MIN = %d",CHAR_MIN);
printf("CHAR_MAX = %d",CHAR_MAX);
printf("UCHAR_MAX = %d",UCHAR_MAX);
printf("SHORT_MIN = %d",SHORT_MIN);
printf("SHORT_MAX = %d",SHORT_MAX);
printf("USHORT_MAX = %d",USHORT_MAX);
printf("INT_MIN = %d",INT_MIN);
printf("INT_MAX = %d",INT_MAX);
printf("UINT_MAX = %u",UINT_MAX);
printf("LONG_MIN = %I64d",LONG_MIN);
printf("LONG_MAX = %I64d",LONG_MAX);
printf("ULONG_MAX = %I64u",ULONG_MAX);
printf("EMPTY_VALUE = %.16e",EMPTY_VALUE);
printf("DBL_MIN = %.16e",DBL_MIN);
printf("DBL_MAX = %.16e",DBL_MAX);
printf("DBL_EPSILON = %.16e",DBL_EPSILON);
printf("DBL_DIG = %d",DBL_DIG);
printf("DBL_MANT_DIG = %d",DBL_MANT_DIG);
printf("DBL_MAX_10_EXP = %d",DBL_MAX_10_EXP);
printf("DBL_MAX_EXP = %d",DBL_MAX_EXP);
printf("DBL_MIN_10_EXP = %d",DBL_MIN_10_EXP);
printf("DBL_MIN_EXP = %d",DBL_MIN_EXP);
printf("FLT_MIN = %.8e",FLT_MIN);
printf("FLT_MAX = %.8e",FLT_MAX);
printf("FLT_EPSILON = %.8e",FLT_EPSILON);
}
l codice motivo di deinizializzazione è anche passato come parametro della funzione predeterminata
I
Esempio:
//+--------------------------------------------------------------------------------+
//| ottiene la descrizione del testo |
//+--------------------------------------------------------------------------------+
string getUninitReasonText(int reasonCode)
{
string text="";
//---
switch(reasonCode)
{
case REASON_ACCOUNT:
text="L'account è cambiato";break;
case REASON_CHARTCHANGE:
text="Il simbolo o timeframe sono cambiati";break;
case REASON_CHARTCLOSE:
text="Il grafico è cambiato";break;
case REASON_PARAMETERS:
text="I parametri di input sono cambiati";break;
case REASON_RECOMPILE:
text="Il programma "+__FILE__+" è stato ricompilato";break;
case REASON_REMOVE:
text="Il programma"+__FILE__+" è stato rimosso dal grafico";break;
case REASON_TEMPLATE:
text="Nuovi template sono stati applicati al grafico";break;
default:text="Altro motivo";
}
//---
return text;
}
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione Expert |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- Il primo modo per ottenere il codice del motivo di deinizializzazione
Print(__FUNCTION__,"_Deinizializzazione(codice del motivo) = ",reason);
//--- Il secondo modo per ottenere il codice del motivo di deinizializzazione
Print(__FUNCTION__,"_UninitReason = ",getUninitReasonText(_UninitReason));
}
Oggetti creati dall'operatore new() sono di tipo POINT ER_DYNAM IC. L ' operatore delete() può e deve
essere utilizzato solo per puntatori del genere.
Tutti gli altri puntatori sono di tipo POINT ER_AUT OM ATIC, il che significa che l'oggetto è stato creato
automaticamente dall'ambiente programma mql5. T ali oggetti vengono eliminati automaticamente
dopo l'uso.
ENUM_POINTER_TY PE
Constant Descrizione
POINT ER_INVAL ID Puntatore errato
Vedi anche
Errori di runtime, Oggetto Elimina Operatore delete, Check Pointer
Altre costanti
La costante CL R_NONE viene utilizzata per delineare l'assenza di colore, significa che l' oggetto grafico
o serie grafica di un indicatore non verrà stampata. Questa costante non è stata inclusa nella lista
costanti W eb-color, ma può essere applicata ovunque dove gli argomenti del colore sono richiesti.
La costante INVAL ID_HANDLE può essere utilizzata per il controllo degli handles file (vedi FileOpen() e
FileFindFirst()).
E
IS _D BUG_ MODE Flag dove un programma-mq5 diverso da zero in modalità di
opera in modalità di debug debug, altrimenti zero
P OFILE_MODE
IS _ R Flag dove un programma-mq5 diverso da zero in modalità di
opera in modalità di analisi analisi, altrimenti zero
La costante EMPTY_VAL UE di solito corrisponde ai valori di indicatori che non sono mostrati nel
grafico. Per esempio, per indicatori built-in Deviazione standard con un periodo di 20, la linea per le
prime 19 barre nello storico non è mostrata nel grafico. S e si crea un handle di questo indicatore con la
funzione iS tdDev() e lo si copia in un array di valori degli indicatori per queste barre attraverso
CopyBuffer(), allora questi valori saranno uguali ad EMPTY_VAL UE.
La costante NULL può essere assegnata ad una variabile di qualsiasi tipo semplice o ad una struttura
oggetto o puntatore alla classe. L 'assegnazione NULL per una variabile stringa significa la
deinizializzazione completa di questa variabile.
voidOnStart()
{
if(CheckLineStyle("MyChartObject")==WRONG_VALUE)
printf("Errore di ottenimento stile linea.");
}
//+--------------------------------------------------------------------------------+
//| restituisce lo stile della linea per un oggetto specificato dal suo nome |
//+--------------------------------------------------------------------------------+
ENUM_LINE_STYLE CheckLineStyle(string name)
{
long style;
//---
if(ObjectGetInteger(0,name,OBJPROP_STYLE,0,style))
return((ENUM_LINE_STYLE)style);
else
return(WRONG_VALUE);
}
· A rrayCopy();
· A rrayMinimum();
· A rrayMax imum();
· F ileR eadArray();
· F ileW riteArray().
Se si desidera specificare, che tutti i valori della matrice da una posizione specificata fino alla fine
devono essere elaborati, è necessario specificare solo il valore W H OLE_ARRAY.
corretti in modalità profiling. Profiling consente di misurare il tempo di esecuzione dei singoli
frammenti di programma (di solito comprende le funzioni), nonché il calcolo del numero di tali
chiamate. La chiamata della funzione S leep() può essere disattivata per determinare il tempo di
esecuzione in modalità di profiling, come in questo esempio:
Il valore costate IS _PR OFILE_MODE è impostato dal compilatore durante la compilazione, mentre è
impostato a zero in modo convenzionale. Quando si lancia un programma in modalità profiling, viene
eseguita una raccolta speciale e IS _PR OFILE_MODE viene sostituito con un valore diverso da zero.
La costante IS _DEBUG_MODE può essere utile quando è necessario modificare un po' il funzionamento
di un programma MQL5 in modalità di debug. Ad esempio, in modalità di debug può essere necessario
visualizzare ulteriori informazioni di debug nel registro terminale o creare altri oggetti grafici in un
grafico.
L 'esempio seguente crea un oggetto Label e imposta la sua descrizione e il colore a seconda della
modalità script in esecuzione. Per eseguire uno script in modalità di debug da MetaEditor, premere
F5. S e si esegue lo script dalla finestra del browser nel terminale, il colore e il testo dell' oggetto Label
sarà diverso.
Esempio:
//+--------------------------------------------------------------------------------+
//| Check_DEBUG_MODE.mq5 |
//| Copyright © 2009, MetaQuotes Software Corp. //| |
//| https://www.metaquotes.net |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright © 2009, MetaQuotes Software Corp."
#property link "https://www.metaquotes.net"
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//---
string label_name="invisible_label";
if(ObjectFind(0,label_name)<0)
{
Print("Object",label_name,"not found. Error code = ",GetLastError());
//--- crea Label
ObjectCreate(0,label_name,OBJ_LABEL,0,0,0);
//--- imposta coordinate X
ObjectSetInteger(0,label_name,OBJPROP_XDISTANCE,200);
//--- imposta coordinate Y
ObjectSetInteger(0,label_name,OBJPROP_YDISTANCE,300);
ResetLastError();
if(IS_DEBUG_MODE) // modalità debug
{
//--- mostra il messaggio riguardo la modalità di esecuzione dello script
ObjectSetString(0,label_name,OBJPROP_TEXT,"DEBUG MODE");
//--- imposta il colore del testo in rosso
if(!ObjectSetInteger(0,label_name,OBJPROP_COLOR,clrRed))
Print("Impossibile impostare il colore. Error",GetLastError());
}
else // modalità operazione
{
ObjectSetString(0,label_name,OBJPROP_TEXT,"RELEASE MODE");
//--- imposta il colore del testo ad invisibile
if(!ObjectSetInteger(0,label_name,OBJPROP_COLOR,CLR_NONE))
Print("Impossibile impostare il colore. Error ",GetLastError());
}
ChartRedraw();
Crypt Methods
The ENUM _CRYPT_METH OD enumeration is used to specify the data tranformation method, used in
CryptEncode() and CryptDecode() functions.
ENUM_CRY PT_METHOD
Constant Description
CRYPT_BAS E64 BAS E64
Vedi anche
D ebug Break , Proprietà di esecuzione programma MQL5, CryptEncode(), CryptDecode()
Strutture Dati
I l linguaggio MQL5 offre 12 strutture predefinite:
· M qlParam può inviare parametri di input quando si crea un handle dell'indicatore utilizzando la
funzione IndicatorCreate();
· M qlR ates è designata per manipolare i dati storici, essa contiene informazioni riguardanti il p
rezzo,
il volume e lo spread;
· M qlBookI nfo è designata per ottenere informazioni sul Depth of Mark et;
· M qlT radeR equest viene utilizzata per la creazione di una richiesta di trade per le operazioni di
trade;
· M qlT radeCheckR esult viene usata per controllare la preparazione della richiesta di trade prima
dell'invio di questa;
· M qlT radeR esult contiene una risposta del trade server ad una richiesta di trade, inviata dalla
funzione OrderS end();
· M qlT radeT ransaction contiene la descrizione della transazione di trade;
· M qlT ick è designata per il recupero rapido delle informazioni più richieste sui prezzi attuali.
· Le strutture del Calendario Economico sono utilizzate per ottenere dati sugli eventi del calendario
economico inviati alla piattaforma MetaT rader 5 in tempo reale. Le funzioni del calendario
economico permettono di analizzare i parametri macroeconomici immediatamente dopo il rilascio di
nuovi report, poiché i valori rilevanti vengono trasmessi direttamente dalla sorgente senza alcun
ritardo.
MqlDateTime
La struttura tipo di data contiene otto campi di tipo int:
struct MqlDateTime
{
int year; // Anno
int mon; // Mese
int day; // Giorno
int hour; // Ora
int min; // Minuti
int sec; // Secondi
int day_of_week; // Giorni della settimana (0-Domenica, 1-Lunedì, ... ,6-Sabato)
int day_of_year; // Numedo di giorno dell'anno (al 1mo Gennaio viene assegnato il valore di z
};
Nota
Il numero del giorno dell'anno day_of_year per l'anno bisestile, da Marzo, sarà diverso da un numero
del giorno corrispondente per un anno non bisestile.
Esempio:
voidOnStart()
{
//---
datetime date1=D'2008.03.01';
datetime date2=D'2009.03.01';
MqlDateTime str1,str2;
TimeToStruct(date1,str1);
TimeToStruct(date2,str2);
printf("%02d.%02d.%4d, day of year = %d",str1.day,str1.mon,
str1.year,str1.day_of_year);
printf("%02d.%02d.%4d, giorni dell'anno = %d",str2.day,str2.mon,
str2.year,str2.day_of_year);
}
/* Risultato:
01.03.2008, day of year = 60
01.03.2009, day of year = 59
*/
Vedi anche
T imeT oS truct, S trutture e Classi
struct MqlParam
{
ENUM_DATATYPE type; // tipo di parametro di input, valore di ENUM_DATATYP
long integer_value; // campo per memorizzare un tipo integer
double double_value; // campo per memorizzare il tipo double
string string_value; // campo per memorizzare il tipo stringa
};
T utti i parametri di input di un indicatore vengono trasmessi sottoforma di array di tipo M qlParam, il
campo type di ciascun elemento di questa matrice specifica il tipo di dati trasmessi dall'elemento. I
valori degli indicatori devono essere prima immessi nei campi appropriati per ogni elemento (in
integer_value, In double_value o valore_stringa) a seconda del valore dell' ENUM _DATATYPE
enumerazione che è specificata nel campo type(campo).
Se il valore IND_CUS T OM viene passato per terzo come tipo di indicatore alla funzione
IndicatorCreate(), il primo elemento dell'array di parametri di input deve avere il campo type con il
valore di TYPE_S TRING dall'enumerazione ENUM _DATATYPE, ed il campo string_value deve contenere il
nome dell' indicatore personalizzato.
MqlRates
Questa struttura memorizza le informazioni sui prezzi, i volumi e lo spread.
struct MqlRates
{
datetime time; // Orario di inizio del periodo
double open; // Prezzo di apertura
double high; // Il prezzo più alto del periodo
double low; // Il prezzo più basso del periodo
double close; // Prezzo close
long tick_volume; // Volume Tick
int spread; // Spread
long real_volume; // Volume Trade
};
Esempio:
voidOnStart()
{
MqlRates rates[];
int copied=CopyRates(NULL,0,0,100,rates);
if(copied<=0)
Print("Errore nella copia dei dati dei prezzi ",GetLastError());
else Print("Copiate ",ArraySize(rates)," barre");
}
Vedi anche
CopyR ates, Accesso al T imeS eries
MqlBookInfo
F ornisce informazioni sui dati di profondità del mercato.
struct MqlBookInfo
{
ENUM_BOOK_TYPE type; // Tipo di ordine dall'enumerazione ENUM_BOOK_TYPE
double price; // Prezzo
long volume; // Volume
double volume_real; // Volume con maggiore accuratezza
};
Nota
La struttura M qlBookInfo è predefinita, pertanto non richiede alcuna dichiarazione e descrizione. Per
utilizzare la struttura, basta dichiarare una variabile di questo tipo.
Esempio:
MqlBookInfo priceArray[];
bool getBook=MarketBookGet(NULL,priceArray);
if(getBook)
{
int size=ArraySize(priceArray);
Print("MarketBookInfo su ",Symbol());
}
else
{
Print("Fallimento nel ricevere il DOM per il simbolo",Symbol());
}
Vedi anche
Mark etBookAdd, Mark etBookR elease, Mark etBookGet, Ordini di T rade nel DOM, T ipi di Dati
struct MqlTradeRequest
{
ENUM_TRADE_REQUEST_ACTIONS action; // Tipo d'operazione di trade
ulong magic; // Expert Advisor ID (magic number)
ulong order; // Ticket dell'ordine
string symbol; // Simbolo di trade
double volume; // Volume richiesto per un affare, in lotti
double price; // Prezzo
double stoplimit; // Livello StopLimit dell'ordine
double sl; // Livello Stop Loss dell'ordine
double tp; // Take Profit level dell'ordine
ulong deviation; // Deviazione massima possibile dal prezzo richi
ENUM_ORDER_TYPE type; // Tipo di ordine
ENUM_ORDER_TYPE_FILLING type_filling; // Tipo d'esecuzione dell'ordine
ENUM_ORDER_TYPE_TIME type_time; // Tipo d'espirazione dell'ordine
datetime expiration; // Orario d'espirazione dell'ordine (per gli ord
string comment; // Commento dell'ordine
ulong position; // Ticket della posizione
ulong position_by; // Il ticket di una posizione opposta
};
Descrizione campi
Campi Descrizione
action Tipo d'operazione di trade. Può essere uno dei
valori dell'enumerazione
ENUM _TRADE_R EQUES T_ACTIONS .
Campi Descrizione
d'esecuzione dell'ordine.
Quando si modifica o si chiude una posizione nel sistema di copertura (hedging), assicurarsi di
specificare il suo tick et (M qlT radeR equest::tick et). Il tick et può anche essere specificato nel
sistema di compensazione(netting), anche se una posizione è identificata dal nome del simbolo.
Per l'invio di ordini per eseguire operazioni di trade è necessario utilizzare la funzione OrderS end().
Per ogni operazione di trade è necessario specificare i campi obbligatori; campi facoltativi possono
anche essere riempiti. Ci sono sette casi possibili per inviare un ordine di trade:
Esecuzione a richiesta
Si tratta di un ordine di trade per aprire una posizione in modalità di Esecuzione della R ichiesta
(trade sui prezzi richiesti). S i richiede di specificare i seguenti 9 campi:
· action
· s ymbol
· volume
· price
· sl
· tp
· deviation
· type
· type_filling
I noltre è possibile specificare i valori dei campi " magic" e " field" .
Esecuzione immediata
Si tratta di un ordine di trade per aprire una posizione in modalità esecuzione immediata (trade ai
prezzi correnti). R ichiede specificazione dei seguenti 9 campi:
· action
· s ymbol
· volume
· price
· sl
· tp
· deviation
· type
· type_filling
I noltre è possibile specificare i valori dei campi " magic" e " field" .
Esecuzione a mercato
S i tratta di un ordine di trade per aprire una posizione in modalità di esecuzione a mercato. S i
richiede di specificare i seguenti 5 campi:
· action
· s ymbol
· volume
· type
· type_filling
I noltre è possibile specificare i valori dei campi " magic" e " field" .
Esecuzione a cambio
S i tratta di un ordine di trade per aprire una posizione in modalità di esecuzione Ex change. S i
richiede di specificare i seguenti 5 campi:
· action
· s ymbol
· volume
· type
· type_filling
I noltre è possibile specificare i valori dei campi " magic" e " field" .
Esempio per TRADE_ACTION_DEAL, operazione di trade per aprire una posizione Buy:
#define EXPERT_MAGIC 123456 // MagicNumber dell'expert
//+------------------------------------------------------------------+
//| Apre posizione Buy |
//+------------------------------------------------------------------+
void OnStart()
{
//--- dichiara ed inizializza la richiesta di trade ed il risultato della richiesta di trade
MqlTradeRequest request={};
MqlTradeResult result={};
//--- parametri della richiesta
request.action =TRADE_ACTION_DEAL; // tipo di operazione di trade
request.symbol =Symbol(); // simbolo
request.volume =0.1; // volume di 0.1 lotti
request.type =ORDER_TYPE_BUY; // tipo di ordine
request.price =SymbolInfoDouble(Symbol(),SYMBOL_ASK); // prezzo per l'apertura
request.deviation=5; // permessa la deviazione dal prezzo
request.magic =EXPERT_MAGIC; // MagicNumber dell'ordine
//--- invia la richiesta
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError()); // se impossibilitato ad inviare la ric
//--- informazione riguardo l'operazione
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
}
//+------------------------------------------------------------------+
Esempio di E
TRAD _A CTION_DEAL, operazione di trade per aprire la posizione S ell:
Esempio di E
TRAD _A CTION_DEAL, operazione di trade per chiudere la posizione:
}
}
//+------------------------------------------------------------------+
SL & TP Modifica
Trade order per modificare i prezzi di S topLoss e/o i prezzi T ak eProfit. S i richiede di specificare i
seguenti 4 settori:
· action
· s ymbol
· sl
· tp
· position
Esempio per TRADE_ACTION_S L T P, operazione di trade per la modifica dei valori di S top Loss e
T ak e Profit di una posizione aperta:
Ordine Pendente
Ordine di trade per piazzare un ordine pendente. S i richiede di specificare i seguenti 11 campi:
· action
· s ymbol
· volume
· price
· stoplimit
· sl
· tp
· type
· type_filling
· type_time
· ex piration
I noltre è possibile specificare i valori dei campi " magic" e " field" .
Esempio di E
TRAD _A CTION_PENDING, operazione di trade per piazzare un ordine pendente:
campi:
· action
· order
· price
· sl
· tp
· type_time
· ex piration
Esempio di E
TRAD _A CTION_MODIFY, operazione di trade per la modifica dei livelli di prezzo di ordini
pendenti:
request.sl = NormalizeDouble(price-offset*point,digits);
request.price =NormalizeDouble(price,digits); // prezzo d'apertura n
}
else if(type==ORDER_TYPE_SELL_STOP)
{
price = SymbolInfoDouble(Symbol(),SYMBOL_BID)-offset*point;
request.tp = NormalizeDouble(price-offset*point,digits);
request.sl = NormalizeDouble(price+offset*point,digits);
request.price =NormalizeDouble(price,digits); // prezzo d'apertura n
}
//--- invia la richiesta
if(!OrderSend(request,result))
PrintFormat("OrderSend errore %d",GetLastError()); // se impossibile inviare la richie
//--- informazioni riguardo l'operazione
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order)
//--- azzera la richiesta ed i risultanti valori
ZeroMemory(request);
ZeroMemory(result);
}
}
}
//+------------------------------------------------------------------+
Esempio per TRADE_ACTION_R EMOVE, operazione di trade per eliminare ordini pendenti:
#define EXPERT_MAGIC 123456 // MagicNumber dell'expert
//+------------------------------------------------------------------+
//| Elimina ordini pendenti |
//+------------------------------------------------------------------+
void OnStart()
{
//--- dichiara ed inizializza la richiesta di trade ed il risultato della richiesta di trade
MqlTradeRequest request={};
MqlTradeResult result={};
int total=OrdersTotal(); // numero totale di ordini pendenti piazzati
//--- itera su tutti gli ordini pendenti piazzati
for(int i=total-1; i>=0; i--)
{
ulong order_ticket=OrderGetTicket(i); // ticket ordine
ulong magic=OrderGetInteger(ORDER_MAGIC); // MagicNumber dell'ordine
//--- se il MagicNumber corrisponde
if(magic==EXPERT_MAGIC)
{
//--- azzera la richiesta ed i valori del risultato
ZeroMemory(request);
ZeroMemory(result);
//--- imposta i parametri dell'operazione
request.action=TRADE_ACTION_REMOVE; // tipo d'operazione di trade
request.order = order_ticket; // ticket ordine
//--- invia la richiesta
if(!OrderSend(request,result))
PrintFormat("OrderSend errore %d",GetLastError()); // se impossibile inviare la richie
//--- informazioni riguardo l'operazione
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order)
}
}
}
//+------------------------------------------------------------------+
Guarda anche
S trutture e Classi, Funzioni di T rade, Proprietà Ordini
struct MqlTradeCheckResult
{
uint retcode; // Codice di risposta
double balance; // Bilancio dopo l'esecuzione di un deal
double equity; // Equità dopo l'esecuzione di un deal
double profit; // Profitto fluttuante
double margin; // Requisiti di margine
double margin_free; // Margine libero
double margin_level; // Livello del margine
string comment; // Commento al codice di risposta (descrizione dell'errore)
};
Campo Descrizione
retcode I l codice di ritorno
Vedi anche
T rade R equest S tructure, S truttura per i Prezzi Correnti, OrderS end, OrderCheck
struct MqlTradeResult
{
uint retcode; // Codice di ritorno dell'operazione
ulong deal; // Ticket dell'Affare, se è stato eseguito
ulong order; // Ticket dell'Ordine, se è stato piazzato
double volume; // Volume dell'Affare, confermato dal broker
double price; // Prezzo dell'affare, confermato dal broker
double bid; // Prezzo Bid Corrente
double ask; // Prezzo Ask Corrente
string comment; // Commento del Broker all'operazione (per impostazione predefinita è
uint request_id; // ID della Richiesta impostato dal terminale durante l'invio
};
Campo Descrizione
retcode I l codice di ritorno del trade server
Il risultato dell'operazione di trade viene restituito ad una variabile di tipo M qlT radeR esult, che viene
passata come secondo parametro ad OrderS end() per effettuare operazioni di trade.
Il terminale fissa la richiesta ID nel campo request_id quando si invia al trade server usando le funzioni
Orders S end() e OrderS endAs ync(). Il terminale riceve i messaggi sulle operazioni effettuate dal trade
server e li sottopone per l'elaborazione della funzione OnT radeT ransaction() contenente i seguenti
componenti come parametri:
· descrizione della richiesta di trade inviata dalla funzione OrderS end() o Orders S endAs ync(). L ' ID
richiesta viene inviato dal terminale al trade server, mentre la stessa richiesta e la sua request_id
sono memorizzate nella memoria del terminale;
· il risultato della richiesta di esecuzione come nella struttura M qlT radeR esult con il campo request_id
contenente l'ID della richiesta.
La funzione OnT radeT ransaction() riceve tre parametri di input, ma gli ultimi due devono essere
analizzati solo per le operazioni aventi tipo TRADE_TRANS ACTION_R EQUES T . In tutti gli altri casi, i
dati sulla richiesta di trade ed il suo risultato dell'esecuzione non vengono riempiti. Esempio di analisi
dei parametri può essere trovato nella S truttura di una R ichiesta di T rade.
L 'impostazione di request_id dal terminale per la richiesta di trade, quando si al trade server è
principalmente introdotta per lavorare con la funzione asincrona OrderS endAs ync(). Questo
identificatore consente di associare l'azione eseguita (chiamate di funzioni OrderS end o
OrderS endAs ync) con il risultato di questa azione inviato ad OnT radeT ransaction().
Esempio:
//+--------------------------------------------------------------------------------+
//| Invia una richiesta di trade con il risultato dell'esecuzione |
//+--------------------------------------------------------------------------------+
bool MyOrderSend(MqlTradeRequest request,MqlTradeResult result)
{
//--- resetta l'ultimo codice dell'errore, a zero
ResetLastError();
//--- invia richiesta
bool success=OrderSend(request,result);
//--- se il risultato fallisce - prova a cercare il perchè
if(!success)
{
int answer=result.retcode;
Print("TradeLog: Richiesta di trade fallita. Error = ",GetLastError());
switch(answer)
{
//--- requote
case 10004:
{
Print("TRADE_RETCODE_REQUOTE");
Print("request.price = ",request.price," result.ask = ",
result.ask," result.bid = ",result.bid);
break;
}
· I nviare una richiesta di trade da ualsiasi applicazione MQL5 nel terminale client utilizzando le
q
Per esempio, quando si invia un ordine di acquisto di mercato, esso viene gestito, un ordine di
acquisto appropriata viene creato per l'account, l'ordine quindi viene eseguito e rimosso dalla lista di
quelli aperti, e poi viene aggiunto alla cronistoria ordini, un appropriato aff viene aggiunto alla
cronistoria ed una nuova posizione viene creata. T utte queste azioni sono transazioni di trade.
Lo S peciale handler OnT radeT ransaction() viene fornito in MQL5 per ottenere transazioni di trade
applicate ad un account. Il primo parametro dell'handler ottiene la struttura M qlT radeT ransaction
descrivendo transazioni di trade.
struct MqlTradeTransaction
{
ulong deal; // Ticket dell'Affare
ulong order; // Ticket dell'Ordine
string symbol; // Nome del simbolo di Trade
ENUM_TRADE_TRANSACTION_TYPE type; // Tipo del simbolo di Trade
ENUM_ORDER_TYPE order_type; // Tipo di Ordine
ENUM_ORDER_STATE order_state; // Stato dell'Ordine
ENUM_DEAL_TYPE deal_type; // Tipo dell'Affare
ENUM_ORDER_TYPE_TIME time_type; // Tipo di Ordine per periodo dell'azione
datetime time_expiration; // Orario di espirazione dell'Ordine
double price; // Prezzo
double price_trigger; // Prezzo di attivazione dell'ordine Stop Limit
double price_sl; // Livello Stop Loss
double price_tp; // Livello Take Profit
double volume; // Volume in lotti
ulong position; // Position ticket
ulong position_by; // Ticket of an opposite position
};
Descrizione Campi
Campo Descrizione
deal T ick et affare.
Il parametro essenziale per l'analisi della transazione ricevuta è il tipo specificato nel campo type. Ad
esempio, se una transazione è di tipo TRADE_TRANS ACTION_R EQUES T (viene ricevuto il risultato dell'
handling di una richiesta di trade dal server), la struttura ha solo un campo che viene riempito
completamente - type. Altri campi non vengono analizzati. In questo caso, si possono analizzare due
ulteriori richieste ed i parametri risultato presentati all'handler OnT radeT ransaction(), come mostrato
di seguito.
A vendo i dati su un tipo di operazione di trading, si può decidere l'analisi dello stato attuale di ordini,
le posizioni e le offerte per un conto di trading. R icordate che una richiesta di trade inviata al server
dal terminale può generare generare diverse nuove operazioni. La priorità del loro arrivo presso il
terminale non è garantita.
La struttura M qlT radeT ransaction viene riempita in modi diversi a seconda del tipo di transazione di
trade (ENUM _TRADE_TRANS ACTION_TYPE):
TRADE_TRANSACTION_DEAL_*
I seguenti campi nella struttura M qlT radeT ransaction vengono riempiti per le transazioni di trade
relative all' handling delgli affari (TRADE_TRANS ACTION_DEAL _ADD,
TRADE_TRANS A C TI O N_DEA L _UPDAT E e TRADE_TRANS A C TI O N_DEA L _DELET E) :
cui si basa);
· price_tp - prezzo di T ak e Profit (filled, se specificato nell'ordine, dove è stato eseguito l'affare su
cui si basa);
· volume - volume dell'affare in lotti.
TRADE_TRANSACTION_POSITION
I seguenti campi nella struttura M qlT radeT ransaction sono riempiti per le transazioni di trade
relative alla modifica delle posizioni non connesse all'esecuzione degli affari
(TRADE_TRANS ACTION_POS ITION):
· s ymbol - nome di posizione del simbolo;
· type - tipo di transazione di trade;
· deal_type - tipo di posizione (DEAL _TYPE_BUY o E L _TYPE_S ELL);
D A
Il ambio della posizione (aggiunta, cambio o chiusura), come risultato dell'esecuzione dell'affare,
non porta al verificarsi della transazione TRADE_TRANS ACTION_POS ITION.
TRADE_TRANSACTION_REQUEST
Solo un campo nella struttura M qlT radeT ransaction è riempito per le transazioni di trade che
descrivono il fatto che una richiesta di trade è stata elaborata dal server ed il risultato dell'
elaborazione è stato ricevuto (TRADE_TRANS ACTION_R EQUES T ):
· type - tipo di transazione di trade;
Solo il campo tipo (tipo di transazione di trade) deve essere analizzato per tali operazioni. Il
secondo e terzo parametro della funzione OnT radeT ransaction (richiesta e risultato) devono
essere analizzati per ulteriori dati.
Esempio:
input int MagicNumber=1234567;
//---
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione tick dell'Expert |
//+--------------------------------------------------------------------------------+
void OnTick()
{
//---installa un ordine pendente
if(!pending_done)
{
double ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
double buy_stop_price=NormalizeDouble(ask+1000*_Point,(int)SymbolInfoInteger(_Symbol,SYMBOL_D
bool res=trade.BuyStop(0.1,buy_stop_price,_Symbol);
//--- se la funzione BuyStop() viene eseguita con successo
if(res)
{
pending_done=true;
//--- ottiene il risultato dell'invio di una richiesta da ctrade
MqlTradeResult trade_result;
trade.Result(trade_result);
//--- ottiene request_id per la richiesta inviata
uint request_id=trade_result.request_id;
Print("La richiesta è stata inviata per impostare un ordine pendente. Request_ID=",request
//--- memorizza il ticket dell'ordine (sarà zero se si usa la modalità di invio asincrona
order_ticket=trade_result.order;
//--- tutto è stato fatto, uscita precoce dall'handler OnTick()
return;
}
}
//--- elimina l'ordine pendente
if(!pending_deleted)
//--- controllo addizionale
if(pending_done && (order_ticket!=0))
{
//--- prova ad eliminare l'ordine pendente
bool res=trade.OrderDelete(order_ticket);
Print("OrderDelete=",res);
//--- quando la richiesta di eliminazione viene inviata con successo
if(res)
{
pending_deleted=true;
//--- ottiene il risultato della richiesta di esecuzione
MqlTradeResult trade_result;
trade.Result(trade_result);
//--- prende l' ID della richiesta dal risultato
uint request_id=trade_result.request_id;
//--- visualizza nel Journal
Print("La richiesta è stata inviata per eliminare un ordine pendente #",order_ticket,
". Request_ID=",request_id,
"\r\n");
//--- fissa il ticket dell'ordine dal risultato della richiesta
order_ticket=trade_result.order;
}
}
//---
}
//+--------------------------------------------------------------------------------+
//| Funzione TradeTransaction |
//+--------------------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
//--- ottiene type come valore dell'enumerazione
ENUM_TRADE_TRANSACTION_TYPE type=(ENUM_TRADE_TRANSACTION_TYPE)trans.type;
//--- se la transazione è il risultato dell'handling richiesta, verrà visualizzato solo il suo nome
if(type==TRADE_TRANSACTION_REQUEST)
{
Print(EnumToString(type));
//--- visualizza il nome stringa della richiesta maneggiata
Print("------------RequestDescription\r\n",RequestDescription(request));
//--- mostra la descrizione del risultato della richiesta
Print("------------ResultDescription\r\n",TradeResultDescription(result));
//--- memorizza il ticket dell'ordine per la sua cancellazione al prossimo handling in OnTick
if(result.order!=0)
{
//--- elimina quest'ordine dal suo ticket alla prossima chiamata OnTick()
order_ticket=result.order;
Print(" Ticket dell'ordine pendente ",order_ticket,"\r\n");
}
}
else // mostra la descrizione completa per le transazioni di altro tipo
//--- mostra la descrizione di una transazione ricevuta nel Journal
Print("------------TransactionDescription\r\n",TransactionDescription(trans));
//---
}
//+--------------------------------------------------------------------------------+
//| Restituisce la descrizione testuale della transazione |
//+--------------------------------------------------------------------------------+
string TransactionDescription(const MqlTradeTransaction &trans)
{
//---
string desc=EnumToString(trans.type)+"\r\n";
desc+="Simbolo: "+trans.symbol+"\r\n";
desc+="Ticket dell'affare: "+(string)trans.deal+"\r\n";
desc+="Tipo di Affare: "+EnumToString(trans.deal_type)+"\r\n";
desc+="Ask: "+StringFormat("%G",result.ask)+"\r\n";
desc+="Bid: "+StringFormat("%G",result.bid)+"\r\n";
desc+="Commento: "+result.comment+"\r\n";
//--- restituisce la stringa ottenuta
return desc;
}
Vedi anche
T ipi di T ransazione di T rade, OnT radeT ransaction()
struct MqlTick
{
datetime time; // Orario dell'aggiornamento dell'ultimo prezzo
double bid; // Il corrente prezzo Bid
double ask; // Il corrente prezzo Ask
double last; // Prezzo dell'ultimo affare (Last)
ulong volume; // Volume per il corrente prezzo Last
long time_msc; // Orario dell'ultimo aggiornamento di prezzo in millisecondi
uint flags; // Flag Ticks
double volume_real; // Volume con maggior accuratezza per il corrente presso Last
};
La variabile di tipo M qlT ick permette di ottenere valori di As k , Bid, Last e Volume entro una singola
chiamata della funzione S ymbolInfoT ick ().
The parameters of each tick are filled in regardless of whether there are changes compared to the
previous tick . T hus, it is possible to find out a correct price for any moment in the past without the
need to search for previous values at the tick history. For ex ample, even if only a Bid price changes
during a tick arrival, the structure still contains other parameters as well, including the previous As k
price, volume, etc.
You can analyze the tick flags to find out what data have been changed ex actly:
· TI CK_FL AG_BID – tick has changed a Bid price
· TI C K_FL AG_AS K – a tick has changed an A s k price
Esempio:
void OnTick()
{
MqlTick last_tick;
//---
if(SymbolInfoTick(Symbol(),last_tick))
{
Print(last_tick.time,": Bid = ",last_tick.bid,
" Ask = ",last_tick.ask," Volume = ",last_tick.volume);
}
else Print("SymbolInfoTick() fallito, errore = ",GetLastError());
//---
}
Vedi anche
Questa sezione descrive le strutture per lavorare con il calendario economico disponibile direttamente
nella piattaforma MetaT rader. Il calendario economico è un'enciclopedia già pronta con descrizioni di
indicatori macroeconomici, le loro date di rilascio e gradi di importanza. I valori rilevanti degli
indicatori macroeconomici vengono inviati alla piattaforma MetaT rader proprio al momento della
pubblicazione e vengono visualizzati su un chart come tag che consente di monitorare visivamente gli
indicatori richiesti in base a Paesi, valute e importanza.
Le funzioni del calendario economico consentono di condurre l'analisi automatica degli eventi in arrivo
in base a criteri di importanza personalizzati da una prospettiva di coppie di Paesi/valute necessarie.
Le descrizioni dei Paesi sono impostate dalla struttura M qlCalendarCountry. È usata nelle funzioni
CalendarCountryById() e CalendarCountries()
struct MqlCalendarCountry
{
ulong id; // ID del Paese (ISO 3166-1)
string name; // nome del testo del Paese (nella co
string code; // nome codice del Paese (ISO 3166-1
string currency; // codice valuta del paese
string currency_symbol; // simbolo di valuta del paese
string url_name; // nome del paese utilizzato nell'URL
};
Le descrizioni degli eventi sono impostate dalla struttura M qlCalendarEvent. È usata nelle funzioni
CalendarEventById(), CalendarEventByCountry() e CalendarEventByCurrency()
struct MqlCalendarEvent
{
ulong id; // ID evento
ENUM_CALENDAR_EVENT_TYPE type; // tipo di evento dall'enumerazione E
ENUM_CALENDAR_EVENT_SECTOR sector; // settore a cui è collegato un event
ENUM_CALENDAR_EVENT_FREQUENCY frequency; // frequenza degli eventi
ENUM_CALENDAR_EVENT_TIMEMODE time_mode; // modalità orario evento
ulong country_id; // ID Paese
ENUM_CALENDAR_EVENT_UNIT unit; // unità di misura del valore dell'in
ENUM_CALENDAR_EVENT_IMPORTANCE importance; // importanza dell'evento
ENUM_CALENDAR_EVENT_MULTIPLIER multiplier; // moltiplicatore del valore dell'ind
uint digits; // numero di posizioni decimali
string source_url; // URL di una fonte in cui è pubblica
string event_code; // codice evento
string name; // nome del testo dell'evento nella l
};
I valori degli eventi sono impostati dalla struttura M qlCalendarValue. Èusata nelle funzioni
CalendarValueById(), CalendarValueH istoryByEvent(), CalendarValueH istory(),
CalendarValueLastByEvent() e CalendarValueLast()
struct MqlCalendarValue
{
ulong id; // ID valore
ulong event_id; // ID evento
datetime time; // data e ora dell'evento
datetime period; // periodo del report degli eventi
int revision; // ha rilasciato la revisione dell'in
long actual_value; // valore attuale dell'indicatore
long prev_value; // valore precedente dell'indicatore
long revised_prev_value; // valore rivisto dell'indicatore pre
long forecast_value; // valore di previsione dell'indicato
ENUM_CALENDAR_EVENT_IMPACT impact_type; // impatto potenziale su un tasso di
};
La frequenza degli eventi è specificata nella struttura M qlCalendarEvent. I valori possibili sono
impostati nell'elenco ENUM_CALENDAR_EVENT_FREQUENCY
ID Descrizione
CALENDAR_FR EQUENCY_NONE La frequenza di rilascio non è impostata
Il tipo di evento è specificato nella struttura M qlCalendarEvent. I valori possibili sono impostati
nell'elenco ENUM_CALENDAR_EVENT_TY PE
ID Descrizione
CALENDAR_TYPE_EVENT Evento (riunione, discorso, ecc.)
CALENDAR_TYPE_INDICAT OR I ndicatore
ID Descrizione
CALENDAR_S ECT OR_NONE I l settore non è impostato
ID Descrizione
CALENDAR_IMPORTANCE_NONE L 'importanza non è impostata
Il tipo di unità di misura utilizzato nella visualizzazione dei valori degli eventi è specificato nella
struttura M qlCalendarEvent. I valori possibili sono impostati nell'elenco
ENUM_CALENDAR_EVENT_UNIT
ID Descrizione
CALENDAR_UNIT_NONE L 'unità di misura non è impostata
CALENDAR_UNIT_JOB Lavori
ID Descrizione
CALENDAR_UNIT_RIG I mpianti di perforazione
CALENDAR_UNIT_US D US D
CALENDAR_UNIT_PEOPLE Persone
CALENDAR_UNIT_MORTGAGE Mutui
CALENDAR_UNIT_VOT E voti
CALENDAR_UNIT_BARR EL B arili
n alcuni casi, i valori dei parametri economici richiedono un moltiplicatore impostato nella struttura
I
ID Descrizione
CALENDAR_M UL TIPL IER_NONE I l moltiplicatore non è impostato
ID Descrizione
CALENDAR_IMPACT_NA L 'impatto non è impostato
L 'orario dell'evento è specificato nella struttura M qlCalendarEvent. I valori possibili sono impostati
nell'elenco ENUM_CALENDAR_EVENT_TIMEMODE
ID Descrizione
CALENDAR_TIMEMODE_DAT ETIME La fonte pubblica un orario esatto di un evento
ID Descrizione
CALENDAR_TIMEMODE_DAT E L 'evento dura tutto il giorno
Guarda anche
Calendario Economico
· Codici di ritorno del trade server - analisi dei risultati di richieste trade dalla funzione OrderS end();
· Avvisi del compilatore - codici di messaggi di avviso che vengono visualizzati in fase di
compilazione (non errori);
· Errori di compilazione - i codici dei messaggi di errore ad un tentativo non riuscito di compilazione;
· R untime errors – codici errore nell'esecuzione di programmi mql5 che possono essere ottenuti usando
la funzione GetLastError().
I O NS quando si tenta di
piazzare un ordine. La
limitazione funziona in modo
diverso a seconda del tipo di
accounting della posizione:
· Netting(compensazione) —
Codice Descrizione
21 Record incompleto di una data nella stringa
datetime
30 Overriding macro
Codice Descrizione
43 Possibile perdita di dati al typecasting.
Esempio: int x = (double) z;
M _PI
Codice Descrizione
specificata
Codice Descrizione
78 Non tutti i percorsi di controllo restituiscono un
valore
byte
indicator_chart_window is applied
Errori di compilazione
MetaEdtior 5 mostra i messaggi di errore sugli errori rilevati dal programma dal compilatore built-in
durante la compilazione. L 'elenco di questi errori è riportato qui sotto nella tabella. Per compilare il
codice sorgente in un unico eseguibile, premere F 7. I programmi che contengono errori non possono
essere compilati fino a quando gli errori individuati dal compilatore non vengono eliminati.
Codice Descrizione
100 Errore lettura file
Codice Descrizione
122 D ichiarazione errata del distruttore
144 Nessuna coppia per " )" o " ]" , cioè " (" o " [" è
assente
14 5 Nessuna coppia per " (" o " {" , cioè " )" o " ]" è
assente
Codice Descrizione
149 Questo tok en non è previsto qui
1 3 5 Misuso di break
1 7 5 A ttesa un espressione
Codice Descrizione
174 N ell' espressione #import è atteso un nome del
file
Codice Descrizione
197 Espressione Integer attesa
Codice Descrizione
224 Metodo della classe o struttura con lo stesso
nome, ma con parametri diversi (dichiarazione
!=implementazione)
Codice Descrizione
249 Non è permesso di dichiarare un riferimento ad
un riferimento
5
2 0 Non è permesso di dichiarare un puntatore ad
un puntatore
5
2 1 La dichiarazione di struttura nella lista dei
parametri non è consentita
5
2 2 Operazione di typecasting non valida
5
2 3 U n puntatore può essere dichiarato solo per una
classe o una struttura
5
2 6 I dentificatore non dichiarato
5
2 7 Errore ottimizzatore codice eseguibile
5
2 8 Errore generazione codice eseguibile
Codice Descrizione
274 Non è permesso cambiare i membri della classe
nel metodo costante
Codice Descrizione
299 D eve essere una classe
Codice Descrizione
326 La dichiarazione non è consentita per il
corrente ambito
I CO(formato)
Codice Descrizione
34 5 Inizializzazione di un membro non-statico di
una classe/struttura su un livello globale non è
consentito
Codice Descrizione
applicati)
37 I nconsistent #ifdef/#endif
380 N on usato
Codice Descrizione
381 Sintassi illegale quando si dichiara una funzione
virtuale pura, solo " =NULL " o " =0" sono
consentiti
un'altra interfaccia
Codice Descrizione
403 Lo specificatore final può essere applicato solo
alle funzioni virtual
specificato
Errori di Runtime
GetLastError() è la funzione che restituisce l'ultimo codice di errore memorizzato nella variabile
predefinita _LastError. Questo valore può essere azzerato dalla funzione R esetLastError().
Chart
ERR_CHART_W R ONG_ID 4101 ID del Chart errato
Oggetti grafici
ERR_OBJECT_ERR OR 4201 Errore di lavoro con un oggetto
grafico
MarketInfo
ERR_M ARKET_UNKNOW N_S YM 4301 S imbolo sconosciuto
BOL
Variabili_Globali
ERR_GLOBAL VARIABLE_NOT_F 5
4 01 La variabile globale del
OUND terminale cliente non è stata
trovata
ERR_GLOBAL VARIABLE_EXIS TS 5
4 02 La variabile globale del
terminale client con lo stesso
nome esiste già
ERR_GLOBAL VARIABLE_NOT_M 5
4 03 Le variabili globali non sono
ODIFIED state modificate
ERR_GLOBAL VARIABLE_CANNO 5
4 04 Non posso leggere il file con i
TR EAD valori delle variabiili globali
ERR_GLOBAL VARIABLE_CANNO 5 5
4 0 Non posso scrivere il file con i
TW RIT E valori delle variabiili globali
ERR_NOTIFICATION_S END_FAI 5 5
4 1 Fallimento nell'invio di una
LED notifica
ERR_NOTIFICATION_W R ONG_P 5
4 16 Parametro non valido per
ARA MET ER l'invio di una notifica - una
stringa vuota o NULL è stato
ERR_NOTIFICATION_W R ONG_S 5
4 17 Impostazioni errate di
ETTINGS notifiche nel terminale (ID non
è specificato o l'autorizzazione
non è impostata)
ERR_NOTIFICATION_T OO_FR E 5
4 18 Invio troppo frequente delle
QUENT notifiche
I Buffers Indicatore
Personalizzato
ERR_BUFFERS _NO_MEMORY 4601 Memoria insufficiente per la
distribuzione dei buffer
indicatore
Proprietà Indicatore
Personalizzato
ERR_CUS T OM _W R ONG_PR OPE 4603 ID errato della proprietà
RTY indicatore personalizzato
Account
ERR_ACCOUNT_W R ONG_PR OP 4701 Proprietà ID dell'account,
ERTY sbagliata
Indicatori
ERR_INDICAT OR_UNKNOW N_S 4801 S imbolo sconosciuto
YM BOL
Profondità di Mercato
ERR_BOOKS _CANNOT_ADD 4901 Profondità di Mercato non può
essere aggiunta
FileR eadDatetime,
OpenCL
Simboli personalizzati
ERR_NOT_CUS T OM _S YM BOL 5300 È necessario specificare un
simbolo personalizzato
finale 0
Calendario Economico
ERR_CALENDAR_MOR E_DATA 5400 La grandezza dell'array è
insufficiente per la ricezione
delle descrizioni di tutti i
valori
Errori Definiti-Dall-utente
ERR_US ER_ERR OR_FIRS T 6 5536 Errori definiti dall'utente
iniziano con questo codice
Vedi anche
Codici di R itorno del T rade S erver
necessaria.
U na o più flags possono essere specificato quando si apre un file. S i tratta di una combinazione di
flag. La combinazione di flag viene scritta utilizzando il segno logico OR (|), che è posizionato tra
flags enumerati. Ad esempio, per aprire un file in formato CS V per la lettura e la scrittura, allo stesso
tempo, specificare la combinazione FILE_R EAD|FILE_W RIT E|FILE_CS V.
Esempio:
int filehandle=FileOpen(filename,FILE_READ|FILE_WRITE|FILE_CSV);
Ci sono alcune caratteristiche specifiche di lavoro quando si specificano flags di lettura e scrittura:
· Se viene specificato FILE_R EAD, viene effettuato un tentativo di aprire un file esistente. S e il file
non esiste, l'apertura del file non riesce, un nuovo file non viene creato.
· FI LE_R EAD|FILE_W RIT E – un nuovo file viene creato se il file con il nome specificato non esiste.
· FI LE_W RIT E – il file viene creato di nuovo con una dimensione pari a zero.
Quando si apre un file, è necessaria la specifica di FI LE_W RIT E e/o FILE_R EAD.
F lags che definiscono il tipo di lettura di un file aperto, posseggono priorità. La più alta flag è
FI LE_CS V, poi va FILE_BIN, e FILE_TXT è di priorità più bassa. Quindi, se le bandiere vengono indicate
al tempo stesso, (FILE_TXT | FILE_CS V o FILE_TXT | FILE_BIN o FILE_BIN | FILE_CS V), verrà utilizzata
la bandiera con la priorità più alta.
Bandiere che definiscono il tipo di codifica anche hanno la priorità. FILE_UNICODE sono di una priorità
maggiore rispetto FILE_ANS I. Quindi, se si specifica la combinazione FILE_UNICODE|FILE_ANS I, verrà
utilizzato il flag FILE_UNICODE.
Se un file viene aperto per la lettura come file di testo (o FILE_TXT FILE_CS V), ed all'inizio del file
viene trovata di una speciale indicazione due-byte 0x ff,0x fe, il flag di codifica sarà FILE_UNICODE,
anche se viene specificato FILE_ANS I.
Vedi anche
F unzioni con i File
Proprietà file
La funzione FileGetInteger() viene utilizzata per ottenere le proprietà del file. L 'identificatore della
proprietà richiesta dell'enumerazione ENUM _FILE_PR OPERTY_INT EGER viene passato ad esso durante
la chiamata.
ENUM_FILE_PROPERTY _INTEGER
ID ID descrizione
FI LE_EXIS TS Controllare l'esistenza
La funzione FileGetInteger() ha due diverse opzioni di chiamata. Nella prima opzione, per ottenere le
proprietà di un file, viene specificato il suo handle, che viene ottenuto durante l'apertura del file
utilizzando la funzione FileOpen(). Questa opzione permette di ottenere tutte le proprietà di un file.
La seconda opzione della funzione FileGetInteger() restituisce i valori delle proprietà del file, per il
nome del file. Utilizzando questa opzione, solo le seguenti proprietà generali possono essere ottenute:
Quando si cerca di ottenere le proprietà diverse da quelle di cui sopra, la seconda opzione di
FileGetI nteger() chiamata restituirà un errore.
ENUM_FILE_POSITION
Identificatore Descrizione
S EEK_S ET I nizio file
Vedi anche
F ileIsEnding, FileIsLineEnding
La tabella elenca le costanti predefinite per alcune delle più popolari pagine di codice. Pagine di codice
non menzionate possono essere specificate da un codice corrispondente alla pagina.
CP_UTF7 5
6 000 UTF 7 - code page.
CP_UTF8 5
6 001 UTF 8 - code page.
Vedi anche
Proprietà del T erminale Client
Per visualizzare l'icona nella finestra del messaggio, è necessario specificare flag addizionali:
MQL5 Programs
Per far opeare il programma mql5, esso deve essere compilato (bottone Compile o tasto F7). La
compilazione dovrebbe passare senza errori (sono possibili alcuni avvisi, ma devono essere
analizzati). In questo processo, un file eseguibile con lo stesso nome e con estensione EX5 dev ' essere
creato nella directory corrispondente, terminal_dir\MQL5\Ex perts, terminal_dir\MQL5\indicators or
terminal_dir\MQL5\scripts. Questo file può essere eseguito.
Le caratteristiche operative dei programmi MQL5 sono descritte nelle seguenti sezioni:
· Chiamata delle funzioni importate - descrizione ordine, parametri consentiti, i dettagli di ricerca ed
accordi di chiamata per le funzioni importate.
· Errori di runtime - ottenere informazioni sugli errori di runtime e critici.
Ex pert Advisor, indicatori personalizzati e script sono collegati ad uno dei grafici aperti con il metodo
Drag 'n'Drop dalla finestra del Navigator.
A ffinché un Ex pert Advisor smetta di funzionare, dovrebbe essere rimosso dal grafico. Per farlo
selezionare " Lista Ex perts " nel menu contestuale del grafico, quindi selezionare un Ex pert Advisor dalla
lista e fare clic sul pulsante " R imuovi" . Il funzionamento degli Ex pert Advisors è influenzato anche dallo
stato del bottone " AutoT rading " .
Per fermare un indicatore personalizzato, esso deve essere rimosso dal grafico.
G li indicatori personalizzati ed Ex pert Advisors lavorano fino a quando non vengono esplicitamente
rimossi da un grafico, le informazioni su Ex pert Advisor ed Indicatori attaccati vengono salvate tra le
sessioni di terminale client.
G li script vengono eseguiti una sola volta e vengono eliminati automaticamente al termine del
completamento dell'operazione o al cambio dello stato del grafico corrente, o su arresto del terminale
client. Dopo il riavvio del terminale client, gli scripts non vengono avviati, perché le informazioni su di
essi non vengono salvate.
Massimo un Ex pert Advisor, uno script ed un numero illimitato di indicatori, possono operare in un
grafico.
Iservizi non richiedono di essere associati ad un chart per funzionare e sono progettati per eseguire
funzioni ausiliarie. Ad esempio, in un servizio, è possibile creare un simbolo personalizzato, aprire il
suo chart, ricevere i dati per esso in un ciclo infinito usando le funzioni di rete e aggiornarlo
costantemente.
I programmi in esecuzione
Ogni script ed ogni Ex pert Advisor viene eseguito in un thread separato. T utti gli indicatori calcolati su
un simbolo, anche se sono collegati ai grafici diversi, lavorano nello stesso thread. Dunque, tutti gli
indicatori di uno simbolo condividono le risorse di un thread.
T utte le altre azioni associate ad un simbolo, come l'elaborazione di tick s e la sincronizzazione dello
storico, sono sempre eseguiti nello stesso thread con gli indicatori. Ciò significa che se un' azione
infinita viene eseguita in un indicatore, tutti gli altri eventi associati con il suo simbolo non verranno
mai eseguiti.
Durante l'esecuzione di un Ex pert Advisor, assicurarsi che ha un vero e proprio ambiente di trading e
può accedere allo storico del simbolo e periodo richiesti, e sincronizzare i dati tra il terminale ed il
server. Per tutte queste procedure, il terminale fornisce un ritardo di avvio di non più di 5 secondi,
dopo di che l'Ex pert Advisor viene avviato con i dati disponibili. Pertanto, nel caso in cui non vi è alcun
collegamento al server, questo può portare ad un ritardo nella partenza di un Ex pert Advisor.
Subito dopo che un programma è collegato ad un grafico, viene caricato nella memoria del terminale
client, cos ì come le variabili globali vengono inizializzate. S e qualche variabile globale di tipo classe ha
un costruttore, questo costruttore sarà chiamato durante l'inizializzazione di variabili globali.
Dopo di che il programma resta in attesa di un evento dal terminale client. Ogni programma-mql5 deve
avere almeno un event-handler, altrimenti il programma caricato non verrà eseguito. Gli event
handlers hanno nome, parametri e tipi restituiti, tutti predefiniti.
const double
&Open[] ,
const double
&H igh[] ,
const double
&Low[] ,
const double
&Close[] ,
const long
&T ickVolume[] ,
const long
&Volume[] ,
const int
&S pread[]
const double
&dparam,
const string
&sparam
void OnBook Event const string Ex pert Advisors Book Event event
&s ymbol_name ed indicatori handler.
Un terminale client invia nuovi eventi ai corrispondenti grafici aperti. Gli eventi possono essere
generati anche da grafici (grafico eventi) o programmi-mql5 (eventi personalizzati). Generazione di
eventi di creazione o l'eliminazione di oggetti grafici in un grafico possono essere abilitati o
disabilitati impostando le proprietà del grafico CHART_EVENT_OBJECT_CR EAT E e
CHART_EVENT_OBJECT_DELET E. Ogni programma mql5 ed ogni grafico ha la propria coda di eventi, in
cui vengono aggiunti tutti i nuovi eventi in arrivo.
U n programma riceve solo gli eventi dal grafico su cui gira. T utti gli eventi vengono elaborati uno dopo
l'altro nell'ordine in cui vengono ricevuti. S e una coda ha già un evento NewT ick , o questo evento è
attualmente in fase di elaborazione, il nuovo evento NewT ick non viene inserito nella coda del
programma mql5. Analogamente, se ChartEvent è già accodato, o questo evento è in fase di
elaborazione, nessun nuovo evento di questo tipo viene messo in fila. Gli eventi timer vengono gestiti
allo stesso modo - se l'evento T imer è in coda o manipolato, l'evento nuovo timer non è messo in coda.
Code degli eventi hanno una grandezza limitata ma sufficiente, in modo che l'overflow della coda per
programmi ben scritti è improbabile. In caso di overflow della coda, i nuovi eventi vengono ignorati
senza fare la fila.
Si raccomanda vivamente di non utilizzare loop infiniti per gestire gli eventi. Le possibili eccezioni
sono script e servizi che gestiscono un singolo evento S tart.
Indicatori, script ed Ex pert Advisor sono programmi eseguibili scritti in MQL5. Essi sono progettati per
diversi tipi di compiti. Pertanto vi sono alcune limitazioni all'uso di determinate funzioni, a seconda
del tipo di programma. Le seguenti funzioni sono vietate negli indicatori:
· OrderCalcMargin();
· OrderCalcProfit();
· OrderCheck ();
· OrderS end();
· S endFT P();
· S leep();
· Ex pertR emove();
· MessageBox ().
T utte le funzioni progettate per gli indicatori sono vietate in Ex pert Advisor e script:
· S etIndexBuffer();
· I ndicatorS etDouble();
La libreria non è un programma indipendente ed è eseguita nel contesto del programma MQL5 che lo
ha chiamato: script, indicatore o Ex pert Advisor. Di conseguenza, le restrizioni di cui sopra si
applicano alla libreria chiamata.
Ex pertR emove();
EventS etMillisecondT imer();
EventS etT imer();
EventKillT imer();
S etIndexBuffer();
I ndicatorS etDouble();
I ndicatorS etInteger();
I ndicatorS etS tring();
PlotIndexS etDouble();
PlotIndexS etInteger();
PlotIndexS etS tring();
PlotIndexGetInteger();
· avvio del terminale (se l'indicatore viene attaccato al grafico prima della chiusura del terminale);
· caricamento di un template (se l'indicatore attaccato ad un grafico viene specificato nel template);
· modifica di un profilo (se l'indicatore è attaccato ad uno dei grafici del profilo);
· modifica di un profilo, se l'indicatore è attaccato a uno dei grafici del profilo modificato;
· modifica di un profilo, se l' Ex pert Advisor è attaccato a uno dei grafici del profilo modificato;
· modifica dell'account sul quale il terminale è collegato (se l'Ex pert A dvisor è stato attaccato al
grafico prima dell'autorizzazione del terminale sul server;
· calling the Ex pertR emove() function.
Nel caso in cui il simbolo o il timeframe di un grafico, al quale è attaccato l'Expert Advisor,
cambia, gli Expert Advisor non vengono caricati o decaricati. In questo caso il terminale client
chiama in subsequenzialmente i gestori OnDeinit() sul vecchio simbolo/timeframe ed OnInit() sul
nuovo simbolo/timeframe (se ce ne sono), i valori delle variabili globali e variabili statiche non
vengono ripristinati. T utti gli eventi, che sono stati ricevuti per l'Ex pert Advisor prima che
l'inizializzazione sia stata completata (funzione OnInit()) vengono saltati.
I servizi hanno un singolo gestore OnS tart(), in cui è possibile implementare un ciclo infinito di
ricezione e gestione dei dati, ad esempio creando e aggiornando simboli personalizzati utilizzando le
funzioni di rete.
A differenza di Ex pert Advisors, indicatori e script, i servizi non sono associati ad un chart specifico,
pertanto viene fornito un meccanismo separato per avviarli. Una nuova istanza di servizio viene
creata nel Navigator utilizzando il comando " Aggiungi servizio" . Un'istanza di servizio può essere
avviata, arrestata e rimossa utilizzando il menu di istanza appropriato. Per gestire tutte le istanze,
utilizzare il menu di servizio.
Per una migliore comprensione del funzionamento degli Ex pert Advisor si consiglia di compilare il
codice del seguente Ex pert Advisor ed eseguire operazioni di carico/decarico, cambio template,
cambio simbolo, cambio timeframe ecc.:
Esempio:
//+--------------------------------------------------------------------------------+
//| TestExpert.mq5 |
//| Copyright 2009, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
class CTestClass
{
public:
CTestClass() { Print("CTestClass constructor"); }
~CTestClass() { Print("CTestClass destructor"); }
};
CTestClass global;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione dell' Expert |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//---
Print("Inizializzazione");
//---
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione Expert |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
Print("Deinizializzazione con motivo",reason);
}
//+--------------------------------------------------------------------------------+
//| Funzione tick dell'Expert |
//+--------------------------------------------------------------------------------+
void OnTick()
{
//---
}
//+--------------------------------------------------------------------------------+
Vedi anche
Eventi terminale client, Event handlers
Trade Permission
Trade Automation
MQL5 language provides a special group of trade functions designed for developing automated trading
s ystems. Programs developed for automated trading with no human intervention are called Ex pert
A dvisors or trading robots. I n order to create an Ex pert A dvisor in MetaEditor, launch MQL5 W izard
· Ex pert dvisor (template) – allows you to create a template with ready-made event handling
A
functions that should be supplemented with all necessary functionality by means of programming.
· Ex pert Advisor (generate) – allows you to develop a full-fledged trading robot simply by selecting the
necessary modules : trading signals module, money management module and trailing stop module.
T rading functions can work only in Ex pert Advisors and scripts. T rading is not allowed for indicators.
Y ou can s witch automated trading option right on the terminal's S tandard panel:
S ample check:
if (!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
Alert("Check if automated trading is allowed in the terminal settings!");
S ample check:
if(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
Alert("Check if automated trading is allowed in the terminal settings!");
else
{
if(!MQLInfoInteger(MQL_TRADE_ALLOWED))
Alert("Automated trading is forbidden in the program settings for ",__FILE__);
}
Checking if trading is allo w ed for any Expert Advisors/scripts for the current
account
A utomated trading can be disabled at the trade server side. S ample check:
if(!AccountInfoInteger(ACCOUNT_TRADE_EXPERT))
Alert("Automated trading is forbidden for the account ",AccountInfoInteger(ACCOUNT_LOGIN),
" at the trade server side");
If automated trading is disabled for a trading account, trading operations of Ex pert A dvisors /scripts
are not ex ecuted.
if(!AccountInfoInteger(ACCOUNT_TRADE_ALLOWED))
Comment("Trading is forbidden for the account ",AccountInfoInteger(ACCOUNT_LOGIN),
".\n Perhaps an investor password has been used to connect to the trading account.",
"\n Check the terminal journal for the following entry:",
See also
Client T erminal Properties, Account Properties, Properties of a R unning MQL5 Program
Deinit
Prima che le variabili globali vengano deinizializzate, ed il programma (Ex pert Advisor o indicatore
personalizzato) viene scaricato, il terminale client invia l'evento Deinit al programma. Deinit viene
generato anche quando il terminale client viene chiuso, quando un grafico viene chiuso, proprio prima
che lo strumento finanziario e/o il timeframe vengono cambiati, o ad una ricompilazione con successo
del programma, o quando i parametri di input vengono cambiati, o quando cambia un account.
Le motivazioni di deinizializzazione possono essere ottenute dal parametro, passato alla funzione
OnDeinit(). La l'esecuzione della funzione OnDeinit() è limitata a 2,5 secondi. S e durante questo tempo
la funzione non è stata completata, viene interrotta prematuramente. L 'evento Deinit non viene
generato per gli script.
Start
Start è un evento speciale per il lancio di uno script o di un servizio dopo averlo caricato. È gestito
dalla funzione OnS tart. L 'evento S tart non viene passato agli EA e agli indicatori personalizzati.
New Tick
L 'evento NewT ick viene generato se ci sono nuove quotazioni, e viene elaborato da OnT ick () dell'
Ex pert Advisor allegato. Nel caso in cui la funzione OnT ick per la quotazione precedente è in fase di
elaborazione quando viene ricevuta una quotazione, la nuova quotazione verrà ignorata dall' Ex pert
A dvisor, perché l'evento corrispondente non sarà messo in fila.
T utte le nuove citazioni che vengono ricevute mentre il programma è in esecuzione vengono ignorate
fino a quando onT ick () non è completato. Dopo di che la funzione girerà solo dopo che viene ricevuta
una nuova quotazione. L 'evento NewT ick viene generato indipendentemente dal fatto che sia
consentito il trading automatizzato o meno (bottone " permetti/vieta il trading automatizzato" ). Il
divieto di trading automatico indica solo che l'invio delle richieste di trading provenienti da un Ex pert
A dvisor non sono consentite, mentre l'Ex pert A dvisor continua a lavorare.
Il divieto di trading automatico, premendo il relativo bottone, non fermerà l'esecuzione corrente della
funzione onT ick ().
Calculate
L 'evento Calculate viene generato solo per gli indicatori giusto dopo che l'evento Init viene inviato ad
ogni cambio di dati sui prezzi. Viene elaborato dalla funzione OnCalculate.
Timer
L 'evento T imer viene periodicamente generato dal terminale client per l'Ex pert Advisor che ha attivato
il timer della funzione EventS etT imer. Di solito, questa funzione viene chiamata da OnInit. L 'evento di
elaborazione T imer viene eseguito dalla funzione OnT imer. Dopo che l'operazione dell' Ex pert Advisor è
stata completata, è necessario distruggere il timer con la funzione EventKillT imer, che di solito è
chiamata nella funzione OnDeinit.
Trade
L 'evento di trade viene generato quando un operazione di trade è stata completata sul trade server.
L 'evento T rade è gestito dalla funzione OnT rade() per le operazioni di trade seguenti:
· la modifica della posizione aperta (cambio degli stops - S top Loss e/o T ak e Profit).
TradeTransaction
Quando si eseguono alcune azioni precise su un trade account, il suo stato cambia. T ali azioni
comprendono:
· I nviare una richiesta di trade da ualsiasi applicazione MQL5 nel terminale client utilizzando le
q
Per esempio, quando si invia un ordine di mercato buy, esso viene gestito, un appropriato ordine di
buy viene creato per l'account, l'ordine viene poi eseguito e rimosso dalla lista di quelli aperti, quindi
viene aggiunto alla cronistoria ordini, un appropriato affare si aggiunge alla cronistoria e una nuova
posizione viene creata. T utte queste azioni sono transazioni di trade. L ' arrivo di una tale operazione
al terminal è un evento T radeT ransaction. Questo evento viene gestito dalla funzione
OnT radeT ransaction.
Tester
L 'evento T ester viene generato dopo che il testing di un Ex pert A dvisor su dati storici è finito.
L 'evento è gestito dalla funzione OnT ester().
TesterInit
L 'evento T esterInit viene generato con l'inizio dell' ottimizzazione nello strateg y tester prima del primo
step di ottimizzazione. L 'evento T esterInit viene gestito dalla funzione OnT esterInit().
TesterPass
L 'evento T esterPass viene generato quando viene ricevuto un nuovo frame di dati. L 'evento
T esterPass viene gestito dalla funzione OnT esterPass().
TesterDeinit
L ' evento T esterDeinit viene generato dopo la fine dell' ottimizzazione di un Ex pert A dvisor nello
strateg y tester. L 'evento T esterDeinit viene gestito dalla funzione OnT esterDeinit().
ChartEvent
L ' eventoChartEvent viene generato dal terminale client q uando un utente sta lavorando con un
grafico:
noltre vi è un ChartEvent evento personalizzato, che può essere inviato ad un Ex pert Advisor
I
BookEvent
L 'evento Book Event viene generato dal terminale client dopo che la Profondità di Mercato è cambiata;
viene elaborato dalla funzione OnBook Event. Per avviare la generazione di Book Event per il simbolo
specificato, è necessario registrare il simbolo per questo evento utilizzando la funzione
Mark etBookAdd.
Per annullare l'iscrizione a Book Event per un simbolo specificato, è necessario chiamare la funzione
Mark etBookR elease. L 'evento Book Event è un evento di tipo-broadcasting - significa che è sufficiente
iscrivere un solo Ex pert Advisor per questo evento, e tutti gli altri Ex pert Advisor che hanno l'handler
event OnBook Event, lo riceveranno. Ecco perché è necessario analizzare il nome del simbolo, che è
passato ad un handler come parametro.
Vedi anche
Event handlers, Funzionamento del programma
Risorse
Uso di immagini e suoni in programmi mql5
I programmi in MQL5 permettono di lavorare con i file audio e grafica:
· ObjectCreate() permette di creare interfacce utente utilizzando gli oggetti grafici OBJ_BIT M AP e
OBJ_BIT M AP_L ABEL.
PlaySound()
Esempio di chiamata della funzione PlayS ound():
//+--------------------------------------------------------------------------------+
//| Chiama OrderSend() standard e riproduce un suono |
//+--------------------------------------------------------------------------------+
void OrderSendWithAudio(MqlTradeRequest &request, MqlTradeResult &result)
{
//--- Invia una richiesta ad un server
OrderSend(request,result);
//--- se la richiesta viene accettata, riproduce l'audio Ok.wav
if(result.retcode==TRADE_RETCODE_PLACED) PlaySound("Ok.wav");
//--- se fallisce, riproduce l' allarme dal file timeout.wav
else PlaySound("timeout.wav");
}
L 'esempio mostra come riprodurre i suoni di 'Ok .wav ' file e 'timeout.wav ', che sono inclusi nel
pacchetto terminale standard. Questi file si trovano nella cartella terminal_directory\Sounds. Qui
terminal_directory vi è la cartella, da cui viene avviato Terminale Client MetaTrader 5. La posizione
della directory del terminale può essere scoperta da un programma MQL5 nel modo seguente:
È possibile utilizzare i file audio non solo dalla cartella terminal_directory\Sounds, ma anche da
qualsiasi sottocartella che si trova terminal_data_directory\ MQL5. S i può scoprire il percorso della
directory dei dati del terminale dal menu del terminale " File" -> " Apri" dati del terminale o con il
metodo del programma:
Si prega di notare che nel commento il percorso del file è scritto usando una barra inversa " \" , e nella
funzione invece viene usato " \\" .
Quando si specifica il percorso, usare sempre e solo la doppia barra rovesciata come separatore, in
quanto una singola barra rovesciata è un simbolo di controllo per il compilatore quando si tratta di
Chiama la funzione PlayS ound() con parametro NULL per fermare la riproduzione:
ObjectCreate()
Esempio di un Ex pert Advisor, che crea un'etichetta grafica (OBJ_BIT M AP_L ABEL) utilizzando la
funzione ObjectCreate().
if(!set)
{
PrintFormat("Impossibile scaricare l'immagine dal file %s. Error code %d",dollar,GetLastError());
}
//--- invia un comando per un grafico per aggiornare in modo che il bottone viene visualizzato imme
ChartRedraw(0);
}
else
{
// --- fallimento nel creare un oggetto, notifica
PrintFormat("Fallimento nel creare OBJ_BITMAP_LABEL. Error code %d",GetLastError());
}
}
//---
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione Expert |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- elimina un oggetto da un grafico
ObjectDelete(0,label_name);
}
L 'oggetto OBJ_BIT M AP_L ABEL è in realtà un bottone, che visualizza una delle due immagini, a seconda
dello stato del bottone (premuto o non premuto): euro.bmp o dollar.bmp.
La grandelzza del bottone con un'interfaccia grafica viene automaticamente adattata alla dimensione
dell'immagine. L 'immagine viene modificata con un clic del tasto sinistro del mouse sull'oggetto
OBJ_BIT M AP_L ABEL (deve essere impostata nelle proprietà " Disattivare la selezione" ). L 'oggetto
OBJ_BIT M AP viene creato nello stesso modo - viene utilizzato per creare lo sfondo con un'immagine
necessaria.
Il valore della proprietà OBJPR OP_BMPFILE, che è responsabile per l'aspetto degli oggetti OBJ_BIT M AP
e OBJ_BIT M AP_L ABEL, può essere modificato in modo dinamico. Questo permette di creare diverse
interfacce utente interattive per programmi mql5.
#resource percorso_al_file_risorsa
I file in formato BMP e W AV vengono automaticamente compressi prima di includerli in un file EX5.
Questo indica che in aggiunta alla creazione di programmi completi in MQL5, l'utilizzo di risorse
consente inoltre di ridurre la grandezza totale dei file necessari utilizzando immagini e suoni, rispetto
al solito modo di scrittura del programma MQL5.
#resource "<percorso_ad_un_file_risorse>"
I l compilatore cerca per una risorsa nel percorso specificato nel seguente ordine:
· se il separatore barra rovesciata " \" (scritto come " \\" ) è posto all'inizio del percorso, esso ricerca
I l percorso delle risorse non può contenere le sottostringhe " ..\\" e " :\\" .
riga, che imposta il percorso della risorsa. Per usare le tue risorse nel codice, il contrassegno speciale
" ::" deve essere aggiunto prima il nome della risorsa.
Esempi:
Occorre notare che quando si impostano immagini da una risorsa agli oggetti OBJ_BIT M AP e
OBJ_BIT M AP_L ABEL, il valore della proprietà OBJPR OP_BMPFILE non può essere modificato
manualmente. Ad esempio, per la creazione di OBJ_BIT M AP_L ABEL utilizziamo le risorse euro.bmp e
dollar.bmp.
Quando si visualizzano le proprietà di questo oggetto, vedremo che la proprietà BitMap File (On) e
BitMap File (Off) sono disattivate e non possono essere cambiate manualmente:
Per utilizzare il nome di risorsa da un altro file, dovrebbe essere specificato come
<path_EX5_file_name>::<resource_name> . Ad esempio, si supponga che lo script
Draw_T riangles _S cript.mq5 contiene una risorsa di un'immagine nel file triangle.bmp:
#resource "\\Files\\triangle.bmp"
Allora il suo nome, per l'utilizzo nello script stesso, sarà tipo "F ile\triangle.bmp" , e per usarlo, " ::"
Per poter utilizzare la stessa risorsa da un altro programma, ad esempio da un Ex pert Advisor,
abbiamo bisogno di aggiungere al nome della risorsa il percorso del relativo file da EX5
terminal_data_directory\MQL5\ ed il nome del file EX5 dello script, il EX5 file -
Draw_Triangles_Script.ex5. S i supponga che lo script si trovi nella cartella standard
terminal_data_directory\MQL5\S cripts \, dunque la chiamata deve essere scritta come segue:
//--- Utilizzando una risorsa da uno script in un EA
ObjectSetString(0,my_bitmap_name,OBJPROP_BMPFILE,0,"\\Scripts\\Draw_Triangles_Script.ex5::Files\\tr
Se il percorso del file eseguibile non è specificato quando si chiama la risorsa da un altro EX5, il file
eseguibile viene cercato nella stessa cartella che contiene il programma che chiama la risorsa. Ciò
significa che se un Ex pert Advisor richiede una risorsa da Draw_T riangles _S cript.ex 5 senza
specificazione del percorso, in questo modo:
allora il file verrà ricercato per la cartella terminal_data_directory\MQL5\Ex perts \, se gli Ex pert
A dvisor sono memorizzati in terminal_data_directory\ MQL5 \ Ex perts \ .
//+------------------------------------------------------------------+
//| SampleEA.mq5 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#resource "\\Indicators\\SampleIndicator.ex5"
int handle_ind;
//+------------------------------------------------------------------+
//| Funzione di inizializzazione dell' Expert |
//+------------------------------------------------------------------+
int OnInit()
{
//---
handle_ind=iCustom(_Symbol,_Period,"::Indicators\\SampleIndicator.ex5");
if(handle_ind==INVALID_HANDLE)
{
Print("Expert: iCustom call: Error code=",GetLastError());
return(INIT_FAILED);
}
//--- ...
return(INIT_SUCCEEDED);
}
Il caso quando un indicatore personalizzato nella funzione OnInit() crea una o più copie di se stesso e
richiede una speciale considerazione. S i prega di tenere presente che la risorsa deve essere
specificata nel seguente modo: <path_EX 5_file_name>::<resource_name>.
A d esempio, se l'indicatore S ampleIndicator.ex 5 è incluso per S ampleEA.ex 5 Ex pert Advisor come una
risorsa, il percorso a s é specificato al momento della chiamata della iCustom() enlla funzione di
inizializzazione dell' indicatore personalizzato appare nel seguente modo: " \\Ex perts \
\S ampleEA .ex 5::I ndicators \\S ampleI ndicator.ex 5" .. Quando questo percorso è impostato in modo
Il percorso di per s é può essere ricevuto tramite la funzione G etR elativeProgramPath(). L 'esempio del
suo utilizzo è il seguente:
//+------------------------------------------------------------------+
//| SampleIndicator.mq5 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_plots 0
int handle;
//+-----------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+-----------------------------------------------------------------+
int OnInit()
{
//--- il modo sbagliato di fornire un collegamento a se stesso
//--- string path="\\Experts\\SampleEA.ex5::Indicators\\SampleIndicator.ex5";
//--- il modo giusto per ricevere un collegamento a se stesso
string path=GetRelativeProgramPath();
//--- mappatura buffers indicatore
handle=iCustom(_Symbol,_Period,path,0,0);
if(handle==INVALID_HANDLE)
{
Print("Indicator: iCustom call: Error code=",GetLastError());
return(INIT_FAILED);
}
else Print("Indicator handle=",handle);
//---
return(INIT_SUCCEEDED);
}
///....
//+-----------------------------------------------------------------+
//| GetRelativeProgramPath |
//+-----------------------------------------------------------------+
string GetRelativeProgramPath()
{
int pos2;
//--- ottiene il percorso assoluto per l'applicazione
string path=MQLInfoString(MQL_PROGRAM_PATH);
//--- trova la posizione della sottostriga "\MQL5\"
int pos =StringFind(path,"\\MQL5\\");
//--- sottostringa non trovata - errore
if(pos<0)
return(NULL);
//--- salta la directory "\MQL5"
pos+=5;
//--- salta il simbolo '\'
while(StringGetCharacter(path,pos+1)=='\\')
pos++;
//--- se c'è una risorsa, restituisce il percorso relativo alla directory MQL5
if(StringFind(path,"::",pos)>=0)
return(StringSubstr(path,pos));
//--- trova un separatore per la prima sottodirectory MQL5 (per esempio, MQL5\Indicators)
//--- se non trovato, restituisce il percorso relativo alla directory MQL5
if((pos2=StringFind(path,"\\",pos+1))<0)
return(StringSubstr(path,pos));
//--- restituisce il percorso relativo alla sottodirectory (per esempio, MQL5\Indicators)
return(StringSubstr(path,pos2+1));
}
//+-----------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+-----------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const int begin,
const double& price[])
{
//--- restituisce il valore di prev_calculated per la prossima chiamata
return(rates_total);
}
Variabili di risorsa
Le risorse possono essere dichiarate utilizzando le variabili di risorsa e trattati come se fossero
variabili del tipo appropriato. Formato Dichiarazione:
D ichiarazioni di esempio:
In caso di tale dichiarazione, la risorsa dati può essere indirizzata solo attraverso la variabile, l'auto
indirizzamento via " ::<rsource name>" non funziona.
R isultato di esecuzione S cript – solo due OBJ_BIT M AP_L ABEL oggetti su tre sono stati creati.
L 'immagine del primo oggetto ha la striscia rossa nel mezzo.
L 'utilizzo delle variabili di risorse è particolarmente conveniente per i prodotti editoriali nel Mark et.
Caratteristiche
· La speciale risorsa variabile di tipo bitmapinforma il compilatore che la risorsa è un'immagine. T ali
variabili ricevono il tipo uint.
· L 'array del tipo di variabile risorsa bitmappuò avere due dimensioni. I n questo caso, la dimensione
dell'array è definita come [altezza_immagine] [larghezza_immagine]. S e non viene specificato un
array ad una dimensione, il numero di elementi è pari ad altezza_immagine * larghezza_immagine.
· Durante il download di immagini a 24 bit, il componente canale alfa è impostato a 255 per tutti i
pix el dell'immagine.
· Quando si scarica un'immagine a 32 bit senza il canale alfa, la componente canale alfa è anche
Se BOM è assente, la codifica è definita dal contenuto del file. S ono supportati i file nei ANS I, UTF-8
e UTF-16. T utte le stringhe vengono convertite in Unicode durante la lettura dei dati dai file.
OpenCL programs
L 'utilizzo delle variabili stringa risorsa può facilitare notevolmente lo sviluppo di alcuni programmi. Ad
esempio, si è in grado di scrivere un codice di un programma OpenCL in un file CL separato e poi
includerlo come una stringa nella vostre risorse MQL5 del programma.
In questo esempio, si sarebbe dovuto scrivere l'intero codice come un'unica grande stringa se non sono
stati usati variabili risorsecl_program.
Vedi anche
ResourceCreate(), R esourceS ave(), PlayS ound(), ObjectS etInteger(), ChartApplyT emplate(), Funzioni
con i Files
Si raccomanda di non utilizzare il nome completo specificato del modulo da caricare come Unità:
\Directory\FileName.Ext. Le librerie MQL5 vengono caricate dalla cartella
terminal_dir\MQL5\Libraries. S e la libreria non è stata trovata, il terminale client esegue un tentativo
di caricamento dalla cartella terminal_dir\experts.
Le librerie di sistema (DLL) vengono caricatee dalle regole del sistema operativo. S e la libreria è già
caricata (per esempio, un altro Ex pert Advisor, e anche da un altro terminale client, in parallelo),
allora utilizza richieste alla libreria già caricata. Altrimenti, esegue una ricerca nella seguente
sequenza:
1 . La directory, da cui il modulo importazione dll è stato avviato. Il modulo qui è un Ex pert Advisor,
uno script, un indicatore o una libreria ex 5;
2 . D irectory terminal_data_directory\MQL5\Libraries (T ER M INAL _DATA_PATH\MQL5\Libraries);
3 . D irectory, da cui è stato avviato il terminale client MetaT rader 5;
4 . D irectory di sistema
5. D irectory di W indows ;
6 . D irectory corrente;
7 . D irectory elencate nella variabile di sistema PATH .
Se la libreria DLL utilizza un'altra DLL nel suo lavoro, la prima non può essere caricata nel caso in cui
non vi è alcuna seconda DLL.
Prima che un Ex pert Advisor (script, direzione) venga caricato, viene formata una lista comune di tutti
i moduli di libreria EX5. Va utilizzato sia da un Ex pert Advisor caricato (script, indicatore) che da
librerie di questa lista. Quindi è necessario caricamento, una volta, di moduli EX5 utilizzati molte
volte. Le librerie utilizzano le variabili predefinite degli Ex pert Advisor (script, indicatore) dal quale
sono state chiamate.
1 . D irectory, percorso che è impostato relativelativamente alla directory di Ex pert A dvisor (script,
indicatore) che importa EX5);
2 . D irectory terminal_directory\MQL5\Libraries ;
3 . Directory MQL5\Libraries nella directory comune a tutti i terminali client di MetaT rader 5
(Common\MQL5\Libraries).
Funzioni importate DLL in un programma-mql5 devono garantire l'accordo delle chiamate W indows API.
Per garantire tale accordo, nel testo sorgente dei programmi scritti in C o C++, utilizzare la parola
chiave __ stdcall, che è specifico per i compilatori Microsoft(r). Questo accordo è caratterizzato dal
seguente:
· il chiamante (nel nostro caso è un programma-mql5) dovrebbe " vedere" un prototipo di una funzione
chiamata (importata dalla DLL), al fine di combinare opportunamente i parametri ad uno stack;
· il chiamante (nel nostro caso è un programma mql5) mette i parametri nello stack in ordine inverso,
da destra a sinistra - in questo modo una funzione importata legge i parametri passati ad essa;
· i parametri vengono passati per valore, ad eccezione di quelli esplicitamente passati per riferimento
(nel nostro caso le stringhe)
· una funzione importata pulisce lo stack in modo indipendente con la lettura dei parametri passati.
Quando si descrive il prototipo di una funzione importata, possono essere utilizzati i parametri di
default.
Passaggio di parametri
T utti i parametri di tipi semplici vengono passati per valori a meno che non sia espressamente
indicato che siano passati per riferimento. Quando viene passata una stringa, viene passato l'indirizzo
del buffer della stringa copiata, se una stringa viene passata per riferimento, l'indirizzo del buffer di
questa stringa senza copiarla, viene passato alla funzione importata da DLL.
Le S trutture che contengono gli array dinamici, le stringhe, le classi, le altre strutture complesse, cos ì
come array dinamici o statici degli oggetti enumerati, non possono essere passati come parametro ad
una funzione importata.
Quando si passa un array ad una DLL, l'indirizzo di inizio del buffer di dati viene sempre passato
(indipendentemente dal flag AS _S ERIES ). Una funzione all'interno di una DLL non sa nulla della
bandiera AS _S ERIES , l'array passato è un array statico di una lunghezza indefinita, dovrebbe essere
utilizzato un parametro aggiuntivo per specificare la dimensione dell'array.
Errori di Runtime
Il sottosistema di esecuzione del terminale client ha la possibilità di salvare il codice di errore in caso
si verifichi durante il funzionamento di un programma MQL5. Vi è una variabile predefinita _LastError
per ogni programma MQL5 eseguibile.
Prima di iniziare la funzione OnInit, la variabile _LastError viene resettata. In caso si verifichi una
situazione errata durante calcoli o in fase di chiamate di funzione interne, la variabile _LastError
accetta un codice di errore corrispondente. Il valore memorizzato in questa variabile può essere
ottenuto usando la funzione GetLastError().
Ci sono diversi errori critici nel caso in cui si verifichino, il programma viene terminato
immediatamente:
· L 'Ex pert Advisor esegue operazioni di trading secondo le regole del sistema di trading ;
Per avere risposte a queste domande, ci rivolgiamo allo S trateg y T ester, incluso nel terminale client
MetaT rader 5.
Questa sezione illustra le caratteristiche del programma di testing ed ottimizzazione nello strateg y
tester:
· T esting Multi-valuta
· S imulazione del T empo nello S trateg y T ester
· G li Oggetti Grafici nel T esting
· La funzone OnT imer() nello S trateg y T ester
Per aumentare le prestazioni, le funzioni Comment(), Print() e PrintFormat() non vengono eseguite
durante l'ottimizzazione dei parametri del robot di trading. L 'eccezione è l'uso di queste funzioni
all'interno dell handler OnInit(). Questo ti permette di trovare facilmente la causa degli errori quando
si verificano.
strategia.
L 'evento NewT ick (variazione di prezzo) è l'evento principale per l'EA e, di conseguenza, abbiamo
bisogno di generare una sequenza di tick per testare l' EA. Ci sono 3 modalità di generazione tick
implementate nello S trateg y T ester del terminale client di MetaT rader 5:
· Ogni tick
La modalità base e la più dettagliata è la modalità " Ogni tick" , le altre due modalità sono le
semplificazioni della base, e verranno descritte rispetto alla modalità " Ogni tick" . Considerate tutte le
tre modalità, al fine di capire le differenze tra di loro.
"Every Tick"
Idati storici di quotazioni di strumenti finanziari vengono trasferiti dal trade server al terminale client
MetaT rader 5 sotto forma di barre minutamente impacchettate . Informazioni dettagliate sulla
presenza delle richieste e la costruzione del timeframe richiesto può essere ottenuta dal capitolo
Organizzare Dati di Accesso nel manuale di riferimento MQL5.
L 'elemento minimo dello storico dei prezzo è la barra minuta, da cui è possibile ottenere informazioni
sui quattro valori del prezzo:
· H igh - il massimo che è stato raggiunto nel corso di questa barra minuta;
· Low - il minimo che è stato raggiunto nel corso di questa barra minuta;
La nuova barra dei minuti non viene aperta nel momento in cui inizia il nuovo minuto (il numero di
secondi diventa uguale a 0), ma quando si verifica un tick - un cambio di prezzo di almeno un punto.
La figura mostra la barra primo minuto della nuova settimana di trading, che ha orario di apertura
. .
2011 01 10 00:00 . Il divario di prezzo tra Venerdì e Lunedì, che vediamo sul chart, è comune, poiché i
tassi di cambio fluttuano anche nei fine settimana in risposta alle notizie in arrivo.
Per questa barra, si sa solo che la barra minuta è stata aperta il 10 gennaio 2011 alle 00 ore 00 minuti,
ma non sappiamo nulla circa i secondi. Avrebbe potuto essere aperta alle 00:00:12 o 00:00:36 (12 o 36
secondi dopo l'inizio di un nuovo giorno) o qualsiasi altro momento entro tale minuto. Ma sappiamo
che il prezzo di apertura di EURUS D era a 1.28940 al tempo di apertura della barra del nuovo minuto.
Non sappiamo anche, in un secondo, quando il tick corrispondente al prezzo di chiusura della barra
minuto considerata, è stato ricevuto. S appiamo solo una cosa - l'ultimo prezzo Close della barra
minuto. Per questo minuto, il prezzo era 1,28958. Il tempo di comparsa di prezzi H igh e Low è
sconosciuto anche, ma sappiamo che i prezzi Minimi(Low) e Massimi(H igh) sono stati a livello di
1, 28958 e 1, 28940, rispettivamente.
Per testare la strategia di trading, abbiamo bisogno di una sequenza di tick s, in cui il lavoro dell'
Ex pert Advisor verrà simulato. Cos ì, per ogni barra minuto, sappiamo che i 4 punti di controllo, dove
il prezzo vi è stato sicuramente. S e un bar ha solo 4 tick s, allora ciò è un informazione sufficiente per
effettuare un testing, ma di solito il volume di tick e è superiore a 4.
Quindi, vi è la necessità di generare punti di controllo supplementari per i tick s, che si sono verificati
tra i prezzi Open, H igh, Low e Close. Il principio della generazione tick s modalità " Ogni tick" è
descritto L 'algoritmo di Generazione T ick s all'interno dello S trategia T ester del T erminale MetaT rader
5 del quale una figura è presentata di seguito.
Durante il testing in modalità " Ogni T ick" , la funzione OnT ick () dell' EA verrà chiamata ad ogni punto
di controllo. Ogni punto di controllo è un tick da una sequenza generata. L ' EA riceverà l'orario ed il
prezzo del tick simulato, cos ì come sarebbe quando si lavora online.
Importante: la modalità testing " Ogni tick" è la più precisa, ma al tempo stesso, quella che
richiede più tempo. Per un test iniziale della maggioranza delle strategie di trading, è
generalmente sufficiente utilizzare una delle altre due modalità di test.
Nella modalità " 1 minuto OH LC" , la sequenza tick s è costruita solo dai prezzi OHLC delle barre
minuto; il numero dei punti di controllo generati è significativamente ridotto - quindi, e di
conseguenza è ridotto il tempo di testing. Il lancio della funzione onT ick () viene eseguito su tutti i
punti di controllo, che sono costruiti dai prezzi delle barre OH LC minuto.
Il rifiuto di generare ulteriori tick s intermedi tra i prezzi Open, H igh, Low e Close, porta ad un aspetto
di rigido determinismo nello sviluppo dei prezzi, dal momento che viene determinato il prezzo di
apertura. Ciò permette di creare un " T esting Graal" , che mostra un grafico piacevole di rialzo del saldo
testing.
La figura mostra un grafico molto interessante di questo EA testing. Come è stato ottenuto?
Conosciamo 4 prezzi per una barra minuto, e sappiamo anche che il primo è il prezzo di apertura, e
l'ultimo è il prezzo di chiusura. Abbiamo i prezzi Alti e Bassi tra loro, e la sequenza del loro verificarsi
è sconosciuta, ma è noto, che il prezzo H igh(alto) è maggiore o uguale al prezzo di Apertura(Open), ed
il prezzo Low(basso) è minore o uguale al prezzo Open.
E' sufficiente per determinare il momento di ricezione del prezzo di apertura(Open), e quindi
analizzare il tick successivo al fine di determinare quale prezzo abbiamo in questo momento - sia l'Alto
o il Basso. S e il prezzo è inferiore al prezzo Open, allora abbiamo un prezzo Low ed il buy in questo
tick; il tick successivo corrisponderà al prezzo H igh, al quale noi chiudiamo il buy e apririamo per sell.
I l tick successivo è l'ultimo, questo è il prezzo Close, e chiudiamo la vendita su di esso.
Se dopo il prezzo, riceviamo un tick con un prezzo superiore al prezzo di apertura, allora la sequenza di
affari è invertita. Elabora una barra minuto in questo modo " cheat" , ed attende il prossimo.
D urante il testing di questo EA sullo storico, tutto va liscio, ma una volta che lo lanciamo on-line, la
verità comincia a rivelarsi - la linea di bilancio rimane costante, ma punta in giù. Per esporre questo
trucco, dobbiamo semplicemente eseguire l'EA nella modalità " Ogni tick" .
Nota: S e i risultati dell' EA nelle modalità di testing grezze (" OH LC 1 minuto" e " S olo Prezzi di
A pertura" ) sembrano troppo buoni, assicuratevi di provarlo in modalità " Ogni T ick" .
I periodi W 1 e M N1 sono le eccezioni in modalità di generazione tick s " Open Price Only" : per questi
timeframes i tick s vengono generati per i prezzi OH LC di ogni giorno, non prezzi OH LC della settimana
o del mese.
Supponiamo di provare un Ex pert Advisor su EURUS D H1 nella modalità " S olo Prezzi di Apertura" . In
questo caso, il numero totale di tick s (punti di controllo) sarà non più di 4*numero di barre un-ora
all'interno dell'intervallo testato. Ma l' handler OnTick() viene chiamato solo all'apertura della barra
un-ora. I controlli richiesti per una analisi corretta si verificano sul resto dei ticks (che sono " nascosti"
dalla EA).
S e non ci sono posizioni aperte o ordini in sospeso, non abbiamo bisogno di effettuare tali controlli sui
tick s nascosti, e l'incremento della velocità può essere sostanzialmente tranquillo. Questa modalità
" S olo Prezzi di A pertura" è ben adatta per le strategie di testing, il quale procedimento riguarda solo
l'apertura della barra e non utilizza gli ordini pendenti, cos ì come gli ordini S topLoss e T ak eProfit. Per
la classe di tali strategie, l'accuratezza necessaria del testing viene preservata.
U siamo l' Ex pert Advisor Moving Average dal pacchetto astandard, come un esempio di EA, che può
essere testato in qualsiasi modalità. La logica di questo EA è costruita in modo tale che tutte le
decisioni vengono prese all' apertura della barra, e gli affari vengono eseguiti immediatamente, senza
l'uso di ordini pendenti.
Come si può vedere, i grafici su diverse modalità di testing sono esattamente gli stessi per l'EA
Moving Average dal pacchetto standard.
· Le limitazioni per l'accesso ai dati di altri timeframes si applicano anche ad altri simboli i cui dati
vengono utilizzati dall'Ex pert Advisor. In questo caso la limitazione per ogni simbolo dipende dal
timeframe a cui si accede durante il testing /ottimizzazione. S upponiamo che, durante le prove su
EURUS D H1, un Ex pert Advisor accede ai dati di GBPUS D M 20. In questo caso l' Ex pert Advisor sarà
in grado di utilizzare ulteriori dati di EURUS D H1, H2, ecc., nonché GBPUS D M 20, H1, H2 ecc.
Nota: La modalità " S olo Prezzi di Apertura" ha il più veloce tempo di testing, ma non è adatto per
tutte le strategie di trading. S elezionare la modalità di testing desiderata in base alle
caratteristiche del sistema di trading.
Per concludere la sezione sulle modalità di generazione dei tick s, consideriamo un confronto visivo
delle diverse modalità di generazione di tick s per EURUS D, per due barre M 15 su un intervallo da
2011. 01. 11 21:00:00 - 2011. 01. 11 21:30:00..
I tick s sono stati salvati in file diversi utilizzando l'EA W riteT ick s FromT ester.mq5 e la fine di questi
nomi file sono specificati in filenameEveryT ick , filenameOH LC e filenameOpenPrice (parametri di
input).
Per ottenere tre file con tre sequenze di tick (per ciascuna delle seguenti modalità " Ogni T ick" , " 1
minuto OH LC" e " S olo Prezzi di Apertura" ), l'EA è stato lanciato per tre volte nei modi corrispondenti,
in runs singole. Quindi, i dati provenienti da questi tre file sono stati visualizzati sul grafico con
l'indicatore T ick s FromT ester.mq5. Il codice dell' indicatore è allegato a questo articolo.
Per default, tutte le operazioni sui file nel linguaggio MQL5 vengono realizzate all'interno del " file
sandbox" , e durante il testing l'EA ha accesso solo alla propria " sandbox file" . Affinché l'indicatore e l'
EA possano lavorare con i file da una cartella durante la prova, abbiamo usato il flag FILE_COMMON.
Un esempio di codice dall' EA:
Per leggere i dati dell'indicatore, abbiamo usato anche il flag FILE_COMMON. Questo ci ha permesso di
evitare di trasferire manualmente i file necessari da una cartella ad un'altra.
Inoltre, i dati dello storico contengono i valori dei tick ed i volumi di trading. Per lo stoccaggio ed il
recupero dei dati si usa una speciale struttura M qlR ates :
struct MqlRates
{
datetime time; // Orario di inizio del periodo
double open; // Prezzo di Apertura(Open)
double high; // Il prezzo Massimo del periodo
double low; // Il prezzo Minimo del periodo
double close; // Prezzo di Chiusura(Close)
long tick_volume; // Volume Tickv
int spread; // Spread
long real_volume; // Volume Trade
};
Per garantire la massima precisione di test, barre minuti vengono utilizzate anche nella modalità tick s
reali. Le barre vengono applicate per controllare e correggere i dati tick . Questo permette anche di
evitare la divergenza dei charts nel tester e nel terminale client.
Il tester confronta i dati tick con i parametri barra minuto: un tick non dovrebbe superare i livelli
A lto/Basso della barra, anche, i tick s iniziali e finali, dovrebbero coincidere con i prezzi
A pertura/Chiusura della barra. I l volume viene confrontato pure. S e viene rilevata una mancata
corrispondenza, tutti i tick s corrispondenti a tale barra minuto vengono scartati. Vengono invece
utilizzati tick s generati(come nella modalità " Ogni tick" ).
Se uno storico del simbolo ha una barra minuto senza i dati tick per essa, il tester genera tick s in
modalità " Ogni tick" . Questo permette tracciare un chart corretto nel tester in caso i dati tick di un
brok er siano insufficienti. S e uno storico del simbolo non dispone di una barra minuto, ma i dati tick
appropriati per il minuto sono presenti, i dati possono essere utilizzati nel tester. Ad esempio, le
coppie di simboli di scambio vengono formate usando gli Ultimi prezzi. S e solo i tick s con prezzi
Bid/A s k , senza l'Ultimo prezzo (Last), arrivano dal server, la barra non viene generata. I l tester
utilizza questi dati tick dal momento che non contraddicono quelli al minuto.
dati tick potrebbero non coincidere con barre minuto per varie ragioni, per esempio a causa di
I
perdite di connessione o altri errori durante la trasmissione dei dati da una sorgente al terminale
client. I dati minuto vengono considerati più affidabile durante i test.
· Quando si lancia un test, i dati aggiornati sul simbolo vengono sincronizzati con quelli tick .
· I tick vengono memorizzati nella cache simbolo dello strateg y tester. La dimensione della cache non
supera i 128000 tick s. Quando i nuovi tick s arrivano, i dati più vecchi vengono rimossi dalla cache.
T uttavia, la funzione CopyT ick s permette la ricezione di tick s fuori della cache (solo quando si fa il
test su tick reali). In tal caso, i dati vengono richiesti dal database tick tester che è completamente
simile al database terminale client corrispondente. Non vengono implementate correzioni barra
minulo a questa base. Pertanto, i tick s possono essere diversi da quelli memorizzati nella cache.
N on importa se c'è o non c'è una chiamata per l'indicatore in un event handler specifico, tutti gli
indicatori, dei quali sono stati creati gli handlers dalle funzioni iCustom() o IndicatorCreate()
verranno ricalcolati prima di richiamare l'event handler.
Di conseguenza, quando si fa il testing in modalità " Ogni T ick" , il calcolo degli indicatori avviene prima
della chiamata della funzione OnT ick ().
S e il timer è on nell' EA, utilizzando la funzione EventS etT imer(), allora gli indicatori verranno
ricalcolati prima di ogni chiamata dell'handler OnT imer(). Pertanto, il tempo di testing può venire
notevolmente aumentato con l'uso di un indicatori, scritti in un modo non ottimale.
Un agente di testing riceve lo storico di un simbolo da testare dal terminale client subito dopo l'inizio
del testing. S e i dati di altri strumenti vengono utilizzati nel processo di testing (ad esempio, è un
Ex pert Advisor multivaluta), gli agenti di testing richiedono lo storico dal terminale client durante la
prima chiamata a tali dati. S e i dati storici sono disponibili nel terminale, vengono immediatamente
passati all'agente di testing. S e i dati non sono disponibili, il terminale li richiede e scarica dal server,
e poi li passa all'agente di testing.
I dati di strumenti finanziari aggiuntivi sono anche necessari per il calcolo dei cross-rates per le
operazioni di trade. Per esempio, quando si fa il testing di una strategia EUR CHF con la valuta di
deposito in US D, prima di elaborare la prima operazione di trading, l'agente di testing richiede i dati
storici di EURUS D e US DCHF dal terminale client, anche se la strategia non contiene la chiamata
diretta di uso di questi simboli.
Prima di testare una strategia multi-valuta, si consiglia di scaricare tutti i dati storici necessari nel
terminale client. Ciò contribuirà ad evitare ritardi nel testing /ottimizzazione associato con il download
dei dati richiesti. È possibile scaricare lo storico, per esempio, aprendo i grafici appropriati e facendo
scorrimento verso l'inizio dello storico. Un esempio di caricamento forzato dello storico nel terminale è
disponibile nella sezione Organizzare l'Accesso ai Dati dell' MQL5 R eference.
Agenti di testing, a loro volta, ricevono lo storico dal terminale in una forma impacchettata. Durante il
testing successivo, il tester non carica lo storico dal terminale, in quanto i dati richiesti sono
disponibili dalla precedente esecuzione del tester.
· I l terminale carica lo storico da un trade server sola volta, la prima volta l'agente richiede lo
storico di un simbolo da essere testato dal terminale. Lo storico viene caricato in forma
impacchettata per ridurre il traffico.
· I tick s non vengono inviati attraverso la rete, sono generati sugli agenti di testing.
Testing Multi-valuta
Lo strateg y tester ci permette di eseguire un test di strategie, facendo trading su più simboli. T ali EA
sono convenzionalmente indicati come Ex pert Advisor multi-valuta, dal momento che in origine, nelle
piattaforme precedenti, il testing veniva effettuato solo per un unico simbolo. Nello S trateg y T ester
del terminale MetaT rader 5, possiamo modellare il trading per tutti i simboli disponibili.
Il tester carica lo storico dei simboli utilizzati dal terminale client (non dal trade server!)
automaticamente durante la prima chiamata dei dati del simbolo.
L 'agente di testing scarica solo lo storico mancante, con un piccolo margine per fornire i dati necessari
sullo storico, per il calcolo degli indicatori al momento di avvio del testing. Per i limiti temporali di D1
e minori, il volume minimo dello storico scaricato è di un anno.
Se non vi sono le barre necessarie, la data di inizio del testing verr à automaticamente slittata dal
passato al presente per fornire la necessaria riserva di barre prima del testing.
Durante il testing, il " Mark et W atch" viene emulato anche, dal quale si possono ottenere informazioni
sui simboli.
Per default, all'inizio del testing, c'è solo un simbolo nel " Mark et W atch" dello S trateg y T ester - il
simbolo su cui gira il testing. T utti i simboli necessari sono collegati al " Mark et W atch" dello S trateg y
T ester (non al terminale! ) automaticamente quando vi si riferiscono.
Al momento della prima chiamata ad un " altro" simbolo, il processo di testing viene interrotto e lo
storico viene scaricato per il simbolo/timefreame, dal terminale per l'agente di testing. Allo stesso
tempo viene fatta la generazione della sequenza dei tick per questo simbolo.
Una sequenza individuale di tick viene generata per ogni simbolo, secondo il modo selezionato di
generazione tick . È anche possibile richiedere lo storico in modo esplicito per i simboli desiderati
chiamando S ymbolS elect() nell'handler OnInit() - il download dello storico sarà effettuato
immediatamente prima del testing dell' Ex pert Advisor.
Pertanto, non richiede alcuno sforzo supplementare eseguire testing multi-valuta nel terminale client
MetaT rader 5 . Basta aprire i grafici dei simboli appropriati del terminale cliente. Lo storico sarà
caricato automaticamente dal trade server per tutti i simboli necessari, purché contenga questi dati.
La mancanza di una differenza tra l'orario GM T , locale, server nello S trateg y T ester viene fatta
deliberatamente in caso non vi è alcuna connessione con il server. I risultati del test devono essere
sempre gli stessi, indipendentemente dal fatto che vi sia un collegamento. Le informazioni sull'ora del
server non vengono memorizzate localmente, ed sono prese dal server.
allora all' apertura di ogni barra H4, l'handler OnT ick () sarà chiamato una sola volta, e l'handler
OnT imer() sarà chiamato 14400 volte (3600 secondi * 4 ore). La quantità per cui il tempo di testing
dell' EA sarà aumentata dipende dalla logica della EA.
Per verificare la dipendenza del tempo di testing dalla data frequenza del timer, abbiamo creato un EA
semplice senza operazioni di trading.
{
EventSetTimer(timer);
}
//---
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione Expert |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- ferma il timer
EventKillTimer();
}
//+--------------------------------------------------------------------------------+
//| Funzione Timer |
//+--------------------------------------------------------------------------------+
void OnTimer()
{
//---
// non viene eseguita alcuna azione, il corpo dell'handler è vuoto
}
//+--------------------------------------------------------------------------------+
Misure del tempo di testing sono state prese da diversi valori del parametro timer (periodicità
dell'evento T imer). S ui dati ottenuti, abbiamo tracciato un tempo di testing in funzione del periodo di
T imer.
Si vede chiaramente che il più piccolo è il parametro di timer, durante l'inizializzazione della funzione
EventS etT imer(T imer), più piccolo è il periodo (Period) tra le chiamate dell'handler OnT imer(), e più
grande è il tempo T di testing, alle stesse condizioni di altri.
La funzione S leep() consente all' EA o script di sospendere l'esecuzione del programma MQL5 per un
po', quando si lavora sul grafico. Questo può essere utile per la richiesta di dati, che non sono pronti al
momento della richiesta ed è necessario attendere che siano pronti. Un esempio dettagliato di utilizzo
della funzione S leep() possono essere trovati nella sezione Arrangiamento Accesso ai Dati.
Il processo di testing non è attardato dalla chiamata S leep(). Quando si chiama S leep(), i tick s
generati vengono sono " giocati" entro un termine specificato, che può provocare l'innesco di ordini
pendenti, stops, ecc. Dopo una chiamata S leep(), il tempo simulato nello S trateg y T ester aumenta di
un intervallo, specificato nel parametro della funzione S leep.
S e, a seguito della esecuzione della funzione S leep(), l'ora corrente nello S trateg y T ester ha superato il
periodo di testing, allora si riceverà un errore di " Ciclo si S leep infinito rilevato durante il testing " . S e
si riceve questo errore, i risultati del testing non vengono respinti, tutti i calcoli vengono eseguiti nel
loro pieno volume (numero di affari, subsidenza, ecc), ed i risultati di questo test vengono trasmessi
al terminale.
La funzione S leep() non funziona in OnDeinit(), dal momento che dopo che viene chiamata, il tempo di
testing sarà garantito a superare il range dell' intervallo di testing.
I n questo caso, solo tre funzioni verranno chiamate: OnInit(), OnT ester(), OnDeinit(). In modalità
" Calcoli matematici" lo S trateg y T ester non genera alcun tick e download dello storico.
Lo S trateg y T ester funziona in modalità " Calcoli matematici" anche se si specifica la data di inizio
maggiore di quella di chiusura.
Quando si utilizza il tester per risolvere problemi matematici, il caricamento dello storico e la
generazione di tick s non si verifica.
Un tipico problema matematico da risolvere nello S trateg y T ester MetaT rader 5 - la ricerca di un
estremo di una funzione con molte variabili.
· I l calcolo del valore della funzione deve essere collocato nella funzione OnT ester();
· I parametri della funzione devono essere definiti come variabili di input- dell' Ex pert Advisor;
Compilare l'EA, aprire la finestra " S trateg y T ester" . Nel campo " Parametri di Input" , selezionare le
variabili di input richieste, e definire l'insieme dei valori dei parametri specificando i valori di avvio,
di arresto e di step per ognuna delle variabili della funzione.
Selezionare il tipo di ottimizzazione - " Algoritmo Completo lento" (ricerca completa dello spazio
parametri) o " Algoritmo veloce a base genetica" . Per una semplice ricerca di estremo della funzione, è
meglio scegliere una ottimizzazione veloce, ma se si desidera calcolare i valori per l'intero set di
variabili, allora è meglio usare l'ottimizzazione lenta.
Selezionare la modalità " Calcoli matematici" ed utilizzare il bottone " S tart" , per eseguire la procedura
di ottimizzazione. Notare che durante l'ottimizzazione lo S trateg y T ester ricerca i valori massimi della
funzione OnT ester. Per trovare un minimo locale, restituire l'inverso del valore della funzione calcolata
dalla funzione OnT ester:
return(1/function_value);
È necessario controllare che function_value non è uguale a zero, altrimenti si può ottenere un errore
critico di divisione per zero.
C'è un altro modo, è più conveniente e non distorce i risultati dell'ottimizzazione, è stato suggerito dai
lettori di questo articolo:
return(-function_value);
Questa opzione non richiede il controllo del function_value_ per essere uguale a zero, e la superficie
dei risultati di ottimizzazione in una rappresentazione 3D ha la stessa forma, ma si specchia
all'originale.
I l codice della EA per trovare l'estremo di questa funzione è inserito nell' OnT ester():
//+--------------------------------------------------------------------------------+
//| Sink.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
//--- parametri di input
input double x=-3.0; // start=-3, step=0.05, stop=3
input double y=-3.0; // start=-3, step=0.05, stop=3
//+--------------------------------------------------------------------------------+
//| Tester function |
//+--------------------------------------------------------------------------------+
double OnTester()
{
//---
double sink=MathSin(x*x+y*y);
//---
return(sink);
}
//+--------------------------------------------------------------------------------+
Migliore è il valore di una data coppia di parametri (x , y), più è saturo il colore. Come era atteso dalla
vista della forma della formula sink (), i suoi valori formano cerchi concentrici con centro in (0,0). S i
può vedere nel grafico-3D, che la funzione sink () non ha un estremo unico globale:
Il testing di strategie, che sono tradate su più simboli, impone alcuni requisiti tecnici complementari
sul tester:
Lo S trateg y T ester genera e riproduce una sequenza tick per ogni strumento secondo la modalità
trading selezionata. Al tempo stesso, viene aperta una nuova barra per ogni simbolo,
indipendentemente da come la barra viene aperta su un altro simbolo. Ciò significa che quando si
testa un EA multi-valuta, può verificarsi una situazione (e spesso accade), quando per uno strumento
una nuova barra è già aperta, e per l'altro non. Cos ì, durante il testing, tutto avviene proprio come
nella realtà.
Questa simulazione autentica dello storico nel tester non causa alcun problema, basta che vengono
utilizzate le moddalità di testing " Ogni tick" e " 1 minuto OH LC" . Per queste modalità, sufficienti tick s
vengono generati per una candela, per poter attendere fino a che avviene la sincronizzazione di barre
da diversi. Ma come facciamo a testare strategie di un EA multi-valuta in modalità " S olo prezzi di
A pertura" , se la sincronizzazione delle barre degli strumenti di trading è obbligatoria? I n questa
modalità, l'EA viene chiamato solo su un tick , che corrisponde al tempo di apertura delle barre.
Noi lo illustrano in un esempio: se stiamo testando un EA su EURUS D, ed una nuova candela oraria è
aperta su EURUS D, allora si può facilmente riconoscere questo fatto - nei test in modalità " S olo Prezzi
di apertura" , l' evento NewT ick corrisponde al momento dell'apertura barra sul periodo di testing. Ma
non vi è alcuna garanzia che la nuova candela aperta sul simbolo US DJPY, viene utilizzata nella EA.
In circostanze normali, è sufficiente completare il lavoro della funzione OnT ick () e verificare la
comparsa di una nuova barra sull'emersione di una nuova barra su US DJPY al prossimo tick . Ma,
durante il testing in la modalità " S olo prezzi di Apertura" , non ci sarà nessun altro tick , e cos ì può
sembrare che questa modalità non è adatta per il testing di EA multi-valuta. Ma non è cos ì - non
dimenticate che il tester in MetaT rader 5 si comporta proprio come farebbe nella vita reale. È
possibile attendere una nuova barra si apre su un altro dei simboli utilizzando la funzione del S leep() !
//+--------------------------------------------------------------------------------+
//| Synchronize_Bars_Use_Sleep.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
//--- parametri di input
input string other_symbol="USDJPY";
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione dell' Expert |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- controllo il simbolo
if(_Symbol==other_symbol)
{
PrintFormat("Devi specificare l'altro simbolo nei parametri di input o selezionare altro simb
//--- arresto testing forzato
return(INIT_PARAMETERS_INCORRECT);
}
//---
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione tick dell'Expert |
//+--------------------------------------------------------------------------------+
void OnTick()
{
//--- variabile statica, utilizzata per il salvataggio del tempo dell'ultima barra
static datetime last_bar_time=0;
//--- sync flag
static bool synchonized=false;
//--- se variabile statica non viene inizializzata
if(last_bar_time==0)
{
//--- è la prima chiamata, salva il tempo bar ed esce
last_bar_time=(datetime)SeriesInfoInteger(_Symbol,Period(),SERIES_LASTBAR_DATE);
PrintFormat("La variabile last_bar_time è inizializzata con valore %s",TimeToString(last_bar_
}
//--- ottiene il tempo di apertura dell'ultima barra del simbolo del grafico
datetime curr_time=(datetime)SeriesInfoInteger(Symbol(),Period(),SERIES_LASTBAR_DATE);
//--- se gli orari non sono uguali
if(curr_time!=last_bar_time)
{
//--- salva l'orario di apertura della barra alla variabile statica
last_bar_time=curr_time;
//--- non sincronizzato
synchonized=false;
//--- stampa messaggio
PrintFormat("Una nuova barra è apparsa sul simbolo %s at %s",_Symbol,TimeToString(TimeCurrent
}
//--- prezzo di apertura della barra dell'altro simbolo
datetime other_time;
//--- loop fino al tempo di apertura di un altro simbolo diventa uguale a curr_time
while(!(curr_time==(other_time=(datetime)SeriesInfoInteger(other_symbol,Period(),SERIES_LASTBAR_
{
PrintFormat("Aspetta 5 secondi..");
//--- aspetta 5 secondi e chima SeriesInfoInteger(other_symbol,Period(),SERIES_LASTBAR_DATE)
Sleep(5000);
}
//--- le barre sono sincronizzate
synchonized=true;
PrintFormat("Orario di aperturara della barra del simbolo del grafico %s: is %s",_Symbol,TimeToS
PrintFormat("Oerario di apertura della barra del simbolo %s: is %s",other_symbol,TimeToString(ot
//--- TimeCurrent() non è utile, utilizzare TimeTradeServer()
Print("Le barre sono sincronizzate a ",TimeToString(TimeTradeServer(),TIME_SECONDS));
}
//+--------------------------------------------------------------------------------+
Si noti l'ultima riga dell' EA, che visualizza l'ora corrente quando il fatto della sincronizzazione è stato
stabilito:
Per visualizzare l'ora corrente abbiamo usato la funzione T imeT radeS erver() piuttosto che
T imeCurrent(). T imeCurrent() restituisce l'orario dell'ultimo tick , che non cambia dopo l'utilizzo di
S leep(). Esegui l'EA in modalità " S olo Prezzi di A pertura" , e vedrai un messaggio riguardo la
Usiamo la funzione T imeT radeS erver() al posto di T imeCurrent(), se è necessario per ottenere l'ora
corrente del server, e non il tempo di arrivo dell'ultimo tick .
C'è un altro modo per sincronizzare le barre - utilizzando un timer. U n esempio di tale EA è
S ynchronize_Bars _Use_OnT imer.mq5, che è allegato in questo articolo.
Nota: indicatori, visualizzati sul grafico, che si aprono automaticamente dopo il completamento
del test, vengono calcolati nuovamente dopo il completamento del test. Anche se questi indicatori
sono stati utilizzati nell' EA testato.
Ma in alcuni casi, il programmatore può decidere di nascondere le informazioni su cui sono stati
coinvolti gli indicatori negli algoritmi di trading. Ad esempio, il codice della EA è in affitto o venduto
come un file eseguibile, senza la fornitura del codice sorgente. A questo scopo, la funzione
I ndicatorR elease() è adatta.
Se il terminale imposta un modello con il nome tester.tpl nella directory /profiles /templates del
terminale client, allora sarà applicato al grafico aperto. In sua assenza, viene applicato il modello
predefinito. (default.tpl).
Per proibire la visualizzazione dell'indicatore sul grafico dopo il testing, chiamare IndicatorR elease()
con l'handle dell'indicatore nell'handler OnDeinit(). La funzione OnDeinit() viene sempre chiamata dopo
il completamento e prima della visualizzazione del grafico di prova.
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione Expert |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
bool hidden=IndicatorRelease(handle_ind);
if(hidden) Print("IndicatorRelease() completato con successo");
else Print("IndicatorRelease() ha restituito false. Error code ",GetLastError());
}
Al fine di proibire che si mostri l'indicatore sul grafico, dopo il completamento di un singolo test,
utilizzare la funzione IndicatorR elease() nell'handler OnDeinit().
D urante il testing in un EA, siamo in grado di gestire gli eventi personalizzati utilizzando la funzione
OnChartEvent(), ma negli indicatori, questa funzione non può essere chiamata nel tester. Anche se
l'indicatore ha l'event handler OnChartEvent() e questo indicatore è utilizzato nella EA testato,
l'indicatore stesso non riceverà alcun evento personalizzato.
In aggiunta a questi eventi, eventi speciali associati al processo di testing ed ottimizzazione vengono
generati nello strateg y tester:
· Tester - questo evento viene generato dopo il completamento del testing dell'Ex pert Advisor sui dati
storici. L 'evento T ester viene gestito utilizzando la funzione OnT ester(). Questa funzione può essere
utilizzata solo quando si fa il testing dell'Ex pert Advisorè ed destinata principalmente per il calcolo di
un valore utilizzato come criterio Custom max per l'ottimizzazione genetica dei parametri di input.
· TesterInit - questo evento viene generato durante l'avvio di ottimizzazione nello strateg y tester
prima del vero primo passo. L 'evento T esterInit viene gestito utilizzando la funzione OnT esterInit().
Durante l'inizio dell' ottimizzazione, un Ex pert Advisor con questo gestore viene caricato
automaticamente in un grafico del terminale separato, con simbolo e periodo specificati nel tester,
e riceve l'evento T esterInit. La funzione viene utilizzata per avviare un Ex pert Advisor prima
dell'inizio dell' ottimizzazione per ulteriore elaborazione dei risultati di ottimizzazione.
· T esterPass - questo evento viene generato quando un nuovo frame di dati viene ricevuto. L 'evento
T esterPass è gestito utilizzando la funzione OnT esterPass(). Un Ex pert A dvisor con questo handler
FrameA dd(), che può essere chiamata dopo la fine di un singolo passaggio nell' handler OnT ester().
· T esterDeinit - questo evento viene generato dopo la fine della ottimizzazione Ex pert Advisor nello
S trateg y T ester. L 'evento T esterDeinit è gestito utilizzando la funzione OnT esterDeinit(). Un Ex pert
A dvisor con questo handler viene caricato automaticamente in un grafico all'inizio dell'
ottimizzazione, e riceve T esterDeinit dopo il suo completamento. La funzione viene utilizzata per la
lavorazione finale di tutti i risultati dell'ottimizzazione.
Agenti Testing
Il testing nel terminale MetaT rader 5 viene effettuato utilizzando agenti di test. Agenti locali vengono
creati e attivati automaticamente. Il numero predefinito di agenti locali corrisponde al numero di core
in un computer.
Ogni agente di testing ha la propria copia delle variabili globali, che non è correlata al terminale client.
I l terminale stesso è il dispensatore, che distribuisce i compiti agli agenti locali e remoti. Dopo
l'esecuzione di un compito sul testing di un EA, con i parametri specificati, l'agente restituisce i
risultati al terminale. Con un singolo test, un solo agente viene utilizzato.
L 'agente memorizza lo storico, ricevuto dal terminale, in cartelle separate, dal nome dello strumento,
in modo che lo storico per EURUS D è memorizzato in una cartella denominata EURUS D. Inoltre, la
storia degli strumenti è separata dalle loro fonti. La struttura per memorizzare lo storico assomiglia al
seguente modo:
tester_catalog\Agent-IPaddress-Port\bases\name_source\history\symbol_name
Ad esempio, lo storico per EURUS D dal server MetaQuotes-Demo può essere memorizzato nella cartella
tester_catalog \Agent-127.0.0.1-3000\bases \MetaQuotes-Demo\EURUS D.
Un agente locale, dopo il completamento del testing, entra in una modalità di stand-by, in attesa di
una nuova attività per altri 5 minuti, in modo da non perdere tempo per avviare per la chiamata
successiva. S olo dopo che il periodo di attesa è finito, l'agente locale si spegne e si decarica dalla
memoria della CPU.
In caso di un precoce completamento del testing, da parte dell'utente (il pulsante " Annulla" ), nonché
con la chiusura del terminale client, tutti gli agenti locali interrompono immediatamente il loro lavoro
e vengono decaricati dalla memoria.
· Iparametri di input per il testing (modalità di simulazione, l'intervallo di test, strumenti, criteri di
ottimizzazione, ecc.)
· L 'elenco dei simboli selezionati nel " Mark et W atch"
· La specifica del simbolo di testing (la dimensione del contratto, i margini consentiti dal mercato per
l'impostazione di un S topLoss e T ak eprofit, ecc)
· L 'Ex pert Advisor da essere testato e i valori dei suoi parametri di input
· I nformazioni su file aggiuntivi (librerie, indicatori, file di dati - # property tester_ ...)
essere specificato.
proprietà è necessaria
Per ogni blocco di parametri, un'impronta digitale in forma di hash-M D5 viene creata, e viene inviata
all'agente. M D5-hash è univoca per ciascun set, il suo volume è molte volte più piccolo della quantità di
informazioni sulla quale viene calcolato.
L 'agente riceve un hash di blocchi e li confronta con quelli che ha già. S e l'impronta digitale del blocco
parametri dato non è presente nell'agente, o l'hash ricevuto è diverso da quello esistente, l'agente
richiede questo blocco di parametri. Questo riduce il traffico tra il terminale e l'agente.
Dopo il testing, l'agente restituisce al terminale di tutti i risultati della run, che sono indicati nella
scheda " R isultati del T est" e " R isultati Ottimizzazione" : il profitto ricevuto, il numero di affari, il
coefficiente S harpe, il risultato della funzione OnT ester(), ecc
Durante l'ottimizzazione, le terminale spedisce i compiti di testing agli agenti in piccoli pacchetti, ogni
pacchetto contenente diversi compiti (per ogni compito si intende ogni attività di test singolo con una
serie di parametri di input). Questo riduce il tempo di scambio tra il terminale e l'agente.
Gli agenti non registrano mai sull'hard dis k i files EX5, ottenuti dal terminale (EA, indicatori, librere,
ecc) per motivi di sicurezza, di modo che un computer con un agente in esecuzione non può utilizzare i
dati inviati. T utti gli altri file, tra cui DLL, sono registrate nella sandbox . In agenti remoti non si
possono testare EA utilizzando DLL.
I risultati dei testing sono sommate dal terminale in una cache speciale dei risultati (i risultati della
cache), per un accesso rapido ad essi quando sono necessari. Per ogni insieme di parametri, il
terminale ricerca la i risultati della cache già disponibili dalle run precedenti, al fine di evitare
repliche. S e il risultato con un insieme di parametri non viene trovato, all'agente viene dato il compito
di eseguire il testing.
I tick s non vengono inviati attraverso la rete, sono generati sugli agenti di testing.
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione dell' Expert |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- la cartella condivisa per tutti i terminali client
common_folder=TerminalInfoString(TERMINAL_COMMONDATA_PATH);
//--- tira fuori il nome di questa cartella
PrintFormat("Apre il file nella cartella condivisa dei terminali client %s", common_folder);
//--- apre il file nella cartella condivisa (indicato dal flag FILE_COMMON)
handle=FileOpen(filename,FILE_WRITE|FILE_READ|FILE_COMMON);
... ulteriori azioni
//---
return(INIT_SUCCEEDED);
}
Utilizzo di DLLs
Per accelerare l'ottimizzazione è possibile utilizzare non solo agenti locali, ma anche agenti remoti. In
questo caso, ci sono alcune limitazioni per agenti remoti. Prima di tutto, gli agenti remoti non
mostrano nei loro log i risultati dell'esecuzione della funzione Print(), messaggi sulla apertura e la
chiusura delle posizioni. Un minimo di informazioni vengono visualizzate nel registro per evitare che
EA erroneamente scritti facciano immondizia nel computer , su cui l'agente di rimozione è in funzione,
con i messaggi.
Una seconda limitazione - il divieto di utilizzo di DLL durante il testing degli EA. Le chiamate DLL sono
assolutamente vietate su agenti remoti per motivi di sicurezza. In agenti locale, le chiamate DLL negli
EA testati sono ammesse solo con l'autorizzazione appropriata " Consenti Importazione DLL " .
Le variabili predefinite
Per ogni programma mql5 eseguibile viene supportata una serie di variabili predefinite, che riflettono
lo stato del corrente grafico prezzo, dal momento in cui viene avviato un MQL5-programma (Ex pert
A dvisor, script o indicatore personalizzato).
I valori delle variabili predefinite è fissato dal terminale client prima che un programma mql5 venga
avviato. Le variabili predefinite sono costanti e non possono essere cambiate da un programma mql5.
Come eccezione, vi è una variabile speciale _LastError, che può essere resettata a 0 con la funzione
R esetLastError.
Variabile Valore
_A ppliedT o La variaile _AppliedT o consente di trovare il
tipo di dati, utilizzati per il calcolo
dell'indicatore
s
_I X64 La variabile _Is X64 consente di trovare la
versione bit del terminale, in cui è in
esecuzione un'applicazione MQL5
Le variabili predefinite non possono essere definite in una libreria. Una libreria utilizza tali variabili
definite nel programma da cui si chiama questa libreria.
int _AppliedTo
La variaile _AppliedT o consente di trovare il tipo di dati, utilizzati per il calcolo dell'indicatore:
(H igh+Low+Close)/3
(Open+H igh+Low+Close)/4
Esempio:
//+------------------------------------------------------------------+
//| Funzione Inizializzazione Indicatore Custom |
//+------------------------------------------------------------------+
int OnInit()
{
//--- mappatura dei buffer degli indicatori
SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
Guarda anche
ENUM _APPL IED_PRICE
int _Digits
La variabile _Digits memorizza numeri di cifre dopo il punto decimale, che definisce la precisione
prezzo del simbolo del grafico corrente.
double _Point
La variabile _Point contiene la grandezza in punti del simbolo corrente nella valuta di quotazione.
int _LastError
La variabile _LastError contiene il codice dell'ultimo errore, che si è verificato nel corso del programma
mql5. Il suo valore può essere resettato a zero R esetLastError().
Per ottenere il codice dell'ultimo errore, si può anche usare la funzione GetLastError().
int _Period
La variabile _Period contiene il valore del periodo del grafico corrente.
Vedi anche
PeriodS econds, T imeframes del Grafico, Data ed Ora, Visibilità degli Oggetti
_RandomSeed
Variabile per la memorizzazione dello stato attuale quando si generano numeri pseudo-casuali interi.
_RandomS eed cambia il suo valore quando si chiama MathR and(). Utilizzare MathS rand() per
impostare la condizione richiesta iniziale.
x il numero casuale ricevuto da MathR and() viene calcolato nel seguente modo ad ogni chiamata:
x=_RandomSeed*214013+2531011;
_RandomSeed=x;
x=(x>>16)&0x7FFF;
Vedi anche
MathR and(), MathS rand(), T ipi interi
bool _StopFlag
La variabile _S topFlag contiene la flag di stop del programma mql5. Quando il terminale client sta
cercando di fermare il programma, imposta la variabile _S topFlag su true.
Per controllare lo stato del _S topFlag si può anche usare la funzione Is S topped().
string _Symbol
La variabile _S ymbol contiene il nome del simbolo del grafico corrente.
int _UninitReason
La variabile _UninitR eason contiene il codice del motivo di deinizializzazione del programma.
int _IsX64
La variabile _Is X64 consente di trovare la versione bit del terminale, in cui è in esecuzione
un'applicazione MQL5: _Is X64=0 per il terminale a 32 bit e _Is X64!= 0 per il terminale a 64 bit.
Esempio:
// Controllo del terminale, in cui è in esecuzione il programma
Print("_IsX64=",_IsX64);
if(_IsX64)
Print("Program ",__FILE__," sta girando sul terminale 64-bit");
else
Print("Program ",__FILE__," sta girando sul terminale 32-bit");
Print("TerminalInfoInteger(TERMINAL_X64)=",TerminalInfoInteger(TERMINAL_X64));
Guarda anche
MQL InfoInteger, Funzioni di Importazione (#import)
Common Functions
Le funzioni a scopo-generico non incluce in nessun gruppo specializzato, sono qui elencate.
Funzione Azione
A lert Mostra un messaggio in una finestra separata.
Funzione Azione
R esourceS av S alva una risorsa nel file specificato
Alert
Visualizza un messaggio in una finestra separata.
void Alert(
argument, // primo valore
... // altri valori
);
Parametri
argomento
[in] T utti i valori separati da virgole. Per dividere l'output delle informazioni in più righe è
possibile utilizzare il carattere di avanzamento riga " \n" o " \r\n" . Il numero di parametri non può
superare 64.
Valore restituito
N essun valore restituito.
Nota
G li array non possono essere passati alla funzione Alert(). Arrays should be output elementwise I dati
di tipo double sono output con 8 cifre dopo la virgola, i dati di tipo float vengono visualizzati con 5
cifre dopo la virgola. Per emettere in output i numeri reali con una precisione diversa o in un
formato scientifico, utilizzare la funzione DoubleT oS tring().
I dati di tipo bool è sono dati in output come stringhe " true" o " false" . Le date sono emesse in
output come AAAA.MM.GG. HH:M I:S S . Per visualizzare una data in un altro formato utilizzare la
funzione T imeT oS tring(). I dati di tipo colore vengono emessi in output sia come stringhe R ,G,B o
come un nome di colore, se il colore è presente in un set di colori.
CheckPointer
La funzione restituisce il tipo dell'oggetto pointer.
ENUM_POINTER_TYPE CheckPointer(
object* anyobject // puntatore oggetto
);
Parametri
anyobject
[ in] Object pointer.
Return value
R estituisce un valore dall'enumerazione ENUM _POINT ER_TYPE.
Nota
Un tentativo di chiamare un puntatore scorretto risulta nella terminazione critica del programma.
Ecco perché è necessario chiamare la funzione Check Pointer prima di usare un puntatore. Un
puntatore può essere errato nei seguenti casi:
· il puntatore è uguale a LL ;
NU
Questa funzione può essere utilizzata per verificare la validità del puntatore. n valore non-zero
U
Esempio:
//+--------------------------------------------------------------------------------+
//| Elimina la lista eliminando i suoi elementi |
//+--------------------------------------------------------------------------------+
void CMyList::Destroy()
{
//--- servizio puntatore per lavorare nel loop
CItem* item;
//--- passa attraverso il loop e tenta di eliminare i puntatori dinamici
while(CheckPointer(m_items)!=POINTER_INVALID)
{
item=m_items;
m_items=m_items.Next();
if(CheckPointer(item)==POINTER_DYNAMIC)
{
Print("Oggetto dinamico ",item.Identifier()," to be deleted");
delete (item);
}
else Print("L' oggetto non-dinamico ",item.Identifier()," non può essere eliminato");
}
//---
}
Vedi anche
Object Pointers, Check ing the Object Pointer, Object Delete Operator delete
Comment
Questa funzione emette in output un commento definito da un utente in alto a sinistra di un grafico.
void Comment(
argument, // primo valore
... // prossimo valore
);
Parametri
...
[in] T utti i valori, separati da virgole. Per delimitare i dati in output in diverse righe, viene usato
un simbolo di interruzione di riga " \n" o " \r\n" . Il numero di parametri non può superare 64. La
lunghezza totale del commento di input (compresi i simboli invisibili) non può superare i 2045
caratteri (i simboli in eccesso verranno tagliati durante l'output).
Valore restituito
N essun valore di ritorno
Nota
G li array non possono essere passati alla funzione Comment(). G li array devono essere riempiti
elemento per elemento.
I dati di tipo double vengono emessi in output con la precisione di un massimo di 16 cifre dopo la
virgola decimale, e possono essere inviati in output sia in formato tradizionale che in formato
scientifico, a seconda di quale notazione sarà più compatta. I dati di tipo float sono output con 5
cifre dopo la virgola decimale. Per emettere in output i numeri reali con un altra precisione o in un
formato predefinito, utilizzare la funzione DoubleT oS tring().
I dati di tipo bool vengono emessi in output come stringhe " true" o " false" . Le date vengono
visualizzati come AAAA.MM.GG. HH:M I:S S . Per visualizzare le date in un altro formato, utilizzare la
funzione T imeT oS tring(). Dati del tipo color vengono emessi in output sia come stringhe R ,G,B o
come nome di colore, se questo colore è presente nel set di colori.
Esempio:
void OnTick()
{
//---
double Ask,Bid;
int Spread;
Ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
Bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);
Spread=SymbolInfoInteger(Symbol(),SYMBOL_SPREAD);
//--- Valori di uscita in tre righe
Comment(StringFormat("Show prices\nAsk = %G\nBid = %G\nSpread = %d",Ask,Bid,Spread));
}
Vedi anche
CryptEncode
T ransforms the data from array with the specified method.
int CryptEncode(
ENUM_CRYPT_METHOD method, // method
const uchar& data[], // source array
const uchar& key[], // key
uchar& result[] // destination array
);
Parameters
method
[in] Data transformation method. Can be one of the values of ENUM _CRYPT_METH OD
enumeration.
data[]
[ in] S ource array.
key[]
[ in] K y e array.
result[]
[ out] D estination array.
Returned value
Amount of bytes in the destination array or 0 in case of error. T o obtain information about the error
call the GetLastError() function.
Example:
//+------------------------------------------------------------------+
//| ArrayToHex |
//+------------------------------------------------------------------+
string ArrayToHex(uchar &arr[],int count=-1)
{
string res="";
//--- check
if(count<0 || count>ArraySize(arr))
count=ArraySize(arr);
//--- transform to HEX string
for(int i=0; i<count; i++)
res+=StringFormat("%.2X",arr[i]);
//---
return(res);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
string text="The quick brown fox jumps over the lazy dog";
string keystr="ABCDEFG";
uchar src[],dst[],key[];
//--- prepare key
StringToCharArray(keystr,key);
//--- copy text to source array src[]
StringToCharArray(text,src);
//--- print initial data
PrintFormat("Initial data: size=%d, string='%s'",ArraySize(src),CharArrayToString(src));
//--- encrypt src[] with DES 56-bit key in key[]
int res=CryptEncode(CRYPT_DES,src,key,dst);
//--- check error
if(res>0)
{
//--- print encrypted data
PrintFormat("Encoded data: size=%d %s",res,ArrayToHex(dst));
//--- decode dst[] to src[]
res=CryptDecode(CRYPT_DES,dst,key,src);
//--- check error
if(res>0)
{
//--- print decoded data
PrintFormat("Decoded data: size=%d, string='%s'",ArraySize(src),CharArrayToString(src));
}
else
Print("Error in CryptDecode. Error code=",GetLastError());
}
else
Print("Error in CryptEncode. Error code=",GetLastError());
}
See also
A rray Functions, CryptDecode()
CryptDecode
Performs the inverse transformation of the data from array, tranformed by CryptEncode().
int CryptEncode(
ENUM_CRYPT_METHOD method, // method
const uchar& data[], // source array
const uchar& key[], // key
uchar& result[] // destination array
);
Parameters
method
[in] Data transformation method. Can be one of the values of ENUM _CRYPT_METH OD
enumeration.
data[]
[ in] S ource array.
key[]
[ in] K y e array.
result[]
[ out] D estination array.
Returned value
Amount of bytes in the destination array or 0 in case of error. T o obtain information about the error
call the GetLastError() function.
See also
A rray Functions, CryptEncode()
DebugBreak
S i tratta di un punto di interruzione nel programma di debug.
void DebugBreak();
Valore restituito
Nessun valore restituito.
Nota
L 'esecuzione di un programma MQL5 viene interrotta solo se un programma viene avviato in
modalità di debug. La funzione può essere utilizzata per visualizzare i valori delle variabili e/o per
un'ulteriore esecuzione passo-passo.
ExpertRemove
La funzione ferma un Ex pert Advisor e lo decarica da un grafico.
void ExpertRemove();
Valore restituito
Nessun valore restituito.
Nota
L 'Ex pert Advisor non viene fermato immediatamente appena si chiama Ex pertR emove(); viene
impostato solo un flag per fermare l'operatività dell' EA . Vale a dire, che ogni evento successivo non
verrà elaborato, verr chiamato OnDeinit() e l'Ex pert Advisor verrà decaricato e rimosso dal grafico.
Chiamare Ex pertR emove() nel tester di strategia all'interno dell handler OnInit() annulla i test sul set
corrente di parametri. T ale completamento è considerato un errore di inizializzazione.
Quando si chiama Ex pertR emove() nel tester della strategia dopo inizializzazione riuscita di un EA,
un test è completato normalmente con la chiamata di OnDeinit() e OnT ester(). In questo caso,
vengono ottenuti i valori delle intere statistiche di trading e criterio di ottimizzazione.
Esempio:
//+--------------------------------------------------------------------------------+
//| Test_ExpertRemove.mq5 |
//| Copyright 2009, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
input int ticks_to_close=20;// number of ticks before EA unload
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione Expert |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
Print(TimeCurrent(),": " ,__FUNCTION__," reason code = ",reason);
//--- "clear" comment
Comment("");
//---
}
//+--------------------------------------------------------------------------------+
//| Funzione tick dell'Expert |
//+--------------------------------------------------------------------------------+
void OnTick()
{
static int tick_counter=0;
//---
tick_counter++;
Comment("\nPrima di decaricare l'expert advisor ",__FILE__," left",
(ticks_to_close-tick_counter)," ticks");
//--- prima
if(tick_counter>=ticks_to_close)
{
ExpertRemove();
Print(TimeCurrent(),": ",__FUNCTION__," l'expert advisor verrà decaricato");
}
Print("tick_counter =",tick_counter);
//---
}
//+--------------------------------------------------------------------------------+
Vedi anche
F unzionamento programmi, Eventi terminale client
GetPointer
La funzione restituisce l'oggetto pointer.
void* GetPointer(
any_class anyobject // oggetto di qualsiasi classe
);
Parametri
anyobject
[ in] Oggetto di qualsiasi classe.
Valore restituito
La funzione restituisce il puntatore all'oggetto.
Nota
Solo gli oggetti della classe hanno puntatori. Le istanze delle strutture e variabili di tipo semplice
non possono avere puntatori. L 'oggetto della classe creato non usando l'operatore new(), ma, ad
esempio, creato automaticamente nell'array di oggetti, ha ancora un puntatore. Ma questo
puntatore sarà di tipo automatico POINT ER_AUT OM ATIC, pertanto l'operatore delete() non può
essere applicato. A parte questo, il puntatore tipo non differisce da puntatori dinamici di tipo
POINT ER_AUT OM ATIC.
Poiché le variabili di tipo strutture e di tipo semplice non sono puntatori, è vietato applicare la
funzione GetPointer() per esse. E' anche vietato passare il puntatore come argomento di funzione.
I n tutti questi casi il compilatore notificherà un errore.
Un tentativo di chiamare un puntatore errato provoca la terminazione critica del programma. Ecco
perché la funzione Check Pointer() deve essere chiamata prima di utilizzare un puntatore. Un
puntatore può essere corretto nei seguenti casi:
Questa funzione può essere utilizzata per verificare la validità di un puntatore. Un valore non-zero
garantisce, che il puntatore può essere utilizzato per accedere.
Esempio:
//+--------------------------------------------------------------------------------+
//| Check_GetPointer.mq5 |
//| Copyright 2009, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
//+--------------------------------------------------------------------------------+
//| Classe che implementa gli elementi della lista |
//+--------------------------------------------------------------------------------+
class CItem
{
int m_id;
string m_comment;
CItem* m_next;
public:
CItem() { m_id=0; m_comment=NULL; m_next=NULL; }
~CItem() { Print("Distruttore di ",m_id,
(CheckPointer(GetPointer(this))==POINTER_DYNAMIC)?
"dynamic":"non-dynamic"); }
void Initialize(int id,string comm) { m_id=id; m_comment=comm; }
void PrintMe() { Print(__FUNCTION__,":",m_id,m_comment); }
int Identifier() { return(m_id); }
CItem* Next() {return(m_next); }
void Next(CItem *item) { m_next=item; }
};
//+--------------------------------------------------------------------------------+
//| Più semplice classe della lista |
//+--------------------------------------------------------------------------------+
class CMyList
{
CItem* m_items;
public:
CMyList() { m_items=NULL; }
~CMyList() { Destroy(); }
bool InsertToBegin(CItem* item);
void Destroy();
};
//+--------------------------------------------------------------------------------+
//| Inserisce gli elementi della lista all'inizio |
//+--------------------------------------------------------------------------------+
bool CMyList::InsertToBegin(CItem* item)
{
if(CheckPointer(item)==POINTER_INVALID) return(false);
//---
item.Next(m_items);
m_items=item;
//---
return(true);
}
//+--------------------------------------------------------------------------------+
//| Elimina la lista eliminando gli elementi |
//+--------------------------------------------------------------------------------+
void CMyList::Destroy()
{
//--- puntatore di servizio per lavorare in un loop
CItem* item;
//--- passa attraverso il loop e tenta di eliminare i puntatori dinamici
while(CheckPointer(m_items)!=POINTER_INVALID)
{
item=m_items;
m_items=m_items.Next();
if(CheckPointer(item)==POINTER_DYNAMIC)
{
Print("Dynamyc object ",item.Identifier()," to be deleted");
delete (item);
}
else Print("L' oggetto non-dinamico ",item.Identifier()," non può essere eliminato");
}
//---
}
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
CMyList list;
CItem items[10];
CItem* item;
//--- crea ed aggiunge nella lista un puntatore oggetto dinamico
item=new CItem;
if(item!=NULL)
{
item.Initialize(100,"dynamic");
item.PrintMe();
list.InsertToBegin(item);
}
//--- aggiunge puntatori automatici nella lista
for(int i=0; i<10; i++)
{
items[i].Initialize(i,"automatic");
items[i].PrintMe();
item=GetPointer(items[i]);
if(CheckPointer(item)!=POINTER_INVALID)
list.InsertToBegin(item);
}
//--- aggiunge uno o più oggetti puntatori dinamici all'inizio della lista
item=new CItem;
if(item!=NULL)
{
item.Initialize(200,"dynamic");
item.PrintMe();
list.InsertToBegin(item);
}
//--- elimina tutti gli elementi della lista
list.Destroy();
//--- tutti gli elementi della lista verranno eliminati dopo che lo script è andato
Vedi anche
Object Pointers, Check ing the Object Pointer, Object Delete Operator delete
GetTickCount
La funzione GetT ick Count() restituisce il numero di millisecondi trascorsi dall'inizio l'avvio del sistema.
uint GetTickCount();
Valore restituito
V alore di tipo uint.
Nota
Il contatore è limitato dalle restrizioni del timer di sistema. L 'orario viene memorizzato come
numero intero senza segno, cos ì viene sovrariempito ogni 49,7 giorni se il computer lavora
ininterrottamente.
Esempio:
#define MAX_SIZE 40
//+--------------------------------------------------------------------------------+
//| Script per misurare il tempo di calcolo di 40 numeri di Fibonacci |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- Ricordate il valore iniziale
uint start=GetTickCount();
//--- Una variabile per ottenere il numero successivo della serie di Fibonacci
long fib=0;
//--- In loop calcola la quantità specificata di numeri dalla serie di Fibonacci
for(int i=0;i<MAX_SIZE;i++) fib=TestFibo(i);
//--- Prende il tempo trascorso in millisecondi
uint time=GetTickCount()-start;
//--- Manda in output un messaggio al journal Experts
PrintFormat("Calcola i primi %d numeri di Fibonacci prendendo %d millisecondo",MAX_SIZE,time);
//--- Script completato
return;
}
//+--------------------------------------------------------------------------------+
//| Funzione per ottenere il numero di Fibonacci per il suo numero di serie |
//+--------------------------------------------------------------------------------+
long TestFibo(long n)
{
//--- Il primo membro della serie di Fibonacci
if(n<2) return(1);
//--- Tutti gli altri membri vengono calcolati con la seguente formula
return(TestFibo(n-2)+TestFibo(n-1));
}
Vedi anche
D ata ed Ora, EventS etMillisecondT imer, GetT ick Count64, GetMicrosecondCount
GetTickCount64
La funzione GetT ick Count64() restituisce il numero di millisecondi trascorsi dall'avvio del sistema.
ulong GetTickCount64();
Valore di ritorno
U n valore di tipo ulong.
Nota
Il contatore è limitato alla precisione del timer di sistema, che di solito restituisce un risultato con
una precisione di 10-16 millisecondi. Diversamente da GetT ick Count, che è di tipo uint e il cui
contenuto overflowa ogni 49.7 giorni in caso di funzionamento continuo del computer,
GetT ick Count64() può essere utilizzato per un tempo di funzionamento illimitato del computer e non
è soggetto ad overflow.
Guarda anche
D ata ed Ora, EventS etMillisecondT imer, GetT ick Count, GetMicrosecondCount
GetMicrosecondCount
La funzione GetMicrosecondCount() restituisce il numero di microsecondi trascorsi dall'inizio del
programma-MQL5.
ulong GetMicrosecondCount();
Valore restituito
Valore di tipo ulong.
Esempio:
//+------------------------------------------------------------------+
//| Funzione Test |
//+------------------------------------------------------------------+
void Test()
{
int res_int=0;
double res_double=0;
//---
for(int i=0;i<10000;i++)
{
res_int+=i*i;
res_int++;
res_double+=i*i;
res_double++;
}
}
//+------------------------------------------------------------------+
//| Funzione start del programma Script |
//+------------------------------------------------------------------+
void OnStart()
{
uint ui=0,ui_max=0,ui_min=INT_MAX;
ulong ul=0,ul_max=0,ul_min=INT_MAX;
//--- numero di misurazioni
for(int count=0;count<1000;count++)
{
uint ui_res=0;
ulong ul_res=0;
//---
for(int n=0;n<2;n++)
{
//--- seleziona il tipo di misurazione
if(n==0) ui=GetTickCount();
else ul=GetMicrosecondCount();
//--- esecuzione codice
Test();
//--- aggiungi il risultato della misurazione (a seconda del tipo)
if(n==0) ui_res+=GetTickCount()-ui;
else ul_res+=GetMicrosecondCount()-ul;
}
//--- calcola il tempo minimo e massimo per entrambe le misurazioni
if(ui_min>ui_res) ui_min=ui_res;
if(ui_max<ui_res) ui_max=ui_res;
if(ul_min>ul_res) ul_min=ul_res;
if(ul_max<ul_res) ul_max=ul_res;
}
//---
Print("GetTickCount error(msec): ",ui_max-ui_min);
Print("GetMicrosecondCount error(msec): ",DoubleToString((ul_max-ul_min)/1000.0,2));
}
Vedi anche
D ata ed Ora, GetT ick Count, GetT ick Count64
MessageBox
Crea e mostra una finestra di messaggio e lo gestisce. Una finestra di messaggio contiene un
messaggio e l'intestazione, qualsiasi combinazione di segni predefiniti e pulsanti di comando.
int MessageBox(
string text, // testo del messaggio
string caption=NULL, // box header
int flags=0 // definisce il set di bottoni nel box
);
Parametri
text
[ in] T esto, contenente il messaggio da dare in output.
caption=NULL
[in] T esto opzionale da essere visualizzato nell'intestazione del box . S e il parametro è vuoto, il
nome Ex pert Advisor è indicato nell'intestazione del box .
flags=0
[in] flags opzionale che definisce l'aspetto ed il comportamento del box messaggio. Flags can be a
combination of a special group of flags.
Valore restituito
Se la funzione è eseguita con successo, il valore restituito è uno dei valori dei codici di ritorno di
MessageBox ().
Nota
La funzione non può essere chiamata da indicatori personalizzati, in quanto gli indicatori vengono
eseguiti nel thread di interfaccia e non dovrebbero rallentarla.
PeriodSeconds
Questa funzione restituisce il numero di secondi in un periodo.
int PeriodSeconds(
ENUM_TIMEFRAMES period=PERIOD_CURRENT // periodo del grafico
);
Parametri
period=PERIOD_CURRENT
[in] Valore di un periodo grafico dall'enumerazione ENUM _TIMEFRAMES . S e il parametro non viene
specificato, restituisce il numero di secondi del periodo del grafico corrente, in cui il programma
viene eseguito.
Valore restituito
N umero di secondi in un determinato periodo.
Vedi anche
_ Period, T imeframes del Grafico, Data ed Ora, Visibilità degli Oggetti
PlaySound
R iproduce un file sonoro
bool PlaySound(
string filename // nome del file
);
Parametri
filename
[ in] Percorso del file audio. S e filename=NULL, il playback viene fermato.
Valore restituito
true - se il file viene trovato, in caso contrario - false.
Nota
Il file deve essere posizionato in terminal_directory\S ounds o la sua sub-directory. S olo i file W AV
vengono riprodotti.
Vedi anche
R isorse
Print
I nserisce un messaggio nel registro Ex pert Advisor. I parametri possono essere di qualsiasi tipo.
void Print(
argument, // primo valore
... // prossimo valore
);
Parametri
...
[ in] T utti i valori separati da virgole. Il numero di parametri non può superare 64.
Nota
Gli array non possono essere passati alla funzione Print(). G li array devono essere inseriti elemento
per elemento.
I dati di tipo double vengono indicati con la precisione di un massimo di 16 cifre dopo la virgola
decimale, e possono essere emessi in output sia in formato scientifico che tradizionale, a seconda
di quale entry sarà piu compatta. I dati di tipo float sono output con 5 cifre dopo la virgola decimale.
Per emettere in output i numeri reali con un altra precisione o in un formato predefinito, utilizzare
la funzione PrintFormat().
Idati di tipo bool vengono emessi come righe " true" o " false" . Le date vengono visualizzati come
AAAA .MM.GG. HH:M I:S S . Per visualizzare i dati in un altro formato, utilizzare T imeT oS tring(). Dati
del tipo di colore vengono restituiti sia come righe R ,G,B o come nome di colore, se questo colore è
presente nel set di colori.
Esempio:
voidOnStart()
{
//--- Da in output DBL_MAX usando Print(), questo è equivalenta a PrintFormat(%%.16G,DBL_MAX)
Print("---- come appaere DBL_MAX -----");
Print("Print(DBL_MAX)=",DBL_MAX);
//--- Ora da in output un numero DBL_MAX usando PrintFormat()
PrintFormat("PrintFormat(%%.16G,DBL_MAX)=%.16G",DBL_MAX);
//--- Output all' Experts journal
// Print(DBL_MAX)=1.797693134862316e+308
// PrintFormat(%.16G,DBL_MAX)=1.797693134862316E+308
//--- Mostra cosa può accadere con le operazioni aritmetiche con tipi reali
double a=7,b=200;
Print("---- Prima delle operazioni aritmetiche");
Print("a=",a," b=",b);
Print("Print(DoubleToString(b,16))=",DoubleToString(b,16));
//--- Divide a per b (7/200)
a=a/b;
//--- Ora emula il ripristino di un valore della variabile b
b=7.0/a; // It is expected that b=7.0/(7.0/200.0)=>7.0/7.0*200.0=200 - but it differs
//--- Da in output il nuovo valore calcolato di b
Print("----- Dopo le operazioni aritmetiche");
Print("Print(b)=",b);
Print("Print(DoubleToString(b,16))=",DoubleToString(b,16));
//--- Output all' Experts journal
// Print(b)=200.0
// Print(DoubleToString(b,16))=199.9999999999999716 (vedi che b non è più uguale a 200.0)
Vedi anche
D oubleT oS tring, S tring Format
PrintFormat
Formatta ed introduce un set di simboli e valori nel registro Ex pert A dvisor secondo un formato
prestabilito.
void PrintFormat(
string format_string, // formato stringa
... // valori dei tipi semplici
);
Parametri
format_string
[in] Un formato stringa è composto di simboli semplici, e se il formato stringa è seguito da
argomenti, contiene anche le specifiche di formato.
...
[in] T utti i valori di tipi semplici separati da virgole. Il numero di parametri non può superare i 64
Valore restituito
S tring.
Nota
La funzione PrintFormat() non funziona durante l'ottimizzazione nel T ester di strategia.
Se il formato stringa è seguito dai parametri, questa stringa deve contenere le specifiche di formato
che indicano il formato di output di questi parametri. S pecification of format always starts with the
percent sign (%).
U n formato stringa viene letto da sinistra a destra. Quando viene soddisfatta la prima specifica di
formato (se presente), il valore del primo parametro dopo il formato stringa viene trasformato ed
emesso in output secondo la specifica preset. La specifica del secondo formato chiama la
trasformazione e l'output del secondo parametro, e cos ì via fino alla fine del formato stringa.
flags
w idth
U n numero non negativo decimale che imposta il numero minimo di simboli di output del valore
formattato. S e il numero di simboli di uscita è inferiore alla larghezza specificata, il corrispondente
numero di spazi viene aggiunto da sinistra o destra a seconda dell'allineamento (flag -). S e c'è flag
zero (0), il corrispondente numero di zeri viene aggiunto prima del valore di uscita. S e il numero di
simboli di uscita è maggiore della larghezza specificata, il valore di uscita non viene mai tagliato.
Se un asterisco (*) viene specificato come larghezza, il valore di tipo int deve essere indicato nel
punto corrispondente della lista dei parametri passati. Esso sarà utilizzato per specificare lunghezza
del valore di uscita.
precision
Un numero non negativo decimale che imposta la precisione di uscita - numero di cifre dopo la
virgola decimale. A differenza della specificazion della larghezza, una specifica di precisione può
tagliare la parte frazionaria del tipo con o senza arrotondamento.
c, C N on utilizzato
h | l | ll | I32 | I64
S pecificazione dei formati di dati, passati come parametro.
uint l (L minuscola) o, u, x , or X
short h d, i, o, x , or X
ushort h o, u, x , or X
int I32 d, i, o, x , or X
uint I32 o, u, x , or X
long I64 d, i, o, x , or X
ulong I64 o, u, x , or X
type
Lo specificatore di tipo è l'unico campo obbligatorio per l'output formattato.
di esponente. Il numero di
cifre decimali è determinato
dalle specifiche di accuratezza
Esempio:
void OnStart()
{
//--- trade server name
string server=AccountInfoString(ACCOUNT_SERVER);
//--- account number
int login=(int)AccountInfoInteger(ACCOUNT_LOGIN);
//--- long value output
long leverage=AccountInfoInteger(ACCOUNT_LEVERAGE);
PrintFormat("%s %d: leverage = 1:%I64d",
server,login,leverage);
//--- account currency
string currency=AccountInfoString(ACCOUNT_CURRENCY);
//--- double value output with 2 digits after the decimal point
double equity=AccountInfoDouble(ACCOUNT_EQUITY);
PrintFormat("%s %d: account equity = %.2f %s",
server,login,equity,currency);
//--- double value output with mandatory output of the +/- sign
double profit=AccountInfoDouble(ACCOUNT_PROFIT);
PrintFormat("%s %d: current result for open positions = %+.2f %s",
server,login,profit,currency);
//--- double value output with variable number of digits after the decimal point
double point_value=SymbolInfoDouble(_Symbol,SYMBOL_POINT);
string format_string=StringFormat("%%s: point value = %%.%df",_Digits);
PrintFormat(format_string,_Symbol,point_value);
//--- int value output
int spread=(int)SymbolInfoInteger(_Symbol,SYMBOL_SPREAD);
PrintFormat("%s: current spread in points = %d ",
_Symbol,spread);
//--- double value output in the scientific (floating point) format with 17 meaningful digits after
PrintFormat("DBL_MAX = %.17e",DBL_MAX);
//--- double value output in the scientific (floating point) format with 17 meaningful digits after
PrintFormat("EMPTY_VALUE = %.17e",EMPTY_VALUE);
//--- output using PrintFormat() with default accuracy
PrintFormat("PrintFormat(EMPTY_VALUE) = %e",EMPTY_VALUE);
//--- simple output using Print()
Print("Print(EMPTY_VALUE) = ",EMPTY_VALUE);
/* execution result
MetaQuotes-Demo 1889998: leverage = 1:100
MetaQuotes-Demo 1889998: account equity = 22139.86 USD
MetaQuotes-Demo 1889998: current result for open positions = +174.00 USD
EURUSD: point value = 0.00001
EURUSD: current spread in points = 12
DBL_MAX = 1.79769313486231570e+308
EMPTY_VALUE = 1.79769313486231570e+308
PrintFormat(EMPTY_VALUE) = 1.797693e+308
Print(EMPTY_VALUE) = 1.797693134862316e+308
*/
}
Vedi anche
StringFormat, DoubleToS tring, Tipi Reali (double, float)
ResetLastError
Consente di impostare il valore della variabile predefinita _LastError a zero.
void ResetLastError();
Valore restituito
N essun valore restituito.
Nota
V a notato che la funzione GetLastError() non azzera la variabile _LastError. Di solito la funzione
R esetLastError() viene chiamata prima di chiamare una funzione, dopo la quale viene controllata
l'apparizione dell' errore.
ResourceCreate
Crea una risorsa immagine basata su un insieme di dati. Ci sono due varianti della funzione:
Creazione di una risorsa basata su un file
bool ResourceCreate(
const string resource_name, // Nome della risorsa
const string path // Un percorso relativo, al file
);
Parametri
resource_name
[ in] ome risorsa.
N
data[][]
[ in] n array uni-dimensionale o bi-dimensionale per creare un'immagine completa.
U
img_width
[in] La larghezza dell'area rettangolare dell'immagine in pix el che devono essere immessi nella
risorsa sottoforma di un'immagine. Non può essere maggiore di data_width (valore).
img_height
[in] L 'altezza dell'area rettangolare dell'immagine in pix el da collocare nella risorsa sottoforma di
un'immagine.
data_xoffset
[ in] L 'offset orizzontale verso destra dell'area rettangolare dell'immagine.
data_yoffset
[ in] L 'offset verticale verso il basso dell'area rettangolare dell'immagine.
data_width
[in] Obbligatorio solo per array monodimensionali. Denota l'intera larghezza della immagine dal set
di dati. S e data_width=0, è considerato essere uguale a img_width. Per array bi-dimensionali il
parametro viene ignorato e viene assunto essere pari alla seconda dimensione dei dati[] dell'array.
color_format
[ in] Metodo di elaborazione dei colori, da un valore dell'enumerazione ENUM _COLOR_FOR M AT .
Valore restituito
Restituisce true se ha successo, altrimenti false. Per ottenere informazioni sull'errore chiamare la
funzione GetLastError(). Possono verificarsi i seguenti errori:
· 5 - ERR_R ES OUR CE_NAME_DUPL ICAT ED (nomi identici della dinamica e delle risorse statiche)
401
Nota
S e la seconda versione della funzione viene chiamata per creare la stessa risorsa con diversa
larghezza, altezza e parametri di slittamento, non crea una nuova risorsa, ma aggiorna
semplicemente quella esistente.
La prima versione della funzione viene utilizzata per il caricamento delle immagini e suoni da file, e
la seconda versione viene utilizzata solo per la creazione dinamica di immagini.
Le immagini devono essere in formato BMP con una profondità di colore di 24 o 32 bit. I suoni
possono essere solo in formato W AV. La dimensione della risorsa non deve superare i 16 Mb.
ENUM_COLOR_FORMAT
Identificatore Descrizione
COLOR_FOR M AT_XRGB_NOALPHA La componente del canale alfa viene ignorata
Vedi anche
R isorse, ObjectCreate(), ObjectS etS tring(), OBJPR OP_BMPFILE
ResourceFree
La funzione elimina le risorse create dinamicamente (liberando la memoria allocata per essa).
bool ResourceFree(
const string resource_name // nome della risorsa
);
Parametri
resource_name
[ in] R esource il nome deve iniziare con " ::" .
Valore restituito
True se avviene con successo, altrimenti false. Per ottenere informazioni sull'errore, chiamare la
funzione GetLastError().
Nota
ResourceFree() consente agli sviluppatori di applicazioni mql5 di gestire il consumo di memoria
quando si lavora attivamente con le risorse. Oggetti grafici legati alla risorsa sono eliminati dalla
memoria vengono visualizzati correttamente dopo la sua eliminazione. T uttavia, oggetti grafici di
nuova costruzione (OBJ_BIT M AP e OBJ_BIT M AP_L ABEL) non saranno in grado di utilizzare la risorsa
eliminata.
Vedi anche
R isorse, ObjectCreate(), PlayS ound(), ObjectS etS tring(), OBJPR OP_BMPFILE
ResourceReadImage
La funzione legge i dati dalla risorsa grafica creata dalla funzione R esourceCreate() o salvato in un file
EX5 durante la compilazione.
bool ResourceReadImage(
const string resource_name, // nome risorse grafiche per la lettura
uint& data[], // array di ricezione dati dalla risorsa
uint& width, // per ricevere la lareghezza dell'immagine nella risorsa
uint& height, // per ricevere l'altezza immagine nella risorsa
);
Parametri
resource_name
[in] Nome della risorsa grafica contenente un'immagine. Per accedere alle proprie risorse, il nome
viene usato in forma breve " ::resourcename" . S e scarichiamo una risorsa da un file EX5 compilato,
il nome completo dovrebbe essere usato con il percorso relativo a directory mql5, nome file e
risorse - " percorso\\nomefile.ex 5::resourcename" .
data[][]
[ in] array mono o bi dimensionale per la ricezione di dati dalla risorsa grafica.
img_width
[ out] Larghezza della risorsa grafica immagine, in pix el.
img_height
[ out] Altezza della risorsa grafica immagine, in pix el.
Valore restituito
vero se ha successo, altrimenti false. Per ottenere informazioni sull'errore, chiamare la funzione
GetLastError().
Nota
Se l'array data[] viene quindi utilizzato per la creazione di una risorsa grafica,
COLOR_FOR M AT_ARGB_NOR M AL IZE or COLOR_FOR M AT_XRGB_NOALPHAdevono essere usati i
formati colore.
Vedi anche
R esource, ObjectCreate(), ObjectS etS tring(), OBJPR OP_BMPFILE
ResourceSav
Consente di salvare una risorsa nel file specificato.
bool ResourceSave(
const string resource_name // Nome della risorsa
const string file_name // Nome del File
);
Parametri
resource_name
[ in] Il nome della risorsa, deve iniziare con " ::" .
file_name
[ in] Il nome del file relativo a MQL5\Files.
Valore restituito
true - in caso di successo, altrimenti false. Per le informazioni di errore chiamare GetLastError().
Nota
La funzione sovrascrive sempre un file e crea tutte le directory necessarie intermedie nel nome del
file, se necessario.
Vedi anche
R isorse, ObjectCreate(), PlayS ound(), ObjectS etS tring(), OBJPR OP_BMPFILE
SetReturnError
I mposta il codice che restituisce il processo del terminale quando si completa l'operazione.
void SetReturnError(
int ret_code // codice di comletamento del terminale client
);
Parametri
ret_code
[ in] Il codice da restituire dal processo del terminale client al termine dell'operazione.
Valore di ritorno
N essun valore di ritorno.
Nota
Impostazione dello specificato codice di ritorno ret_code usando la funzione S etR eturnError() è utile
per analizzare i motivi del completamento dell'operazione programmatica quando si lancia il
terminale tramite la riga di comando.
Diversamente dalla funzione T erminalClose(), S etR eturnError() non completa l'operazione del
terminale. Invece, imposta solo il codice che restituisce il processo del terminale al suo
completamento.
Se la funzione S etR eturnError() viene chiamata più volte e/o da diversi programmi MQL5, il
terminale restituisce l'ultimo codice di ritorno impostato.
Il codice impostato viene restituito al completamento del processo del terminale, ad eccezione dei
seguenti casi:
· un errore critico si è verificato durante l'esecuzione;
· è stata chiamata la funzione T erminalClose(int ret_code) che ha emesso il comando di
completamento dell'operazione terminale con un codice specificato.
Guarda anche
Esecuzione Programma, Errori di R untime, Codici di Motivazione di Deinizializzazione,
T erminalClose
SetUserError
I mposta la variabile predefinita _LastError nel valore pari a ERR_US ER_ERR OR_FIRS T + user_error
void SetUserError(
ushort user_error, // numero errore
);
Parametri
user_error
[ in] Error numero impostato da un utente.
Valore restituito
N essun valore restituito.
Nota
D opo che un errore è stato impostato utilizzando la funzione S etUserError(user_error),
G etLastError() restituisce il valore pari a ERR_US ER_ERR OR_FIRS T + user_error.
Esempio:
voidOnStart()
{
//--- imposta il numero errore 65537=(ERR_USER_ERROR_FIRST +1)
SetUserError(1);
//--- ottiene l' ultimo codice di errore
Print("GetLastError = ",GetLastError());
/*
Result
GetLastError = 65537
*/
}
Sleep
La funzione sospende l'esecuzione dell'Ex pert Advisor o script all'interno di un intervallo specificato.
void Sleep(
int millisecondi // intervallo
);
Parametri
millisecondi
[ in] L 'intervallo di ritardo in millisecondi.
Valore restituito
Nessun valore restituito.
Nota
La funzione S leep() non può essere chiamata per indicatori personalizzati, in quanto gli indicatori
vengono eseguiti nel thread di interfaccia e non devono rallentarlo. La funzione ha il controllo built-
in di della flag dell'alt dell EA EA ogni 0,1 secondi.
TerminalClose
La funzione comanda il terminale a completare il funzionamento.
bool TerminalClose(
int ret_code // codice di chiusura del terminale client
);
Parametri
ret_code
[ in] Codice di ritorno, restituito dal processo del terminale client al completamento dell'operazione.
Valore restituito
La funzione restituisce true in caso di successo, altrimenti - false.
Nota
La funzione T erminalClose() non ferma il terminale immediatamente, comanda solo al terminale di
completare la sua operazione.
Il codice di un Ex pert Advisor che ha chiamato T erminalClose() deve avere tutte le disposizioni per il
completamento immediato (ad esempio tutti i file precedentemente aperti devono essere chiusi in
modo normale). La chiamata di questa funzione deve essere seguita dall'operatore return.
Il parametro ret_code consente di indicare il codice di ritorno necessario per l'analisi dei motivi della
cessazione programma del funzionamento del terminale, quando parte dal prompt dei comandi.
Esempio:
//--- parametri di input
input int tiks_before=500; // numero di ticks fino alla terminazione
input int pips_to_go=15; // distanza in pips
input int seconds_st=50; // numero di secondi dato all' Expert Advisor
//--- globali
datetime launch_time;
int tick_counter=0;
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione Expert |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
Print(__FUNCTION__," reason code = ",reason);
Comment("");
}
//+--------------------------------------------------------------------------------+
//| Funzione tick dell'Expert |
//+--------------------------------------------------------------------------------+
void OnTick()
{
static double first_bid=0.0;
MqlTick tick;
double distance;
//---
SymbolInfoTick(_Symbol,tick);
tick_counter++;
if(first_bid==0.0)
{
launch_time=tick.time;
first_bid=tick.bid;
Print("first_bid =",first_bid);
return;
}
//--- distanza prezzo in pips
distance=(tick.bid-first_bid)/_Point;
//--- mostra una notifica per monitorare l'operazione dell' EA
string comm="Secondi passati dal momento d' inizio:\r\n\x25CF: "+
IntegerToString(tick.time-launch_time)+" ;"+
"\r\n\x25CF ticks received: "+(string)tick_counter+" ;"+
"\r\n\x25CF price went in points: "+StringFormat("%G",distance);
Comment(comm);
//--- sezione per il controllo della condizione di chiusura del terminale
if(tick_counter>=tiks_before)
TerminalClose(0); // uscita dal contatore tick
if(distance>pips_to_go)
TerminalClose(1); // va su per numero di pips uguale a pips_to_go
if(distance<-pips_to_go)
TerminalClose(-1); // va giu per numero di pips uguale a pips_to_go
if(tick.time-launch_time>seconds_st)
TerminalClose(100); // terminazione per timeout
//---
}
Vedi anche
F unzionamento del Programma, Errori di esecuzione, Motivi per deinizializzazione
TesterStatistics
La funzione restituisce il valore del parametro statistico specificato calcolato sulla base dei risultati di
test.
double TesterStatistics(
ENUM_STATISTICS statistic_id // ID
);
Parametri
statistic_id
[ in] L ' ID del parametro statistico dell'enumerazione ENUM _S TATIS TICS .
Valore restituito
I l valore del parametro statistico dai risultati di testing.
Nota
La funzione può essere richiamata all'interno di OnT ester() o OnDeinit() nel tester. In altri casi il
risultato è indefinito.
TesterStop
F ornisce il comando di completamento dell'operazione del programma quando si fa il testing.
void TesterStop();
Valore di ritorno
Nessun valore di ritorno.
Nota
La funzione T esterS top() è progettata per uno spegnimento anticipato di routine di un EA su un
agente di testing - per esempio, quando si raggiunge un numero specificato di trade perdenti o un
livello di drawdown preimpostato.
La chiamata di Ex pertR emove() nel tester di strategia significa anche normale completamento del
test e consente di ottenere statistiche di trading, ma l'EA viene de-caricato dalla memoria
dell'agente. In questo caso, eseguire un passaggio(un pass) sul prossimo set di parametri richiede
tempo per ricaricare il programma. Pertanto, T esterS top() è un'opzione preferita per il
completamento di routine di un test.
Guarda anche
Esecuzione Programma, T est delle S trategie di T rading, Ex pertR emove, S etR eturnError
TesterDeposit
La funzione speciale che emula i fondi depositati, durante un test. Può essere utilizzato in alcuni
sistemi di gestione del denaro.
bool TesterDeposit(
double money // somma depositata
);
Parametri
soldi
[ in] S oldi da depositare su un conto nella valuta del deposito.
Valore di ritorno
R estituisce true se ha successo, altrimenti - false.
Guarda anche
T esterW ithdrawal
TesterHideIndicators
Imposta la modalità di visualizzazione/occultamento degli indicatori utilizzati in un EA. La funzione è
destinata alla gestione della visibilità degli indicatori utilizzati solo durante i test.
void TesterHideIndicators(
bool hide // flag
);
Parametri
hide
[in] Flag per nascondere gli indicatori durante il test. Impostare true per nascondere gli indicatori
creati, altrimenti false.
Valore di ritorno
N essuno.
Nota
Per impostazione predefinita, tutti gli indicatori creati in un EA testato vengono visualizzati nel
chart del testing visuale. Inoltre, questi indicatori vengono visualizzati sul chart che viene aperto
automaticamente al termine del test. La funzione T esterH ideIndicators() consente agli sviluppatori
di implementare la possibilità di disabilitare la visualizzazione degli indicatori utilizzati.
ciò, sono contrassegnati con il flag " Nascondi" (hide). Questi indicatori non vengono visualizzati
durante un test visuale e sul chart che viene automaticamente aperto al termine del test.
Per disabilitare la modalità Nascondi degli indicatori appena creati, chiama T esterH ideIndicators()
uguale a false. S olo gli indicatori generati direttamente dall'EA testato possono essere visualizzati
sul chart dei test. Questa regola si applica solo ai casi in cui non è presente un singolo template in
<cartella_dati >MQL5\ Profiles \T emplates.
Esempio:
bool CSampleExpert::InitIndicators(void)
{
TesterHideIndicators(true);
//--- crea indicatore MACD
if(m_handle_macd==INVALID_HANDLE)
if((m_handle_macd=iMACD(NULL,0,12,26,9,PRICE_CLOSE))==INVALID_HANDLE)
{
printf("Errore creazione indicatore MACD");
return(false);
}
TesterHideIndicators(false);
//--- crea l'indicatore EMA e lo aggiunge alla collezione
if(m_handle_ema==INVALID_HANDLE)
if((m_handle_ema=iMA(NULL,0,InpMATrendPeriod,0,MODE_EMA,PRICE_CLOSE))==INVALID_HANDLE)
{
printf("Errore creazione indicatore EMA");
return(false);
}
//--- con successo
return(true);
}
Guarda anche
I ndicatorR elease
TesterW ithdrawal
La funzione speciale per emulare il l'operazione di prelievo del denaro nel processo di testing. Può
essere utilizzata in alcuni sistemi di gestione del risparmio.
bool TesterWithdrawal(
double money // la somma da prelevare
);
Parametri
denaro
[ in] La somma di denaro che abbiamo bisogno di ritirare (nella valuta di deposito).
Valore restituito
I n caso di successo, restituisce true, in caso contrario - false.
TranslateKey
R estituisce un carattere Unicode da un codice tasto virtuale considerando la lingua di input corrente e
lo status dei tasti di controllo.
short TranslateKey(
int key_code // codice tasto per la ricezione del carattere Unicode
);
Parametri
key_code
[ in] Codice T asto.
Valore di ritorno
Carattere Unicode in caso di successo della conversione. La funzione restituisce -1 in caso di errore.
Nota
La funzione usa T oUnicodeEx per convertire i tasti premuti da un utente in caratteri Unicode. Un
errore può verificarsi nel caso in cui T oUnicodeEx non viene attivato – per esempio, quando si cerca
di ricevere il carattere tasto S HIFT .
Esempio:
void OnChartEvent(const int id,const long& lparam,const double& dparam,const string& sparam)
{
if(id==CHARTEVENT_KEYDOWN)
{
short sym=TranslateKey((int)lparam);
//--- se il carattere introdotto viene convertito con successo in Unicode
if(sym>0)
Print(sym,"'",ShortToString(sym),"'");
else
Print("Errore TranslateKey per key=",lparam);
}
}
Guarda anche
Eventi del T erminale Client, OnChartEvent
ZeroMemory
Parametri
variabile
[I n] [out] Variabile passata per riferimento che si vuole resettare (inizializzare con valori zero).
Valore restituito
N essun valore restituito.
Nota
Se il parametro della funzione è una stringa, la chiamata sarà equivalente a NULL come valore.
Per i tipi semplici e loro array, nonché per strutture/classi composte di questi tipi, questo è un
semplice reset.
Per gli oggetti che contengono le stringhe e gli array dinamici, viene chiamata ZeroMemory() per
ogni elemento.
Per gli array non protetti dal modificatore const, questa è l'azzeramento di tutti gli elementi.
Per array di oggetti complessi, ZeroMemory() viene chiamata per ogni elemento.
Z eroMemory() non può essere applicata alle classi membri protetti o ereditati.
Funzione Azione
A rrayBsearch Restituisce l' indice del primo elemento trovato
nella prima dimensione dell' array
Funzione Azione
A rrayS ize R estituisce il numero di elementi dell'array
ArrayBsearch
Searches for a specified value in a multidimensional numeric array sorted ascending. S earch is
performed through the elements of the first dimension.
Parametri
array[]
[ in] Array numerico per la ricerca.
valore
Valore restituito
La funzione restituisce l'indice di un elemento trovato. S e il valore desiderato non viene trovato, la
funzione restituisce l'indice di un elemento più vicino in termini di valore.
Nota
La ricerca binaria elabora solo array ordinati. Per ordinare gli array numerici utilizzare la funzione
A rrayS ort().
Esempio:
#property description "Lo Script è basato sui dati che l'indicatore RSI mostra"
#property description "quanto spesso il mercato era in"
#property description "area overbought ed oversold nell'intervallo di tempo specificato."
//--- mostra la finestra dei parametri di input quando lancia lo script
#property script_show_inputs
//--- parametri di input
input int InpMAPeriod=14; // Periodo media mobile
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; // Tipo di prezzo
input double InpOversoldValue=30.0; // Livello Oversold (_* SovraVenduto)
input double InpOverboughtValue=70.0; // Livello Overbought (_* SovraComprato
input datetime InpDateStart=D'2012.01.01 00:00'; // Data di inizio Analisi
input datetime InpDateFinish=D'2013.01.01 00:00'; // Data di Fine Analisi
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
double rsi_buff[]; // array dei valori dell'indicatore
int size=0; // grandezza dell' array
//--- riceve l'handle dell'indicatore RSI
ResetLastError();
int rsi_handle=iRSI(Symbol(),Period(),InpMAPeriod,InpAppliedPrice);
if(rsi_handle==INVALID_HANDLE)
{
//--- fallimento nel ricevere l'handle dell'indicatore
PrintFormat("Indicator handle receiving error. Codice Errore = %d",GetLastError());
return;
}
//--- è in loop, finchè l'indicatore calcola tutti i suoi valori
while(BarsCalculated(rsi_handle)==-1)
{
//--- esce se l'indicatore ha completato forzatamente l'operazione dello script
if(IsStopped())
return;
//--- una pausa per permettere all'indicatore di calcolare tutti i suoi valori
Sleep(10);
}
ArrayCopy
Copia un array in un altro.
int ArrayCopy(
void& dst_array[], // array di destinazione
const void& src_array[], // array sorgente
int dst_start=0, // indice d'inizio dal quale scrivere nell'array di destinazio
int src_start=0, // primo indica di un array sorgente
int count=WHOLE_ARRAY // numero di elementi
);
Parametri
dst_array[]
[ out] A rray di Destinazione
src_array[]
[ in] A rray di Origine
dst_start=0
[in] Indice di partenza dall'array di destinazione. Per impostazione predefinita, indice di partenza
è 0.
src_start=0
[ in] indice iniziale per l'array d' origine. Per impostazione predefinita, indice di partenza è 0.
count=WHOLE_ARRAY
[in] Numero di elementi che devono essere copiati. Per default, l'intero array viene copiato
(count=W H OLE_ARRAY).
Valore restituito
R estituisce il numero di elementi copiati.
Nota
If count<0 or count>src_size-src_start, all the remaining array part is copied. Gli array vengono
copiati da sinistra a destra. Per array series (_*serie), la posizione di partenza è correttamente
definita, aggiustata per la copia da sinistra a destra.
Se gli array sono di tipi diversi, durante la copiatura essa cerca di trasformare ogni elemento di un
array di origine nel tipo di array di destinazione. Un array di stringhe può essere copiato solo in
un'array di stringhe. Array di classi e strutture contenenti oggetti che richiedono l'inizializzazione,
non vengono copiati. Un array di strutture può essere copiato solo in un array dello stesso tipo.
For dynamic arrays with index ing as in timeseries, the size of a destination array is automatically
increased to the amount of copied data (if the latter ex ceeds the array size). T he destination array
size is not decreased automatically.
Esempio:
#property description "L'indicatore evidenzia le candele che sono locali"
#property description "alti e bassi. Intervallo per la ricerca della lunghezza"
#property description "valori estremi devono essere trovati usando i parametri di input "
//--- impostazioni indicatore
#property indicator_chart_window
#property indicator_buffers 5
#property indicator_plots 1
//---- plot
#property indicator_label1 "Extremums"
#property indicator_type1 DRAW_COLOR_CANDLES
#property indicator_color1 clrLightSteelBlue,clrRed,clrBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- costanti predefinite
#define INDICATOR_EMPTY_VALUE 0.0
//--- parametri di input
input int InpNum=4; // Lunghezza semi-intervallo
//--- buffers indicatore
double ExtOpen[];
double ExtHigh[];
double ExtLow[];
double ExtClose[];
double ExtColor[];
//--- variabili globali
int ExtStart=0; // indice della prima candela che non è un estremo
int ExtCount=0; // numero di non-estremi nell'intervallo
//+--------------------------------------------------------------------------------+
//| Riempimento di candele non estreme |
//+--------------------------------------------------------------------------------+
void FillCandles(const double &open[],const double &high[],
const double &low[],const double &close[])
{
//--- riempimento di candele
ArrayCopy(ExtOpen,open,ExtStart,ExtStart,ExtCount);
ArrayCopy(ExtHigh,high,ExtStart,ExtStart,ExtCount);
ArrayCopy(ExtLow,low,ExtStart,ExtStart,ExtCount);
ArrayCopy(ExtClose,close,ExtStart,ExtStart,ExtCount);
}
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- mappatura buffers indicatore
SetIndexBuffer(0,ExtOpen);
SetIndexBuffer(1,ExtHigh);
SetIndexBuffer(2,ExtLow);
SetIndexBuffer(3,ExtClose);
SetIndexBuffer(4,ExtColor,INDICATOR_COLOR_INDEX);
//--- specificare il valore che non è mostrato
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,INDICATOR_EMPTY_VALUE);
//--- specificare i nomi dei buffer indicatore per la visualizzazione nella finestra dati
PlotIndexSetString(0,PLOT_LABEL,"Open;High;Low;Close");
//---
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//--- imposta l'indicizzazione dritta nelle time series
ArraySetAsSeries(open,false);
ArraySetAsSeries(high,false);
ArraySetAsSeries(low,false);
ArraySetAsSeries(close,false);
//--- Variabile di inizio calcolo barra
int start=prev_calculated;
//--- il calcolo non viene effettuato per le prime InpNum*2 barre
if(start==0)
{
start+=InpNum*2;
ExtStart=0;
ExtCount=0;
}
//--- se la barra è appena nata, controlla il prossimo potenziale estremo
if(rates_total-start==1)
start--;
//--- l'indice della barra che dev'essere controllato per l'estremo
int ext;
//--- calcolo loop valore indicatore
for(int i=start;i<rates_total-1;i++)
{
//--- inizialmente sulla barra i senza disegnarla
ExtOpen[i]=0;
ExtHigh[i]=0;
ExtLow[i]=0;
ExtClose[i]=0;
//--- indice dell'estremo per il controllo
ext=i-InpNum;
//--- controllo per il massimo locale
if(IsMax(high,ext))
{
//--- evidenzia di una candela estrema
ExtOpen[ext]=open[ext];
ExtHigh[ext]=high[ext];
ExtLow[ext]=low[ext];
ExtClose[ext]=close[ext];
ExtColor[ext]=1;
//--- evidenzia altre candele fino all'estremo con un colore neutro
FillCandles(open,high,low,close);
//--- cambia i colori della variabile
ExtStart=ext+1;
ExtCount=0;
//--- passa alla prossima iterazione
continue;
}
//--- controlla il minimo locale
if(IsMin(low,ext))
{
//--- evidenzia di una candela estrema
ExtOpen[ext]=open[ext];
ExtHigh[ext]=high[ext];
ExtLow[ext]=low[ext];
ExtClose[ext]=close[ext];
ExtColor[ext]=2;
//--- evidenzia altre candele fino all'estremo con un colore neutro
FillCandles(open,high,low,close);
//--- cambia i valori della variabile
ExtStart=ext+1;
ExtCount=0;
//--- passa alla prossima iterazione
continue;
}
//--- incrementa il numero dei non-estremi all'intervallo
ExtCount++;
}
//--- restituisce il valore di prev_calculated per la prossima chiamata
return(rates_total);
}
//+--------------------------------------------------------------------------------+
//| Controlla se l'auttuale elemento dell'array è un alto locale |
//+--------------------------------------------------------------------------------+
bool IsMax(const double &price[],const int ind)
{
//--- variabile inizio dell' intervallo
int i=ind-InpNum;
//--- periodo di fine dell'intervallo
int finish=ind+InpNum+1;
//--- controlla la prima metà dell'intervallo
for(;i<ind;i++)
{
if(price[ind]<=price[i])
return(false);
}
//--- controlla la seconda metà dell'intervallo
for(i=ind+1;i<finish;i++)
{
if(price[ind]<=price[i])
return(false);
}
//--- questo èun estremo
return(true);
}
//+--------------------------------------------------------------------------------+
//| Controlla se i correnti elementi dell'array sono bassi locali |
//+--------------------------------------------------------------------------------+
bool IsMin(const double &price[],const int ind)
{
//--- variabile inizio dell' intervallo
int i=ind-InpNum;
//--- variabile di fine intervallo
int finish=ind+InpNum+1;
//--- controlla la prima metà dell'intervallo
for(;i<ind;i++)
{
if(price[ind]>=price[i])
return(false);
}
//--- controlla la seconda metà dell'intervallo
for(i=ind+1;i<finish;i++)
{
if(price[ind]>=price[i])
return(false);
}
//--- questo èun estremo
return(true);
}
ArrayCompare
La funzione restituisce il risultato del confronto di due array dello stesso tipo. Esso può essere
utilizzato per confrontare gli array di tipi semplici o strutture personalizzate senza oggetti complessi,
che sono le strutture personalizzate che non contengono stringhe, array dinamici, classi e le altre
strutture con oggetti complessi.
int ArrayCompare(
const void& array1[], // primo array
const void& array2[], // secondo array
int start1=0, // offset iniziale nel primo array
int start2=0, // offset iniziale nel secondo array
int count=WHOLE_ARRAY // numero di elementi per il confronto
);
Parametri
array1[]
[ in] Primo array.
array2[]
[ in] S econdo array.
start1=0
[in] L 'indice iniziale dell'elemento nel primo array, da cui inizia il confronto. L 'inice di inizio di
default - 0.
start2=0
[in] L 'indice iniziale dell'elemento nel secondo array, da cui inizia il confronto. L 'inice di inizio di
default - 0.
count=WHOLE_ARRAY
[in] Numero di elementi da confrontare. T utti gli elementi di entrambi gli array partecipano al
confronto per default (count =W H OLE_ARRAY).
Valore restituito
· -1, se array1 è meno di array2 []
[]
Nota
La funzione non restituirà 0 (gli array non saranno considerati uguali) se gli array si differenziano
per dimensioni e count=W H OLE_ARRAY per il caso in cui un array è un fedele sottoinsieme di un
altro. In questo caso, il risultato del confronto delle grandezze di quelli array sarà restituito: -1, se la
grandezza dell'array1 [] è inferiore alla grandezza dell' array2 [] , Altrimenti 1.
ArrayFree
Libera il buffer di qualsiasi array dinamico ed imposta il valore della dimensione zero a 0.
void ArrayFree(
void& array[] // array
);
Parametri
array[]
[ in] Array Dinamico.
Valore restituito
N essun valore restituito.
Nota
La necessità di utilizzare la funzione ArrayFree() potrebbe non presentarsi troppo spesso
considerando che tutta la memoria utilizzata viene liberata tutt'in una volta ed il lavoro principale
con gli array comprende l'accesso ai buffer indicatore. Le grandezze dei buffer sono gestite
automaticamente dal sottosistema esecutivo del terminale.
Esempio:
#include <Controls\Dialog.mqh>
#include <Controls\Button.mqh>
#include <Controls\Label.mqh>
#include <Controls\ComboBox.mqh>
//--- costanti predefinite
#define X_START 0
#define Y_START 0
#define X_SIZE 280
#define Y_SIZE 300
//+--------------------------------------------------------------------------------+
//| Classe dialogo per lavorare con la memoria |
//+--------------------------------------------------------------------------------+
class CMemoryControl : public CAppDialog
{
private:
//--- grandezza array
int m_arr_size;
//--- arrays
char m_arr_char[];
int m_arr_int[];
float m_arr_float[];
double m_arr_double[];
long m_arr_long[];
//--- etichette
CLabel m_lbl_memory_physical;
CLabel m_lbl_memory_total;
CLabel m_lbl_memory_available;
CLabel m_lbl_memory_used;
CLabel m_lbl_array_size;
CLabel m_lbl_array_type;
CLabel m_lbl_error;
CLabel m_lbl_change_type;
CLabel m_lbl_add_size;
//--- bottoni
CButton m_button_add;
CButton m_button_free;
//--- combo boxes
CComboBox m_combo_box_step;
CComboBox m_combo_box_type;
//--- valore corrente del tipo di array dalla combo box
int m_combo_box_type_value;
public:
CMemoryControl(void);
~CMemoryControl(void);
//--- metodo di creazione della classe object
virtual bool Create(const long chart,const string name,const int subwin,const int x1,const
//--- handler dell'evento chart
virtual bool OnEvent(const int id,const long &lparam,const double &dparam,const string &spa
protected:
//--- crea etichette
bool CreateLabel(CLabel &lbl,const string name,const int x,const int y,const string
//--- crea elementi di controllo
bool CreateButton(CButton &button,const string name,const int x,const int y,const s
bool CreateComboBoxStep(void);
bool CreateComboBoxType(void);
//--- event handlers
void OnClickButtonAdd(void);
void OnClickButtonFree(void);
void OnChangeComboBoxType(void);
//--- metodi per lavorare con il corrente array
void CurrentArrayFree(void);
bool CurrentArrayAdd(void);
};
//+--------------------------------------------------------------------------------+
//| Memoria libera dell'array corrente |
//+--------------------------------------------------------------------------------+
void CMemoryControl::CurrentArrayFree(void)
{
//--- resetta la grandezza dell'array
m_arr_size=0;
//--- libera l'array
if(m_combo_box_type_value==0)
ArrayFree(m_arr_char);
if(m_combo_box_type_value==1)
ArrayFree(m_arr_int);
if(m_combo_box_type_value==2)
ArrayFree(m_arr_float);
if(m_combo_box_type_value==3)
ArrayFree(m_arr_double);
if(m_combo_box_type_value==4)
ArrayFree(m_arr_long);
}
//+--------------------------------------------------------------------------------+
//| Tenta di aggiungere memoria al corrente array |
//+--------------------------------------------------------------------------------+
bool CMemoryControl::CurrentArrayAdd(void)
{
//--- esce se la grandezza della memoria utilizzata supera la grandezza della memoria fisica
if(TerminalInfoInteger(TERMINAL_MEMORY_PHYSICAL)/TerminalInfoInteger(TERMINAL_MEMORY_USED)<2)
return(false);
//--- tentativo di allocare memoria secondo il tipo corrente
if(m_combo_box_type_value==0 && ArrayResize(m_arr_char,m_arr_size)==-1)
return(false);
if(m_combo_box_type_value==1 && ArrayResize(m_arr_int,m_arr_size)==-1)
return(false);
if(m_combo_box_type_value==2 && ArrayResize(m_arr_float,m_arr_size)==-1)
return(false);
if(m_combo_box_type_value==3 && ArrayResize(m_arr_double,m_arr_size)==-1)
return(false);
if(m_combo_box_type_value==4 && ArrayResize(m_arr_long,m_arr_size)==-1)
return(false);
//--- memoria allocata
return(true);
}
//+--------------------------------------------------------------------------------+
//| Events handling |
//+--------------------------------------------------------------------------------+
EVENT_MAP_BEGIN(CMemoryControl)
ON_EVENT(ON_CLICK,m_button_add,OnClickButtonAdd)
ON_EVENT(ON_CLICK,m_button_free,OnClickButtonFree)
ON_EVENT(ON_CHANGE,m_combo_box_type,OnChangeComboBoxType)
EVENT_MAP_END(CAppDialog)
//+--------------------------------------------------------------------------------+
//| Costruttore |
//+--------------------------------------------------------------------------------+
CMemoryControl::CMemoryControl(void)
{
}
//+--------------------------------------------------------------------------------+
//| Distruttore |
//+--------------------------------------------------------------------------------+
CMemoryControl::~CMemoryControl(void)
{
}
//+--------------------------------------------------------------------------------+
//| Metodo di creazione oggetto della classe |
//+--------------------------------------------------------------------------------+
bool CMemoryControl::Create(const long chart,const string name,const int subwin,
const int x1,const int y1,const int x2,const int y2)
{
//--- crea l'oggetto della classe base
if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2))
return(false);
//--- prepara le stringhe per le etichette
string str_physical="Memory physical = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_PHYSICAL)+"
string str_total="Memory total = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_TOTAL)+" Mb";
string str_available="Memory available = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE
string str_used="Memory used = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_USED)+" Mb";
//--- crea le etichette
if(!CreateLabel(m_lbl_memory_physical,"physical_label",X_START+10,Y_START+5,str_physical,12,clrB
return(false);
if(!CreateLabel(m_lbl_memory_total,"total_label",X_START+10,Y_START+30,str_total,12,clrBlack))
return(false);
if(!CreateLabel(m_lbl_memory_available,"available_label",X_START+10,Y_START+55,str_available,12,
return(false);
if(!CreateLabel(m_lbl_memory_used,"used_label",X_START+10,Y_START+80,str_used,12,clrBlack))
return(false);
if(!CreateLabel(m_lbl_array_type,"type_label",X_START+10,Y_START+105,"Array type = double",12,cl
return(false);
if(!CreateLabel(m_lbl_array_size,"size_label",X_START+10,Y_START+130,"Array size = 0",12,clrBlac
return(false);
if(!CreateLabel(m_lbl_error,"error_label",X_START+10,Y_START+155,"",12,clrRed))
return(false);
if(!CreateLabel(m_lbl_change_type,"change_type_label",X_START+10,Y_START+185,"Change type",10,cl
return(false);
if(!CreateLabel(m_lbl_add_size,"add_size_label",X_START+10,Y_START+210,"Add to array",10,clrBlac
return(false);
//--- crea elementi di controllo
if(!CreateButton(m_button_add,"add_button",X_START+15,Y_START+245,"Add",12,clrBlue))
return(false);
if(!CreateButton(m_button_free,"free_button",X_START+75,Y_START+245,"Free",12,clrBlue))
return(false);
if(!CreateComboBoxType())
return(false);
if(!CreateComboBoxStep())
return(false);
//--- inizializza la variabile
m_arr_size=0;
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Crea il bottone |
//+--------------------------------------------------------------------------------+
bool CMemoryControl::CreateButton(CButton &button,const string name,const int x,
const int y,const string str,const int font_size,
const int clr)
{
//--- crea il bottone
if(!button.Create(m_chart_id,name,m_subwin,x,y,x+50,y+20))
return(false);
//--- testo
if(!button.Text(str))
return(false);
//--- grandezza del font
if(!button.FontSize(font_size))
return(false);
//--- colore dell'etichetta
if(!button.Color(clr))
return(false);
//--- aggiunge il bottone agli elementi di controllo
if(!Add(button))
return(false);
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Crea un box combo per la grandezza dell'array |
//+--------------------------------------------------------------------------------+
bool CMemoryControl::CreateComboBoxStep(void)
{
//--- crea il combo box
if(!m_combo_box_step.Create(m_chart_id,"step_combobox",m_subwin,X_START+100,Y_START+185,X_START+
return(false);
//--- aggiunge elementi al combo box
if(!m_combo_box_step.ItemAdd("100 000",100000))
return(false);
if(!m_combo_box_step.ItemAdd("1 000 000",1000000))
return(false);
if(!m_combo_box_step.ItemAdd("10 000 000",10000000))
return(false);
if(!m_combo_box_step.ItemAdd("100 000 000",100000000))
return(false);
//--- imposta gli elementi correnti del combo box
if(!m_combo_box_step.SelectByValue(1000000))
return(false);
//+--------------------------------------------------------------------------------+
//| Handler del cambio evento del combo box |
//+--------------------------------------------------------------------------------+
void CMemoryControl::OnChangeComboBoxType(void)
{
//--- verifica se il tipo dell' array è cambiato
if(m_combo_box_type.Value()!=m_combo_box_type_value)
{
//--- libera la memoria dell'array corrente
OnClickButtonFree();
//--- lavora con un altro tipo di array
m_combo_box_type_value=(int)m_combo_box_type.Value();
//--- visualizza il nuovo tipo di array sullo schermo
if(m_combo_box_type_value==0)
m_lbl_array_type.Text("Array type = char");
if(m_combo_box_type_value==1)
m_lbl_array_type.Text("Array type = int");
if(m_combo_box_type_value==2)
m_lbl_array_type.Text("Array type = float");
if(m_combo_box_type_value==3)
m_lbl_array_type.Text("Array type = double");
if(m_combo_box_type_value==4)
m_lbl_array_type.Text("Array type = long");
}
}
//--- Oggetto della classe CMemoryControl
CMemoryControl ExtDialog;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione dell' Expert |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- crea il dialogo
if(!ExtDialog.Create(0,"MemoryControl",0,X_START,Y_START,X_SIZE,Y_SIZE))
return(INIT_FAILED);
//--- lancia
ExtDialog.Run();
//---
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione Expert |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
ExtDialog.Destroy(reason);
}
//+--------------------------------------------------------------------------------+
ArrayGetAsSeries
Controlla la direzione dell' indice dell' array.
bool ArrayGetAsSeries(
const void& array[] // array per il controllo
);
Parametri
array
[ in] A rray controllato.
Valore restituito
Restituisce vero, se l'array specificato, ha il flag AS _S ERIES impostato, vale a dire l'accesso all' array
viene eseguito dal posteriore all'anteriore come nelle timeseries. La timeseries differisce da un
array usuale nel fatto che l'indicizzazione di elementi della timeseries viene eseguita dalla fine
all'inizio (dai dati più recenti a quelli più vecchi).
Nota
Per verificare se un array appartiene alle timeseries, utilizzare la funzione ArrayIs S eries(). Arrai di
dati sui prezzi passati come parametri di input nella funzione OnCalculate() non obbligatoriamente
hanno la direzione di indicizzazione identica alle timeseries. La direzione di indicizzazione
necessaria può essere impostata utilizzando la funzione ArrayS etAs S eries().
Esempio:
#property description "L'indicatore calcola i valori assoluti della differenza tra"
#property description "i prezzi Open e Close o High e Low visualizzandoli in una sottofinestra sepa
#property description "come un istogramma."
//--- impostazioni indicatore
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//---- plot
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_style1 STYLE_SOLID
#property indicator_width1 3
//--- parametri di input
input bool InpAsSeries=true; // Direzione di indicizzazione nel buffere indicatore
input bool InpPrices=true; // Calcolo dei prezzi (true - Open,Close; false - High,Low)
//--- buffer indicatore
double ExtBuffer[];
//+--------------------------------------------------------------------------------+
//| Calcola i valori dell'indicatore |
//+--------------------------------------------------------------------------------+
void CandleSizeOnBuffer(const int rates_total,const int prev_calculated,
const double &first[],const double &second[],double &buffer[])
{
//--- variabile iniziale per il calcolo delle barre
int start=prev_calculated;
//--- lavora all'ultima barra se i valori degli indicatori sono già stati calcolati al tick precede
if(prev_calculated>0)
start--;
//--- definisce la direzione di indicizzazione nell'array
bool as_series_first=ArrayGetAsSeries(first);
bool as_series_second=ArrayGetAsSeries(second);
bool as_series_buffer=ArrayGetAsSeries(buffer);
//--- sostituisce la direzione di indicizzazione con una diretta se necessario
if(as_series_first)
ArraySetAsSeries(first,false);
if(as_series_second)
ArraySetAsSeries(second,false);
if(as_series_buffer)
ArraySetAsSeries(buffer,false);
//--- calcola i valori dell'indicatore
for(int i=start;i<rates_total;i++)
buffer[i]=MathAbs(first[i]-second[i]);
}
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- lega i buffer indicatore
SetIndexBuffer(0,ExtBuffer);
//--- imposta l'elemento di indicizzazione nel buffer indicatore
ArraySetAsSeries(ExtBuffer,InpAsSeries);
//--- controlla per quali prezzi l'indicatore è calcolato
if(InpPrices)
{
//--- Apre e Chiude i prezzi
PlotIndexSetString(0,PLOT_LABEL,"BodySize");
//--- imposta i colori dell'indicatore
PlotIndexSetInteger(0,PLOT_LINE_COLOR,clrOrange);
}
else
{
//--- Prezzi High e Low
PlotIndexSetString(0,PLOT_LABEL,"ShadowSize");
//--- imposta i colori dell'indicatore
PlotIndexSetInteger(0,PLOT_LINE_COLOR,clrDodgerBlue);
}
//---
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
Vedi anche
A ccesso alle timeseries, ArrayS etAs S eries
ArrayInitialize
La funzione inizializza un array numerico per un valore prestabilito.
Parametri
array[]
[ out] Array numerico che deve essere inizializzato.
valore
[ in] Nuovo valore che dovrebbe essere impostato per tutti gli elementi dell'array.
Valore restituito
Numero di elementi.
Nota
La funzione ArrayR esize() permette di impostare la dimensione di un array con una riserva per
un'ulteriore espansione senza la rilocazione fisica della memoria. Viene implementato per una
migliore performance, perché le operazioni di delocalizzazione della memoria sono abbastanza lente.
L ' inizializzazione dell' array con ArrayInitialize(array, init_val) non significa l'inizializzazione con lo
stesso valore di elementi di riserva allocati per questo array. Ad ulteriore espansione dell' array
utilizzando la funzione ArrayR esize(), gli elementi verranno aggiunti alla fine dell'array, i loro valori
saranno indefiniti ed in molti casi non saranno uguali ad init_value.
Esempio:
voidOnStart()
{
//--- array dinamico
double array[];
//--- imposta la grandezza dell'array per 100 elementi e riserviamo un buffer per altri 10 elementi
ArrayResize(array,100,10);
//--- inizializza gli elementi dell'array con il valore EMPTY_VALUE=DBL_MAX
ArrayInitialize(array,EMPTY_VALUE);
Print("Valori degli ultimi 10 elementi dopo l'inizializzazione");
for(int i=90;i<100;i++) printf("array[%d] = %G",i,array[i]);
//--- espande l'array di 5 elementi
ArrayResize(array,105);
Print("Valori degli ultimi 10 elementi dopo ArrayResize(array,105)");
//--- i valori degli ultimi 5 elementi sono ottenuti dal buffer riserva
for(int i=95;i<105;i++) printf("array[%d] = %G",i,array[i]);
}
ArrayFill
La funzione riempie un array con il valore specificato.
void ArrayFill(
void& array[], // array
int start, // indice d'inizio
int count, // numero di elementi da riempire
void value // valore
);
Parametri
array[]
[out] Array di tipo semplice (char, uchar, short, ushort, int, uint, long, ulong, bool, color,
datetime, float, double).
start
[ in] Indice iniziale. In tal caso, la specificata flag AS _S ERIES , viene ignorata.
count
[ in] Numero di elementi da riempire.
valore
[ in] Valore con cui riempire l'array.
Valore restituito
Nessun valore restituito.
Nota
Quando la funzione ArrayFill() viene chiamata, la direzione indicizzazione normale (da sinistra a
destra) è sempre implicita. S ignifica che la variazione dell'ordine di accesso agli elementi dell'array
utilizzando la funzione ArrayS etAs S eries() viene ignorata.
U n array multidimensionale è mostrato come uni-dimensionale quando viene elaborato dalla funzione
A rrayFill(). A d esempio, array [2][4] viene elaborato come array [8] . Di conseguenza, è possibile
specificare l'indice dell'elemento iniziale, da essere uguale a 5 quando si lavora con questo array.
Pertanto, la chiamata di ArrayFill(array, 5, 2, 3.14) per l'aray [2][4] riempie gli elementi array [1][1]
ed array [1][2] con 3.14.
Esempio:
voidOnStart()
{
//--- dichiara l'array dinamico
int a[];
//--- imposta la grandezza
ArrayResize(a,10);
//--- riempie i primi 5 elementi con 123
ArrayFill(a,0,5,123);
//--- riempie i primi 5 elementi con 456
ArrayFill(a,5,5,456);
//--- mostra valori
for(int i=0;i<ArraySize(a);i++) printf("a[%d] = %d",i,a[i]);
}
ArrayIsDynamic
La funzione controlla se un' array è dinamico.
bool ArrayIsDynamic(
const void& array[] // array controllato
);
Parametri
array[]
[ in] A rray controllato.
Valore restituito
R estituisce vero se l'array selezionato è dinamico, altrimenti restituisce falso.
Esempio:
#property description "Questo indicatore non calcola i valori. Fa un singolo tentativo di"
#property description "applicare la chiamata alla funzione ArrayFree() a tre array: quello dinamico
#property description "un buffer indicatore. I risultati vengono mostrati nel journal Experts (il r
//--- impostazioni indicatore
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//--- variabili globali
double ExtDynamic[]; // array dinamico
double ExtStatic[100]; // array statico
bool ExtFlag=true; // flag
double ExtBuff[]; // buffer indicatore
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- alloca la memoria per l'array
ArrayResize(ExtDynamic,100);
//--- mappatura buffers indicatore
SetIndexBuffer(0,ExtBuff);
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//---
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const int begin,
const double &price[])
{
//--- esegue una singola analisi
if(ExtFlag)
{
//--- tenta di liberare la memoria per gli array
//--- 1. Array dinamico
Print("+============================+");
Print("1. Controlla l' array dinamico:");
Print("Grandezza prima che la memoria venga liberata = ",ArraySize(ExtDynamic));
Print("E' questo un array dinamico = ",ArrayIsDynamic(ExtDynamic) ? "Yes" : "No");
//--- tentativo di liberare la memoria dell'array
ArrayFree(ExtDynamic);
Print("Grandezza dopo che la memoria è stata liberata = ",ArraySize(ExtDynamic));
//--- 2. Array statico
Print("2. Controlla l'array statico:");
Print("Grandezza prima che la memoria venga liberata = ",ArraySize(ExtStatic));
Print("E' questo un array dinamico = ",ArrayIsDynamic(ExtStatic) ? "Yes" : "No");
//--- tentativo di liberare la memoria dell'array
ArrayFree(ExtStatic);
Print("Grandezza dopo che la memoria è stata liberata = ",ArraySize(ExtStatic));
//--- 3. Buffer Indicatore
Print("3. Controlla il buffer indicatore:");
Print("Grandezza prima che la memoria venga liberata = ",ArraySize(ExtBuff));
Print("E' questo un array dinamico = ",ArrayIsDynamic(ExtBuff) ? "Yes" : "No");
//--- tentativo di liberare la memoria dell'array
ArrayFree(ExtBuff);
Print("Grandezza dopo che la memoria è stata liberata = ",ArraySize(ExtBuff));
//--- cambia il valore della flag
ExtFlag=false;
}
//--- restituisce il valore di prev_calculated per la prossima chiamata
return(rates_total);
}
Vedi anche
A ccesso alle timeseries ed indicatori
ArrayIsSeries
La funzione controlla se un array è una timeseries.
bool ArrayIsSeries(
const void& array[] // array controllato
);
Parametri
array[]
[ in] A rray controllato.
Valore restituito
Restituisce vero, se l'array controllato è un array di timeseries, altrimenti restituisce falso. Gli array
passati come parametro alla funzione OnCalculate() devono essere verificati per l'ordine di accesso
agli elementi dell'array da ArrayGetAs S eries().
Esempio:
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//---- plot Label1
#property indicator_label1 "Label1"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- buffers indicatore
double Label1Buffer[];
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
void OnInit()
{
//--- mappatura buffers indicatore
SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
//---
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
Vedi anche
A ccesso alle timeseries ed indicatori
ArrayMaximum
S earches for the largest element in the first dimension of a multidimensional numeric array.
int ArrayMaximum(
const void& array[], // array per la ricerca
int start=0, // indice dal quale iniziare il controllo
int count=WHOLE_ARRAY // numero di elementi verificati
);
Parametri
array[]
[ in] l' array numerico, in cui viene effettuata la ricerca.
start=0
[ in] Indice con cui avviare il controllo.
count=WHOLE_ARRAY
[in] Numero di elementi per la ricerca. Per impostazione predefinita, cerca in tutto l'array (count
=W H OLE_ARRAY).
Valore restituito
La funzione restituisce l' indice di un elemento trovato tenendo conto dell' array seriale. N el caso
fallisse, restituisce -1.
Nota
T he AS _S ERIES flag value is tak en into account while searching for a max imum.
Esempio:
#property description "L'indicatore mostra candele di un timeframe più grande sul timeframe corrent
//--- impostazioni indicatore
#property indicator_chart_window
#property indicator_buffers 16
#property indicator_plots 8
//---- plot 1
#property indicator_label1 "BearBody"
#property indicator_color1 clrSeaGreen,clrSeaGreen
//---- plot 2
#property indicator_label2 "BearBodyEnd"
#property indicator_color2 clrSeaGreen,clrSeaGreen
//---- plot 3
#property indicator_label3 "BearShadow"
#property indicator_color3 clrSalmon,clrSalmon
//---- plot 4
#property indicator_label4 "BearShadowEnd"
#property indicator_color4 clrSalmon,clrSalmon
//---- plot 5
#property indicator_label5 "BullBody"
#property indicator_color5 clrOlive,clrOlive
//---- plot 6
#property indicator_label6 "BullBodyEnd"
#property indicator_color6 clrOlive,clrOlive
//---- plot 7
#property indicator_label7 "BullShadow"
#property indicator_color7 clrSkyBlue,clrSkyBlue
//---- plot 8
#property indicator_label8 "BullShadowEnd"
#property indicator_color8 clrSkyBlue,clrSkyBlue
//--- costanti predefinite
#define INDICATOR_EMPTY_VALUE 0.0
//--- parametri di input
input ENUM_TIMEFRAMES InpPeriod=PERIOD_H4; // Timeframe per il calcolo dell'indicatore
input datetime InpDateStart=D'2013.01.01 00:00'; // Data di inizio analisi
//--- buffer indicatore per candele ribassiste
double ExtBearBodyFirst[];
double ExtBearBodySecond[];
double ExtBearBodyEndFirst[];
double ExtBearBodyEndSecond[];
double ExtBearShadowFirst[];
double ExtBearShadowSecond[];
double ExtBearShadowEndFirst[];
double ExtBearShadowEndSecond[];
//--- indicator buffers for bullish candlesticks
double ExtBullBodyFirst[];
double ExtBullBodySecond[];
double ExtBullBodyEndFirst[];
double ExtBullBodyEndSecond[];
double ExtBullShadowFirst[];
double ExtBullShadowSecond[];
double ExtBullShadowEndFirst[];
double ExtBullShadowEndSecond[];
//--- variabili globali
datetime ExtTimeBuff[]; // più largo buffer di tempo del timeframe
int ExtSize=0; // grandezza del buffer tempo
int ExtCount=0; // indice dentro il buffer tempo
int ExtStartPos=0; // posizione iniziale per il calcolo dell'indicatore
bool ExtStartFlag=true; // flag ausiliaria per la ricezione della posizione iniziale
datetime ExtCurrentTime[1]; // ultimo orario di creazione della barra più ampia
datetime ExtLastTime; // ultimo orario dal timeframe più ampio, per cui viene eseguito il ca
bool ExtBearFlag=true; // flag per definire l'ordine di scrittura dei dato nei buffer indicat
bool ExtBullFlag=true; // flag per definire l'ordine di scrittura dei dato nei buffer indicat
int ExtIndexMax=0; // indice dell'elemento massimo nell' array
int ExtIndexMin=0; // indice dell'elemento minimo nell'array
int ExtDirectionFlag=0; // direzione del movimento di prezzo per la corrente candela
//--- spostamento tra il prezzo di apertura e di chiusura della candela per il corretto disegnament
//--- se i prezzi close ed open sono uguali, utilizza lo shift per una corretta visualizzazione
if(high[index_max]!=low[index_min])
FormCandleMain(ExtBearBodyFirst,ExtBearBodySecond,ExtBearShadowFirst,ExtBearShadowSecond,open
open[start]-ExtEmptyBodySize,high[index_max],low[index_min],start,count,ExtBea
else
FormCandleMain(ExtBearBodyFirst,ExtBearBodySecond,ExtBearShadowFirst,ExtBearShadowSecond,
open[start],open[start]-ExtEmptyBodySize,high[index_max],
high[index_max]-ExtEmptyBodySize,start,count,ExtBearFlag);
}
//+--------------------------------------------------------------------------------+
//| Riempie la fine della candela |
//+--------------------------------------------------------------------------------+
void FillCandleEnd(const double &open[],const double &close[],
const double &high[],const double &low[],
const int start,const int last,const int fill_index,
const int index_max,const int index_min)
{
//--- non disegnare in caso di barra singola
if(last-start==0)
return;
//--- se il prezzo di chiusura alla prima barra eccede quella dell'ultima barra, la candela è ribas
if(open[start]>close[last])
{
//--- genera la fine della candela
FormCandleEnd(ExtBearBodyEndFirst,ExtBearBodyEndSecond,ExtBearShadowEndFirst,ExtBearShadowEnd
open[start],close[last],high[index_max],low[index_min],fill_index,ExtBearFlag);
//--- esce dalla funzione
return;
}
//--- se il prezzo di chiusura alla prima barra è inferiore a quello dell'ultima barra, la candela
if(open[start]<close[last])
{
//--- genera la fine della candela
FormCandleEnd(ExtBullBodyEndFirst,ExtBullBodyEndSecond,ExtBullShadowEndFirst,ExtBullShadowEnd
close[last],open[start],high[index_max],low[index_min],fill_index,ExtBullFlag);
//--- esce dalla funzione
return;
}
//--- se siete in questa parte della funzione, il prezzo di apertura alla prima barra è pari a
//--- al prezzo di chiusura dell''ultima barra; tale candela è considerata ribassista
//--- genera la fine della candela
if(high[index_max]!=low[index_min])
FormCandleEnd(ExtBearBodyEndFirst,ExtBearBodyEndSecond,ExtBearShadowEndFirst,ExtBearShadowEnd
open[start]-ExtEmptyBodySize,high[index_max],low[index_min],fill_index,ExtBearF
else
FormCandleEnd(ExtBearBodyEndFirst,ExtBearBodyEndSecond,ExtBearShadowEndFirst,ExtBearShadowEnd
open[start]-ExtEmptyBodySize,high[index_max],high[index_max]-ExtEmptyBodySize,f
}
//+--------------------------------------------------------------------------------+
{
//--- nel caso in cui non ci siano ancora barre calcolate
if(prev_calculated==0)
{
//--- riceve l' orario di arrivo del frame's bar più grande
if(!GetTimeData())
return(0);
}
//--- imposta l'indicizzazione diretta
ArraySetAsSeries(time,false);
ArraySetAsSeries(high,false);
ArraySetAsSeries(low,false);
ArraySetAsSeries(open,false);
ArraySetAsSeries(close,false);
//--- variabile iniziale per il calcolo delle barre
int start=prev_calculated;
//--- se la barra viene generata, ricalcola il valore dell'indicatore su di essa
if(start!=0 && start==rates_total)
start--;
//--- Il ciclo per calcolare i valori degli indicatori
for(int i=start;i<rates_total;i++)
{
//--- riempie gli elementi del buffer indicatore per valori vuoti
FillIndicatorBuffers(i);
//--- esegue il calcolo per le barre iniziando dalla data InpDateStart
if(time[i]>=InpDateStart)
{
//--- definisce la posizione, dal quale i valori devono essere mostrati, per la prima volt
if(ExtStartFlag)
{
//--- conserva il numero di barre iniziali
ExtStartPos=i;
//--- definisce la prima data dal timeframe più grande che eccedente time[i]
while(time[i]>=ExtTimeBuff[ExtCount])
if(ExtCount<ExtSize-1)
ExtCount++;
//--- modifica il valore del flag per non eseguire nuovamente questo blocco
ExtStartFlag=false;
}
//--- controlla se ci sono ancora elementi nell'array
if(ExtCount<ExtSize)
{
//--- attende il valore del timeframe corrente per raggiungere quello del timeframe più
if(time[i]>=ExtTimeBuff[ExtCount])
{
//--- disegna la parte principale della candela (senza riempire l'area tra l'ultima
FillCandleMain(open,close,high,low,ExtStartPos,i-1,i-2,ExtIndexMax,ExtIndexMin);
//--- riempie la fine della candela (l'area tra l'ultima e la penultima barra)
FillCandleEnd(open,close,high,low,ExtStartPos,i-1,i-1,ExtIndexMax,ExtIndexMin);
if(current_period>=high_period)
{
Print("Error! Il valore del periodo dell'indicatore deve superare il valore del timeframe cor
return(false);
}
//--- se il periodo dell'indicatore è di una settimana o mese, il periodo è corretto
if(high_period>32768)
return(true);
//--- converte i valori del periodo in minuti
if(high_period>30)
high_period=(high_period-16384)*60;
if(current_period>30)
current_period=(current_period-16384)*60;
//--- il periodo dell'indicatore deve essere multiplo del timeframe su cui è visualizzato
if(high_period%current_period!=0)
{
Print("Error! Il valore del periodo dell' indicatore deve essere multiplo del valore del peri
return(false);
}
//--- il periodo dell'indicatore deve superare il timeframe su cui è visualizzato, di 3 o più volte
if(high_period/current_period<3)
{
Print("Error! Il periodo dell'indicatore dovrebbe superare l'attuale timeframe di 3 o più vol
return(false);
}
//--- Il periodo indicatore è corretto per il timeframe corrente
return(true);
}
//+--------------------------------------------------------------------------------+
//| Riceve i dati temporali dal lasso di tempo più ampio |
//+--------------------------------------------------------------------------------+
bool GetTimeData(void)
{
//--- resetta il valore dell' errore
ResetLastError();
//--- copia tutti i dati per il tempo corrente
if(CopyTime(Symbol(),InpPeriod,InpDateStart,TimeCurrent(),ExtTimeBuff)==-1)
{
//--- riceve il codice dell'errore
int code=GetLastError();
//--- stampa il messaggio d'errore
PrintFormat("Errore copia dei dati! %s",code==4401
? "Lo storico è ancora in fase di uploading!"
: "Code = "+IntegerToString(code));
//--- restituisce false per fare un nuovo tentativo di download dei dati
return(false);
}
//--- riceve la grandezza dell'array
ExtSize=ArraySize(ExtTimeBuff);
if(flag)
{
//--- genera la fine del corpo della candela
FormEnd(body_fst,body_snd,fst_value,snd_value,end);
//--- genera la fine dell'ombra della candela
FormEnd(shadow_fst,shadow_snd,fst_extremum,snd_extremum,end);
//--- cambia il valore della flag in quello opposto
flag=false;
}
else
{
//--- genera la fine del corpo della candela
FormEnd(body_fst,body_snd,snd_value,fst_value,end);
//--- genera la fine dell'ombra della candela
FormEnd(shadow_fst,shadow_snd,snd_extremum,fst_extremum,end);
//--- cambia il valore della flag in quello opposto
flag=true;
}
}
//+--------------------------------------------------------------------------------------------+
//| Cancella la fine della candela (l'area tra l'ultima e la penultima |
//| barra |
//+--------------------------------------------------------------------------------------------+
void ClearEndOfBodyMain(const int ind)
{
ClearCandle(ExtBearBodyFirst,ExtBearBodySecond,ExtBearShadowFirst,ExtBearShadowSecond,ind,1);
ClearCandle(ExtBullBodyFirst,ExtBullBodySecond,ExtBullShadowFirst,ExtBullShadowSecond,ind,1);
}
//+-----------------------------------------------------------------------------------------+
//| Cancella la candela |
//+-----------------------------------------------------------------------------------------+
void ClearCandle(double &body_fst[],double &body_snd[],double &shadow_fst[],
double &shadow_snd[],const int start,const int count)
{
//--- controlla
if(count!=0)
{
//--- riempie il buffer indicatore con valori vuoti
ArrayFill(body_fst,start,count,INDICATOR_EMPTY_VALUE);
ArrayFill(body_snd,start,count,INDICATOR_EMPTY_VALUE);
ArrayFill(shadow_fst,start,count,INDICATOR_EMPTY_VALUE);
ArrayFill(shadow_snd,start,count,INDICATOR_EMPTY_VALUE);
}
}
//+-----------------------------------------------------------------------------------------+
//| Genera la parte principale della candela |
//+-----------------------------------------------------------------------------------------+
void FormMain(double &fst[],double &snd[],const double fst_value,
const double snd_value,const int start,const int count)
{
//--- controlla
if(count!=0)
{
//--- riempie il buffer indicatore con i valori
ArrayFill(fst,start,count,fst_value);
ArrayFill(snd,start,count,snd_value);
}
}
//+---------------------------------------------------------------------------------------+
//| Genera la fine della candela |
//+---------------------------------------------------------------------------------------+
void FormEnd(double &fst[],double &snd[],const double fst_value,
const double snd_value,const int last)
{
//--- riempie il buffer indicatore con i valori
ArrayFill(fst,last-1,2,fst_value);
ArrayFill(snd,last-1,2,snd_value);
}
//+--------------------------------------------------------------------------------+
//| _* Riempie gli elementi del buffer indicatore per valori vuoti |
//+--------------------------------------------------------------------------------+
void FillIndicatorBuffers(const int i)
{
//--- imposta un valore vuoto nella cella del buffer indicatore
ExtBearBodyFirst[i]=INDICATOR_EMPTY_VALUE;
ExtBearBodySecond[i]=INDICATOR_EMPTY_VALUE;
ExtBearShadowFirst[i]=INDICATOR_EMPTY_VALUE;
ExtBearShadowSecond[i]=INDICATOR_EMPTY_VALUE;
ExtBearBodyEndFirst[i]=INDICATOR_EMPTY_VALUE;
ExtBearBodyEndSecond[i]=INDICATOR_EMPTY_VALUE;
ExtBearShadowEndFirst[i]=INDICATOR_EMPTY_VALUE;
ExtBearShadowEndSecond[i]=INDICATOR_EMPTY_VALUE;
ExtBullBodyFirst[i]=INDICATOR_EMPTY_VALUE;
ExtBullBodySecond[i]=INDICATOR_EMPTY_VALUE;
ExtBullShadowFirst[i]=INDICATOR_EMPTY_VALUE;
ExtBullShadowSecond[i]=INDICATOR_EMPTY_VALUE;
ExtBullBodyEndFirst[i]=INDICATOR_EMPTY_VALUE;
ExtBullBodyEndSecond[i]=INDICATOR_EMPTY_VALUE;
ExtBullShadowEndFirst[i]=INDICATOR_EMPTY_VALUE;
ExtBullShadowEndSecond[i]=INDICATOR_EMPTY_VALUE;
}
ArrayMinimum
S earches for the lowest element in the first dimension of a multidimensional numeric array.
int ArrayMinimum(
const void& array[], // array per la ricerca
int start=0, // indice dal quale iniziare il controllo
int count=WHOLE_ARRAY // numero di elementi controllati
);
Parametri
array[]
[ in] l' array numerico, in cui viene effettuata la ricerca.
start=0
[ in] Indice con cui avviare il controllo.
count=WHOLE_ARRAY
[in] Numero di elementi per la ricerca. Per impostazione predefinita, cerca in tutto l'array (count
=W H OLE_ARRAY).
Valore restituito
La funzione restituisce l' indice di un elemento trovato tenendo conto dell' array seriale. N el caso
fallisse, restituisce -1.
Nota
T he AS _S ERIES flag value is tak en into account while searching for a minimum.
Esempio:
#property description "L'indicatore mostra candele di un timeframe più grande sul timeframe corrent
//--- impostazioni indicatore
#property indicator_chart_window
#property indicator_buffers 16
#property indicator_plots 8
//---- plot 1
#property indicator_label1 "BearBody"
#property indicator_color1 clrSeaGreen,clrSeaGreen
//---- plot 2
#property indicator_label2 "BearBodyEnd"
#property indicator_color2 clrSeaGreen,clrSeaGreen
//---- plot 3
#property indicator_label3 "BearShadow"
#property indicator_color3 clrSalmon,clrSalmon
//---- plot 4
#property indicator_label4 "BearShadowEnd"
#property indicator_color4 clrSalmon,clrSalmon
//---- plot 5
#property indicator_label5 "BullBody"
#property indicator_color5 clrOlive,clrOlive
//---- plot 6
#property indicator_label6 "BullBodyEnd"
#property indicator_color6 clrOlive,clrOlive
//---- plot 7
#property indicator_label7 "BullShadow"
#property indicator_color7 clrSkyBlue,clrSkyBlue
//---- plot 8
#property indicator_label8 "BullShadowEnd"
#property indicator_color8 clrSkyBlue,clrSkyBlue
//--- costanti predefinite
#define INDICATOR_EMPTY_VALUE 0.0
//--- parametri di input
input ENUM_TIMEFRAMES InpPeriod=PERIOD_H4; // Timeframe per il calcolo dell'indicatore
input datetime InpDateStart=D'2013.01.01 00:00'; // Data di inizio analisi
//--- buffer indicatore per candele ribassiste
double ExtBearBodyFirst[];
double ExtBearBodySecond[];
double ExtBearBodyEndFirst[];
double ExtBearBodyEndSecond[];
double ExtBearShadowFirst[];
double ExtBearShadowSecond[];
double ExtBearShadowEndFirst[];
double ExtBearShadowEndSecond[];
//--- indicator buffers for bullish candlesticks
double ExtBullBodyFirst[];
double ExtBullBodySecond[];
double ExtBullBodyEndFirst[];
double ExtBullBodyEndSecond[];
double ExtBullShadowFirst[];
double ExtBullShadowSecond[];
double ExtBullShadowEndFirst[];
double ExtBullShadowEndSecond[];
//--- variabili globali
datetime ExtTimeBuff[]; // più largo buffer di tempo del timeframe
int ExtSize=0; // grandezza del buffer tempo
int ExtCount=0; // indice dentro il buffer tempo
int ExtStartPos=0; // posizione iniziale per il calcolo dell'indicatore
bool ExtStartFlag=true; // flag ausiliaria per la ricezione della posizione iniziale
datetime ExtCurrentTime[1]; // ultimo orario di creazione della barra più ampia
datetime ExtLastTime; // ultimo orario dal timeframe più ampio, per cui viene eseguito il ca
bool ExtBearFlag=true; // flag per definire l'ordine di scrittura dei dato nei buffer indicat
bool ExtBullFlag=true; // flag per definire l'ordine di scrittura dei dato nei buffer indicat
int ExtIndexMax=0; // indice dell'elemento massimo nell' array
int ExtIndexMin=0; // indice dell'elemento minimo nell'array
int ExtDirectionFlag=0; // direzione del movimento di prezzo per la corrente candela
//--- spostamento tra il prezzo di apertura e di chiusura della candela per il corretto disegnament
//--- se i prezzi close ed open sono uguali, utilizza lo shift per una corretta visualizzazione
if(high[index_max]!=low[index_min])
FormCandleMain(ExtBearBodyFirst,ExtBearBodySecond,ExtBearShadowFirst,ExtBearShadowSecond,open
open[start]-ExtEmptyBodySize,high[index_max],low[index_min],start,count,ExtBea
else
FormCandleMain(ExtBearBodyFirst,ExtBearBodySecond,ExtBearShadowFirst,ExtBearShadowSecond,
open[start],open[start]-ExtEmptyBodySize,high[index_max],
high[index_max]-ExtEmptyBodySize,start,count,ExtBearFlag);
}
//+--------------------------------------------------------------------------------+
//| Riempie la fine della candela |
//+--------------------------------------------------------------------------------+
void FillCandleEnd(const double &open[],const double &close[],
const double &high[],const double &low[],
const int start,const int last,const int fill_index,
const int index_max,const int index_min)
{
//--- non disegnare in caso di barra singola
if(last-start==0)
return;
//--- se il prezzo di chiusura alla prima barra eccede quella dell'ultima barra, la candela è ribas
if(open[start]>close[last])
{
//--- genera la fine della candela
FormCandleEnd(ExtBearBodyEndFirst,ExtBearBodyEndSecond,ExtBearShadowEndFirst,ExtBearShadowEnd
open[start],close[last],high[index_max],low[index_min],fill_index,ExtBearFlag);
//--- esce dalla funzione
return;
}
//--- se il prezzo di chiusura alla prima barra è inferiore a quello dell'ultima barra, la candela
if(open[start]<close[last])
{
//--- genera la fine della candela
FormCandleEnd(ExtBullBodyEndFirst,ExtBullBodyEndSecond,ExtBullShadowEndFirst,ExtBullShadowEnd
close[last],open[start],high[index_max],low[index_min],fill_index,ExtBullFlag);
//--- esce dalla funzione
return;
}
//--- se siete in questa parte della funzione, il prezzo di apertura alla prima barra è pari a
//--- al prezzo di chiusura dell''ultima barra; tale candela è considerata ribassista
//--- genera la fine della candela
if(high[index_max]!=low[index_min])
FormCandleEnd(ExtBearBodyEndFirst,ExtBearBodyEndSecond,ExtBearShadowEndFirst,ExtBearShadowEnd
open[start]-ExtEmptyBodySize,high[index_max],low[index_min],fill_index,ExtBearF
else
FormCandleEnd(ExtBearBodyEndFirst,ExtBearBodyEndSecond,ExtBearShadowEndFirst,ExtBearShadowEnd
open[start]-ExtEmptyBodySize,high[index_max],high[index_max]-ExtEmptyBodySize,f
}
//+--------------------------------------------------------------------------------+
{
//--- nel caso in cui non ci siano ancora barre calcolate
if(prev_calculated==0)
{
//--- riceve l' orario di arrivo del frame's bar più grande
if(!GetTimeData())
return(0);
}
//--- imposta l'indicizzazione diretta
ArraySetAsSeries(time,false);
ArraySetAsSeries(high,false);
ArraySetAsSeries(low,false);
ArraySetAsSeries(open,false);
ArraySetAsSeries(close,false);
//--- variabile iniziale per il calcolo delle barre
int start=prev_calculated;
//--- se la barra viene generata, ricalcola il valore dell'indicatore su di essa
if(start!=0 && start==rates_total)
start--;
//--- Il ciclo per calcolare i valori degli indicatori
for(int i=start;i<rates_total;i++)
{
//--- riempie gli elementi del buffer indicatore per valori vuoti
FillIndicatorBuffers(i);
//--- esegue il calcolo per le barre iniziando dalla data InpDateStart
if(time[i]>=InpDateStart)
{
//--- definisce la posizione, dal quale i valori devono essere mostrati, per la prima volt
if(ExtStartFlag)
{
//--- conserva il numero di barre iniziali
ExtStartPos=i;
//--- definisce la prima data dal timeframe più grande che eccedente time[i]
while(time[i]>=ExtTimeBuff[ExtCount])
if(ExtCount<ExtSize-1)
ExtCount++;
//--- modifica il valore del flag per non eseguire nuovamente questo blocco
ExtStartFlag=false;
}
//--- controlla se ci sono ancora elementi nell'array
if(ExtCount<ExtSize)
{
//--- attende il valore del timeframe corrente per raggiungere quello del timeframe più
if(time[i]>=ExtTimeBuff[ExtCount])
{
//--- disegna la parte principale della candela (senza riempire l'area tra l'ultima
FillCandleMain(open,close,high,low,ExtStartPos,i-1,i-2,ExtIndexMax,ExtIndexMin);
//--- riempie la fine della candela (l'area tra l'ultima e la penultima barra)
FillCandleEnd(open,close,high,low,ExtStartPos,i-1,i-1,ExtIndexMax,ExtIndexMin);
if(current_period>=high_period)
{
Print("Error! Il valore del periodo dell'indicatore deve superare il valore del timeframe cor
return(false);
}
//--- se il periodo dell'indicatore è di una settimana o mese, il periodo è corretto
if(high_period>32768)
return(true);
//--- converte i valori del periodo in minuti
if(high_period>30)
high_period=(high_period-16384)*60;
if(current_period>30)
current_period=(current_period-16384)*60;
//--- il periodo dell'indicatore deve essere multiplo del timeframe su cui è visualizzato
if(high_period%current_period!=0)
{
Print("Error! Il valore del periodo dell' indicatore deve essere multiplo del valore del peri
return(false);
}
//--- il periodo dell'indicatore deve superare il timeframe su cui è visualizzato, di 3 o più volte
if(high_period/current_period<3)
{
Print("Error! Il periodo dell'indicatore dovrebbe superare l'attuale timeframe di 3 o più vol
return(false);
}
//--- Il periodo indicatore è corretto per il timeframe corrente
return(true);
}
//+--------------------------------------------------------------------------------+
//| Riceve i dati temporali dal lasso di tempo più ampio |
//+--------------------------------------------------------------------------------+
bool GetTimeData(void)
{
//--- resetta il valore dell' errore
ResetLastError();
//--- copia tutti i dati per il tempo corrente
if(CopyTime(Symbol(),InpPeriod,InpDateStart,TimeCurrent(),ExtTimeBuff)==-1)
{
//--- riceve il codice dell'errore
int code=GetLastError();
//--- stampa il messaggio d'errore
PrintFormat("Errore copia dei dati! %s",code==4401
? "Lo storico è ancora in fase di uploading!"
: "Code = "+IntegerToString(code));
//--- restituisce false per fare un nuovo tentativo di download dei dati
return(false);
}
//--- riceve la grandezza dell'array
ExtSize=ArraySize(ExtTimeBuff);
if(flag)
{
//--- genera la fine del corpo della candela
FormEnd(body_fst,body_snd,fst_value,snd_value,end);
//--- genera la fine dell'ombra della candela
FormEnd(shadow_fst,shadow_snd,fst_extremum,snd_extremum,end);
//--- cambia il valore della flag in quello opposto
flag=false;
}
else
{
//--- genera la fine del corpo della candela
FormEnd(body_fst,body_snd,snd_value,fst_value,end);
//--- genera la fine dell'ombra della candela
FormEnd(shadow_fst,shadow_snd,snd_extremum,fst_extremum,end);
//--- cambia il valore della flag in quello opposto
flag=true;
}
}
//+-------------------------------------------------------------------------------------+
//| Cancella la fine della candela (l'area tra l'ultima e la penultima |
//| barra) |
//+-------------------------------------------------------------------------------------+
void ClearEndOfBodyMain(const int ind)
{
ClearCandle(ExtBearBodyFirst,ExtBearBodySecond,ExtBearShadowFirst,ExtBearShadowSecond,ind,1);
ClearCandle(ExtBullBodyFirst,ExtBullBodySecond,ExtBullShadowFirst,ExtBullShadowSecond,ind,1);
}
//+--------------------------------------------------------------------------------+
//| Cancella la candela |
//+--------------------------------------------------------------------------------+
void ClearCandle(double &body_fst[],double &body_snd[],double &shadow_fst[],
double &shadow_snd[],const int start,const int count)
{
//--- controlla
if(count!=0)
{
//--- riempie il buffer indicatore con valori vuoti
ArrayFill(body_fst,start,count,INDICATOR_EMPTY_VALUE);
ArrayFill(body_snd,start,count,INDICATOR_EMPTY_VALUE);
ArrayFill(shadow_fst,start,count,INDICATOR_EMPTY_VALUE);
ArrayFill(shadow_snd,start,count,INDICATOR_EMPTY_VALUE);
}
}
//+--------------------------------------------------------------------------------+
//| Genera la parte principale della candela |
//+--------------------------------------------------------------------------------+
void FormMain(double &fst[],double &snd[],const double fst_value,
const double snd_value,const int start,const int count)
{
//--- controlla
if(count!=0)
{
//--- riempie il buffer indicatore con i valori
ArrayFill(fst,start,count,fst_value);
ArrayFill(snd,start,count,snd_value);
}
}
//+--------------------------------------------------------------------------------+
//| Genera la fine della candela |
//+--------------------------------------------------------------------------------+
void FormEnd(double &fst[],double &snd[],const double fst_value,
const double snd_value,const int last)
{
//--- riempie il buffer indicatore con i valori
ArrayFill(fst,last-1,2,fst_value);
ArrayFill(snd,last-1,2,snd_value);
}
//+--------------------------------------------------------------------------------+
//| _* Riempie gli elementi del buffer indicatore per valori vuoti |
//+--------------------------------------------------------------------------------+
void FillIndicatorBuffers(const int i)
{
//--- imposta un valore vuoto nella cella del buffer indicatore
ExtBearBodyFirst[i]=INDICATOR_EMPTY_VALUE;
ExtBearBodySecond[i]=INDICATOR_EMPTY_VALUE;
ExtBearShadowFirst[i]=INDICATOR_EMPTY_VALUE;
ExtBearShadowSecond[i]=INDICATOR_EMPTY_VALUE;
ExtBearBodyEndFirst[i]=INDICATOR_EMPTY_VALUE;
ExtBearBodyEndSecond[i]=INDICATOR_EMPTY_VALUE;
ExtBearShadowEndFirst[i]=INDICATOR_EMPTY_VALUE;
ExtBearShadowEndSecond[i]=INDICATOR_EMPTY_VALUE;
ExtBullBodyFirst[i]=INDICATOR_EMPTY_VALUE;
ExtBullBodySecond[i]=INDICATOR_EMPTY_VALUE;
ExtBullShadowFirst[i]=INDICATOR_EMPTY_VALUE;
ExtBullShadowSecond[i]=INDICATOR_EMPTY_VALUE;
ExtBullBodyEndFirst[i]=INDICATOR_EMPTY_VALUE;
ExtBullBodyEndSecond[i]=INDICATOR_EMPTY_VALUE;
ExtBullShadowEndFirst[i]=INDICATOR_EMPTY_VALUE;
ExtBullShadowEndSecond[i]=INDICATOR_EMPTY_VALUE;
}
ArrayPrint
S tampa un array di tipo semplice o una struttura semplice nel journal.
void ArrayPrint(
const void& array[], // array stampato
uint digits=_Digits, // numero di posti decimali
const string separator=NULL, // separatore dei valori dei campi della struttura
ulong start=0, // indice del primo elemento stampato
ulong count=WHOLE_ARRAY, // numero di elementi stampati
ulong flags=ARRAYPRINT_HEADER|ARRAYPRINT_INDEX|ARRAYPRINT_LIMIT|ARRAYPRINT_ALIGN
);
Parametri
array[]
[ in] A rray di tipo semplice o una struttura semplice.
digits=_Digits
[ in] Il numero di posti decimali per il tipo real. Il valore di default è _Digits.
separator=NULL
[in] S eparatore dei valori degli elementi del campo della struttura. Il valore di default LL
NU
significa una linea vuota. Uno spazio è usato come separatore in questo caso.
start=0
[ in] L 'indice del primo elemento stampato dell'array. E' stampato dall'indice zero per default
count=WHOLE_ARRAY
[in] Numero degli elementi dell'arrat da essere stampati. L 'intero array è visualizzato per default
(count=W H OLE_ARRAY).
flags=ARRAYPRINT_HEADER|ARRAYPRINT_INDEX|ARRAYPRINT_LIMIT|ARRAYPRINT_ALIGN
[in] Combinazione delle impostazioni delle flags in output mode. T utte le flags vengono abilitare
per default.:
o P EADER – stama headers per l'array struttura
ARRAY RINT_H
o ARRAYPRINT_L I M IT – stampa solo i primi 100 e gli ultimi 100 elementi dell'array. Usa se vuoi
Nota
ArrayPrint() non stampa tutti i campi array della struttura nel journal - i campi di array e puntatore
oggetto vengono saltati. Queste colonne semplicemente non vengono stampate per una
presentazione più conveniente. S e avete bisogno di stampare tutti i campi della struttura, è
necessario scrivere la propria funzione di stampa di massa con la formattazione desiderata.
Esempio:
// --- stampa i valori delle ultime 10 barre
MqlRates rates[];
if(CopyRates(_Symbol,_Period,1,10,rates))
{
ArrayPrint(rates);
Print("Check\n[time]\t[open]\t[high]\t[low]\t[close]\t[tick_volume]\t[spread]\t[real_volume]"
for(int i=0;i<10;i++)
{
PrintFormat("[%d]\t%s\t%G\t%G\t%G\t%G\t%G\t%G\t%I64d\t",i,
TimeToString(rates[i].time,TIME_DATE|TIME_MINUTES|TIME_SECONDS),
rates[i].open,rates[i].high,rates[i].low,rates[i].close,
rates[i].tick_volume,rates[i].spread,rates[i].real_volume);
}
}
else
PrintFormat("CopyRates failed, error code=%d",GetLastError());
//--- esempio per la stampa
/*
[time] [open] [high] [low] [close] [tick_volume] [spread] [real_volume]
[0] 2016.11.09 04:00:00 1.11242 1.12314 1.11187 1.12295 18110 10 17300175000
[1] 2016.11.09 05:00:00 1.12296 1.12825 1.11930 1.12747 17829 9 15632176000
[2] 2016.11.09 06:00:00 1.12747 1.12991 1.12586 1.12744 13458 10 9593492000
[3] 2016.11.09 07:00:00 1.12743 1.12763 1.11988 1.12194 15362 9 12352245000
[4] 2016.11.09 08:00:00 1.12194 1.12262 1.11058 1.11172 16833 9 12961333000
[5] 2016.11.09 09:00:00 1.11173 1.11348 1.10803 1.11052 15933 8 10720384000
[6] 2016.11.09 10:00:00 1.11052 1.11065 1.10289 1.10528 11888 9 8084811000
[7] 2016.11.09 11:00:00 1.10512 1.11041 1.10472 1.10915 7284 10 5087113000
[8] 2016.11.09 12:00:00 1.10915 1.11079 1.10892 1.10904 8710 9 6769629000
[9] 2016.11.09 13:00:00 1.10904 1.10913 1.10223 1.10263 8956 7 7192138000
Check
[time] [open] [high] [low] [close] [tick_volume] [spread] [real_volume]
[0] 2016.11.09 04:00:00 1.11242 1.12314 1.11187 1.12295 18110 10 17300175000
[1] 2016.11.09 05:00:00 1.12296 1.12825 1.1193 1.12747 17829 9 15632176000
[2] 2016.11.09 06:00:00 1.12747 1.12991 1.12586 1.12744 13458 10 9593492000
[3] 2016.11.09 07:00:00 1.12743 1.12763 1.11988 1.12194 15362 9 12352245000
[4] 2016.11.09 08:00:00 1.12194 1.12262 1.11058 1.11172 16833 9 12961333000
[5] 2016.11.09 09:00:00 1.11173 1.11348 1.10803 1.11052 15933 8 10720384000
[6] 2016.11.09 10:00:00 1.11052 1.11065 1.10289 1.10528 11888 9 8084811000
[7] 2016.11.09 11:00:00 1.10512 1.11041 1.10472 1.10915 7284 10 5087113000
[8] 2016.11.09 12:00:00 1.10915 1.11079 1.10892 1.10904 8710 9 6769629000
[9] 2016.11.09 13:00:00 1.10904 1.10913 1.10223 1.10263 8956 7 7192138000
*/
Guarda anche
F ileS ave, FileLoad
ArrayRange
La funzione restituisce il numero di elementi nella dimensione selezionata dell'array.
int ArrayRange(
const void& array[], // array per la verifica
int rank_index // indice della dimensione
);
Parametri
array[]
[ in] A rray controllato.
rank_index
[ in] Indice della dimensione.
Valore restituito
Numero di elementi nella selezionata dell'array.
Nota
Poiché gli indici iniziano da zero, il numero delle dimensioni di un array è una maggiore dell'indice
dell'ultima dimensione.
Esempio:
voidOnStart()
{
//--- crea un array quadri-dimensionale
double array[][5][2][4];
//--- imposta la grandezza della dimensione zero
ArrayResize(array,10,10);
//--- stampa le dimensioni
int temp;
for(int i=0;i<4;i++)
{
//--- riceve la grandezza della dimensione i
temp=ArrayRange(array,i);
//--- stampa
PrintFormat("dim = %d, range = %d",i,temp);
}
//--- Risultato
// dim = 0, range = 10
// dim = 1, range = 5
// dim = 2, range = 2
// dim = 3, range = 4
}
ArrayResize
La funzione imposta una nuova grandezza per la prima dimensione
int ArrayResize(
void& array[], // array passato per riferimento
int new_size, // nuova grandezza array
int reserve_size=0 // riserva valore grandezza (eccesso)
);
Parametri
array[]
[ out] Array per cui cambiare la grandezza.
new_size
[ in] uova grandezza per la prima dimensione.
N
reserve_size=0
[ in] G randezza distribuita per avere la riserva.
Valore restituito
S e eseguita correttamente, restituisce il conteggio di tutti gli elementi contenuti nell' array dopo il
ridimensionamento, in caso contrario, restituisce -1, e l'array non viene ridimensionato.
Nota
La funzione può essere applicata solo agli array dinamici. Va notato che non è possibile modificare la
grandezza degli array dinamici assegnati come buffers di indicatore dalla funzione S etIndexBuffer().
Per i buffers indicatore, tutte le operazioni di ridimensionamento vengono eseguite dal sottosistema
runtime del terminale.
Con una frequente allocazione di memoria, si raccomanda di utilizzare un terzo parametro che
imposta una riserva per ridurre il numero di allocazioni di memoria fisica. T utte le chiamate
successive di ArrayR esize non portano ad una riallocazione della memoria fisica, ma solo modificano
la grandezza della prima dimensione dell' array all'interno della memoria riservata. Va ricordato che il
terzo parametro verrà utilizzato solo durante l'allocazione di memoria fisica. Ad esempio:
ArrayResize(arr,1000,1000);
for(int i=1;i<3000;i++)
ArrayResize(arr,i,1000);
In questo caso, la memoria viene riallocata due volte, inizialmente, prima di inserire il ciclo di 3000-
elementi (la grandezza dell'array sarà impostata a 1000), e la seconda volta poi con i pari a 2000. S e
saltiamo il terzo parametro, ci saranno 2000 riallocazioni fisiche della memoria, che rallenteranno il
programma.
Esempio:
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- Contatori
ulong start=GetTickCount();
ulong now;
int count=0;
//--- Un array per la dimostrazione di una versione rapida
double arr[];
ArrayResize(arr,100000,100000);
//--- Controllare quanto velocemente funziona con la variante di riserva di memoria
Print("--- Test Fast: ArrayResize(arr,100000,100000)");
for(int i=1;i<=300000;i++)
{
//--- Impostare una nuova dimensione array che specifica la riserva di 100.000 elementi!
ArrayResize(arr,i,100000);
//--- Quando si raggiunge un numero tondo, mostrare la dimensione dell'array ed il tempo trascorso
if(ArraySize(arr)%100000==0)
{
now=GetTickCount();
count++;
PrintFormat("%d. ArraySize(arr)=%d Time=%d ms",count,ArraySize(arr),(now-start));
start=now;
}
}
//--- Ora mostra, quanto è lenta la versione senza riserve di memoria
double slow[];
ArrayResize(slow,100000,100000);
//---
count=0;
start=GetTickCount();
Print("---- Test Slow: ArrayResize(slow,100000)");
//---
for(int i=1;i<=300000;i++)
{
//--- Impostare una nuova dimensione array, ma senza la riserva aggiuntiva
ArrayResize(slow,i);
//--- Quando si raggiunge un numero tondo, mostrare la dimensione dell'array ed il tempo trascorso
if(ArraySize(slow)%100000==0)
{
now=GetTickCount();
count++;
PrintFormat("%d. ArraySize(slow)=%d Time=%d ms",count,ArraySize(slow),(now-start));
start=now;
}
}
}
//--- Un semplice risultato dello script
/*
Test_ArrayResize (EURUSD,H1) --- Test Fast: ArrayResize(arr,100000,100000)
Test_ArrayResize (EURUSD,H1) 1. ArraySize(arr)=100000 Time=0 ms
Test_ArrayResize (EURUSD,H1) 2. ArraySize(arr)=200000 Time=0 ms
Test_ArrayResize (EURUSD,H1) 3. ArraySize(arr)=300000 Time=0 ms
Test_ArrayResize (EURUSD,H1) ---- Test Slow: ArrayResize(slow,100000)
Test_ArrayResize (EURUSD,H1) 1. ArraySize(slow)=100000 Time=0 ms
Test_ArrayResize (EURUSD,H1) 2. ArraySize(slow)=200000 Time=0 ms
Test_ArrayResize (EURUSD,H1) 3. ArraySize(slow)=300000 Time=228511 ms
*/
Vedi anche
A rrayInitialize
ArrayInsert
Inserisce il numero specificato di elementi da un array sorgente ad uno ricevente a partire da un indice
specificato.
bool ArrayInsert(
void& dst_array[], // array ricevente
const void& src_array[], // array sorgente
uint dst_start, // indice dell'array ricevente da inserire
uint src_start=0, // indice dell'array sorgente da copiare
uint count=WHOLE_ARRAY // numero di elementi da inserire
);
Parametri
dst_array[]
[ in] [out] Array ricevente a cui devono essere aggiunti gli elementi.
src_array[]
[ in] Array sorgente da cui devono essere aggiunti gli elementi.
dst_start
[ in] Indice dell'array ricevente per l'inserimento di elementi dall'array sorgente.
src_start=0
[in] Indice dell'array ricevente, a partire dal quale gli elementi dell'array sorgente vengono presi
per l'inserimento.
count
[in] Numero di elementi da aggiungere dall'array sorgente. WH OLE_ARRAY indica tutti gli
elementi, dall'indice specificato fino alla fine dell'array.
Valore di ritorno
Restituisce true se ha successo, altrimenti - false. Per ottenere informazioni sull'errore, chiamare la
funzione GetLastError(). Possibili errori:
· 5052 – ERR_S M A LL _ARRAY (i parametri start e/o count sono impostati in modo errato o l'array
diverso, oppure esiste un array a grandezza fissa contenente oggetti classe o distruttori di
strutture),
· 4005 - ERR_S TRUC T_W ITH O BJEC TS _O R CL AS S (l'array non contiene strutture PO D e sta a
Nota
Se la funzione viene utilizzata per un array di grandezza fissa, la grandezza dell'array ricevente
stesso dst_array[] non cambia. A partire dalla posizione dst_start, gli elementi dell'array ricevente
vengono spostati a destra (l'ultimo counts degli elementi " viene fuori" ), mentre gli elementi copiati
dall'array sorgente prendono il loro posto.
Non è possibile inserire gli elementi negli array dinamici designati come buffer indicatore dalla
funzione S etIndexBuffer(). Per i buffer indicatori, tutte le operazioni di modifica della grandezza
vengono eseguite dal sottosistema di esecuzione del terminale.
Nell'array sorgente, gli elementi vengono copiati a partire dall'indice src_start. La grandezza
dell'array sorgente rimane invariata. Gli elementi da aggiungere all'array ricevente non sono
collegamenti agli elementi dell'array sorgente. Ciò significa che le successive modifiche degli
elementi in uno dei due array non si riflettono nel secondo.
Esempio:
//+------------------------------------------------------------------+
//| Funzione Start del programma di script |
//+------------------------------------------------------------------+
void OnStart()
{
//--- dichiara l'array a dimensione fissa e riempie i valori
int array_dest[10];
for(int i=0;i<10;i++)
{
array_dest[i]=i;
}
//--- array sorgente
int array_source[10];
for(int i=0;i<10;i++)
{
array_source[i]=10+i;
}
//--- mostra gli array prima di inserire gli elementi
Print("Prima di chiamare ArrayInsert()");
ArrayPrint(array_dest);
ArrayPrint(array_source);
//--- inserisce 3 elementi dall'array sorgente e mostra il nuovo set dell'array ricevente
ArrayInsert(array_dest,array_source,4,0,3);
Print("Dopo aver chiamato ArrayInsert()");
ArrayPrint(array_dest);
/*
Risultato dell'esecuzione
Prima di chiamare ArrayInsert()
0 1 2 3 4 5 6 7 8 9
Dopo aver chiamato ArrayInsert()
0 1 2 3 10 11 12 7 8 9
*/
Guarda anche
A rrayR emove, ArrayCopy, ArrayR esize, ArrayFree
ArrayRemove
R imuove il numero specificato di elementi dall'array iniziando con un indice specificato.
bool ArrayRemove(
void& array[], // array di qualsiasi tipo
uint start, // indice da cui parte la rimozione
uint count=WHOLE_ARRAY // numero di elementi
);
Parametri
array[]
[ in][out] A rray.
start
[ in] Indice, a partire dal quale vengono rimossi gli elementi dell'array.
count=WHOLE_ARRAY
[in] Numero di elementi rimossi. Il valore W H OLE_ARRAY significa la rimozione di tutti gli
elementi dall'indice specificato fino alla fine dell'array.
Valore di ritorno
Restituisce true se ha successo, altrimenti - false. Per ottenere informazioni sull'errore, chiamare la
funzione GetLastError(). Possibili errori:
· 5052 ERR_S M ALL _ARRAY (valore start troppo grande),
–
· 5056 ERR_S ERIES _ARRAY (l'array non può essere modificato, buffer indicatore),
–
Nota
S e la funzione viene utilizzata per un array di grandezza fissa, la grandezza dell'array non cambia: la
" coda" rimanente viene fisicamente copiata nella posizione start. Per una comprensione accurata di
come lavora la funzione, vedere l'esempio di seguito. Copia " fisica" significa che gli oggetti copiati
non vengono creati chiamando il costruttore o l'operatore di copia. Invece, viene copiata la
rappresentazione binaria dell'oggetto. Per questo motivo, non è possibile applicare la funzione
A rrayR emove() all'array di grandezza fissa contenente oggetti con il distruttore (l'errore
ERR_INVAL ID_ARRAY o ERR_S TRUCT_W ITH OBJECTS _OR CL AS S viene attivato). Quando si rimuove
un oggetto di questo tipo, il distruttore dovrebbe essere chiamato due volte - per l'oggetto originale
e per la sua copia.
N on è possibile rimuovere elementi dagli array dinamici designati come buffer indicatore dalla
funzione S etIndexBuffer(). Ciò provocherà l'errore ERR_S ERIES _ARRAY. Per i buffer indicatori, tutte
le operazioni di modifica della grandezza vengono eseguite dal sottosistema di esecuzione del
terminale.
Esempio:
//+------------------------------------------------------------------+
//| Funzione Start del programma di script |
//+------------------------------------------------------------------+
void OnStart()
{
//--- dichiara l'array a dimensione fissa e riempie i valori
int array[10];
for(int i=0;i<10;i++)
{
array[i]=i;
}
//--- mostra l'array prima di rimuovere gli elementi
Print("Prima di chiamare ArrayRemove()");
ArrayPrint(array);
// --- elimina 2 elementi dall'array e mostra il nuovo set
ArrayRemove(array,4,2);
Print("Dopo aver chiamato ArrayRemove()");
ArrayPrint(array);
/*
Risultato dell'esecuzione
Prima di chiamare ArrayRemove()
0 1 2 3 4 5 6 7 8 9
Dopo aver chiamato ArrayRemove()
0 1 2 3 6 7 8 9 8 9
*/
Guarda anche
A rrayInsert, ArrayCopy, ArrayR esize, ArrayFree
ArrayReverse
I nverte il numero specificato di elementi nell'array iniziando con un indice specificato.
bool ArrayReverse(
void& array[], // array di qualsiasi tipo
uint start=0, // indice da cui iniziare ad invertire l'array
uint count=WHOLE_ARRAY // numero di elementi
);
Parametri
array[]
[ in][out] A rray.
start=0
[ in] Indice da cui inizia l'inversione dell'array.
count=WHOLE_ARRAY
[in] Numero di elementi invertiti. S e W H OLE_ARRAY, tutti gli elementi dell'array vengono spostati
nel modo inverso a partire dall'indice specificato start fino alla fine dell'array.
Valore di ritorno
R estituisce true se ha successo, altrimenti - false.
Nota
La funzione ArrayS etAs S eries() non sposta fisicamente gli elementi dell'array. Invece, cambia solo la
direzione di indicizzazione all'indietro, per disporre l'accesso agli elementi come nelle timeseries. La
funzione ArrayR everse() sposta fisicamente gli elementi dell'array in modo che l'array sia " invertito" .
Esempio:
//+------------------------------------------------------------------+
//| Funzione Start del programma di script |
//+------------------------------------------------------------------+
void OnStart()
{
//--- dichiara l'array a dimensione fissa e riempie i valori
int array[10];
for(int i=0;i<10;i++)
{
array[i]=i;
}
//--- mostra l'array prima di invertire gli elementi
Print("Prima di chiamare ArrayReverse()");
ArrayPrint(array);
//--- inverte 3 elementi nell'array e mostra il nuovo set
ArrayReverse(array,4,3);
Print("Dopo aver chiamato ArrayReverse()");
ArrayPrint(array);
/*
Risultato dell'esecuzione
Prima di chiamare ArrayReverse()
0 1 2 3 4 5 6 7 8 9
Dopo aver chiamato ArrayReverse()
0 1 2 3 6 5 4 7 8 9
*/
Guarda anche
A rrayInsert, ArrayR emove, ArrayCopy, ArrayR esize, ArrayFree, ArrayGetAs S eries, ArrayS etAs S eries
ArraySetAsSeries
La funzione imposta il flag AS _S ERIES ad un oggetto di un array dinamico, E gli elementi verranno
indicizzati come in T imeS eries.
bool ArraySetAsSeries(
const void& array[], // array per riferimento
bool flag // true denota l'ordinamento invertito di indicizzazione
);
Parametri
array[]
[ in][out] A rray numerico da impostare.
flag
[ in] D irezione indicizzazione Array.
Valore restituito
La funzione restituisce true in caso di successo, altrimenti - false.
Nota
Il flag AS _S ERIES non può essere impostato per array multidimensionali o array statici (array, le cui
grandezze tra parentesi quadre sono preimpostate già in fase di compilazione). L ' indicizzazione
nelle timeseries si differenzia da array comune nel fatto che gli elementi delle timeseries sono
indicizzati a partire dalla fine verso l'inizio (dai dati più recenti ai più vecchi).
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//---- plot della Numerazione
Vedi anche
A ccesso alle timeseries, ArrayGetAs S eries
ArraySize
La funzione restituisce il numero di elementi di un array selezionato.
int ArraySize(
const void& array[] // array verificato
);
Parametri
array[]
[ in] Array di qualsiasi tipo.
Valore restituito
Value of int type.
Nota
Per un array unidimensionale, il valore che deve essere restituito da ArrayS ize è uguale a quello di
A rrayR ange(array, 0).
Esempio:
voidOnStart()
{
//--- crea gli array
double one_dim[];
double four_dim[][10][5][2];
//--- grandezze
int one_dim_size=25;
int reserve=20;
int four_dim_size=5;
//--- variabile ausiliaria
int size;
//--- alloca la memoria senza backup
ArrayResize(one_dim,one_dim_size);
ArrayResize(four_dim,four_dim_size);
//--- 1. Array uni-dimensionale
Print("+==========================================================+");
Print("Grandezze degli array:");
Print("1. Array uni-dimensionale ");
size=ArraySize(one_dim);
PrintFormat("Grandezza della dimensione Zero = %d, Grandezza dell'array = %d",one_dim_size,size)
//--- 2. array multidimensionale
Print("2. Array multidimensionale");
size=ArraySize(four_dim);
PrintFormat("Grandezza della dimensione Zero = %d, Grandezza dell'array = %d",four_dim_size,size
//--- grandezze delle dimensioni
int d_1=ArrayRange(four_dim,1);
int d_2=ArrayRange(four_dim,2);
int d_3=ArrayRange(four_dim,3);
Print("Controllo:");
Print("Dimensione Zero = Grandezza Array / (Prima dimensione * Seconda dimensione * Terza dimens
PrintFormat("%d = %d / (%d * %d * %d)",size/(d_1*d_2*d_3),size,d_1,d_2,d_3);
//--- 3. array uni-dimensionale con backup memoria
Print("3. Array uni-dimensionale con un backup memoria");
//--- raddoppia il valore
one_dim_size*=2;
//--- alloca la memoria con backup
ArrayResize(one_dim,one_dim_size,reserve);
//--- stampa la grandezza
size=ArraySize(one_dim);
PrintFormat("Grandezza con backup = %d, Attuale grandezza dell'array = %d",one_dim_size+reserve,
}
ArraySort
S orts the values in the first dimension of a multidimensional numeric array in the ascending order.
bool ArraySort(
void& array[] // array per l'ordinamento
);
Parametri
array[]
[ in][out] A rray numerido che deve essere messo in ordine.
Valore restituito
La funzione restituisce true in caso di successo, altrimenti - false.
Nota
A n array is always sorted in the ascending order irrespective of the AS _S ERIES flag value.
Functions ArrayS ort and ArrayBS earch accept any-dimensional arrays as a parameter. H owever,
searching and sorting are always applied to the first (zero) dimension.
Esempio:
#property description "L'indicatore analizza i dati per l'ultimo mese e disegna tutte le candele co
#property description "e larghi volumi tick. L'array volume tick è stato ordinato"
#property description "per definire tali candele. Le candele hanno i volumi che compongono il primo
#property description "percentuale dell'array è considerata piccola. Le candle hanno i volumi tick
#property description "l'ultima InpBigVolume percentuale dell'array sono considerate grandi."
//--- impostazioni indicatore
#property indicator_chart_window
#property indicator_buffers 5
#property indicator_plots 1
//--- plot
#property indicator_label1 "VolumeFactor"
#property indicator_type1 DRAW_COLOR_CANDLES
#property indicator_color1 clrDodgerBlue,clrOrange
#property indicator_style1 STYLE_SOLID
#property indicator_width1 2
//--- costanti predefinite
#define INDICATOR_EMPTY_VALUE 0.0
//--- parametri di input
input int InpSmallVolume=15; // Valore percentuale di volumi piccoli (<50)
input int InpBigVolume=20; // Valore percentuale di volumi grandi (>50)
//--- orario di inizio analisi (verrà slittato)
datetime ExtStartTime;
//--- buffers indicatore
double ExtOpenBuff[];
double ExtHighBuff[];
double ExtLowBuff[];
double ExtCloseBuff[];
double ExtColorBuff[];
//--- valori limite di volume per la visualizzazione delle candele
long ExtLeftBorder=0;
long ExtRightBorder=0;
//+--------------------------------------------------------------------------------+
//| Riceve i valori limite per i volumi tick |
//+--------------------------------------------------------------------------------+
bool GetVolumeBorders(void)
{
//--- variabili
datetime stop_time; // orario di fine della copia
long buff[]; // buffer per la copia
//--- l'orario di fine è quello corrente
stop_time=TimeCurrent();
//--- l'orario d'inizio è un mese prima di quello corrente
ExtStartTime=GetStartTime(stop_time);
//--- riceve i valori dei volumi tick
ResetLastError();
if(CopyTickVolume(Symbol(),Period(),ExtStartTime,stop_time,buff)==-1)
{
//--- fallimento nel ricevere i dati, restituizioe false per lanciare il comando di ricalcolo
PrintFormat("Fallimento nel ricevere i valori dei volumi tick. Codice Errore = %d",GetLastErr
return(false);
}
//--- calcola la grandezza dell'array
int size=ArraySize(buff);
//--- ordina l'array
ArraySort(buff);
//--- definisce i valori dei bordi sinistro e destro per i volumi tick
ExtLeftBorder=buff[size*InpSmallVolume/100];
ExtRightBorder=buff[(size-1)*(100-InpBigVolume)/100];
//--- esecuzione avvenuta
return(true);
}
//+--------------------------------------------------------------------------------+
//| Riceve i dati che sono di un mese in meno rispetto a quello passato |
//+--------------------------------------------------------------------------------+
datetime GetStartTime(const datetime stop_time)
{
//--- converte l'orario finale in tipo variabile di struttura MqlDateTime
MqlDateTime temp;
TimeToStruct(stop_time,temp);
//--- riceve i dati che sono un mese in meno
if(temp.mon>1)
temp.mon-=1; // il mese corrente non è il primo dell'anno, quindi, il numero di quello prece
else
{
temp.mon=12; // il mese corrente è il primo dell'anno, quindi, il numero di quello precedent
//--- riceve nuovi valori dei bordi destro e sinistro per i volumi
if(!GetVolumeBorders())
return(0);
}
//--- variabile di inizio per il calcolo della barra
int start=prev_calculated;
//--- lavora all'ultima barra se i valori degli indicatori sono già stati calcolati al tick precede
if(start>0)
start--;
//--- imposta l'indicizzazione nelle timeseries
ArraySetAsSeries(time,false);
ArraySetAsSeries(open,false);
ArraySetAsSeries(high,false);
ArraySetAsSeries(low,false);
ArraySetAsSeries(close,false);
ArraySetAsSeries(tick_volume,false);
//--- il loop di calcolo dei valori dell'indicatore
for(int i=start;i<rates_total;i++)
{
//--- riempie le candele partendo dalla data iniziale
if(ExtStartTime<=time[i])
{
//--- se il valore non è inferiore a quello del bordo destro, riempie la candela
if(tick_volume[i]>=ExtRightBorder)
{
//--- riceve i dati per il disegno della candela
ExtOpenBuff[i]=open[i];
ExtHighBuff[i]=high[i];
ExtLowBuff[i]=low[i];
ExtCloseBuff[i]=close[i];
//--- colore DodgerBlue
ExtColorBuff[i]=0;
//--- continua il loop
continue;
}
//--- riempie la candela se il valore non supera quello del bordo sinistro
if(tick_volume[i]<=ExtLeftBorder)
{
//--- riceve i dati per il disegno della candela
ExtOpenBuff[i]=open[i];
ExtHighBuff[i]=high[i];
ExtLowBuff[i]=low[i];
ExtCloseBuff[i]=close[i];
//--- Colore Orange
ExtColorBuff[i]=1;
//--- continua il loop
continue;
}
}
//--- imposta valori vuoti per le barre che non sono state incluse nel calcolo
ExtOpenBuff[i]=INDICATOR_EMPTY_VALUE;
ExtHighBuff[i]=INDICATOR_EMPTY_VALUE;
ExtLowBuff[i]=INDICATOR_EMPTY_VALUE;
ExtCloseBuff[i]=INDICATOR_EMPTY_VALUE;
}
//--- restituisce il valore di prev_calculated per la prossima chiamata
return(rates_total);
}
Vedi anche
A rrayBsearch
ArraySwap
Scambia il contenuto di due array dinamici dello stesso tipo. Per gli array multidimensionali, il numero
di elementi in tutte le dimensioni tranne la prima, dovrebbe corrispondere.
bool ArraySwap(
void& array1[], // primo array
void& array2[] // secondo array
);
Parametri
array1[]
[ in][out] A rray di tipo numerico.
array2[]
[ in][out] A rray di tipo numerico.
Valore di ritorno
Restituisce true se ha successo, altrimenti false. In questo caso, G etLastError() restituisce il codice
errore ERR_INVAL ID_ARRAY.
Nota
La funzione accetta array dinamici dello stesso tipo e delle stesse dimensioni tranne il primo. Per i
tipi integer, il segno viene ignorato, vale a dire char== uchar)
Esempio:
//+------------------------------------------------------------------+
//| Funzione Start programma Script |
//+------------------------------------------------------------------+
void OnStart()
{
//--- array per conservare le quotazioni
double source_array[][8];
double dest_array[][8];
MqlRates rates[];
//--- ottiene i dati delle ultime 20 candele sul corrente timeframe
int copied=CopyRates(NULL,0,0,20,rates);
if(copied<=0)
{
PrintFormat("CopyRates(%s,0,0,20,rates) fallito, errore=%d",
Symbol(),GetLastError());
return;
}
//--- imposta la grandezza dell'array per la quantità di dati copiati
ArrayResize(source_array,copied);
//--- riempie l'array rate_array_1[] per i dati da rates[]
for(int i=0;i<copied;i++)
{
source_array[i][0]=(double)rates[i].time;
source_array[i][1]=rates[i].open;
source_array[i][2]=rates[i].high;
source_array[i][3]=rates[i].low;
source_array[i][4]=rates[i].close;
source_array[i][5]=(double)rates[i].tick_volume;
source_array[i][6]=(double)rates[i].spread;
source_array[i][7]=(double)rates[i].real_volume;
}
//--- scambia dati tra source_array[] e dest_array[]
if(!ArraySwap(source_array,dest_array))
{
PrintFormat("ArraySwap(source_array,rate_array_2) fallito, codice errore=%d",GetLastError());
return;
}
//--- assicurarsi che l'array di origine sia diventato zero dopo lo swap
PrintFormat("ArraySwap() done: ArraySize(source_array)=%d",ArraySize(source_array));
//--- visualizzare i dati dell'array di destinazione dest_array[]
ArrayPrint(dest_array);
}
Guarda anche
A rrayCopy, ArrayFill, ArrayR ange, ArrayIs Dynamic
Funzioni di Conversione
Questo è un gruppo di funzioni che forniscono la conversione dei dati da un formato ad un altro.
La funzione NormalizeDouble() dev ' essere appositamente notata in quanto fornisce la necessaria
precisione della presentazione del prezzo. Nelle operazioni di trading, in alcun modo i prezzi non
normalizzati possono essere utilizzati se la loro precisione, anche di una cifra eccede quella richiesta
dal tal trade server.
Funzione Azione
CharT oS tring Conversione di un codice di simboli in una
stringa di un carattere
Funzione Azione
CharArrayT oS truct Copia l'array di tipo uchar sulla struttura POD
Vedi anche
L 'uso di una tabella Codici
CharToString
Conversione di un codice di simboli in una stringa di un-carattere.
string CharToString(
uchar char_code // codice numerico del simbolo
);
Parametri
char_code
[ in] Codice di simbolo ANS I.
Valore restituito
S tringa con un simbolo ANS I.
Vedi anche
S tring T oCharArray, S hortT oS tring, S tring GetCharacter
CharArrayToString
Esso copia e converte parte dell' array di tipo uchar in una stringa restituita.
string CharArrayToString(
uchar array[], // array
int start=0, // posizione d'inizio dell'array
int count=-1 // numero di simboli
uint codepage=CP_ACP // codice pagina
);
Parametri
array[]
[I n] Array di tipo uchar.
start=0
[ in] Posizione da cui si avvia la copia. Per impostazione predefinita, viene utilizzato 0.
count=-1
[in] Numero di elementi di array per la copia. Definisce la lunghezza di una stringa risultante. Il
valore predefinito è -1, il che significa la copia fino alla fine dell'array, o fino a terminale 0.
codepage=CP_ACP
[ in] Il valore del codice pagina. Per i codici pagina più usati, provvedere appropriate costanti.
Valore restituito
S tring.
Vedi anche
S tring T oCharArray, S hortArrayT oS tring, L 'uso di una tabella Codici
CharArrayToStruct
Copia l'array di tipo uchar sulla struttura POD.
bool CharArrayToStruct(
void& struct_object, // struttura
const uchar& char_array[], // array
uint start_pos=0 // posizione iniziale dell'array
);
Parametri
struct_object
[ in] R iferimento a qualsiasi tipo di struttura POD (contenente solo tipi di dati semplici).
char_array[]
[ in] array di tipo uchar.
start_pos=0
[ in] Posizione nell'array da cui inizia la copia dei dati.
Valore di ritorno
R eturns true if successful, otherwise false.
Vedi anche
S tring T oCharArray, S hortArrayT oS tring, S tructT oCharArray, Uso di Codepage, FileR eadS truct,
U nions (union), MathS wap
StructToCharArray
Copia struttura POD nell'array di tipo uchar.
bool StructToCharArray(
const void& struct_object, // struttura
uchar& char_array[], // array
uint start_pos=0 // posizione iniziale nell'array
);
Parametri
struct_object
[ in] R iferimento a qualsiasi tipo di S truttura POD (contenente solo tipi di dati semplici).
char_array[]
[ in] array di tipo uchar.
start_pos=0
[ in] Posizione nell'array a partire dalla quale vengono aggiunti i dati copiati.
Valore di ritorno
R eturns true if successful, otherwise false.
Note
Durante la copia, l'array dinamico si espande automaticamente (ArrayR esize) se non c'è abbastanza
spazio. S e l'array non può essere espanso fino al valore richiesto, la funzione restituisce un errore.
Vedi anche
String T oCharArray, S hortArrayT oS tring,CharArrayT oS truct, Uso di Codepage, FileW riteS truct,
Unions (union), MathS wap
ColorToARGB
La funzione converte il tipo colore in tipo uint per ottenere rappresentazione ARGB del colore. Formato
di colore ARGB viene utilizzato per generare una risorsa grafica, visualizzazione del testo, cos ì come
pure la classe libreria standard CCanvas.
uint ColorToARGB(
color clr, // colore convertito in formato color
uchar alpha=255 // canale alfa che gestisce la trasparenza del colore
);
Parametri
clr
[ in] Il valore del colore in variabile tipo di colore.
alpha
[in] Il valore del canale alfa usato per ricevere il colore nel formato ARGB. Il valore può essere
impostato da 0 (un colore di un pix el di primo piano non cambia la visualizzazione di uno
sottostante) fino a 255 (un colore di un pix el sottostante viene completamente sostituito dal pix el
di primo piano). La trasparenza del colore in termini percentuali è calcolata come (1-alpha/255) *
100%. I n altre parole, il valore minore del canale alfa porta ad un colore pi ù trasparente.
Valore restituito
Presentando il colore in formato ARGB dove Alfa, R osso, Verde, Blu valori (canale alfa, rosso, verde,
blu) sono impostati in serie, in quattro byte di tipo uint.
Nota
RGB è un formato di base e comunemente usato per la descrizione del colore del pix el su uno
schermo in computer grafica. I nomi dei colori di base sono utilizzati per impostare componenti di
colore rosso, verde e blu. Ogni componente è descritto da un byte specificando la saturazione di
colore nell'intervallo da 0 a 255 (0x00 a 0xFF in formato esadecimale). Poiché il colore bianco
contiene tutti i colori, è descritto come 0xFFFFFF, dove, ognuno di questi tre componenti viene
presentato dal valore massimo di 0xFF.
T uttavia, alcune operazioni richiedono di specificare la trasparenza del colore per descrivere
l'aspetto di un'immagine nel caso esso sia coperto dal colore con un certo grado di trasparenza. Il
concetto di canale alfa viene introdotto per tali casi. È implementato come un componente
aggiuntivo di formato RGB. La struttura di formato ARGB è riportata di seguito.
Valori ARGB sono tipicamente espressi utilizzando formato esadecimale con ogni coppia di cifre che
rappresentano i valori Alfa dei canali, rosso, verde e blu, i canali, rispettivamente. Ad esempio, il
colore 80FFFF00 rappresenta il 50,2% giallo opaco. Inizialmente, 0x80 imposta valore alfa a 50,2%,
come è 50,2% del valore 0xFF. Poi, la prima coppia FF definisce il valore massimo del componente
rosso; la prossima coppia FF è simile alla precedente, ma per la componente verde; la coppia finale
00 rappresenta il valore pi ù basso che il componente blu può avere (assenza di blu). La
combinazione di colori verde e rosso produce giallo. S e non si utilizza il canale alfa, la voce può
essere ridotta fino al 6 cifre RRVVBB, questo è il motivo per cui i valori del canale alfa vengono
memorizzati nei migliori bits di tipo uint.
A seconda del contesto, cifre esadecimali possono essere scritte con il prefisso '0x' o , per
'#'
Esempio:
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- imposta trasparenza
uchar alpha=0x55; // 0x55 significa 55/255=21.6 % di trasparenza
//--- deriva la conversione ad ARGB per il colore clrBlue
PrintFormat("0x%.8X - clrBlue",clrBlue);
PrintFormat("0x%.8X - clrBlue ARGB con alpha=0x55 (trasparenza 21.6%%)",ColorToARGB(clrBlue,alph
//--- deriva la conversione in ARGB per il colore clrGreen
PrintFormat("0x%.8X - clrGreen",clrGreen);
PrintFormat("0x%.8X - clrGreen ARGB con alpha=0x55 (trasparenza 21.6%%)",ColorToARGB(clrGreen,al
//--- deriva la conversione in ARGB per il colore clrRed
PrintFormat("0x%.8X - clrRed",clrRed);
PrintFormat("0x%.8X - clrRed ARGB con alpha=0x55 (trasparenza 21.6%%)",ColorToARGB(clrRed,alpha)
}
Vedi anche
R esources, R esourceCreate(), T ex tOut(), color type, char, short, int and long types
ColorToString
Converte il valore del colore in stringa di forma , , .
" R G B"
string ColorToString(
color color_value, // valore del clore
bool color_name // mostra o no il nome del colore
);
Parametri
color_value
[ in] Il valore del colore in variabile tipo di colore.
color_name
[in] S egno della necessità di restituire il nome del colore, se il nome del colore è identico a una
delle costanti colore predefinite.
Valore restituito
Presentazione stringa del colore come " R ,G,B" , dove R ,G e B sono costanti decimali tra 0 e 255
convertite in una stringa. S e il parametro color_name = true è impostato, si cercherà di convertire il
valore di colore in nome di un colore.
Esempio:
string clr=ColorToString(C'0,255,0'); // colore verde
Print(clr);
Vedi anche
S tring T oColor, ColorT oARGB
DoubleToString
Conversione valore numerico nella stringa di testo.
string DoubleToString(
double value, // numero
int digits=8 // numero di cifre dopo il punto decimale
);
Parametri
valore
[ in] alore di un floating point.
V
digits
[in] Formato accuratezza. S e il valore delle cifre è compreso tra 0 e 16, si otterrà una
presentazione di stringa di un numero con il numero specificato di cifre dopo il punto. S e il valore
delle cifre è compreso tra -1 e -16, si otterrà una rappresentazione di stringa di un numero nel
formato scientifico con il numero specificato di cifre dopo il punto decimale. In tutti gli altri casi il
valore stringa contiene 8 cifre dopo la virgola decimale.
Valore restituito
S tringa contenente una rappresentazione simbolo di un numero con la precisione specificata.
Esempio:
Print("DoubleToString(120.0 + M_PI) : ",DoubleToString(120.0+M_PI));
Print("DoubleToString(120.0 + M_PI,16) : ",DoubleToString(120.0+M_PI,16));
Print("DoubleToString(120.0 + M_PI,-16) : ",DoubleToString(120.0+M_PI,-16));
Print("DoubleToString(120.0 + M_PI,-1) : ",DoubleToString(120.0+M_PI,-1));
Print("DoubleToString(120.0 + M_PI,-20) : ",DoubleToString(120.0+M_PI,-20));
Vedi anche
N ormalizeDouble, S tring T oDouble
EnumToString
Conversione di un valore di enumerazione di qualsiasi tipo, in formato testo.
string EnumToString(
any_enum value // qualsiasi tipo di valore enumerazione
);
Parametri
valore
[I n] Qualsiasi tipo di valore di enumerazione.
Valore restituito
Una stringa con una rappresentazione testuale dell'enumerazione. Per ottenere il messaggio di
errore chiamare la funzione GetLastError().
Nota
La funzione può impostare i seguenti valori di errore nella variabile _LastError:
· ERR_INT ERNAL _ERR OR errore dell'ambiente di esecuzione
–
Esempio:
enum interval // enumerazione di costanti nominate
{
month=1, // intervallo un-mese
two_months, // due mesi
quarter, // tre mesi - un quarto
halfyear=6, // metà anno
year=12, // un anno - 12 mesi
};
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- Imposta l'intervallo di tempo pari ad un mese
interval period=month;
Print(EnumToString(period)+"="+IntegerToString(period));
ENUM_ORDER_TYPE type=ORDER_TYPE_BUY;
Print(EnumToString(type)+"="+IntegerToString(type));
// Risultato:
// mese=1
// quarto=3
// anno=12
// ORDER_TYPE_BUY=0
// ENUM_ORDER_TYPE::-1=-1
}
Vedi anche
Enumerazioni, Variabili di input
IntegerToString
Questa funzione converte i valori di tipo integer in una stringa di lunghezza specificata e restituisce la
stringa ottenuta.
string IntegerToString(
long number, // numero
int str_len=0, // lunghezza della stringa risultante
ushort fill_symbol=' ' // filler
);
Parametri
number
[ in] N umero per la conversione.
str_len=0
[in] Lunghezza della stringa. S e la lunghezza della stringa risultante è maggiore di quella
specificata, la stringa non viene tagliata. S e è inferiore, simboli riempitivi vengono aggiunti a
sinistra.
fill_symbol=' '
[ in] F iller s ymbol. Per impostazione predefinita è uno spazio.
Valore restituito
S tring.
Vedi anche
S tring T oInteger
ShortToString
Converte il codice del simbolo (unicode) in stringa di un-simbolo e restituisce la stringa risultante.
string ShortToString(
ushort symbol_code // simbolo
);
Parametri
symbol_code
[in] Codice simbolo. Invece del codice simbolo è possibile utilizzare la stringa letterale che
contiene un simbolo, o una stringa letterale con 2 byte di codice esadecimale corrispondente al
simbolo dalla tabella Unicode.
Valore restituito
S tring.
Vedi anche
S tring T oCharArray, CharT oS tring, S tring GetCharacter
ShortArrayToString
Esso copia parte dell' array in una stringa restituita.
string ShortArrayToString(
ushort array[], // array
int start=0, // posizione iniziale nell'array
int count=-1 // numero di simboli
);
Parametri
array[]
[ in] A rray di tipo ushort (analogo per wchar_t type).
start=0
[ in] Posizione, dal quale comincia la copia, Default - 0.
count=-1
[in] Numero di elementi dell' array da copiare. Definisce la lunghezza di una stringa risultante. Il
valore predefinito è -1, il che significa la copia fino alla fine dell'array, o fino a terminale 0.
Valore restituito
S tring.
Vedi anche
S tring T oS hortArray, CharArrayT oS tring, L 'uso di una tabella Codici
TimeToString
Conversione di un valore contenente tempo in secondi trascorsi dal . .
01 01 1970 in una stringa di
formato " aaaa.mm.gg hh:mi" .
string TimeToString(
datetime value, // numero
int mode=TIME_DATE|TIME_MINUTES // formato di output
);
Parametri
valore
[ in] T empo in secondi da 00:00 del 1970/01/01.
mode=TIME_DATE|TIME_MINUTES
[in] Modalità di input dati addizionale. Può essere una flag o flag combinate:
TI ME_DAT E ottiene come risultato " aaaa.mm.gg " ,
Valore restituito
S tring.
Vedi anche
S tring T oT ime, T imeT oS truct
NormalizeDouble
A rrotonda il numero floating point ad una precisione specificata.
double NormalizeDouble(
double value, // numero normalizzato
int digits // numero di cifre dopo il punto decimale
);
Parametri
valore
[ in] Valore con il floating point.
digits
[ in] F ormato di accuratezza, numero di cifre dopo il punto (0-8).
Valore restituito
V alore di tipo double con precisione preset.
Nota
Ivalori calcolati di S topLoss, T ak eProfit, e valori di prezzi di apertura da ordini pendenti, devono
essere normalizzati con la precisione, il cui valore può essere ottenuto da Digits().
Si prega di notare che quando si emette in output nel Journal usando la funzione Print(), un numero
normalizzato può contenere un maggior numero di cifre decimali che ci si aspetta. Ad esempio, per:
double a=76.671; // Un numero normalizzato con tre posti decimali
Print("Print(76.671)=",a); // Output come è
Print("DoubleToString(a,8)=",DoubleToString(a,8)); // Output con un preset di accuratezza
D oubleT oS tring(a,8)=76.67100000
Print(76.671)=76.67100000000001
Esempio:
double pi=M_PI;
Print("pi = ",DoubleToString(pi,16));
double pi_3=NormalizeDouble(M_PI,3);
Print("NormalizeDouble(pi,3) = ",DoubleToString(pi_3,16))
;
double pi_8=NormalizeDouble(M_PI,8);
Print("NormalizeDouble(pi,8) = ",DoubleToString(pi_8,16));
double pi_0=NormalizeDouble(M_PI,0);
Print("NormalizeDouble(pi,0) = ",DoubleToString(pi_0,16));
/*
Risultato:
pi= 3.1415926535897931
NormalizeDouble(pi,3)= 3.1419999999999999
NormalizeDouble(pi,8)= 3.1415926499999998
NormalizeDouble(pi,0)= 3.0000000000000000
*/
Vedi anche
D oubleT oS tring, T ipi R eali (double, float), R iduzione dei tipi
StringToCharArray
Copia in senso-simbolo una stringa convertita da Unicode ad ANS I, in un posto selezionato di un array
di tipo uchar. R estituisce il numero di elementi copiati.
int StringToCharArray(
string text_string, // stringa sorgente
uchar& array[], // array
int start=0, // posizione iniziale nell'array
int count=-1 // numero di simboli
uint codepage=CP_ACP // codice pagina
);
Parametri
text_string
[ in] S tringa da copiare .
array[]
[ out] A rray di tipo uchar.
start=0
[ in] Posizione da cui si avvia la copia. Default - 0.
count=-1
[in] Numero di elementi dell' array da copiare. Definisce lunghezza di una stringa risultante. Il
valore predefinito è -1, il che significa la copia fino alla fine dell'array, o fino a terminale 0.
T erminale 0 verrà anche copiato nell' array destinatario, in questo caso la grandezza di un array
dinamico può essere aumentata, se necessario, per la dimensione della stringa. S e la grandezza
dell' array dinamico supera la lunghezza della stringa, la dimensione dell' array non sarà ridotta.
codepage=CP_ACP
[ in] Il valore del codice pagina. Per i codici pagina più usati, provvedere appropriate costanti.
Valore restituito
Numero di elementi copiati.
Vedi anche
CharArrayT oS tring, S tring T oS hortArray, L 'uso di una tabella Codici
StringToColor
Converte stringhe " R ,G,B" o stringhe con il nome del colore in valore di tipo colore.
color StringToColor(
string color_string // rappresentazione stringa per colore
);
Parametri
color_string
[ in] R appresentazione S tring di un colore di , , , o il nome di uno dei
" R G B" W eb-colors predefiniti.
Valore restituito
Valore del colore.
Esempio:
color str_color=StringToColor("0,127,0");
Print(str_color);
Print((string)str_color);
//--- cambio il colore un po'
str_color=StringToColor("0,128,0");
Print(str_color);
Print((string)str_color);
Vedi anche
ColorT oS tring, ColorT oARGB
StringToDouble
La funzione converte la stringa contenente una rappresentazione simbolo del numero in numero di tipo
double.
double StringToDouble(
string value // stringa
);
Parametri
valore
[ in] S tringa contenente una rappresentazione simbolo di un numero.
Valore restituito
Valore di tipo double.
Vedi anche
N ormalizeDouble, T ipi R eali (double, float), R iduzione dei tipi
StringToInteger
La funzione converte una stringa contenente una rappresentazione simbolo di numero in numero di
tipo long (intero).
long StringToInteger(
string value // stringa
);
Parametri
valore
[ in] S tringa contenente un numero.
Valore restituito
V alore di tipo long.
Vedi anche
I ntegerT oS tring, T ipi R eali (double, float), R iduzione dei tipi
StringToShortArray
La funzione copia in senso-simbolo una stringa in un posto specificato di un array di tipo ushort.
R estituisce il numero di elementi copiati.
int StringToShortArray(
string text_string, // stringa sorgente
ushort& array[], // array
int start=0, // posizione iniziale nell'array
int count=-1 // numero di simboli
);
Parametri
text_string
[ in] S tringa da copiare
array[]
[ out] A rray of ushort type (analog of wchar_t type).
start=0
[ in] Posizione, da cui ha inizio la copia. Default - 0.
count=-1
[in] Numero di elementi dell' array da copiare. Definisce lunghezza di una stringa risultante. Il
valore predefinito è -1, che significa copiare fino alla fine dell' array o sino terminale 0. T erminal 0
sarà anche copiato nell'array destinazione, in questo caso la grandezza dell' array dinamico può
essere aumentata se necessario alla grandezza della stringa. S e la grandezza dell' array dinamico
supera la lunghezza della stringa, la dimensione dell' array non sarà ridotta.
Valore restituito
N umero di elementi copiati.
Vedi anche
S hortArrayT oS tring, S tring T oCharArray, L 'uso di una tabella Codici
StringToTime
T rasforma la stringa contenente il tempo e/o la data nel formato " aaaa.mm.gg [oo:mi]" in numero di
tipo datetime.
datetime StringToTime(
const string time_string // data della stringa
);
Parametri
time_string
[ in] S tringa in uno dei formati specificati:
Valore di ritorno
Valore di tipo datetime contenente il numero di secondi trascorsi dal 01.01.1970.
Nota
Qualsiasi sequenza di spazi e caratteri di tabulazione tra data ed ora è considerata come uno spazio
singolo per evitare un'ulteriore elaborazione di time_string prima di chiamare S tring T oT ime().
Guarda anche
T imeT oS tring, T imeT oS truct
StringFormat
I parametri ottenuti dalle funzioni formato e restituzione di stringa
string StringFormat(
string format, // stringa con la descrizione del formato
... ... // parametri
);
Parametri
(formato)
[in] S tringa contenente i metodi di formattazione. Le regole di formattazione sono le stesse per la
funzione PrintFormat.
...
[ in] Parametri, separati da virgola.
Valore restituito
S tring.
Esempio:
void OnStart()
{
//--- string variables
string output_string;
string temp_string;
string format_string;
//--- prepare the specification header
temp_string=StringFormat("Contract specification for %s:\n",_Symbol);
StringAdd(output_string,temp_string);
//--- int value output
int digits=(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);
temp_string=StringFormat(" SYMBOL_DIGITS = %d (number of digits after the decimal point)\n",
digits);
StringAdd(output_string,temp_string);
//--- double value output with variable number of digits after the decimal point
double point_value=SymbolInfoDouble(_Symbol,SYMBOL_POINT);
format_string=StringFormat(" SYMBOL_POINT = %%.%df (point value)\n",
digits);
temp_string=StringFormat(format_string,point_value);
StringAdd(output_string,temp_string);
//--- int value output
int spread=(int)SymbolInfoInteger(_Symbol,SYMBOL_SPREAD);
temp_string=StringFormat(" SYMBOL_SPREAD = %d (current spread in points)\n",
spread);
StringAdd(output_string,temp_string);
//--- int value output
int min_stop=(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);
temp_string=StringFormat(" SYMBOL_TRADE_STOPS_LEVEL = %d (minimal indention in points for Stop
min_stop);
StringAdd(output_string,temp_string);
//--- double value output without the fractional part
double contract_size=SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);
temp_string=StringFormat(" SYMBOL_TRADE_CONTRACT_SIZE = %.f (contract size)\n",
contract_size);
StringAdd(output_string,temp_string);
//--- double value output with default accuracy
double tick_size=SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);
temp_string=StringFormat(" SYMBOL_TRADE_TICK_SIZE = %f (minimal price change)\n",
tick_size);
StringAdd(output_string,temp_string);
//--- determining the swap calculation mode
int swap_mode=(int)SymbolInfoInteger(_Symbol,SYMBOL_SWAP_MODE);
string str_swap_mode;
switch(swap_mode)
{
case SYMBOL_SWAP_MODE_DISABLED: str_swap_mode="SYMBOL_SWAP_MODE_DISABLED (no swaps)"; break;
case SYMBOL_SWAP_MODE_POINTS: str_swap_mode="SYMBOL_SWAP_MODE_POINTS (in points)"; break;
case SYMBOL_SWAP_MODE_CURRENCY_SYMBOL: str_swap_mode="SYMBOL_SWAP_MODE_CURRENCY_SYMBOL (in mo
case SYMBOL_SWAP_MODE_CURRENCY_MARGIN: str_swap_mode="SYMBOL_SWAP_MODE_CURRENCY_MARGIN (in mo
case SYMBOL_SWAP_MODE_CURRENCY_DEPOSIT: str_swap_mode="SYMBOL_SWAP_MODE_CURRENCY_DEPOSIT (in
case SYMBOL_SWAP_MODE_INTEREST_CURRENT: str_swap_mode="SYMBOL_SWAP_MODE_INTEREST_CURRENT (as
case SYMBOL_SWAP_MODE_INTEREST_OPEN: str_swap_mode="SYMBOL_SWAP_MODE_INTEREST_OPEN (as the sp
case SYMBOL_SWAP_MODE_REOPEN_CURRENT: str_swap_mode="SYMBOL_SWAP_MODE_REOPEN_CURRENT (by reop
case SYMBOL_SWAP_MODE_REOPEN_BID: str_swap_mode="SYMBOL_SWAP_MODE_REOPEN_BID (by reopening po
}
//--- string value output
temp_string=StringFormat(" SYMBOL_SWAP_MODE = %s\n",
str_swap_mode);
StringAdd(output_string,temp_string);
//--- double value output with default accuracy
double swap_long=SymbolInfoDouble(_Symbol,SYMBOL_SWAP_LONG);
margin_maintenance);
StringAdd(output_string,temp_string);
//--- int value output
int freeze_level=(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_FREEZE_LEVEL);
temp_string=StringFormat(" SYMBOL_TRADE_FREEZE_LEVEL = %d (order freeze level in points)",
freeze_level);
StringAdd(output_string,temp_string);
Print(output_string);
Comment(output_string);
/* execution result
Contract specification for EURUSD:
SYMBOL_DIGITS = 5 (number of digits after the decimal point)
SYMBOL_POINT = 0.00001 (point value)
SYMBOL_SPREAD = 10 (current spread in points)
SYMBOL_TRADE_STOPS_LEVEL = 18 (minimal indention in points for Stop orders)
SYMBOL_TRADE_CONTRACT_SIZE = 100000 (contract size)
SYMBOL_TRADE_TICK_SIZE = 0.000010 (minimal price change)
SYMBOL_SWAP_MODE = SYMBOL_SWAP_MODE_POINTS (in points)
SYMBOL_SWAP_LONG = -0.700000 (buy order swap value)
SYMBOL_SWAP_SHORT = -1.000000 (sell order swap value)
SYMBOL_TRADE_MODE = SYMBOL_TRADE_MODE_FULL (no trade restrictions)
SYMBOL_VOLUME_MIN = 0.01 (minimal volume for a deal)
SYMBOL_VOLUME_STEP = 0.01 (minimal volume change step)
SYMBOL_VOLUME_MAX = 500 (maximal volume for a deal)
SYMBOL_TRADE_CALC_MODE = SYMBOL_CALC_MODE_FOREX (Forex)
SYMBOL_MARGIN_INITIAL = 0.00 (initial margin)
SYMBOL_MARGIN_MAINTENANCE = 0.00 (maintenance margin)
SYMBOL_TRADE_FREEZE_LEVEL = 0 (order freeze level in points)
*/
}
Vedi anche
PrintFormat, DoubleT oS tring,ColorT oS tring, T imeT oS tring
Funzioni di matematica
n insieme di funzioni matematiche e trigonometriche.
U
Funzione Azione
MathAbs Restituisce il valore assoluto (modulo) del
valore numerico specificato
Funzione Azione
MathIs ValidNumber V erifica la correttezza di un numero reale
MathAbs
La funzione restituisce il valore assoluto (modulo) di valore numerico specificato.
double MathAbs(
double value // valore numerico
);
Parametri
valore
[ in] umeric value.
N
Valore restituito
Valore di tipo double maggiore o uguale a zero.
Nota
A l posto della funzione MathAbs() è possibile utilizzare fabs().
MathArccos
La funzione restituisce l'arcocoseno di x nel campo da 0 a p in radianti.
double MathArccos(
double val // -1<val<1
);
Parametri
val
[A] I l valore val tra -1 e 1, il quale arcocoseno deve essere calcolato.
Valore restituito
A rcocoseno di un numero in radianti. S e val è minore di -1 o maggiore di 1, la funzione restituisce
N N a (valore indeterminato).
Nota
A l posto della funzione MathArccos() è possibile utilizzare acos().
Vedi anche
I tipi reali (double, float)
MathArcsin
La funzione restituisce l'arcoseno di x entro il range di -p /2 a p /2 radianti.
double MathArcsin(
double val // -1<valore<1
);
Parametri
val
[A] I l valore val tra -1 e 1, l'arcoseno che deve essere calcolato.
Valore restituito
Nota
A l posto della funzione MathArcsin() è possibile utilizzare asin().
Vedi anche
I tipi reali (double, float)
MathArctan
La funzione restituisce l'arcotangente di x . S e x è uguale a 0, la funzione restituisce 0.
double MathArctan(
double value // tangente
);
Parametri
valore
[ in] Un numero che rappresenta la tangente.
Valore restituito
Nota
A l posto della funzione MathArctan() è possibile utilizzare atan().
MathArctan2
R estituisce l'arcotangente del quoziente di due argomenti (x , y).
double MathArctan2(
const double y, // Coordinate Y
const double x // Coordinate X
);
Valore di ritorno
R estituisce true in caso di successo, altrimenti false.
Parametri
y
[ in] Le coordinate Y del punto.
x
[ in] Le coordinate X del punto.
Note
S i prega di notare quanto segue.
· Per (x, y) nel quadrante 1, il valore restituito sarà: 0 < θ < π/2.
· Per (x, y) nel quadrante 2, il valore restituito sarà: π/2 <θ≤π.
· Per (x, y) nel quadrante 3, il valore restituito sarà: -π <θ <-π/2.
· Per (x, y) nel quadrante 4, il valore restituito sarà: -π/2 <θ <0.
Se il valore del parametro X o Y è NaN, o se i valori dei parametri x ed y sono uguali al valore
PositiveInfinity o NegativeInfinity, il metodo restituisce il valore NaN.
MathClassify
Determines the type of a real number and returns a result as a value from the ENUM _FP_CL AS S
enumeration
ENUM_FP_CLASS MathClassify(
double value // real number
);
Parameters
value
[ in] T he real number to be check ed
Return Value
A value from the ENUM _FP_CL AS S enumeration
ENUM_FP_CLASS
ID Description
P
F _S UBN OR M A L A subnormal number which is closer to zero than
the smallest representable normal number
DBL _M IN ( 2. 2250738585072014e- 308)
P
F _N OR M A L A normal number in the range between
. 5 5 5
2 22 0738 8 072014 e-308 and
1. 7976931348623158e+308
P
F _Z R E O A positive or a negative zero
P
F _INFINIT E A number which cannot be represented by the
appropriate type, positive or negative infinity
P
F _NAN N ot a number.
Esempio:
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- test NaN
double nan=double("nan");
PrintFormat("Test NaN: %G is %s, MathIsValidNumber(NaN)=%s",
nan,
EnumToString(MathClassify(nan)),
(string)MathIsValidNumber(nan));
//--- test infinity
double inf=double("inf");
PrintFormat("Test Inf: %G is %s, MathIsValidNumber(inf)=%s",
inf,
EnumToString(MathClassify(inf)),
(string)MathIsValidNumber(inf));
//--- test normal value
double normal=1.2345e6;
PrintFormat("Test Normal: %G is %s, MathIsValidNumber(normal)=%s",
normal,
EnumToString(MathClassify(normal)),
(string)MathIsValidNumber(normal));
//--- test subnormal value
double sub_normal=DBL_MIN/2.0;
PrintFormat("Test Subnormal: %G is %s, MathIsValidNumber(sub_normal)=%s",
sub_normal,
EnumToString(MathClassify(sub_normal)),
(string)MathIsValidNumber(sub_normal));
//--- test zero value
double zero=0.0/(-1);
PrintFormat("Test Zero: %G is %s, MathIsValidNumber(zero)=%s",
zero,
EnumToString(MathClassify(zero)),
(string)MathIsValidNumber(zero));
}
/*
Result:
Test NaN: NAN is FP_NAN, MathIsValidNumber(NaN)=false
Test Inf: INF is FP_INFINITE, MathIsValidNumber(inf)=false
Test Normal: 1.2345E+06 is FP_NORMAL, MathIsValidNumber(normal)=true
Test Subnormal: 1.11254E-308 is FP_SUBNORMAL, MathIsValidNumber(sub_normal)=true
Test Zero: -0 is FP_ZERO, MathIsValidNumber(zero)=true
*/
//+------------------------------------------------------------------+
See also
R eal types (double, float), MathIs ValidNumber
MathCeil
La funzione restituisce un valore numerico intero più vicino dall'alto.
double MathCeil(
double val // numero
);
Parametri
val
[ in] umeric value.
N
Valore restituito
Valore numerico che rappresenta il più piccolo intero che supera o è uguale a val.
Nota
A l posto della funzione MathCeil() si può usare ceil().
MathCos
La funzione restituisce il coseno di un angolo.
double MathCos(
double value // numero
);
Parametri
valore
[ in] Angolo in radianti.
Valore restituito
V alore di tipo double compreso tra -1 e 1.
Nota
I nvece di MathCos() è possibile utilizzare cos().
MathExp
La funzione restituisce il valore di e elevato alla potenza di d.
double MathExp(
double value // potenza per il numero e
);
Parametri
valore
[ in] Un numero che specifica la potenza.
Valore restituito
Un certo numero di tipo double. All' overflow, la funzione restituisce INF (infinito), in caso di perdita
orgine MathEx p restituisce 0.
Nota
A l posto di MathEx p() è possibile utilizzare ex p().
Vedi anche
I tipi reali (double, float)
MathFloor
La funzione restituisce un valore numerico intero più vicino dal basso.
double MathFloor(
double val // numero
);
Parametri
val
[ in] umeric value.
N
Valore restituito
U n valore numerico che rappresenta il numero intero che è minore o uguale a val.
Nota
I nvece di MathFloor() è possibile utilizzare floor().
MathLog
La funzione restituisce un logaritmo naturale.
double MathLog(
double val // valore da cui prendere il logaritmo
);
Parametri
val
[ in] Valore logaritmo in cui va trovato.
Valore restituito
Il logaritmo naturale di val in caso di successo. S e val è negativo, la funzione restituisce NaN (valore
indeterminato). S e val è uguale a 0, la funzione restituisce INF (infinito).
Nota
I nvece di MathLog() è possibile utilizzare log().
Vedi anche
I tipi reali (double, float)
MathLog
R estituisce il logaritmo di un numero da base 10.
double MathLog10(
double val // numero da cui prendere il logaritmo
);
Parametri
val
[ in] Valore numerico del logaritmo comune, che deve essere calcolato.
Valore restituito
Il logaritmo comune in caso di successo. S e val è negativo, la funzione restituisce a
N N (valore
indeterminato). S e val è uguale a 0, la funzione restituisce INF (infinito).
Nota
I nvece di MathLog 10() è possibile utilizzare log 10().
Vedi anche
I tipi reali (double, float)
MathMax
La funzione restituisce il valore massimo di due valori.
double MathMax(
double value1, // primo valore
double value2 // secondo valore
);
Parametri
value1
[ in] Primo valore numerico.
value2
[ in] S econdo valore numerico.
Valore restituito
I l più grande dei due valori.
Nota
Invece di Mathmax () è possibile utilizzare fmax (). Functions fmax (), fmin(), MathMax (), MathMin()
può lavorare con tipi interi senza fare il loro typecasting per il tipo double.
S e i parametri di tipi diversi vengono passati in una funzione, il parametro del tipo minore è
automaticamente castato(da " casting " ) al tipo principale. Il tipo del valore di ritorno corrisponde al
tipo principale.
S e i dati dello stesso tipo sono passati, nessun casting viene eseguito.
MathMin
La funzione restituisce il valore minimo di due valori.
double MathMin(
double value1, // primo valore
double value2 // secondo valore
);
Parametri
value1
[ in] Primo valore numerico.
value2
[ in] S econdo valore numerico.
Valore restituito
I l più piccolo dei due valori.
Nota
Invece di MathMin() è possibile utilizzare fmin(). Le funzioni fmax (), fmin(), MathMax (), MathMin()
possono lavorare con tipi interi senza fare il typecasting di queste al tipo double.
S e i parametri di tipi diversi vengono passati in una funzione, il parametro del tipo minore è
automaticamente castato(da " casting " ) al tipo principale. Il tipo del valore di ritorno corrisponde al
tipo principale.
S e i dati dello stesso tipo sono passati, nessun casting viene eseguito.
MathMod
La funzione restituisce il resto della divisione reale di due numeri.
double MathMod(
double value, // valore dividendo
double value2 // valore divisore
);
Parametri
valore
[ in] alore dividendo.
V
value2
[ in] alore Divisore.
V
Valore restituito
La funzione MathMod calcola il valore reale di f di val / y tale che val = i * y + f, dove i è un numero
intero, f ha lo stesso segno val, ed il valore assoluto di f è minore del valore assoluto di y.
Nota
A l posto di MathMod() è possibile utilizzare fmod().
MathPow
La funzione eleva una base per una potenza specificata.
double MathPow(
double base, // base
double exponent // valore dell'esponente
);
Parametri
base
[ in] ase.
B
esponente
[ in] Valore esponente.
Valore restituito
Valore della base elevato alla potenza specificata.
Nota
A l posto di MathPow() è possibile utilizzare pow().
MathRand
R estituisce un numero intero pseudocasuale compreso tra 0 e 32767.
int MathRand();
Valore restituito
I l valore intero compreso tra 0 e 32767.
Nota
Prima della prima chiamata della funzione, è necessario chiamare MathS rand per impostare il
generatore di numeri pseudocasuali allo stato iniziale.
Nota
I nvece di MathR and() è possibile utilizzare rand().
MathRound
La funzione restituisce un valore arrotondato al numero intero più vicino al valore numerico
specificato.
double MathRound(
double value // valore da arrotondare
);
Parametri
valore
[ in] Valore numerico prima di arrotondare.
Valore restituito
V alore arrotondato fino al numero intero più vicino.
Nota
I nvece di MathR ound() è possibile utilizzare round().
MathSin
R estituisce il seno di un angolo specificato.
double MathSin(
double value // argomento in radianti
);
Parametri
valore
[ in] Angolo in radianti.
Valore restituito
S eno di un angolo misurato in radianti. R estituisce il valore compreso tra -1 e 1.
Nota
I nvece di MathS in() è possibile utilizzare sin().
MathSqrt
R estituisce la radice quadrata di un numero.
double MathSqrt(
double value // numero positivo
);
Parametri
valore
[ in] Valore numerico positivo.
Valore restituito
R adice quadrata del valore. S e il valore è negativo, MathS qrt restituisce NaN (valore indeterminato).
Nota
A l posto di MathS qrt() è possibile utilizzare s qrt().
Vedi anche
I tipi reali (double, float)
MathSrand
Consente di impostare il punto di partenza per la generazione di una serie di interi pseudocasuali.
void MathSrand(
int seed // numero di inizializzazione
);
Parametri
seme
[ in] Il numero di partenza per la sequenza di numeri casuali.
Valore restituito
N essun valore restituito.
Nota
La funzione MathR and() è usata per generare una sequenza di numeri pseudocasuali. La chiamata di
MathS rand() con un certo numero di inizializzazione consente di produrre sempre la stessa sequenza
di numeri pseudocasuali.
Initialization of the random number generator using MathS rand() for indicators and Ex pert Advisors
is better performed in the OnInit() handler; it saves you from the following multiple restarts of the
generator in OnT ick () and OnCalculate().
Esempio:
#property description "L'indicatore mostra il teorema del limite centrale, che dice:"
#property description "La somma di un numero sufficientemente grande di variabili casuali debolment
#property description "avente approssimativamente uguale magnitudo (nessuno degli addendi dominanti
#property description "o rende un contributo determinante alla somma), ha una distribuzione vicina
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- Proprietà della costruzione grafica
#property indicator_label1 "Label"
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_color1 clrRoyalBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 5
//--- Una variabile di input
input int sample_number=10;
{
//--- Il resto della divisione per 7 restituità un valore da 0 a 6
rand_index+=MathRand()%7;
}
//--- Incrementa il valore nel numero della cella rand_index by 1
LabelBuffer[rand_index]++;
}
//--- Esce dall'handoler OnCalculate()
return(rates_total);
}
MathTan
La funzione restituisce la tangente di un numero.
double MathTan(
double rad // argomento in radianti
);
Parametri
rad
[ in] Angolo in radianti.
Valore restituito
T angente di rad. S e rad è maggiore o uguale a 263, o inferiore o uguale a -263, una perdita di
significatività del risultato si verifica, nel qual caso la funzione restituisce un numero indefinito.
Nota
A l posto di MathT an() è possibile utilizzare tan().
Vedi anche
I tipi reali (double, float)
MathIsValidNumber
Verifica la correttezza di un numero reale.
bool MathIsValidNumber(
double number // numero da verificare
);
Parametri
number
[ in] Valore numerico controllato.
Valore restituito
R estituisce true se il valore controllato è un numero accettabile reale. S e il valore selezionato è un
infinito più o meno, o " non un numero" (NaN), la funzione restituisce il valore false.
Esempio:
double abnormal=MathArcsin(2.0);
if(!MathIsValidNumber(abnormal)) Print("Attenzione! MathArcsin(2.0) = ",abnormal);
Vedi anche
R eal types (double, float)
MathExpm1
R eturns the value of the ex pression MathEx p(x )-1.
double MathExpm1(
double value // power for the number e
);
Parameters
value
[ in] T he number specifying the power.
Return Value
A value of the double type. In case of overflow the function returns INF (infinity), in case of
underflow MathEx pm1 returns 0.
Note
At values of x close to 0, the MathEx pm1(x ) function generates much more accurate values than the
MathEx p(x )-1 function.
I nstead of the MathEx pm1() function you can use the ex pm1() function.
See also
R eal types (double, float)
MathLog1p
R eturns the value of the ex pression MathLog(1+x ).
double MathLog1p(
double value // value to take the logarithm
);
Parameters
value
[ in] T he value, the logarithm of which is to be calculated.
Return Value
The natural logarithm of the value (value + 1) if successful. If value is < -1, the function returns a
N N
(undefined value). If value is equal to -1, the function returns INF (infinity).
Note
At values of x close to 0, the MathLog 1p(x ) function generates much more accurate values than the
MathLog(1+x ) function.
I nstead of the MathLog 1p() function you can use the log 1p() function.
See also
R eal types (double, float)
MathArccosh
R eturns the hyperbolic arccosine.
double MathArccosh(
double value // 1 <= value < ∞
);
Parameters
value
[ in] T he value, the hyperbolic arccosine of which is to be calculated.
Return Value
The hyperbolic arccosine of the number. If value is less than +1, the function returns NaN (undefined
value).
Note
I nstead of the MathArccosh() function you can use the acosh() function.
See also
R eal types (double, float)
MathArcsinh
R eturns the hyperbolic arcsine.
double MathArcsinh(
double value // -∞ < value < +∞
);
Parameters
val
[ in] T he value, the hyperbolic arcsine of which is to be calculated.
Return Value
T he hyperbolic arcsine of the number.
Note
I nstead of the MathArcsinh() function you can use the asinh() function.
See also
R eal types (double, float)
MathArctanh
R eturns the hyperbolic arctangent.
double MathArctanh(
double value // value in the range of -1 < value < 1
);
Parameters
value
[ in] umber within the range of -1
N < value < 1, which represents the tangent.
Return Value
T he hyperbolic arctangent of the number.
Note
I nstead of the MathArctanh() function you can use the atanh() function.
MathCosh
R eturns the hyperbolic cosine of the number.
double MathCosh(
double value // number
);
Parameters
value
[ in] alue.
V
Return Value
T he hyperbolic cosine of the number, value within the range of +1 to positive infinity.
Note
I nstead of the MathCosh() function you can use the cosh() function.
MathSinh
R eturns the hyperbolic sine of the number.
double MathSinh(
double value // number
);
Parameters
value
[ in] alue.
V
Return Value
T he hyperbolic sine of the number.
Note
I nstead of the MathS inh() function you can use the sinh() function.
MathTanh
R eturns the hyperbolic tangent of the number.
double MathTanh(
double value // number
);
Parameters
value
[ in] alue.
V
Return Value
T he hyperbolic tangent of the number, value within the range of -1 to +1.
Note
I nstead of the MathT anh() function you can use the tanh() function.
See also
R eal types (double, float)
MathSwap
Cambia l'ordine dei byte nei valori di tipo ushort.
ushort MathSwap(
ushort value // valore
);
Parametri
valore
[ in] Valore per la modifica dell'ordine dei byte.
Valore di ritorno
valore ushort con l'ordine dei byte inverso.
MathSwap
Cambia l'ordine dei byte nel tipo di valore uint.
uint MathSwap(
uint value // valore
);
Parametri
valore
[ in] Valore per la modifica dell'ordine dei byte.
Valore di ritorno
valore uint con l'ordine dei byte inverso.
MathSwap
Cambia l'ordine dei byte nel tipo di valore ulong.
ulong MathSwap(
ulong value // valore
);
Parametri
valore
[ in] Valore per la modifica dell'ordine dei byte.
Valore di ritorno
valore ulong con l'ordine dei byte inverso.
Funzioni Stringa
Questo è un gruppo di funzioni destinate a lavorare con i dati del tipo stringa.
Funzione Azione
S tring Add A ggiunge una stringa alla fine di un'altra stringa
Funzione Azione
S tring T rimLeft Taglia caratteri di alimentazione di linea, spazi
e le schede nella parte sinistra della stringa
StringAdd
La funzione aggiunge una sottostringa alla fine di una stringa.
bool StringAdd(
string& string_var, // stringa, al quale aggiungiamo
string add_substring // stringa, che viene aggiunta
);
Parametri
string_var
[ in] [out] S tringa, a cui si aggiunge un'altra.
add_substring
[ in] S tringa che viene aggiunta alla fine di una stringa di origine.
Valore restituito
In caso di successo restituisce true, altrimenti false. Al fine di ottenere un codice di errore, deve
essere chiamata la funzione GetLastError().
Esempio:
voidOnStart()
{
long length=1000000;
string a="a",b="b",c;
//--- primo metodo
uint start=GetTickCount(),stop;
long i;
for(i=0;i<length;i++)
{
c=a+b;
}
stop=GetTickCount();
Print("tempo per 'c = a + b' = ",(stop-start)," millisecondi, i = ",i);
{
StringConcatenate(c,a,b);
}
stop=GetTickCount();
Print("time for 'StringConcatenate(c,a,b)' = ",(stop-start)," milliseconds, i = ",i);
}
Vedi anche
S tringConcatenate, S tring S plit, S tring S ubstr
StringBufferLen
La funzione restituisce la dimensione del buffer allocato per la stringa.
int StringBufferLen(
string string_var // stringa
)
Parametri
string_var
[ in] S tring.
Valore restituito
Il valore 0 significa che la stringa è costante e la dimensione del buffer non può essere modificata. -
1 significa che la stringa appartiene al terminale client, e la modifica del contenuto del buffer può
avere risultati indeterminati.
Esempio:
voidOnStart()
{
long length=1000;
string a="a",b="b";
//---
long i;
Print("prima: StringBufferLen(a) = ",StringBufferLen(a),
" StringLen(a) = ",StringLen(a));
for(i=0;i<length;i++)
{
StringAdd(a,b);
}
Print("dopo: StringBufferLen(a) = ",StringBufferLen(a),
" StringLen(a) = ",StringLen(a));
}
Vedi anche
S tring Add, S tring Init, S tringLen, S tring Fill
StringCompare
La funzione confronta due stringhe e restituisce il risultato del confronto sottoforma di numero intero.
int StringCompare(
const string& string1, // la prima stringa nel confronto
const string& string2, // la seconda stringa nel confronto
bool case_sensitive=true // selezione modalità di sensibilità maiuscole/minuscole
);
Parametri
string1
[ in] la prima stringa.
string2
[ in] la seconda stringa.
case_sensitive=true
[in] Modalità di selezione sensibilità maiuscole/minuscole. S e è vero, allora " A" >" a" . S e è falso,
allora " A" =" a" . Per impostazione predefinita, il valore è uguale a true.
Valore restituito
· -1 (meno uno), se string 1<string 2
· 0 (zero), se string 1=string 2
· 1 (uno), se string 1>string 2
Nota
Le stringhe sono confrontate simbolo per simbolo, i simboli sono confrontati in ordine alfabetico
secondo la tabella codici corrente.
Esempio:
voidOnStart()
{
//--- chi è più grande - apple oppure home?
string s1="Apple";
string s2="home";
{
if(result2<0)PrintFormat("Confronto case insensitive: %s < %s",s1,s2);
else PrintFormat("Confronto case insensitive: %s = %s",s1,s2);
}
/* Risultato:
Confronto case-sensitive: Apple < home
Confronto case-insensitive: Apple < home
*/
}
Vedi anche
T ipo S tringa, CharT oS tring(), S hortT oS tring(), S tring T oCharArray(), S tring T oS hortArray(),
S tring GetCharacter(), Uso del Codepage
StringConcatenate
La funzione, forma una serie di parametri passati e restituisce la grandezza della stringa formata. I
parametri possono essere di qualsiasi tipo. Il numero di parametri non può essere minore di 2 o più di
64.
int StringConcatenate(
string& string_var, // stringa da formare
void argument1 // primo parametro di un qualsiasi tipo semplice
void argument2 // secondo parametro di un qualsiasi tipo semplice
... // parametro successivo di qualsiasi tipo semplice
);
Parametri
string_var
[ out] S tringa che verrà formata come risultato della concatenazione.
argumentN
[ in] Qualsiasi valore separato da virgola. Da 2 a 63 parametri di qualsiasi tipo semplice.
Valore restituito
Restituisce la lunghezza della stringa, formata dalla concatenazione di parametri trasformati in tipo
stringa. I parametri vengono trasformati in stringhe secondo le stesse regole Print() e Comment().
Vedi anche
S tring Add, S tring S plit, S tring S ubstr
StringFill
R iempie la stringa selezionata con simboli specificati.
bool StringFill(
string& string_var, // stringa da riempire
ushort character // simbolo che riempirà la stringa
);
Parametri
string_var
[ in][out] S tringa, che verrà compilata dal simbolo selezionato.
character
[ in] S imbolo, con la quale la stringa verrà compilata.
Valore restituito
In caso di successo restituisce true, in caso contrario - false. Per ottenere il codice di errore
chiamare GetLastError().
Nota
La compilazione di una stringa in luogo significa che i simboli vengono inseriti direttamente nella
stringa senza le operazioni transitorie di creazione di nuova stringa o la copia. Ciò consente di
risparmiare il tempo di funzionamento.
Esempio:
voidOnStart()
{
string str;
StringInit(str,20,'_');
Print("str = ",str);
StringFill(str,0);
Print("str = ",str,": StringBufferLen(str) = ", StringBufferLen(str));
}
// Risultato
// str = ____________________
// str = : StringBufferLen(str) = 20
//
Vedi anche
S tring BufferLen, S tringLen, S tring Init
StringFind
R icerca di una sottostringa in una stringa.
int StringFind(
string string_value, // stringa in cui si fa ricerca
string match_substring, // ciò che viene cercato
int start_pos=0 // da quale posizione parte la ricerca
);
Parametri
string_value
[ in] S tringa, in cui la ricerca viene effettuata.
match_substring
[ in] sottostringa cercata.
start_pos=0
[ in] Posizione nella stringa, da dove viene avviata la ricerca.
Valore restituito
Restituisce il numero di posizione in una stringa, da dove inizia la sottostringa ricercata, ooppure
restituisce -1, se la sottostringa non viene trovata.
Vedi anche
S tring S ubstr, S tring GetCharacter, S tringLen, S tringLen
StringGetCharacter
R estituisce il valore di un simbolo, che si trova nella posizione specificata di una stringa.
ushort StringGetCharacter(
string string_value, // stringa
int pos // posizione del simbolo nella stringa
);
Parametri
string_value
[ in] S tring.
pos
[ in] Posizione del simbolo nella stringa. Può essere da 0 a S tringLen(testo) -1.
Valore restituito
Codice del s ymbolo o 0 in caso di errore. Per ottenere il codice di errore chiamare GetLastError().
Vedi anche
S tring S etCharacter, S tring BufferLen, S tringLen, S tring Fill, S tring Init, S tring T oCharArray,
S tring T oS hortArray
StringInit
I nizializza una stringa di simboli specificati e fornisce la grandezza della stringa specificata.
bool StringInit(
string& string_var, // stringa da inizializzare
int new_len=0, // lunghezza richiesta della stringa dopo l'inizializzazione
ushort character=0 // simbolo, con il quale la stringa verrà riempita
);
Parametri
string_var
[ in] [out] S tringa che deve essere inizializzata e deinizializzata.
new_len=0
[in] Lunghezza della stringa dopo l'inizializzazione. S e la lunghezza = 0, esso deinizializza la
stringa, cioè il buffer della stringa viene cancellato e l'indirizzo del buffer viene azzerato.
character=0
[ in] S imbolo con cui riempire la stringa.
Valore restituito
In caso di successo restituisce true, in caso contrario - false. Per ottenere il codice di errore
chiamare GetLastError().
Nota
S e il carattere = 0 e la lunghezza new_len>0, il buffer della stringa di lunghezza indicata sarà
distribuito e riempito di zeri. La lunghezza della stringa sarà pari a zero, poiché l'intero buffer è
riempito da terminatori di stringa.
Esempio:
voidOnStart()
{
//---
string str;
StringInit(str,200,0);
Print("str = ",str,": StringBufferLen(str) = ",
StringBufferLen(str)," StringLen(str) = ",StringLen(str));
}
/* Risultato
str = : StringBufferLen(str) = 200 StringLen(str) = 0
*/
Vedi anche
S tring BufferLen, S tringLen
StringLen
R estituisce il numero di simboli in una stringa.
int StringLen(
string string_value // stringa
);
Parametri
string_value
[ in] S tringa per la quale calcolare la lunghezza.
Valore restituito
N umero di simboli in una stringa senza lo zero finale.
Vedi anche
S tring BufferLen, S tring T rimLeft, S tring T rimR ight, S tring T oCharArray, S tring T oS hortArray
StringSetLength
I mposta una lunghezza specificata (in caratteri) per una stringa.
bool StringSetLength(
string& string_var, // stringa
uint new_length // nuova lunghezza della stringa
);
Parametri
string_var
[ in] [out] S tringa, per la quale è necessario impostare una nuova lunghezza in caratteri.
new_capacity
[in] Lunghezza della stringa richiesta in caratteri. S e new_length è inferiore alla grandezza
corrente, i caratteri eccessivi vengono scartati.
Valore di ritorno
In caso di esecuzione riuscita, restituisce true, altrimenti - false. Per ricevere un codice errore,
dovrebbe essere chiamata la funzione GetLastError().
Nota
La funzione S tring S etLength() non modifica la grandezza del buffer allocato per una stringa.
Guarda anche
S tringLen, S tring BufferLen, S tring R eserve S tring Init, S tring S etCharacter
StringReplace
Esso sostituisce tutte le sottostringhe trovate di una stringa da una sequenza di insieme di simboli.
int StringReplace(
string& str, // la stringa in cui le sottostringhe verranno sostituite
const string find, // la sottostringa ricercata
const string replacement // la sottostringa che verrà inserita nelle posizioni trovate
);
Parametri
str
[ in] [out] La stringa in cui si sta andando a sostituire le sottostringhe.
find
[ in] La sottostringa desiderata, da sostituire.
replacement
[ in] La stringa che verrà inserita al posto di quella trovata.
Valore restituito
La funzione restituisce il numero di sostituzioni in caso di successo, altrimenti -1. Per ottenere un
codice di errore chiamare la funzione GetLastError().
Nota
Se la funzione è stata eseguita correttamente, ma non sono state fatte sostituzioni (la sottostringa
da sostituire non è stata trovata), essa restituisce 0.
L 'errore può derivare da parametri str o find errati (stringa vuota o non inizializzata, vedere
S tring I nit() ). I noltre, l'errore si verifica se la memoria non è sufficiente per completare la
sostituzione.
Esempio:
string text="The quick brown fox jumped over the lazy dog.";
int replaced=StringReplace(text,"quick","slow");
replaced+=StringReplace(text,"brown","black");
replaced+=StringReplace(text,"fox","bear");
Print("Rimpiazzato: ", replaced,". Result=",text);
// Risultato
// Rimpiazzato: 3. Risultato=The slow black bear jumped over the lazy dog.
//
Vedi anche
S tring S etCharacter(), S tring S ubstr()
StringReserve
R iserva il buffer di una grandezza specificata per una stringa, in memoria.
bool StringReserve(
string& string_var, // stringa
uint new_capacity // grandezza del buffer per la memorizzazione di una stringa
);
Parametri
string_var
[ in] [out] S tringa per cui dovrebbe cambiare la grandezza del buffer.
new_capacity
[in] Grandezza del buffer richiesta per una stringa. S e la grandezza new_capacity è inferiore alla
lunghezza della stringa, la grandezza del buffer corrente non cambia.
Valore di ritorno
In caso di esecuzione riuscita, restituisce true, altrimenti - false. Per ricevere un codice errore,
dovrebbe essere chiamata la funzione GetLastError().
Nota
Generalmente, la grandezza della stringa non è uguale alla grandezza del buffer inteso per
memorizzare la stringa. Quando si crea una stringa, il buffer appropriato viene solitamente
assegnato con un margine. La funzione S tring R eserve() consente di gestire la grandezza del buffer e
specificare la grandezza ottimale per le operazioni future.
Diversamente daS tring Init(), la funzione S tring R eserve() non modifica il contenuto della stringa e
non la riempie di caratteri.
Esempio:
void OnStart()
{
string s;
//--- controlla la velocità dell'operazione senza usare StringReserve
ulong t0=GetMicrosecondCount();
for(int i=0; i< 1024; i++)
s+=" "+(string)i;
ulong msc_no_reserve=GetMicrosecondCount()-t0;
s=NULL;
//--- ora, facciamo lo stesso usando StringReserve
StringReserve(s,1024 * 3);
t0=GetMicrosecondCount();
for(int i=0; i< 1024; i++)
s+=" "+(string)i;
ulong msc_reserve=GetMicrosecondCount()-t0;
//--- controlla l'ora
Print("Test con StringReserve passato per "+(string)msc_reserve+" msc");
Print("Test senza StringReserve passato per "+(string)msc_no_reserve+" msc");
/* Risultato:
Test con StringReserve passato per 50 msc
Test senza StringReserve passato per 121 msc
*/
}
Guarda anche
S tring BufferLen, S tring S etLength, S tring Init, S tring S etCharacter
StringSetCharacter
R estituisce una copia di una stringa con un carattere modificato in una posizione specificata.
bool StringSetCharacter(
string& string_var, // stringa
int pos, // posizione
ushort character // carattere
);
Parametri
string_var
[ in][out] S tringa.
pos
[ in] Posizione del carattere nella stringa. Può essere da 0 a S tringLen(tex t).
character
[ in] Codice Unicode del simbolo.
Valore restituito
In caso di successo restituisce true, altrimenti false. Al fine di ottenere un codice di errore, deve
essere chiamata la funzione GetLastError().
Nota
Se pos è minore della lunghezza della stringa ed il valore del codice del simbolo = 0, la stringa è
tagliata (ma la grandezza del buffer, distribuita per la stringa rimane invariata). La lunghezza della
stringa diventa uguale a pos.
Se pos è uguale alla lunghezza della stringa, il simbolo specificato viene aggiunto alla fine della
stringa, e la lunghezza è allargata di uno.
Esempio:
voidOnStart()
{
string str="0123456789";
Print("prima: str = ",str,",StringBufferLen(str) = ",
StringBufferLen(str)," StringLen(str) = ",StringLen(str));
//--- aggiunge il valore zero nel mezzo
StringSetCharacter(str,6,0);
Print("after: str = ",str,",StringBufferLen(str) = ",
StringBufferLen(str)," StringLen(str) = ",StringLen(str));
//--- aggiungere simboli alla fine
int size=StringLen(str);
StringSetCharacter(str,size,'+');
Print("aggiunta: str = ",str,",StringBufferLen(str) = ",
StringBufferLen(str)," StringLen(str) = ",StringLen(str));
}
/* Risultato
Vedi anche
S tring BufferLen, S tringLen, S tring Fill, S tring Init, CharT oS tring, S hortT oS tring, CharArrayT oS tring,
S hortArrayT oS tring
StringSplit
Ottiene sottostringhe da un separatore specificato dalla stringa specificata, restituisce il numero di
sottostringhe ottenute.
int StringSplit(
const string string_value, // La stringa nel quale cercare
const ushort separator, // Il separatore, che viene usato per cercare le sottostringh
string & result[] // Un array passato per riferimento per ottenere la sottostri
);
Parametri
string_value
[ in] La stringa da cui è necessario ottenere sottostringhe. La stringa non cambierà.
pos
[ in] Il codice del carattere separatore. Per ottenere il codice, è possibile utilizzare la funzione
S tring GetCharacter ().
result[]
[ out] L ' array di stringhe in cui si trovano le sottostringhe ottenute.
Valore restituito
Il numero di sottostringhe nell'array result[]. S e il separatore non viene trovato nella stringa
passata, una sola stringa di origine verrà inserita nell'array.
Se string _value è vuoto o NULL, la funzione restituisce zero. In caso di errore la funzione restituisce
-1. Per ottenere il codice d' errore, chiamare la funzione GetLastError().
Esempio:
string to_split="_life_is_good_"; // Una stringa per dividere in sottostringhe
string sep="_"; // Un separatore come carattere
ushort u_sep; // Il codice del carattere separatore
string result[]; // Un array per ottenere le stringhe
//--- Ottiene il codice separatore
u_sep=StringGetCharacter(sep,0);
//--- Divide la stringa in sottostringhe
int k=StringSplit(to_split,u_sep,result);
//--- Mostra un commento
PrintFormat("Stringhe ottenute: %d. Usato il separatore '%s' con il codice %d",k,sep,u_sep);
//--- Ora da in output tutte le stringhe ottenute
if(k>0)
{
for(int i=0;i<k;i++)
{
PrintFormat("result[%d]=\"%s\"",i,result[i]);
}
}
Vedi anche
S tring R eplace(), S tring S ubstr(), S tringConcatenate()
StringSubstr
Estrae una sottostringa da una stringa di testo a partire dalla posizione specificata.
string StringSubstr(
string string_value, // stringa
int start_pos, // posizione da cui iniziare
int length=-1 // lunghezza della stringa estratta
);
Parametri
string_value
[ in] S tringa da quale estrarre la sottostringa.
start_pos
[ in] Posizione iniziale della sottostringa. Può essere da 0 a S tringLen(testo) -1.
length=-1
[in] Lunghezza della sottostringa estratta. S e il valore del parametro è uguale a -1 o il parametro
non è impostato, la stringa verrà estratta dalla posizione indicata fino a fine stringa.
Valore restituito
Copia della sottostringa estratta, se possibile. In caso contrario, restituisce una stringa vuota.
Vedi anche
S tring S plit, S tring Find, S tring GetCharacter
StringToLower
T rasforma tutti i simboli di una stringa selezionata in minuscolo per posizione.
bool StringToLower(
string& string_var // stringa da elaborare
);
Parametri
string_var
[ in][out] S tringa.
Valore restituito
In caso di successo restituisce true, in caso contrario - false. Per ottenere il codice di errore
chiamare GetLastError().
Vedi anche
S tring T oUpper, S tring T rimLeft, S tring T rimR ight
StringToUpper
T rasforma tutti i simboli di una stringa selezionata in maiuscole per posizione.
bool StringToUpper(
string& string_var // stringa da elaborare
);
Parametri
string_var
[ in][out] S tringa.
Valore restituito
In caso di successo restituisce true, in caso contrario - false. Per ottenere il codice di errore
chiamare GetLastError().
Vedi anche
S tring T oLower, S tring T rimLeft, S tring T rimR ight
StringTrimLeft
La funzione taglia caratteri di avanzamento di linea, gli spazi e le schede nella parte sinistra della
stringa fino al primo simbolo significativo. La stringa viene modificata nel posto.
int StringTrimLeft(
string& string_var // stringa da tagliare
);
Parametri
string_var
[ in][out] La stringa che viene tagliata dalla sinistra.
Valore restituito
R estituisce il numero di simboli tagliati.
Vedi anche
S tring T rimR ight, S tring T oLower, S tring T oUpper
StringTrimRight
La funzione taglia caratteri di avanzamento di linea, gli spazi e le schede nella parte destra della
stringa fino al primo simbolo significativo. La stringa viene modificata nel posto.
int StringTrimRight(
string& string_var // stringa da tagliare
);
Parametri
string_var
[ in][out] La stringa che viene tagliata dalla destra.
Valore restituito
R estituisce il numero di simboli tagliati.
Vedi anche
S tring T rimLeft, S tring T oLower, S tring T oUpper
Data ed Ora
Questo è il gruppo di funzioni per lavorare con dati di tipo datetime (un numero intero che rappresenta
il numero di secondi trascorsi dall'ora 0 del 1 gennaio 1970).
Per organizzare contatori e timers ad alta risoluzione, utilizzare la funzione G etT ick Count(), che
produce valori in millisecondi.
Funzione Azione
T imeCurrent Restituisce l'ultimo orario conosciuto di server
(orario della ricevuta dell'ultima quotazione) nel
formato datetime
T imeT radeS erver R estituisce l'ora attuale del calcolo del server di
trade
TimeCurrent
Returns the last k nown server time, time of the last quote receipt for one of the s ymbols selected in
the " Mark et W atch" window. Nell'handler OnT ick (), questa funzione restituisce l'orario dell'ultimo tick
handler ricevuto. In altri casi (ad esempio, la chiamata negli handlers OnInit(), OnDeinit(), OnT imer()
e cos ì via), questa è l' orario della ricezione dell' ultima quotazione per qualsiasi simbolo disponibile
nella finestra " Mark et W atch" , l'orario indicato nel titolo di questa finestra. Il valore dell'orario è
formato su un trade server e non dipende dalle impostazioni di orario sul tuo computer. Ci sono due
varianti della funzione.
Parametri
dt_struct
[ out] M qlDateT ime variabile di tipo struttura.
Valore restituito
V alue of datetime type
Nota
Se la variabile M qlDateT ime di tipo struttura è stata passata come parametro, viene riempita di
conseguenza.
Per organizzare contatori e timers ad alta risoluzione, utilizzare la funzione G etT ick Count(), che
produce valori in millisecondi.
D uring testing in the strateg y tester, T imeCurrent() is simulated according to historical data.
TimeTradeServer
Restituisce l'orario corrente calcolato del server di trade. A differenza di T imeCurrent(), il calcolo del
valore di tempo viene eseguito nel terminale cliente e dipende dalle impostazioni dell'ora del
computer. Ci sono due varianti della funzione.
Parametri
dt_struct
[ out] ariabile di tipo struttura M qlDateT ime.
V
Valore restituito
V alue of datetime type
Nota
Se la variabile M qlDateT ime di tipo struttura è stata passata come parametro, viene riempita di
conseguenza.
Per organizzare contatori e timers ad alta risoluzione, utilizzare la funzione G etT ick Count(), che
produce valori in millisecondi.
During testing in the strateg y tester, T imeT radeS erver() is always equal to T imeCurrent() simulated
server time.
TimeLocal
Restituisce l'ora locale di un computer, in cui il terminale client è in esecuzione. Ci sono due varianti
della funzione.
Parametri
dt_struct
[ out] ariabile di tipo struttura M qlDateT ime.
V
Valore restituito
V alue of datetime type
Nota
Se la variabile M qlDateT ime di tipo struttura è stata passata come parametro, viene riempita di
conseguenza.
Per organizzare contatori e timers ad alta risoluzione, utilizzare la funzione G etT ick Count(), che
produce valori in millisecondi.
D uring testing in the strateg y tester, T imeLocal() is always equal to T imeCurrent() simulated server
time.
TimeGMT
R estituisce il GM T , che viene calcolato tenendo conto del DS T s witch dall'ora locale del computer in cui
il terminale client è in esecuzione. Ci sono due varianti della funzione.
Parametri
dt_struct
[ out] ariabile di tipo struttura M qlDateT ime.
V
Valore restituito
V alue of datetime type
Nota
Se la variabile M qlDateT ime di tipo struttura è stata passata come parametro, viene riempita di
conseguenza.
Per organizzare contatori e timers ad alta risoluzione, utilizzare la funzione G etT ick Count(), che
produce valori in millisecondi.
During testing in the strateg y tester, T imeGM T () is always equal to T imeT radeS erver() simulated
server time.
TimeDaylightSavings
R estituisce la correzione per l'ora legale in secondi, quando viene fatto il passaggio al periodo estivo.
D ipende dalle impostazioni dell'ora del computer.
int TimeDaylightSavings();
Valore restituito
S e lo s witch per l'inverno (standard) Il tempo è stato fatto, restituisce 0.
TimeGMTOffset
Restituisce la corrente differenza tra l'orario GM T e l'ora del computer locale in secondi, tenendo conto
dello s witch per l'inverno o estate. Dipende dalle impostazioni dell'ora del computer.
int TimeGMTOffset();
Valore restituito
Il valore di tipo int, che rappresenta la differenza di corrente tra l' ora G M T e l'ora locale del
computer T imeLocal() in secondi.
TimeToStruct
Converte un valore di tipo datetime (numero di secondi dal . .
01 01 1970 ) in una variabile struttura
M qlDateT ime.
bool TimeToStruct(
datetime dt, // date ed ora
MqlDateTime& dt_struct // struttura di adozione dei valori
);
Parametri
dt
[ in] alori data da convertire.
V
dt_struct
[ out] ariabile di struttura tipo M qlDateT ime.
V
Valore restituito
True se avviene con successo, altrimenti false. Per ottenere informazioni sull'errore, chiamare la
funzione GetLastError().
StructToTime
Converte una variabile di struttura M qlDateT ime in un valore di tipo datetime e restituisce il valore
risultante.
datetime StructToTime(
MqlDateTime& dt_struct // struttura della data e dell'ora
);
Parametri
dt_struct
[ in] Variabile della struttura di tipo M qlDateT ime.
Valore restituito
I l valore di tipo datetime contenente il numero di secondi dal 01.01.1970.
Informazioni account
F unzioni che restituiscono i parametri del corrente account.
Funzione Azione
A ccountInfoDouble Restituisce un valore di tipo double della
corrispondente proprietà dell' account
AccountInfoDouble
R estituisce il valore della corrispondente proprietà dell' account.
double AccountInfoDouble(
ENUM_ACCOUNT_INFO_DOUBLE property_id // identificatore della proprietà
);
Parametri
property_id
[in] Identificatore della proprietà. I l valore può essere uno dei valori di
ENUM _ACCOUNT_INFO_DOUBLE.
Valore restituito
V alore di tipo double.
Esempio:
voidOnStart()
{
//--- mostra tutte le informazioni disponibili dalla funzione AccountInfoDouble()
printf("ACCOUNT_BALANCE = %G",AccountInfoDouble(ACCOUNT_BALANCE));
printf("ACCOUNT_CREDIT = %G",AccountInfoDouble(ACCOUNT_CREDIT));
printf("ACCOUNT_PROFIT = %G",AccountInfoDouble(ACCOUNT_PROFIT));
printf("ACCOUNT_EQUITY = %G",AccountInfoDouble(ACCOUNT_EQUITY));
printf("ACCOUNT_MARGIN = %G",AccountInfoDouble(ACCOUNT_MARGIN));
printf("ACCOUNT_MARGIN_FREE = %G",AccountInfoDouble(ACCOUNT_MARGIN_FREE));
printf("ACCOUNT_MARGIN_LEVEL = %G",AccountInfoDouble(ACCOUNT_MARGIN_LEVEL));
printf("ACCOUNT_MARGIN_SO_CALL = %G",AccountInfoDouble(ACCOUNT_MARGIN_SO_CALL));
printf("ACCOUNT_MARGIN_SO_SO = %G",AccountInfoDouble(ACCOUNT_MARGIN_SO_SO));
}
Vedi anche
Sy mbolInfoDouble, Sy mbolInfoS tring, mbolInfoInteger, PrintFormat
Sy
AccountInfoInteger
R estituisce il valore delle proprietà dell'account.
long AccountInfoInteger(
ENUM_ACCOUNT_INFO_INTEGER property_id // identificatore della proprietà
);
Parametri
property_id
[in] Identificatore della proprietà. I l valore può essere uno dei valori di
ENUM _ACCOUNT_INFO_INT EGER .
Valore restituito
V alore di tipo long.
Nota
La proprietà deve essere uno dei tipi bool, int o long.
Esempio:
voidOnStart()
{
//--- mostra tutte le informazioni disponibili ddella funzione AccountInfoInteger()
printf("ACCOUNT_LOGIN = %d",AccountInfoInteger(ACCOUNT_LOGIN));
printf("ACCOUNT_LEVERAGE = %d",AccountInfoInteger(ACCOUNT_LEVERAGE));
bool thisAccountTradeAllowed=AccountInfoInteger(ACCOUNT_TRADE_ALLOWED);
bool EATradeAllowed=AccountInfoInteger(ACCOUNT_TRADE_EXPERT);
ENUM_ACCOUNT_TRADE_MODE tradeMode=(ENUM_ACCOUNT_TRADE_MODE)AccountInfoInteger(ACCOUNT_TRADE_MODE
ENUM_ACCOUNT_STOPOUT_MODE stopOutMode=(ENUM_ACCOUNT_STOPOUT_MODE)AccountInfoInteger(ACCOUNT_MARG
case(ACCOUNT_TRADE_MODE_CONTEST):
Print("Questo è un account di competizione");
break;
default:Print("Questo è un account reale!");
}
Vedi anche
I nformazioni account
AccountInfoString
R estituisce il valore della corrispondente proprietà dell' account.
string AccountInfoString(
ENUM_ACCOUNT_INFO_STRING property_id // identificatore della proprietà
);
Parametri
property_id
[in] I dentificatore della proprietà. I l valore può essere uno dei valori
ENUM _ACCOUNT_INFO_S TRING.
Valore restituito
V alore di tipo string.
Esempio:
voidOnStart()
{
//--- Mostra tutte le informazioni disponibili dalla funzione AccountInfoString()
Print("Il nome del broker = ",AccountInfoString(ACCOUNT_COMPANY));
Print("Valuta di deposito = ",AccountInfoString(ACCOUNT_CURRENCY));
Print("Nome Cliente = ",AccountInfoString(ACCOUNT_NAME));
Print("Il nome del trade server = ",AccountInfoString(ACCOUNT_SERVER));
}
Vedi anche
I nformazioni account
Verifica Stato
F unzione che restituisce i parametri del corrente stato del terminale client
Funzione Azione
G etLastError R estituisce l'ultimo errore
s topped
I S Restituisce true, se un programma mql5 è stato
comandato di fermarsi dal suo funzionamento.
GetLastError
R estituisce il contenuto della variabile del sistema _LastError.
int GetLastError();
Valore restituito
R estituisce il numero dell'ultimo errore che si è verificato durante l'esecuzione del programma mql5.
Nota
Dopo la chiamata della funzione, il contenuto di _LastError non viene resettato. Per resettare questa
variabile, bisogna chiamare R esetLastError().
Vedi anche
Codici di R itorno del T rade S erver
IsStopped
Verifica lo spegnimento forzato del programma mql5.
bool IsStopped();
Valore restituito
Restituisce true, se la variabile di sistema _S topFlag contiene un valore che non sia 0. Un valore
non-zero viene scritto in _S topFlag, se un programma mql5 è stato comandato a completare il suo
funzionamento. In questo caso, bisogna immediatamente terminare il programma, altrimenti il
programma verrà completamente forzato dall'esterno dopo 3 secondi.
UninitializeReason
R estituisce il codice del motivo di deinizializzazione.
int UninitializeReason();
Valore restituito
Restituisce il valore di _UninitR eason che viene formato prima che OnDeinit() venga chiamato. Il
valore dipende dalle ragioni che hanno portato alla deinizializzazione.
TerminalInfoInteger
R estituisce il valore della corrispondente proprietà dell'ambiente di programma mql5.
int TerminalInfoInteger(
int property_id // identificatore della proprietà
);
Parametri
property_id
[in] Identificatore della proprietà. Può essere uno dei valori dell'enumerazione
ENUM _T ER M INAL _INFO_INT EGER .
Valore restituito
V alore di tipo int.
TerminalInfoDouble
R estituisce il valore di una proprietà corrispondente dell'ambiente programma MQL 4.
double TerminalInfoDouble(
int property_id // identificatore della proprietà
);
Parametri
property_id
[in] Identificatore della proprietà. Può essere uno dei valori dell'enumerazione
ENUM _T ER M INAL _INFO_DOUBLE.
Valore restituito
V alore di tipo double.
TerminalInfoString
la funzione resituisce il valore della proprietà corrispondente dell'ambiente di programma mql5. La
proprietà dev 'essere di tipo stringaT he property must be of string type.
string TerminalInfoString(
int property_id // identificatore della proprietà
);
Parametri
property_id
[in] I dentificatore della proprietà. F orse uno dei valori dell'enumerazione
ENUM _T ER M INAL _INFO_S TRING.
Valore restituito
Valore di tipo stringa.
MQLInfoInteger
R estituisce il valore della corrispondente proprietà di un programma mql5 che sta girando.
int MQLInfoInteger(
int property_id // identificatore della proprietà
);
Parametri
property_id
[in] Identificatore della proprietà. Può essere uno dei valori dell'enumerazione
ENUM _MQL _INFO_INT EGER .
Valore restituito
V alore di tipo int.
MQLInfoString
R estituisce il valore della corrispondente proprietà di un programma mql5 che sta girando.
string MQLInfoString(
int property_id // Identificatore della proprietà
);
Parametri
property_id
[in] Identificatore della proprietà. Può essere uno dei valori dell'enumerazione
ENUM _MQL _INFO_S TRING.
Valore restituito
V alore di tipo stringa.
Symbol
R estituisce il nome del simbolo del corrente grafico.
string Symbol();
Valore restituito
V alore della variabile di sistema mbol, che memorizza il nome del corrente simbolo del grafico.
_S y
Nota
A differenza di Ex pert Advisors, indicatori e script, i servizi non sono associati ad uno specifico
chart. Perciò, S imbol() restituisce una stringa vuota (" " ) per un servizio.
Period
R estituisce il timeframe del corrente grafico.
ENUM_TIMEFRAMES Period();
Valore restituito
Il contenuto della variabile _Period che contiene il valore del timeframe del corrente grafico. Il
valorep può essere uno dei valori dell'enumerazione ENUM _TIMEFRAMES .
Nota
A differenza di Ex pert Advisors, indicatori e script, i servizi non sono associati ad uno specifico
chart. Perciò, Period() restituisce 0 per un servizio.
Vedi anche
PeriodS econds, T imeframes del Grafico, Data ed Ora, Visibilità degli Oggetti
Digits
Restituisce il numero di cifre decimali determinando l'accuratezza del prezzo del corrente periodo del
grafico.
int Digits();
Valore restituito
I l valore della variabile _Digits che memorizza il numero di cifre decimali determinando
l'accuratezza del prezzo del corrente simbolo del grafico.
Point
R estituisce la grandezza punti del corrente simbolo, nella valuta di quotazione.
double Point();
Valore restituito
Il valore della variabile _Point che memorizza la grandezza in punti del corrente simbolo nella valuta
di quotazione.
Il gestore eventi del terminale client utilizza i tipi di ritorno e parametro per identificare le funzioni
che elaborano un evento. S e una determinata funzione ha alcuni parametri o un tipo di ritorno non
corrispondente alle descrizioni sottostanti, tale funzione non può essere utilizzata per gestire un
evento.
Funzione Descrizione
OnS tart La funzione è chiamata quando si verifica
l'evento S tart per eseguire azioni impostate
nello script
Funzione Descrizione
elaborare le modifiche del grafico-chart
effettuate da un utente o un programma MQL5
Il terminale client invia eventi in entrata ai corrispondenti grafici-chart aperti. Inoltre, gli eventi
possono essere generati da grafici-charts (eventi del chart) o programmi mql5 (eventi personalizzati).
La generazione di eventi di creazione/eliminazione di oggetti grafici può essere abilitata/disabilitata
impostando le proprietà del chart CHART_EVENT_OBJECT_CR EAT E e CHART_EVENT_OBJECT_DELET E.
Ogni applicazione e grafico-chart mql5 ha una propria coda di eventi in cui vengono posizionati tutti
gli eventi appena arrivati.
Un programma ottiene eventi solo dal grafico-chart su cui è in esecuzione. T utti gli eventi vengono
gestiti uno dopo l'altro nell'ordine di ricezione. S e la coda contiene già l'evento NewT ick o questo
evento è in fase di elaborazione, allora il nuovo evento NewT ick non viene aggiunto alla coda
dell'applicazione mql5. Allo stesso modo, se ChartEvent è già in una coda di programma mql5 o viene
gestito un evento di questo tipo, allora un nuovo evento di questo tipo non viene inserito in coda. La
gestione degli eventi del timer viene elaborata allo stesso modo - se l'evento T imer è già in coda o
viene gestito, nessun nuovo evento timer viene impostato in coda.
Le code degli eventi hanno una grandezza limitata ma sufficiente, quindi l'overflow della coda è
improbabile per un programma sviluppato correttamente. Quando la coda si sovraffolla, i nuovi eventi
vengono eliminati senza essere inseriti in coda.
Si raccomanda vivamente di non utilizzare loop infiniti per gestire gli eventi. Eventuali eccezioni sono
gli script che gestiscono un singolo evento S tart.
OnStart
La funzione è chiamata quando si verifica l'evento S tart. La funzione è intesa all'esecuzione una
tantum delle azioni implementate nello script. Ci sono due tipi di funzione.
Valore di ritorno
I l valore di tipo int visualizzato nella scheda Journal.
La voce " script nome_script rimosso (codice risultato N)" viene creata nel journal del terminale dopo
che è stata completata l'esecuzione di uno script. Qui N è un valore restituito dalla funzione
OnS tart().
La voce " servizio nome_servizio interrotto (codice risultato N)" viene creata nel journal del
terminale dopo che è stata completata l'esecuzione di un servizio. Qui N è un valore restituito dalla
funzione OnS tart().
La chiamata OnS tart() che restituisce il risultato dell'esecuzione è consigliata per l'uso poiché non solo
consente di eseguire uno script o un servizio, ma restituisce anche un codice di errore o altri dati utili
per analizzare il risultato dell'esecuzione del programma.
La versione senza un risultato restituito è lasciata solo per compatibilità con i vecchi codici. Non è
raccomandata per l'uso
void OnStart(void);
Nota
OnS tart() è l'unica funzione per gestire gli eventi in script e servizi. Nessun altro evento viene
inviato a questi programmi. A sua volta, l'evento S tart non viene passato agli EA e agli indicatori
personalizzati.
Script di esempio:
//--- macro per lavorare con i colori
#define XRGB(r,g,b) (0xFF000000|(uchar(r)<<16)|(uchar(g)<<8)|uchar(b))
#define GETRGB(clr) ((clr)&0xFFFFFF)
//+------------------------------------------------------------------+
//| Funzione Start del programma Script |
//+------------------------------------------------------------------+
void OnStart()
{
//--- imposta un colore di candela verso il basso
Comment("Imposta un colore di candela verso il basso");
ChartSetInteger(0,CHART_COLOR_CANDLE_BEAR,GetRandomColor());
ChartRedraw(); // aggiorna il chart immediatamente senza aspettare un nuovo tick
Sleep(1000); // pausa per 1 secondo per vedere tutte le modifiche
//--- imposta un colore di candela verso l'alto
Comment("Imposta un colore di candela verso l'alto");
ChartSetInteger(0,CHART_COLOR_CANDLE_BULL,GetRandomColor());
ChartRedraw();
Sleep(1000);
//--- imposta il colore di sfondo
Comment("Imposta il colore di sfondo");
ChartSetInteger(0,CHART_COLOR_BACKGROUND,GetRandomColor());
ChartRedraw();
Sleep(1000);
//--- imposta il colore della linea Ask
Comment("Imposta il colore della linea Ask");
ChartSetInteger(0,CHART_COLOR_ASK,GetRandomColor());
ChartRedraw();
Sleep(1000);
//--- imposta il colore della linea Bid
Comment("Imposta il colore della linea Bid");
ChartSetInteger(0,CHART_COLOR_BID,GetRandomColor());
ChartRedraw();
Sleep(1000);
// --- imposta il colore di una barra verso il basso e una cornice di candela verso il basso
Comment("Imposta il colore di una barra verso il basso e una cornice di candela verso il basso")
ChartSetInteger(0,CHART_COLOR_CHART_DOWN,GetRandomColor());
ChartRedraw();
Sleep(1000);
//--- imposta il colore di una linea del chart e delle candele Doji
Comment("Imposta il colore di una linea del grafico e dei candelabri Doji");
ChartSetInteger(0,CHART_COLOR_CHART_LINE,GetRandomColor());
ChartRedraw();
Sleep(1000);
//--- imposta il colore di una barra verso l'alto e di una cornice di candele verso l'alto
Comment("Imposta il colore di una barra verso l'alto e una cornice per candele verso l'alto");
ChartSetInteger(0,CHART_COLOR_CHART_UP,GetRandomColor());
ChartRedraw();
Sleep(1000);
//--- imposta il colore degli assi, della scala e della linea OHLC
Comment("Imposta il colore degli assi, la scala e la linea OHLC");
ChartSetInteger(0,CHART_COLOR_FOREGROUND,GetRandomColor());
ChartRedraw();
Sleep(1000);
//--- imposta un colore griglia
Comment("Imposta un colore griglia");
ChartSetInteger(0,CHART_COLOR_GRID,GetRandomColor());
ChartRedraw();
Sleep(1000);
//--- imposta il colore dell'ultimo prezzo
Comment("Imposta il colore dell'ultimo prezzo");
ChartSetInteger(0,CHART_COLOR_LAST,GetRandomColor());
ChartRedraw();
Sleep(1000);
//--- imposta il colore dei livelli di ordine Stop Loss e Take Profit
Comment("Imposta il colore dei livelli di ordine Stop Loss e Take Profit");
ChartSetInteger(0,CHART_COLOR_STOP_LEVEL,GetRandomColor());
ChartRedraw();
Sleep(1000);
/ --- imposta il colore dei volumi e i livelli di entrata nel mercato
Comment("Imposta il colore dei volumi e i livelli di entrata nel mercato");
ChartSetInteger(0,CHART_COLOR_VOLUME,GetRandomColor());
ChartRedraw();
}
//+------------------------------------------------------------------+
//| Restituisce un colore generato a caso |
//+------------------------------------------------------------------+
color GetRandomColor()
{
color clr=(color)GETRGB(XRGB(rand()%255,rand()%255,rand()%255));
return clr;
}
Guarda anche
Funzioni di gestione degli eventi(event handling), Esecuzione Programma, Eventi del terminale
client
OnInit
La funzione è chiamata in indicatori ed EA quando si verifica l'evento Init. Viene utilizzato per
inizializzare un programma MQL5 in esecuzione. Ci sono due tipi di funzione.
Valore di ritorno
int (tipo di valore), zero significa inizializzazione riuscita.
La chiamata OnInit() che restituisce il risultato dell'esecuzione è consigliata per l'uso poiché non solo
consente l'inizializzazione del programma, ma restituisce anche un codice di errore in caso di una
chiusura anticipata del programma.
La versione senza un risultato restituito è lasciata solo per compatibilità con i vecchi codici. Non è
raccomandata per l'uso
void OnInit(void);
Nota
L 'evento Init viene generato immediatamente dopo aver caricato un EA o un indicatore. L 'evento
non è generato per gli script. La funzione OnInit() viene utilizzata per inizializzare un programma
MQL5. S e OnInit() ha un valore di ritorno di tipo int, il codice di ritorno diverso da zero indica
l'inizializzazione fallita e genera l'evento Deinit con il codice del motivo di deinizializzazione
R EAS O N_INITFAI LED.
La funzione OnInit() di tipo void significa sempre inizializzazione riuscita e non è raccomandato per
l'uso.
Per ottimizzazione degli input dell' EA, si consiglia di utilizzare valori dall'enumerazione
ENUM _INIT_R ET CODE come codice di ritorno. Questi valori sono intesi a stabilire la gestione del
processo di ottimizzazione, compresa la selezione dei più adatti agenti di testing. È possibile
richiedere i dati sulla configurazione e sulle risorse degli agenti (numero di core, quantità di
memoria libera, ecc.) utilizzando la funzione T erminalInfoInteger() durante l'inizializzazione di EA
prima dell'avvio del test. S ulla base dei dati ottenuti, è possibile consentire l'uso dell'agente di
testing o vietarlo dall'ottimizzazione di EA.
ID Descrizione
INIT_S U CCEEDED I nizializzazione riuscita, il test EA può essere
continuato.
Questo codice indica lo stesso valore zero:
l'inizializzazione EA nel tester ha esito positivo.
ID Descrizione
Il ritorno di questo valore equivale a restituire il
valore diverso da zero - l'inizializzazione di EA
nel tester non è riuscita.
INIT_ ARA P MET ERS _INCORR ECT Designato per denotare un insieme errato di
parametri di input da parte di un
programmatore. Nella tabella di ottimizzazione
generale, la stringa dei risultati con questo
codice di ritorno è evidenziata in rosso.
Non viene eseguito un test per un tale insieme
Utilizzando OnInit() restituendo INIT_FAILED/INIT_PARAMET ERS _INCORR ECT nel tester ha alcune
peculiarità che dovrebbero essere considerate quando si ottimizzano gli EA:
· l'insieme di parametri OnI nit() restituito P
INIT_ ARAMET ERS _INCORR ECT per è considerato
inadatto per il test e non viene utilizzato per ottenere la successiva popolazione durante
l'ottimizzazione genetica. T roppi set di parametri " scartati" possono portare a risultati errati
durante la ricerca di parametri EA ottimali. L 'algoritmo di ricerca presuppone che la funzione
criterio di ottimizzazione sia regolare e non abbia spazi vuoti sull'intera moltitudine di parametri
di input.
· se OnI nit() restituisce INIT_FAI LED, ciò significa che non è possibile avviare un test e che l'EA
viene de-caricato dalla memoria dell'agente. L 'EA viene nuovamente caricato per eseguire il
passaggio successivo con una nuova serie di parametri. L 'avvio del prossimo passaggio di
ottimizzazione richiede molto più tempo rispetto a chiamare T esterS top().
Esempio di funzione OnInit() per un EA
//--- parametri di input
input int ma_period=20; // periodo media mobile
{
//--- controlla la validità di ma_period
if(ma_period<=0)
{
PrintFormat("Valore input ma_period non valido: %d",ma_period);
return (INIT_PARAMETERS_INCORRECT);
}
//--- durante l'ottimizzazione
if(MQLInfoInteger(MQL_OPTIMIZATION))
{
//--- controlla la RAM disponibile per l'agente
int available_memory_mb=TerminalInfoInteger(TERMINAL_MEMORY_TOTAL);
if(available_memory_mb<2000)
{
PrintFormat("Memoria insufficiente per l'agente test: %d MB",
available_memory_mb);
return (INIT_AGENT_NOT_SUITABLE);
}
}
//--- controlla l'indicatore
indicator_handle=iCustom(_Symbol,_Period,"My_Indicator",ma_period);
if(indicator_handle==INVALID_HANDLE)
{
PrintFormat("Fallimento nel generare l'handle My_Indicator . Codice errore %d",
GetLastError());
return (INIT_FAILED);
}
//--- Inizializzazione EA completata
return(INIT_SUCCEEDED);
}
Guarda anche
OnDeinit, Funzioni di gestione degli eventi(event handling), Esecuzione Programma, Eventi del
terminale client, Inizializzazione di variabili, Creazione ed eliminazione di oggetti
OnDeinit
La funzione è chiamata in indicatori ed EA quando si verifica l'evento D einit. È usato per
deinitializzare un programma MQL5 in esecuzione.
void OnDeinit(
const int reason // codice della ragione di deinizializzazione
);
Parametri
reason
[ in] Codice del motivo di deinitializzazione.
Valore di ritorno
N essun valore di ritorno
Nota
L 'evento Deinit è generato per EA e indicatori nei seguenti casi:
· prima di una nuova re-inizializzazione a causa del cambiamento di un simbolo o di un periodo del
chart a cui è collegato il programma mql5;
· prima di una nuova inizializzazione a causa del cambiamento degli input;
· prima di decaricare un programma mql5.
EA: i codici motivo di deinizializzazione possono essere ricevuti dalla funzione UninitializeR eason() o
dalla variabile predefinita _UninitR eason.
case REASON_ACCOUNT:
text="L'account è cambiato";break;
case REASON_CHARTCHANGE:
text="Il simbolo o timeframe sono cambiati";break;
case REASON_CHARTCLOSE:
text="Il chart Chart è stato chiuso";break;
case REASON_PARAMETERS:
text="I parametri di Input sono stati cambiati";break;
case REASON_RECOMPILE:
text="il programma "+__FILE__+" è stato ricompilato";break;
case REASON_REMOVE:
text="il programma "+__FILE__+" è stato rimosso dal chart";break;
case REASON_TEMPLATE:
text="Il nuovo template è stato applicato al chart";break;
default:text="Altra motivazione";
}
//---
return text;
}
Guarda anche
OnInit, Funzioni di Event handling(gestione degli eventi), Esecuzione programma, Eventi del
terminale client, Codici di motivazione di non inizializzazione, S copo della visibilità e durata delle
variabili, Creazione ed eliminazione di oggetti
OnTick
La funzione è chiamata nell' EA quando si verifica l'evento e
N wT ick si verifica per gestire una nuova
quotazione.
void OnTick(void);
Valore di ritorno
N essun valore di ritorno
Nota
L 'evento NewT ick viene generato solo per EA quando si riceve un nuovo tick per un simbolo del chart
a cui è assegnato l' EA. Non ha senso definire la funzione OnT ick () in un indicatore personalizzato o
uno script poiché non viene generato un evento NewT ick .
L 'evento T ick è generato solo per EA, ma questo non significa che gli EA debbano presentare la
funzione OnT ick (), poiché gli eventi T imer, Book Event e ChartEvent vengono generati anche per
l'EA, oltre a NewT ick .
T utti gli eventi vengono gestiti uno dopo l'altro nell'ordine di ricezione. S e la coda contiene già
l'evento NewT ick o questo evento è in fase di elaborazione, allora il nuovo evento NewT ick non viene
aggiunto alla coda dell'applicazione mql5.
L 'evento NewT ick viene generato indipendentemente dal fatto che il trading automatico sia abilitato
(pulsante AutoT rading). Il trading automatico disabilitato significa solo il divieto di inviare richieste
trade da un EA. L 'operazione EA non viene interrotta.
La disabilitazione del trading automatico premendo il pulsante A utoT rading non interrompe
l'esecuzione corrente della funzione OnT ick ().
}
// --- se si apre una posizione netting, saltare il segnale - attendere fino a quando non si chiude
if(signal!=0 && PositionsTotal()>0 && (ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGI
{
signal=0;
return; // esce dal gestore eventi NewTick e non entra nel mercato prima che appaia una nuova
}
//--- per un conto hedging, ogni posizione viene tenuta e chiusa separatamente
if(signal!=0)
{
//--- segnale buy
if(signal>0)
{
PrintFormat("%s: Segnale Buy! Revers=%s",__FUNCTION__,string(revers));
if(Buy(trade_lot,slippage,EXPERT_MAGIC))
signal=0;
}
//--- segnale sell
if(signal<0)
{
PrintFormat("%s: segnale Sell! Revers=%s",__FUNCTION__,string(revers));
if(Sell(trade_lot,slippage,EXPERT_MAGIC))
signal=0;
}
}
//--- Fine funzione OnTick
}
//+------------------------------------------------------------------+
//| Controlla un nuovo segnale di trading |
//+------------------------------------------------------------------+
int CheckSignal()
{
//--- 0 significa nessun segnale
int res=0;
//--- ottiene il valore ATR su una penultima barra completa (l'indice della barra è 2)
double atr_value[1];
if(CopyBuffer(atr_handle,0,2,1,atr_value)!=-1)
{
last_atr=atr_value[0];
// --- recupera i dati sull'ultima barra chiusa sull'array di tipo MqlRates
MqlRates bar[1];
if(CopyRates(_Symbol,_Period,1,1,bar)!=-1)
{
// --- calcola la misura del corpo della barra sull'ultima barra completa
last_body=bar[0].close-bar[0].open;
// --- se il corpo dell'ultima barra (con indice 1) supera il precedente valore ATR (sulla barra co
if(MathAbs(last_body)>kATR*last_atr)
res=last_body>0?1:-1; // valore positivo per la candela verso l'alto
}
else
PrintFormat("% s: impossibile ricevere l'ultima barra! Error",__FUNCTION__,GetLastError())
}
else
PrintFormat("% s: impossibile ricevere il valore dell'indicatore ATR! Error",__FUNCTION__,Get
//--- se la modalità di trading inverso è abilitata
res=revers?-res:res; // inverte il segnale se necessario (restituisci -1 invece di 1 e vicevers
//--- restituisce un valore del segnale di trading
return (res);
}
//+------------------------------------------------------------------+
//| Restituisce 'true' quando appare una nuova barra |
//+------------------------------------------------------------------+
bool isNewBar(const bool print_log=true)
{
static datetime bartime=0; // memorizza l'orario di apertura della barra corrente
//--- ottiene l'orario di apertura della barra zero
datetime currbar_time=iTime(_Symbol,_Period,0);
// --- se l'orario di apertura cambia, è arrivata una nuova barra
if(bartime!=currbar_time)
{
bartime=currbar_time;
lastbar_timeopen=bartime;
//--- visualizza i dati sull'orario di apertura di una nuova barra nel log
if(print_log && !(MQLInfoInteger(MQL_OPTIMIZATION)||MQLInfoInteger(MQL_TESTER)))
{
//--- visualizza un messaggio con una nuova barra di apertura
PrintFormat("%s: nuova barra su %s %s aperta a %s",__FUNCTION__,_Symbol,
StringSubstr(EnumToString(_Period),7),
TimeToString(TimeCurrent(),TIME_SECONDS));
//--- recupera i dati sull'ultimo tick
MqlTick last_tick;
if(!SymbolInfoTick(Symbol(),last_tick))
Print("SymbolInfoTick() fallito, errore = ",GetLastError());
//--- mostra l'orario dell'ultimo tick fino ai millisecondi
PrintFormat("L'ultimo tick era alle %s.%03d",
TimeToString(last_tick.time,TIME_SECONDS),last_tick.time_msc%1000);
}
//--- abbiamo una nuova barra
return (true);
}
//--- nessuna nuova barra
return (false);
}
//+------------------------------------------------------------------+
//| Acquista ad un prezzo di mercato con un volume specificato |
//+------------------------------------------------------------------+
bool Buy(double volume,ulong deviation=10,ulong magicnumber=0)
{
{
//--- dichiarare e inizializzare le strutture
MqlTradeRequest request={};
MqlTradeResult result={};
double price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
if(type==ORDER_TYPE_BUY)
price=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
//--- richiesta parametri
request.action =TRADE_ACTION_DEAL; // tipi di operazioni di trading
request.position =pos_ticket; // ticket della posizione, se chiusura
request.symbol =Symbol(); // symbol
request.volume =volume; // volume
request.type =type; // tipo di ordine
request.price =price; // prezzo di trade
request.deviation=slip; // deviazione ammissibile dal prezzo
request.magic =magicnumber; // MagicNumber dell'ordine
//--- invia richiesta
if(!OrderSend(request,result))
{
//--- mostra dati sul fallimento
PrintFormat("OrderSend %s %s %.2f at %.5f errore %d",
request.symbol,EnumToString(type),volume,request.price,GetLastError());
return (false);
}
//--- informa di un'operazione riuscita
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
return (true);
}
Guarda anche
Funzioni di gestione degli eventi, Esecuzione Programma, Eventi del terminale client, OnT imer,
OnBook Event, OnChartEvent
OnCalculate
La funzione è chiamata negli indicatori quando si verifica l'evento Calculate per l'elaborazione delle
modifiche dei dati di prezzo. Ci sono due tipi di funzione. S olo uno di esse può essere utilizzata
all'interno di un singolo indicatore.
Parametri
rates_total
[in] Gradenzza della serie di prezzi[ ] o serie di input disponibili per l'indicatore per il calcolo. Nel
secondo tipo di funzione, il valore del parametro corrisponde al numero di barre sul grafico-chart
su cui è stato lanciato.
prev_calculated
[in] Contiene il valore restituito dalla funzione OnCalculate() durante la chiamata precedente. È
progettato per saltare le barre che non sono state modificate dal lancio precedente di questa
funzione.
begin
[in] Il valore dell'indice nell'array price[] da cui partono i dati significativi. Permette di saltare i
dati mancanti o iniziali, per i quali non ci sono valori corretti.
price[]
[in] Array di valori per i calcoli. Una delle timeseries prezzo o un buffer indicatore calcolato può
essere passato come array price[ ]. Il tipo di dati passati per il calcolo può essere definito usando
la variabile predefinita _AppliedT o.
time{}
open[]
[ in] Array con valori di prezzo Open.
high[]
[ in] Array con valori di prezzo H igh.
low[]
[ in] Array con valori di prezzo Low.
close[]
[ in] Array con valori di prezzo Close.
tick_volume[]
[ in] Array con valori di volume tick .
volume[]
[ in] Array con valori di volume trade.
spread[]
[ in] Array di valori spread per le barre.
Valore di ritorno
tipo int di valore da passare come parametro prev_calculated durante la prossima chiamata di
funzione.
Nota
S e la funzione OnCalculate() è uguale a zero, nessun valore dell'indicatore viene visualizzato nel
D ataW indow del terminale client.
Se i dati del prezzo sono stati modificati dall'ultima chiamata della funzione OnCalculate() (è stato
caricato uno storico più profondo o sono stati riempiti spazi vuoti nello storico), il valore del
parametro di input prev_calculated è impostato a zero dal terminale stesso.
Per definire la direzione di indicizzazione negli array time[], open[], high[], low[], close[],
tick_volume[], volume[] e spread[], chiamare la funzione ArrayGetAs S eries(). Per non dipendere dai
valori predefiniti, chiamare la funzione ArrayS etAs S eries() per gli array con cui lavorare.
Quando si utilizza il primo tipo di funzione, un indicatore o timeseries necessari viene selezionato
da un utente come array price[ ] nella scheda Parametri quando si avvia l'indicatore. Per fare ciò,
specificare l'elemento necessario nell'elenco a discesa del campo " Applica a" .
Per ottenere i valori dell'indicatore personalizzato da altri programmi mql5, viene usata la funzione
iCustom(). R estituisce l'handle dell'indicatore per le operazioni successive. È anche possibile
specificare l'array price[ ] richiesto o l'handle di un altro indicatore. Questo parametro deve essere
passato per ultimo nell'elenco delle variabili di input di un indicatore personalizzato.
È necessario utilizzare la connessione tra il valore restituito dalla funzione OnCalculate() e il secondo
parametro di input prev_calculated. Quando si chiama la funzione, il parametro prev_calculated
contiene il valore restituito dalla funzione OnCalculate() durante la chiamata precedente. Ciò
consente di implementare algoritmi di risparmio delle risorse per il calcolo di un indicatore
personalizzato al fine di evitare calcoli ripetitivi per le barre che non sono state modificate dal
lancio precedente di questa funzione.
Indicatore di esempio
//+------------------------------------------------------------------+
//| OnCalculate_Sample.mq5 |
//| Copyright 2018, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "Calcolo dell'indicatore Momentum di esempio"
Guarda anche
ArrayGetAs S eries, ArrayS etAs S eries, iCustom, Funzioni di event handling, Avvio programmi, Eventi
del terminale client, Accesso a timeseries ed indicatori
OnTimer
La funzione è chiamata nell' EA durante l'evento generato T imer dal terminale a intervalli di tempo
fissi.
void OnTimer(void);
Valore di ritorno
N essun valore di ritorno
Nota
L 'evento T imer viene periodicamente generato dal terminale client per un EA, che attiva il timer
utilizzando la funzione EventS etT imer(). Di solito, questa funzione è chiamata nella funzione
OnInit(). Quando l'EA smette di funzionare, il timer dovrebbe essere eliminato usando
EventKillT imer(), che di solito è chiamato nella funzione OnDeinit().
Ogni Ex pert Advisor e ciascun indicatore funzionano con il proprio timer che riceve eventi
esclusivamente da questo timer. Durante l'arresto dell'applicazione mql5, il timer viene eliminato
forzatamente nel caso in cui sia stato creato ma non sia stato disattivato dalla funzione
EventKillT imer().
Se è necessario ricevere eventi timer più frequentemente di una volta al secondo, utilizzare
EventS etMillisecondT imer() per creare un timer ad alta risoluzione.
L 'intervallo minimo di 1000 millisecondi viene utilizzato nel tester di strategia. In generale, quando
il periodo del timer viene ridotto, il tempo di test viene aumentato, in quanto il gestore di eventi
timer viene chiamato più spesso. Quando si lavora in modalità tempo reale, gli eventi timer
vengono generati non più di 1 volta in 10-16 millisecondi a causa di limitazioni hardware.
È possibile avviare un solo timer per ciascun programma. Ogni applicazione e chart mql5 ha una
propria coda di eventi in cui vengono posizionati tutti gli eventi appena arrivati. S e la coda contiene
già l'evento T imer o questo evento è in fase di elaborazione, allora il nuovo evento T imer non viene
aggiunto alla coda dell'applicazione mql5.
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Funzione di deinitializzazione dell' Expert |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- distrugge il timer dopo aver completato il lavoro
EventKillTimer();
}
//+------------------------------------------------------------------+
//| Funzione tick Expert |
//+------------------------------------------------------------------+
void OnTick()
{
//---
}
//+------------------------------------------------------------------+
//| Funzione del timer |
//+------------------------------------------------------------------+
void OnTimer()
{
//--- orario della prima chiamata di OnTimer()
static datetime start_time=TimeCurrent();
//--- orario del trade server durante la prima chiamata OnTimer()
static datetime start_tradeserver_time=0;
//--- orario del trade server calcolato
static datetime calculated_server_time=0;
//--- ora locale PC
datetime local_time=TimeLocal();
//--- orario stimato del trade server
datetime trade_server_time=TimeTradeServer();
// --- se l'orario del server è sconosciuto per qualche motivo, uscire primatempo
if(trade_server_time==0)
return;
//--- se il valore del trade server iniziale non è ancora impostato
if(start_tradeserver_time==0)
{
start_tradeserver_time=trade_server_time;
//--- imposta un valore calcolato del trade server
Print(trade_server_time);
calculated_server_time=trade_server_time;
}
else
{
// --- aumenta il tempo della prima chiamata di OnTimer()
if(start_tradeserver_time!=0)
calculated_server_time=calculated_server_time+1;;
}
//---
string com=StringFormat(" Start time: %s\r\n",TimeToString(start_time,TIME_MINU
com=com+StringFormat(" Local time: %s\r\n",TimeToString(local_time,TIME_MINUTES
com=com+StringFormat("TimeTradeServer time: %s\r\n",TimeToString(trade_server_time,TIME_MINUTES|
com=com+StringFormat(" EstimatedServer time: %s\r\n",TimeToString(calculated_server_time,TIME_MI
//--- visualizza i valori di tutti i contatori sul chart
Comment(com);
}
Guarda anche
EventS etT imer, EventS etMillisecondT imer, EventKillT imer, GetT ick Count, GetMicrosecondCount,
Eventi del terminale client
OnTrade
La funzione è chiamata nell' EA quando si verifica l'evento T rade. La funzione è pensata per elaborare
le modifiche nell'ordine, posizione e liste di trade.
void OnTrade(void);
Valore di ritorno
Nessun valore di ritorno
Nota
OnT rade() è chiamato solo per gli Ex pert Advisor. Non è utilizzato in indicatori e script anche se si
aggiunge una funzione con lo stesso nome e tipo.
Per qualsiasi azione di trade (piazzando un ordine pendente, aprendo/chiudendo una posizione,
piazzando stops, attivando ordine pendente, ecc.), la cronistoria degli ordini e delle operazioni e/o
l'elenco delle posizioni e degli ordini correnti viene modificata in modo appropriato.
Quando si gestisce un ordine, il trade server invia al terminale un messaggio sull'arrivo dell'evento
T rade. Per recuperare dati rilevanti su ordini e trades dalla cronistoria, è necessario eseguire una
Ogni evento T rade può apparire come risultato di una o più richieste di trade. Le richieste di trade
vengono inviate al server utilizzando OrderS end() o OrderS endAs ync(). Ogni richiesta può portare a
diversi eventi di trade. Non è possibile fare affidamento sull'affermazione " Una richiesta - un evento
di T rade" , poiché l'elaborazione degli eventi può essere eseguita in più fasi e ogni operazione può
modificare lo stato degli ordini, delle posizioni e della cronologia di trade.
L 'handler OnT rade() viene chiamato dopo l'appropriata chiamata OnT radeT ransaction(). In generale,
non esiste una correlazione esatta nel numero di chiamate OnT rade() e OnT radeT ransaction(). Una
chiamata OnT rade() corrisponde a una o più chiamate OnT radeT ransaction.
Esempio EA con il gestore OnTrade()
//+------------------------------------------------------------------+
//| OnTrade_Sample.mq5 |
//| Copyright 2018, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
//+------------------------------------------------------------------+
//| Funzione di inizializzazione Expert |
//+------------------------------------------------------------------+
int OnInit()
{
//---
end=TimeCurrent();
start=end-days*PeriodSeconds(PERIOD_D1);
PrintFormat("Limiti della cronistoria da caricare: inizio -%s, fine - %s",
TimeToString(start),TimeToString(end));
InitCounters();
//---
return(0);
}
//+------------------------------------------------------------------+
//| inizializzazione di contatori di posizione, ordine e trade |
//+------------------------------------------------------------------+
void InitCounters()
{
ResetLastError();
//--- carica cronistoria
bool selected=HistorySelect(start,end);
if(!selected)
{
PrintFormat("%s. Fallimento nel caricare la cronistoria da %s a %s nella cache. Codice errore
__FUNCTION__,TimeToString(start),TimeToString(end),GetLastError());
return;
}
//--- ottiene il valore corrente
orders=OrdersTotal();
positions=PositionsTotal();
deals=HistoryDealsTotal();
history_orders=HistoryOrdersTotal();
started=true;
Print("Contatori di ordini, posizioni e affari inizializzati con successo");
}
//+------------------------------------------------------------------+
//| Funzione tick Expert |
//+------------------------------------------------------------------+
void OnTick()
{
if(started) SimpleTradeProcessor();
else InitCounters();
}
//+------------------------------------------------------------------+
//| chiamata quando arriva un evento Trade |
//+------------------------------------------------------------------+
void OnTrade()
{
if(started) SimpleTradeProcessor();
else InitCounters();
}
//+------------------------------------------------------------------+
//| esempio di elaborazione delle modifiche nel trade e nella cronistoria
//+------------------------------------------------------------------+
void SimpleTradeProcessor()
{
end=TimeCurrent();
ResetLastError();
//--- scarica la cronistoria di trading dall'intervallo specificato, nella cache del programma
bool selected=HistorySelect(start,end);
if(!selected)
{
PrintFormat("%s. Fallimento nel caricare la cronistoria da %s a %s nella cache. Codice errore
__FUNCTION__,TimeToString(start),TimeToString(end),GetLastError());
return;
}
//--- ottiene i valori correnti
int curr_orders=OrdersTotal();
int curr_positions=PositionsTotal();
int curr_deals=HistoryDealsTotal();
int curr_history_orders=HistoryOrdersTotal();
//--- controlla se il numero di ordini attivi è stato modificato
if(curr_orders!=orders)
{
//--- il numero di ordini attivi è stato modificato
PrintFormat("Numero di ordini è stato cambiato. Il valore precedente è %d, il valore corrente
orders,curr_orders);
//--- aggiorna il valore
orders=curr_orders;
}
//--- cambia il numero di posizioni aperte
if(curr_positions!=positions)
{
//--- il numero di posizioni aperte è stato cambiato
PrintFormat("Il numero di posizioni è stato cambiato Il valore precedente è %d, il valore cor
positions,curr_positions);
//--- aggiorna il valore
positions=curr_positions;
}
//--- cambia il numero di affari nella cache della cronistoria di trade
if(curr_deals!=deals)
{
//--- il numero di affari nella cache della cronologia di trade è stato modificato
PrintFormat("Il numero di affari è stato cambiato. Il valore precedente è %d, il valore corre
deals,curr_deals);
//--- aggiorna il valore
deals=curr_deals;
}
//--- cambio nel numero degli ordini storici nella cache della cronistoria di trade
if(curr_history_orders!=history_orders)
{
//--- il numero di ordini dello storico nella cache della cronistoria di trade commerciale è
PrintFormat("Il numero di ordini nella cronistoria è stato cambiato. Il valore precedente è %
history_orders,curr_history_orders);
//--- aggiornamento valore
history_orders=curr_history_orders;
}
//--- verifica se è necessario modificare i limiti della cronistoria di trade da richiedere nella c
CheckStartDateInTradeHistory();
}
//+------------------------------------------------------------------+
//| modifica della data di inizio per la richiesta della cronistoria di trade
//+------------------------------------------------------------------+
void CheckStartDateInTradeHistory()
{
/ --- intervallo iniziale, se dovessimo iniziare a lavorare in questo momento
datetime curr_start=TimeCurrent()-days*PeriodSeconds(PERIOD_D1);
//--- assicurarsi che il limite iniziale della cronistoria di trade non sia andato
//--- più di 1 giorno oltre la data prevista
if(curr_start-start>PeriodSeconds(PERIOD_D1))
{
//--- corregge la data di inizio della cronistoria da caricare nella cache
start=curr_start;
PrintFormat("Nuovo limite iniziale della cronistoria di trade da caricare: start => %s",
TimeToString(start));
//--- ora ricarica la cronistoria degli scambi per l'intervallo aggiornato
HistorySelect(start,end);
//--- correggi l'ordine e i contatori dell'ordine nella cronistoria per ulteriori confronti
history_orders=HistoryOrdersTotal();
deals=HistoryDealsTotal();
}
}
//+------------------------------------------------------------------+
/* Esempio di Output :
Limiti della cronistoria da caricare: inizio - 2018.07.16 18:11, fine 2018.07.23 18:11
I contatori di ordini, posizioni ed affari sono inizializzati con successo
Guarda anche
OrderS end, OrderS endAs ync, OnT radeT ransaction, Eventi del terminale client
OnTradeTransaction
La funzione è chiamata nell' EA quando si verifica l'evento T radeT ransaction. La funzione è destinata
alla gestione dei risultati di esecuzione delle richieste di trade.
void OnTradeTransaction()
const MqlTradeTransaction& trans, // struttura transazione di trade
const MqlTradeRequest& request, // struttura request (richiesta)
const MqlTradeResult& result // struttura response (responso)
);
Parametri
trans
[in] M qlT radeT ransaction tipo di variabile che descrive una transazione effettuata su un conto di
trading.
request
[in] M qlT radeR equest tipo di variabile che descrive una richiesta di trade che ha portato alla
transazione. Contiene i valori per i tipi di transazione TRADE_TRANS ACTION_R EQUES T solo.
result
[in] M qlT radeR esult tipo di variabile contenente un risultato di esecuzione di una richiesta di
trade che ha portato alla transazione. Contiene i valori per i tipi di transazione
TRADE_TRANS A C TI O N_R EQUES T solo.
Valore di ritorno
N essun valore di ritorno
Nota
OnT radeT ransaction() è chiamato a gestire l'evento T radeT ransaction inviato dal trade server al
terminale nei seguenti casi:
· invia una richiesta di trade da un programma MQL5 usando le funzioni
OrderS end()/OrderS endAs ync() e la sua successiva esecuzione;
· inviare manualmente una richiesta di trade tramite la GUI e la sua successiva esecuzione;
· attivazioni di ordini pendenti e stop, sul server;
· eseguire operazioni sul lato del trade server.
I dati sul tipo di transazione sono contenuti nel tipo di campo della variabile trans. I tipi di
transazioni di trade sono descritti nell'enumerazione ENUM _TRADE_TRANS ACTION_TYPE:
· TRADE_TRANS ACTI ON_ORDER_ADD - aggiunta di un nuovo ordine attivo
· TRADE_TRANS ACTI ON_ORDER_UPDAT E - modifica di un ordine esistente
· TRADE_TRANS ACTI ON_ORDER_DELET E - eliminazione di un ordine dall'elenco di quelli attivi
· TRADE_TRANS ACTI ON_DEAL _ADD: aggiunta di un affare alla cronistoria
· TRADE_TRANS ACTI ON_DEAL _UPDAT E - modifica di un affare nella cronistoria
· TRADE_TRANS ACTI ON_DEAL _DELET E: eliminazione di un affare dalla cronistoria
· TRADE_TRANS ACTI ON_HIS T ORY_ADD - aggiunta di un ordine alla cronologia come risultato di
esecuzione o cancellazione
· TRADE_TRANS ACTI ON_HIS T ORY_UPDAT E - modifica di un ordine nella cronistoria degli ordini
· E
TRAD _TRANS A CTION_HIS T ORY_DELET E - eliminazione di un ordine dalla cronistoria degli ordini
· TRADE_TRANS ACTI ON_POS ITI ON - modifica della posizione non correlata ad un'esecuzione di trade
· TRADE_TRANS ACTI ON_R EQUES T - notifica che una richiesta di trade è stata elaborata dal server
ed il risultato del suo trattamento è stato ricevuto.
Quando si gestiscono le transazioni del tipo TRADE_TRANS ACTION_R EQUES T , è necessario
analizzare il secondo e il terzo parametro della funzione OnT radeT ransaction() - request e result -
per ricevere ulteriori informazioni.
L 'invio di una richiesta di trade porta ad una catena di transazioni di trade su un conto di trading : 1)
la richiesta è accettata per l'elaborazione, 2) viene creato un ordine di acquisto appropriato per
l'account, 3) l'ordine viene quindi eseguito, 4) l'ordine eseguito viene rimosso dalla lista di quelli
attivi, 5) aggiunto alla cronistoria degli ordini, 6) la transazione successiva viene aggiunta alla
cronistoria e 7) viene creata una nuova posizione. T utte queste fasi sono transazioni di trade.
L 'arrivo di ciascuna di tali transazioni al terminale è l'evento T radeT ransaction. La priorità dell'arrivo
di queste transazioni al terminale non è garantita. Pertanto, non dovresti aspettarti che un gruppo
di transazioni arrivi dopo un altro quando sviluppi il tuo algoritmo di trading.
Quando le transazioni vengono elaborate dal gestore OnT radeT ransaction() di EA, il terminale
continua a gestire le transazioni di trade in entrata. Pertanto, lo stato dell'account di trading può
cambiare nel corso dell'operazione OnT radeT ransaction(). Ad esempio, mentre un programma MQL5
gestisce l'aggiunta di un nuovo ordine, può essere eseguito, eliminato dall'elenco degli ordini aperti
e spostato nella cronistoria. Il programma viene informato di tutti questi eventi.
La lunghezza della coda delle transazioni comprende 1024 elementi. S e OnT radeT ransaction()
gestisce ancora un'altra transazione troppo a lungo, le precedenti possono essere sostituite da nuove
transazioni nella coda.
L 'handler OnT rade() viene chiamato dopo le chiamate OnT radeT ransaction() appropriate. In
generale, non esiste una correlazione esatta nel numero di chiamate OnT rade() e
OnT radeT ransaction(). Una chiamata OnT rade () corrisponde a una o più chiamate
OnT radeT ransaction.
Ogni evento T rade può apparire come risultato di una o più richieste di trade. Le richieste di trade
vengono inviate al server utilizzando OrderS end() o OrderS endAs ync(). Ogni richiesta può portare a
diversi eventi di trade. Non è possibile fare affidamento sull'affermazione " Una richiesta - un evento
di trade" , poiché l'elaborazione degli eventi può essere eseguita in più fasi ed ogni operazione può
modificare lo stato degli ordini, delle posizioni e della cronistoria di trade.
int OnInit()
{
//---
PrintFormat("LAST PING=%.f ms",
TerminalInfoInteger(TERMINAL_PING_LAST)/1000.);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Funzione tick Expert |
//+------------------------------------------------------------------+
void OnTick()
{
//---
}
//+------------------------------------------------------------------+
//| Funzione TradeTransaction |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
//---
static int counter=0; // contatore di chiamate OnTradeTransaction()
static uint lasttime=0; // orario dell'ultima chiamata OnTradeTransaction()
//---
uint time=GetTickCount();
//--- se l'ultima transazione è stata eseguita più di 1 secondo fa,
if(time-lasttime>1000)
{
counter=0; // allora questa è una nuova operazione di trade, il contatore può essere resettat
if(IS_DEBUG_MODE)
Print(" Nuova operazione di trade");
}
lasttime=time;
counter++;
Print(counter,". ",__FUNCTION__);
//--- risultato dell'esecuzione della richiesta di trade
ulong lastOrderID =trans.order;
ENUM_ORDER_TYPE lastOrderType =trans.order_type;
ENUM_ORDER_STATE lastOrderState=trans.order_state;
//--- il nome del simbolo, per il quale è stata eseguita una transazione
string trans_symbol=trans.symbol;
//--- tipo di transazione
ENUM_TRADE_TRANSACTION_TYPE trans_type=trans.type;
switch(trans.type)
{
case TRADE_TRANSACTION_POSITION: // modifica della posizione
{
ulong pos_ID=trans.position;
PrintFormat("MqlTradeTransaction: Posizione #%d %s modificata: SL=%.5f TP=%.5f",
pos_ID,trans_symbol,trans.price_sl,trans.price_tp);
}
break;
case TRADE_TRANSACTION_REQUEST: // invio di una richiesta di trade
PrintFormat("MqlTradeTransaction: TRADE_TRANSACTION_REQUEST");
break;
case TRADE_TRANSACTION_DEAL_ADD: // aggiunta trade
{
ulong lastDealID =trans.deal;
ENUM_DEAL_TYPE lastDealType =trans.deal_type;
double lastDealVolume=trans.volume;
// --- Trade ID in un sistema interno - un ticket assegnato da uno scambio
string Exchange_ticket="";
if(HistoryDealSelect(lastDealID))
Exchange_ticket=HistoryDealGetString(lastDealID,DEAL_EXTERNAL_ID);
if(Exchange_ticket!="")
Exchange_ticket=StringFormat("(Exchange deal=%s)",Exchange_ticket);
Exchange_ticket=StringFormat("Exchange ticket=%s",Exchange_ticket);
}
PrintFormat("MqlTradeTransaction: %s ordine #%d %s %s %s",EnumToString(trans_type),
lastOrderID,EnumToString(lastOrderType),EnumToString(lastOrderState),Exchange_
}
break;
}
//--- ticket dell'ordine
ulong orderID_result=result.order;
string retcode_result=GetRetcodeID(result.retcode);
if(orderID_result!=0)
PrintFormat("MqlTradeResult: ordine #%d retcode=%s ",orderID_result,retcode_result);
//---
}
//+------------------------------------------------------------------+
//| convertire i codici di risposta numerici nella stringa mnemonica |
//+------------------------------------------------------------------+
string GetRetcodeID(int retcode)
{
switch(retcode)
{
case 10004: return("TRADE_RETCODE_REQUOTE"); break;
case 10006: return("TRADE_RETCODE_REJECT"); break;
case 10007: return("TRADE_RETCODE_CANCEL"); break;
case 10008: return("TRADE_RETCODE_PLACED"); break;
case 10009: return("TRADE_RETCODE_DONE"); break;
case 10010: return("TRADE_RETCODE_DONE_PARTIAL"); break;
case 10011: return("TRADE_RETCODE_ERROR"); break;
case 10012: return("TRADE_RETCODE_TIMEOUT"); break;
case 10013: return("TRADE_RETCODE_INVALID"); break;
case 10014: return("TRADE_RETCODE_INVALID_VOLUME"); break;
case 10015: return("TRADE_RETCODE_INVALID_PRICE"); break;
case 10016: return("TRADE_RETCODE_INVALID_STOPS"); break;
case 10017: return("TRADE_RETCODE_TRADE_DISABLED"); break;
case 10018: return("TRADE_RETCODE_MARKET_CLOSED"); break;
case 10019: return("TRADE_RETCODE_NO_MONEY"); break;
case 10020: return("TRADE_RETCODE_PRICE_CHANGED"); break;
case 10021: return("TRADE_RETCODE_PRICE_OFF"); break;
case 10022: return("TRADE_RETCODE_INVALID_EXPIRATION"); break;
case 10023: return("TRADE_RETCODE_ORDER_CHANGED"); break;
case 10024: return("TRADE_RETCODE_TOO_MANY_REQUESTS"); break;
case 10025: return("TRADE_RETCODE_NO_CHANGES"); break;
case 10026: return("TRADE_RETCODE_SERVER_DISABLES_AT"); break;
case 10027: return("TRADE_RETCODE_CLIENT_DISABLES_AT"); break;
case 10028: return("TRADE_RETCODE_LOCKED"); break;
case 10029: return("TRADE_RETCODE_FROZEN"); break;
case 10030: return("TRADE_RETCODE_INVALID_FILL"); break;
case 10031: return("TRADE_RETCODE_CONNECTION"); break;
case 10032: return("TRADE_RETCODE_ONLY_REAL"); break;
Guarda anche
OrderS end, OrderS endAs ync, OnT radeT ransaction, S truttura della richiesta di T rade, S truttura delle
transazioni di trade, T ipi di transazione di trade, T ipi di operazioni di trade, Eventi del terminale
client
OnBookEvent
La funzione è chiamata in indicatori ed EA quando si verifica l'evento Book Event. È pensato per gestire
i cambiamenti del Depth of Mark et.
void OnBookEvent(
const string& symbol // simbolo
);
Parametri
symbol
[ in] Nome del simbolo per cui è arrivato Book Event
Valore di ritorno
N essun valore di ritorno
Nota
Per ottenere gli eventi Book Event per qualsiasi simbolo, è sufficiente iscriversi per riceverli per quel
simbolo utilizzando la funzione Mark etBookAdd(). Per annullare l'iscrizione per la ricezione di
Book Event per un determinato simbolo, chiamare la funzione Mark etBookR elease().
Le trasmissioni di Book Event all'interno dell'intero grafico-chart. Ciò significa che se un'applicazione
su un grafico-chart si iscrive a Book Event utilizzando la funzione Mark etBookAdd, tutti gli altri
indicatori ed EA lanciati sullo stesso chart e che hanno il gestore OnBook Event() ricevono anche
questo evento. Pertanto, è necessario analizzare ilnome di simbolo passato al gestore di
OnBook Event() come parametro symbol.
Contatori separati di Book Event ordinati per simboli vengono forniti per tutte le applicazioni in
esecuzione sullo stesso grafico-chart. Ciò significa che ogni chart può avere più iscrizioni a simboli
diversi e viene fornito un contatore per ciascun simbolo. La sottoscrizione e l'annullamento
dell'iscrizione da Book Event modifica il contatore dell'iscrizione per i simboli specificati solo
all'interno di un grafico-chart. In altre parole, potrebbero esserci due chart adiacenti a Book Event
per lo stesso simbolo ma diversi valori del contatore di iscrizioni.
Il valore del contatore dell'iscrizione iniziale è zero. A ciascuna chiamata Mark etBookAdd(), il
contatore dell'iscrizione per un simbolo specificato sul grafico-chart è aumentato di uno (il simbolo
del chart e il simbolo in Mark etBookAdd() non devono corrispondere). Quando si chiama
Mark etBookR elease(), il contatore delle iscrizioni per un simbolo specificato all'interno del grafico-
chart è diminuito di uno. Gli eventi Book Event per qualsiasi simbolo vengono trasmessi all'interno
del chart finché il contatore non è uguale a zero. Pertanto, è importante che ogni programma MQL5
che contiene Mark etBookAdd() chiami correttamente l'annullamento dell'iscrizione dal ricevere eventi
per ogni simbolo che utilizza Mark etBookR elease() alla fine del suo lavoro. Per raggiungere questo, il
numero di chiamate Mark etBookAdd() e Mark etBookR elease() dovrebbe essere pari per ogni
chiamata durante l'intera vita del programma MQL5. L 'uso di flag o contatori di iscrizioni
personalizzate all'interno del programma consente di lavorare in sicurezza con gli eventi Book Event
ed impedisce di disattivare le iscrizioni per ottenere questo evento in programmi di terze parti
all'interno dello stesso grafico-chart.
Gli eventi Book Event non vengono mai saltati e vengono sempre inseriti in una coda anche se la
gestione del precedente handling di Book Event non è ancora finita.
Esempio
//+------------------------------------------------------------------+
//| OnBookEvent_Sample.mq5 |
//| Copyright 2018, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link "https://www.mql5.com/en/articles/2635"
#property version "1.00"
#property description "Esempio di misurazione della frequenza di aggiornamento profondità del merca
#property description "Il codice è tratto dall'articolo https://www.mql5.com/en/articles/2635"
//--- parametri di input
input ulong ExtCollectTime =30; // tempo di test in secondi
input ulong ExtSkipFirstTicks=10; // numero di ticks saltati all'inizio
//--- contrassegno dell'iscrizione agli eventi BookEvent
bool book_subscribed=false;
//--- array per accettare richieste dal market depth
MqlBookInfo book[];
//+------------------------------------------------------------------+
//| Funzione di inizializzazione Expert |
//+------------------------------------------------------------------+
int OnInit()
{
//--- mostra l'inizio
Comment(StringFormat("In attesa dell'arrivo dei primi ticks %I64u",ExtSkipFirstTicks));
PrintFormat("In attesa dell'arrivo dei primi ticks %I64u",ExtSkipFirstTicks);
//--- abilita la trasmissione del market depth
if(MarketBookAdd(_Symbol))
{
book_subscribed=true;
PrintFormat("%s: la funzione MarketBookAdd(%s) ha restituito true",__FUNCTION__,_Symbol);
}
else
PrintFormat("%s: la funzione MarketBookAdd(%s) ha restituito false! GetLastError()=%d",__FUNC
//--- inizializzazione avvenuta con successo
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Deinitializzazione Expert |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- mostra il codice della ragione di deinitializzazione
Print(__FUNCTION__,": Codice ragione di Deinizializzazione = ",reason);
//--- cancella l'iscrizione per ottenere eventi del market depth
if(book_subscribed)
{
if(!MarketBookRelease(_Symbol))
Guarda anche
Mark etBookAdd, Mark etBookR elease, Mark etBookGet, OnT rade, OnT radeT ransaction, OnT ick ,
Funzioni di Event handling, A vvio Programma, Eventi terminale client
OnChartEvent
La funzione è chiamata in indicatori e EA quando si verifica l'evento ChartEvent. La funzione è
pensata per gestire le modifiche del grafico-chart effettuate da un utente o un programma MQL5.
void OnChartEvent()
const int id, // ID evento
const long& lparam, // parametro event di tipo long
const double& dparam, // parametro event di tipo double
const string& sparam // parametro event di tipo string
);
Parametri
id
[ in] ID evento dall'enumerazione ENUM _CHART_EVENT .
lparam
[ in] parametro event di tipo long
dparam
[ in] parametro event di tipo double
sparam
[ in] parametro event di tipo string
Valore di ritorno
N essun valore di ritorno
Nota
Esistono 11 tipi di eventi che possono essere gestiti utilizzando la funzione OnChartEvent()
predefinita. 65535 ID da CHART EVENT_CUS T OM a CHART EVENT_CUS T OM _L AS T incluso, sono forniti
per eventi personalizzati. Per generare un evento personalizzato, usare la funzione
EventChartCustom().
è a fuoco;
· CHART EVENT_MOUS E_MOVE — spostamento del mouse e click dei pulsanti del mouse (se
CHART_EVENT_MOUS E_MOVE=true per un chart);
· CHART EVENT_OBJECT_CR EAT E — crea un oggetto grafico (se
CHART_EVENT_OBJECT_CR EAT E=true per un chart);
· CHART EVENT_OBJECT_CHANGE — modifica le proprietà dell'oggetto tramite la finestra di dialogo
delle proprietà;
· CHART EVENT_OBJECT_DELET E — elimina un oggetto grafico (se
CHART_EVENT_OBJECT_DELET E=true per un chart);
· CHART EVENT_CL ICK — facendo clic su un chart;
· CHART EVENT_OBJECT_CL ICK — clic del mouse su un oggetto grafico appartenente a un chart;
· CHART EVENT_OBJECT_DRAG — trascinamento di un oggetto grafico con il mouse;
messaggi di sistema per il rendering successivo della finestra dell'applicazione e invia anche
messaggi interni ad ex perts ed indicatori lanciati sul chart. Può verificarsi una situazione, in cui il
thread dell'applicazione principale non ha ancora elaborato il messaggio di sistema W M _PAINT (e
quindi non ha ancora visualizzato il chart modificato), mentre un EA o un indicatore ha già ricevuto
l'evento movimento del mouse. In questo caso, la proprietà del chart CHART_FIRS T_VIS IBLE_BAR
verrà modificata solo dopo il rendering del chart.
Per ogni tipo di evento, gli input della funzione OnChartEvent() hanno determinati valori necessari
per gestire tale evento. La tabella elenca eventi e valori passati tramite i parametri.
del mouse (se OUS E_W H EEL tasti e pulsanti della rotellina
CHART_EVENT_ del mouse, del mouse
MOUS E_W H EEL = coordinate X e Y
true per il chart) del cursore.
Vedere la
descrizione nell'
esempio
su un chart L I CK
modifica delle
proprietà del
chart tramite la
finestra di
ChartRedraw();
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Funzione tick Expert |
//+------------------------------------------------------------------+
void OnTick()
{
//--- contatore tick per la generazione di un evento personalizzato
static int tick_counter=0;
//--- divide i tick accumulati con questo valore
int simple_number=113;
//---
tick_counter++;
//--- invia un evento personalizzato se il contatore tick è multiplo di simple_number
if(tick_counter%simple_number==0)
{
//--- forma un ID evento personalizzato da 0 a 65535<
ushort custom_event_id=ushort(tick_counter%65535);
// --- invia un evento personalizzato con il riempimento dei parametri
EventChartCustom(ChartID(),custom_event_id,tick_counter,SymbolInfoDouble(Symbol(),SYMBOL_BID)
// --- aggiunge un log per analizzare i risultati dell'esempio
Print(__FUNCTION__,": Sent a custom event ID=",custom_event_id);
}
//---
}
//+------------------------------------------------------------------+
//| Funzione ChartEvent |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
//--- keypress
if(id==CHARTEVENT_KEYDOWN)
{
switch((int)lparam)
{
case KEY_NUMLOCK_LEFT: Print("Premuto KEY_NUMLOCK_LEFT"); break;
case KEY_LEFT: Print("Premuto KEY_LEFT"); break;
case KEY_NUMLOCK_UP: Print("Premuto KEY_NUMLOCK_UP"); break;
case KEY_UP: Print("Premuto KEY_UP"); break;
case KEY_NUMLOCK_RIGHT: Print("Premuto KEY_NUMLOCK_RIGHT"); break;
case KEY_RIGHT: Print("Premuto KEY_RIGHT"); break;
case KEY_NUMLOCK_DOWN: Print("Premuto KEY_NUMLOCK_DOWN"); break;
case KEY_DOWN: Print("Premuto KEY_DOWN"); break;
case KEY_NUMPAD_5: Print("Premuto KEY_NUMPAD_5"); break;
if((flg_keys&0x0040)!=0)
str_keys+="X2MOUSE ";
if(str_keys!="")
str_keys=", keys='"+StringSubstr(str_keys,0,StringLen(str_keys)-1)+"'";
PrintFormat("%s: X=%d, Y=%d, delta=%d%s",EnumToString(CHARTEVENT_MOUSE_WHEEL),x_cursor,y_curs
}
//--- evento di ridimensionamento del chart o modifica delle proprietà del chart utilizzando la fin
if(id==CHARTEVENT_CHART_CHANGE)
Print("Modifica della grandezza o delle proprietà del chart");
//--- evento personalizzato
if(id>CHARTEVENT_CUSTOM)
PrintFormat("ID evento custom=%d, lparam=%d, dparam=%G, sparam=%s",id,lparam,dparam,sparam);
}
//+------------------------------------------------------------------+
//| MouseState |
//+------------------------------------------------------------------+
string MouseState(uint state)
{
string res;
res+="\nML: " +(((state& 1)== 1)?"DN":"UP"); // mouse sinistra
res+="\nMR: " +(((state& 2)== 2)?"DN":"UP"); // mouse destra
res+="\nMM: " +(((state&16)==16)?"DN":"UP"); // mouse centrale
res+="\nMX: " +(((state&32)==32)?"DN":"UP"); // primo tasto X del mouse
res+="\nMY: " +(((state&64)==64)?"DN":"UP"); // secondo tasto X del mouse
res+="\nSHIFT: "+(((state& 4)== 4)?"DN":"UP"); // tasto shift
res+="\nCTRL: " +(((state& 8)== 8)?"DN":"UP"); // tasto control
return(res);
}
Guarda anche
EventChartCustom, T ipi di eventi del chart, Funzioni di Event handling, Avvio Programmi, Eventi
terminale client
OnTester
La funzione viene chiamata nell' Ex pert A dvisors uando si verifica l'evento
q T ester per eseguire le
azioni necessarie dopo il test.
double OnTester(void);
Valore di ritorno
Valore dell'ottimizzazione del criterio personalizzato per la valutazione dei risultati del test.
Nota
La funzione OnT ester() può essere utilizzata solo durante il test di EA ed è intesa principalmente per
il calcolo di un valore che viene utilizzato come criterio " Custom max" quando si ottimizzano i
parametri di input.
Pertanto, la funzione OnT ester() consente non solo di creare e salvare i propri report dei risultati dei
test, ma anche di controllare il processo di ottimizzazione per trovare i migliori parametri della
strategia di trading.
//+------------------------------------------------------------------+
//| OnTester_Sample.mq5 |
//| Copyright 2018, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "Esempio di EA con l'handler OnTester()"
#property description "Come criterio di ottimizzazione personalizzato, "
#property description "il rapporto tra la regressione lineare del grafico di equilibrio"
#property description "diviso per l'errore quadratico medio di deviazione restituito"
//--- include la classe per le operazioni di trading
#include <Trade\Trade.mqh>
//--- Parametri di input EA
input double Lots = 0.1; // Volume
input int Slippage = 10; // Slippage ammissibile
input int MovingPeriod = 80; // Periodo Media Mobile
input int MovingShift = 6; // Slittamento Media Mobile
//--- variabili globali
int IndicatorHandle=0; // handle indicatore
//+------------------------------------------------------------------+
void CheckForClose(void)
{
MqlRates rt[2];
//--- trade solo all'inizio di una nuova barra
if(CopyRates(_Symbol,_Period,0,2,rt)!=2)
{
Print("CopyRates di ",_Symbol," fallito, nessuno storico");
return;
}
if(rt[1].tick_volume>1)
return;
//--- riceve valori media mobile
double ma[1];
if(CopyBuffer(IndicatorHandle,0,1,1,ma)!=1)
{
Print("CopyBuffer da iMA fallito, niente dati");
return;
}
//--- la posizione è già stata selezionata in precedenza utilizzando PositionSelect()
bool signal=false;
long type=PositionGetInteger(POSITION_TYPE);
//--- candela aperta più in alto ma chiusa al di sotto della media mobile - chiude una posizione sh
if(type==(long)POSITION_TYPE_SELL && rt[0].open>ma[0] && rt[0].close<ma[0])
signal=true;
//--- candela aperta più bassa ma chiusa sopra la media mobile - chiude una posizione long
if(type==(long)POSITION_TYPE_BUY && rt[0].open<ma[0] && rt[0].close>ma[0])
signal=true;
//--- controlli aggiuntivi
if(signal)
{
if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && Bars(_Symbol,_Period)>100)
trade.PositionClose(_Symbol,Slippage);
}
//---
}
//+-------------------------------------------------------------------+
//| Selezionare una posizione considerando il tipo di account: Netting o Hedging
//+-------------------------------------------------------------------+
bool SelectPosition()
{
bool res=false;
//--- seleziona una posizione per un account Hedging
if(IsHedging)
{
uint total=PositionsTotal();
for(uint i=0; i<total; i++)
{
string position_symbol=PositionGetSymbol(i);
CheckForOpen();
//---
}
//+------------------------------------------------------------------+
//| Funzione tester |
//+------------------------------------------------------------------+
double OnTester()
{
//--- valore di ottimizzazione del criterio personalizzato (più alto è, meglio è)
double ret=0.0;
//--- ottieni risultati di trade nell'array
double array[];
double trades_volume;
GetTradeResultsToArray(array,trades_volume);
int trades=ArraySize(array);
//--- se ci sono meno di 10 operazioni, i risultati del test non danno risultati positivi
if(trades<10)
return (0);
//--- risultato medio per trade
double average_pl=0;
for(int i=0;i<ArraySize(array);i++)
average_pl+=array[i];
average_pl/=trades;
//--- visualizza il messaggio per la modalità test singolo
if(MQLInfoInteger(MQL_TESTER) && !MQLInfoInteger(MQL_OPTIMIZATION))
PrintFormat("%s: Trades=%d, Profitto medio=%.2f",__FUNCTION__,trades,average_pl);
//--- calcola i rapporti di regressione lineare per il grafico del profitto
double a,b,std_error;
double chart[];
if(!CalculateLinearRegression(array,chart,a,b))
return (0);
//--- calcola l'errore della deviazione del chart dalla linea di regressione
if(!CalculateStdError(chart,a,b,std_error))
return (0);
//--- calcola il rapporto tra la tendenza profitti e la deviazione standard
ret=(std_error == 0.0) ? a*trades : a*trades/std_error;
//--- restituisce il valore di ottimizzazione del criterio personalizzato
return(ret);
}
//+------------------------------------------------------------------+
//| Ottieni l'array di profitti/perdite dagli affari |
//+------------------------------------------------------------------+
bool GetTradeResultsToArray(double &pl_results[],double &volume)
{
//--- richiede la cronologia completa del trading
if(!HistorySelect(0,TimeCurrent()))
return (false);
uint total_deals=HistoryDealsTotal();
volume=0;
//--- imposta la grandezza iniziale dell'array con un margine - in base al numero di affari nella c
ArrayResize(pl_results,total_deals);
//--- contatore di affari che fissano il risultato di trading - profitti o perdite
int counter=0;
ulong ticket_history_deal=0;
//--- passa attraverso tutti gli affari
for(uint i=0;i<total_deals;i++)
{
//--- seleziona un affare
if((ticket_history_deal=HistoryDealGetTicket(i))>0)
{
ENUM_DEAL_ENTRY deal_entry =(ENUM_DEAL_ENTRY)HistoryDealGetInteger(ticket_history_deal,DE
long deal_type =HistoryDealGetInteger(ticket_history_deal,DEAL_TYPE);
double deal_profit =HistoryDealGetDouble(ticket_history_deal,DEAL_PROFIT);
double deal_volume =HistoryDealGetDouble(ticket_history_deal,DEAL_VOLUME);
//--- siamo solo interessati alle operazioni di trading
if((deal_type!=DEAL_TYPE_BUY) && (deal_type!=DEAL_TYPE_SELL))
continue;
//--- solo gli affari che fissano i profitti/perdite
if(deal_entry!=DEAL_ENTRY_IN)
{
//--- scrivi il risultato del trading sull'array ed aumenta il contatore degli affari
pl_results[counter]=deal_profit;
volume+=deal_volume;
counter++;
}
}
}
//--- imposta la grandezza finale dell'array
ArrayResize(pl_results,counter);
return (true);
}
//+------------------------------------------------------------------+
//| Calculaa la regressione lineare y=a*x+b |
//+------------------------------------------------------------------+
bool CalculateLinearRegression(double &change[],double &chartline[],
double &a_coef,double &b_coef)
{
//--- controlla la sufficienza dei dati
if(ArraySize(change)<3)
return (false);
//--- crea un array chart con un accumulo
int N=ArraySize(change);
ArrayResize(chartline,N);
chartline[0]=change[0];
for(int i=1;i<N;i++)
chartline[i]=chartline[i-1]+change[i];
//--- ora, calcola i rapporti di regressione
double x=0,y=0,x2=0,xy=0;
for(int i=0;i<N;i++)
{
x=x+i;
y=y+chartline[i];
xy=xy+i*chartline[i];
x2=x2+i*i;
}
a_coef=(N*xy-x*y)/(N*x2-x*x);
b_coef=(y-a_coef*x)/N;
//---
return (true);
}
//+------------------------------------------------------------------+
//| Calcola l'errore di deviazione quadratica media per specificati a e b
//+------------------------------------------------------------------+
bool CalculateStdError(double &data[],double a_coef,double b_coef,double &std_err)
{
//--- somma dei quadrati di errore
double error=0;
int N=ArraySize(data);
if(N<=2)
return (false);
for(int i=0;i<N;i++)
error+=MathPow(a_coef*i+b_coef-data[i],2);
std_err=MathSqrt(error/(N-2));
//---
return (true);
}
Guarda anche
Test delle strategie di trading, T esterH ideIndicators, Lavorare con i risultati di ottimizzazione,
TesterS tatistics, OnT esterInit, OnT esterDeinit, OnT esterPass, MQL _T ES T ER , MQL _OPTIM IZATION,
FileOpen, FileW rite, fileload, FileS ave
OnTesterInit
La funzione è chiamata nell' EA quando si verifica l'evento T esterInit per eseguire le azioni necessarie
prima dell'ottimizzazione nel tester di strategia. Ci sono due tipi di funzione.
Valore di ritorno
valore del tipo int, zero significa inizializzazione di successo di un EA lanciato su un chart prima
dell'inizio dell'ottimizzazione.
La chiamata OnT esterInit() che restituisce il risultato dell'esecuzione è consigliata per l'uso poiché non
solo consente l'inizializzazione del programma, ma restituisce anche un codice di errore in caso di una
fermata di ottimizzazione anticipata. R estituzione di qualsiasi valore diverso da INIT_S UCCEEDED (0)
indica un errore; non viene avviata alcuna ottimizzazione.
La versione senza un risultato restituito è lasciata solo per compatibilità con i vecchi codici. Non
raccomandato per l'uso
void OnTesterInit(void);
Nota
L 'evento T esterInit viene generato prima dell'inizio dell'ottimizzazione EA nel tester strategia. A
questo evento, un EA con il gestore di eventi OnT esterDeI nit() o OnT esterPass() viene scaricato
automaticamente su un terminale separato. H a il simbolo e il periodo che sono stati specificati nel
tester.
Tale evento riceve gli eventi T esterInit, T esterDeinit e T esterPass, ma non quelli Init, Deinit e
e ick . Di conseguenza, tutta la logica necessaria per elaborare i risultati di ogni passaggio
N wT
Il risultato di ogni singolo pass durante l'ottimizzazione della strategia può essere dato tramite un
frame dall handler OnT ester() usando la funzione FrameAdd().
La funzione OnT esterInit() viene utilizzata per avviare un Ex pert Advisor prima dell'inizio
dell'ottimizzazione elaborazione dei risultati di ottimizzazione. Viene sempre utilizzato insieme al
gestore OnT esterDeinit().
Il tempo per l'esecuzione di OnT esterInit() è limitato. S e viene superato, l'EA viene fermato
forzatamente, mentre l'ottimizzazione stessa viene annullata. Un messaggio viene visualizzato nel
j ournal del tester:
L'esempio è preso da OnTick. Il gestore OnTesterInit() viene aggiunto per l'impostazione dei
parametri di ottimizzazione:
//+------------------------------------------------------------------+
//| OnTesterInit_Sample.mq5 |
//| Copyright 2018, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#proprietàdescrizione"Esempio EA con il gestore OnTesterInit()"
#property description "in cui valori e limiti di"
#property description "inputs durante l'ottimizzazione sono impostati"
//+------------------------------------------------------------------+
//| TesterDeinit function |
//+------------------------------------------------------------------+
void OnTesterDeinit()
{
//--- durata dell'ottimizzazione
string log_message=StringFormat("%s: l'ottimizzazione ha richiesto %d secondi",
__FUNCTION__,TimeLocal()-optimization_start);
PrintFormat(log_message);
report=report+"\r\n"+log_message;
Comment(report);
}
//+------------------------------------------------------------------+
//| Funzione di inizializzazione Expert |
//+------------------------------------------------------------------+
int OnInit()
{
//--- inizializza le variabili globali
last_atr=0;
last_body=0;
//--- imposta il volume corretto
double min_lot=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
trade_lot=lots>min_lot? lots:min_lot;
//--- crea l'handle dell'indicatore ATR
atr_handle=iATR(_Symbol,_Period,ATRperiod);
if(atr_handle==INVALID_HANDLE)
{
PrintFormat("%s: impossibile creare iATR, codice di errore %d",__FUNCTION__,GetLastError());
return(INIT_FAILED);
}
//--- inizializzazione EA di successo
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Funzione tick Expert |
//+------------------------------------------------------------------+
void OnTick()
{
//--- segnale di trading
staticoint segnale = 0; // +1 significa un segnale di acquisto, -1 indica un segnale di vendita
//--- controlla e chiude le vecchie posizioni aperte più di barre 'holdbars' fa
ClosePositionsByBars(holdbars,slippage,EXPERT_MAGIC);
//--- controlla una nuova barra
if(isNewBar())
{
// --- controlla la presenza del segnale
signal=CheckSignal();
}
// --- se si apre una posizione netting, saltare il segnale - attendere fino a quando non si chiude
}
else
PrintFormat("% s: impossibile ricevere il valore dell'indicatore ATR! Error",__FUNCTION__,Get
//--- se la modalità di trading inverso è abilitata
res=revers?-res:res; // inverte il segnale se necessario (restituisci -1 invece di 1 e vicevers
//--- restituisce un valore del segnale di trading
return (res);
}
//+------------------------------------------------------------------+
//| Restituisce 'true' quando appare una nuova barra |
//+------------------------------------------------------------------+
bool isNewBar(const bool print_log=true)
{
static datetime bartime=0; // memorizza l'orario di apertura della barra corrente
//--- ottiene l'orario di apertura della barra zero
datetime currbar_time=iTime(_Symbol,_Period,0);
// --- se l'orario di apertura cambia, è arrivata una nuova barra
if(bartime!=currbar_time)
{
bartime=currbar_time;
lastbar_timeopen=bartime;
//--- visualizza i dati sull'orario di apertura di una nuova barra nel log
if(print_log && !(MQLInfoInteger(MQL_OPTIMIZATION)||MQLInfoInteger(MQL_TESTER)))
{
//--- visualizza un messaggio con una nuova barra di apertura
PrintFormat("%s: nuova barra su %s %s aperta a %s",__FUNCTION__,_Symbol,
StringSubstr(EnumToString(_Period),7),
TimeToString(TimeCurrent(),TIME_SECONDS));
//--- recupera i dati sull'ultimo tick
MqlTick last_tick;
if(!SymbolInfoTick(Symbol(),last_tick))
Print("SymbolInfoTick() fallito, errore = ",GetLastError());
//--- mostra l'orario dell'ultimo tick fino ai millisecondi
PrintFormat("L'ultimo tick era alle %s.%03d",
TimeToString(last_tick.time,TIME_SECONDS),last_tick.time_msc%1000);
}
//--- abbiamo una nuova barra
return (true);
}
//--- nessuna nuova barra
return (false);
}
//+------------------------------------------------------------------+
//| Acquista ad un prezzo di mercato con un volume specificato |
//+------------------------------------------------------------------+
bool Buy(double volume,ulong deviation=10,ulong magicnumber=0)
{
//--- compra a prezzo di mercato
return (MarketOrder(ORDER_TYPE_BUY,volume,deviation,magicnumber));
}
//+------------------------------------------------------------------+
//| Vendi ad un prezzo di mercato con un volume specificato |
//+------------------------------------------------------------------+
bool Sell(double volume,ulong deviation=10,ulong magicnumber=0)
{
//--- vendi a prezzo di mercato
return (MarketOrder(ORDER_TYPE_SELL,volume,deviation,magicnumber));
}
//+------------------------------------------------------------------+
//| Chiusura le posizioni per hold time in barre |
//+------------------------------------------------------------------+
void ClosePositionsByBars(int holdtimebars,ulong deviation=10,ulong magicnumber=0)
{
int total=PositionsTotal(); // numero di posizioni aperte
//--- itera su posizioni aperte
for(int i=total-1; i>=0; i--)
{
//--- parametri dell posizione
ulong position_ticket=PositionGetTicket(i); // ticket p
string position_symbol=PositionGetString(POSITION_SYMBOL); // simbolo
ulong magic=PositionGetInteger(POSITION_MAGIC); // MagicNum
datetime position_open=(datetime)PositionGetInteger(POSITION_TIME); // orario d
int bars=iBarShift(_Symbol,PERIOD_CURRENT,position_open)+1; // quante b
MqlTradeRequest request={};
MqlTradeResult result={};
double price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
if(type==ORDER_TYPE_BUY)
price=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
//--- richiesta parametri
request.action =TRADE_ACTION_DEAL; // tipi di operazioni di trading
request.position =pos_ticket; // ticket della posizione, se chiusura
request.symbol =Symbol(); // symbol
request.volume =volume; // volume
request.type =type; // tipo di ordine
request.price =price; // prezzo di trade
request.deviation=slip; // deviazione ammissibile dal prezzo
request.magic =magicnumber; // MagicNumber dell'ordine
//--- invia richiesta
if(!OrderSend(request,result))
{
//--- mostra dati sul fallimento
PrintFormat("OrderSend %s %s %.2f at %.5f errore %d",
request.symbol,EnumToString(type),volume,request.price,GetLastError());
return (false);
}
//--- informa di un'operazione riuscita
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
return (true);
}
Guarda anche
Testing delle strategie di trading, Lavorare con i risultati di ottimizzazione, OnT esterDeinit,
OnT esterPass, ParameterGetR ange, ParameterS etR ange
OnTesterDeinit
La funzione è chiamata in EA quando si verifica l'evento T esterDeinit dopo l'ottimizzazione EA.
void OnTesterDeinit(void);
Valore di ritorno
N essun valore di ritorno
Nota
L 'evento T esterDeinit viene generato dopo la fine dell'ottimizzazione EA nel tester di strategia.
Un EA con un gestore di eventi OnT esterDeInit() o OnT esterPass() viene scaricato automaticamente
su un terminale separato durante l'avvio dell'ottimizzazione. H a il simbolo e il periodo che sono stati
specificati nel tester. La funzione è progettata per l'elaborazione finale di tutti i risultati di
ottimizzazione.
T ienere a mente che i frame di ottimizzazione inviati dagli agenti di test che utilizzano la funzione
FrameAdd() possono venire in bundles e richiedere tempo per la consegna. Pertanto, non tutti i
frame, cos ì come eventi T esterPass, possono arrivare ed essere elaborati in OnT esterPass() prima
della fine dell'ottimizzazione. S e si desidera ricevere tutti i frame in ritardo in OnT esterDeinit(),
inserire il blocco di codice utilizzando la funzione FrameNex t().
Guarda anche
Test delle strategie di trading, Lavorare con i risultati di ottimizzazione, T esterS tatistics,
OnT esterInit, OnT esterPass, ParameterGetR ange, ParameterS etR ange
OnTesterPass
La funzione è chiamata in EA quando si verifica l'evento T esterPass per la gestione di un nuovo frame
di dati durante l'ottimizzazione EA.
void OnTesterPass(void);
Valore di ritorno
N essun valore di ritorno
Nota
L 'evento T esterPass viene generato automaticamente uando si riceve un frame durante
q
Un EA con un gestore di eventi OnT esterDeInit() o OnT esterPass() viene scaricato automaticamente
su un terminale separato durante l'avvio dell'ottimizzazione. H a il simbolo e il periodo che sono stati
specificati nel tester. La funzione è destinata alla gestione dei frame ricevuti dagli agenti di testing
durante l'ottimizzazione. Il frame contenente i risultati del test deve essere inviato da OnT ester()
gestore usando la funzione FrameAdd().
T ienere a mente che i frame di ottimizzazione inviati dagli agenti di test che utilizzano la funzione
FrameA dd() possono venire in bundles e richiedere tempo per la consegna. Pertanto, non tutti i
frame, cos ì come eventi T esterPass, possono arrivare ed essere elaborati in OnT esterPass() prima
della fine dell'ottimizzazione. S e si desidera ricevere tutti i frame in ritardo in OnT esterDeinit(),
inserire il blocco di codice utilizzando la funzione FrameNex t().
D opo aver completato l'ottimizzazione di OnT esterDeinit(), è possibile ordinare nuovamente tutti i
frames ricevuti utilizzando le funzioni FrameFirst()/FrameFilter e FrameNex t().
Guarda anche
Test delle strategie di trading, Lavorare con i risultati di ottimizzazione, OnT esterInit,
OnT esterDeinit, FrameFirst, FrameFilter, FrameNex t, FrameInputs
Funzione Azione
Sy mbols T otal R estituisce il numero di simboli disponibili
(selezionati nel Mark et W atch o tutti)
Funzione Azione
Mark etBookGet Restituisce un array di strutture M qlBookInfo
contenente records della Profondità di Mercato
di un simbolo specifico
SymbolsTotal
R estituisce il numero dei simboli disponibili (selezionati nel Mark et W atch o tutti).
int SymbolsTotal(
bool selected // True - solo i simboli nel MarketWatch
);
Parametri
selected
[ in] Modalità tipo richiesta. Può essere true o false.
Valore restituito
Se il parametro 'selezionato' è true, la funzione restituisce il numero di simboli selezionati nel
Mark etW atch. S e il valore è false, restituisce il numero totale di tutti i simboli.
SymbolExist
Controlla se esiste un simbolo con il nome specificato.
bool SymbolExist(
const string name, // nome del simbolo
bool& is_custom // proprietà del simbolo personalizzato
);
Parametri
name
[ in] Nome del simbolo.
is_custom
[out] Proprietà del simbolo personalizzato impostata in caso di esecuzione riuscita. S e true, il
simbolo rilevato è un custom (simbolo personalizzato).
Valore di ritorno
S e false, il simbolo non è stato trovato tra quelli standard e quelli personalizzati.
Guarda anche
Sy mbols T otal, mbolS elect, Custom s ymbols
Sy
SymbolName
R estituisce il nome di un simbolo.
string SymbolName(
int pos, // numero nella lista
bool selected // true - solo simboli nel MarketWatch
);
Parametri
pos
[ in] Numero d'ordine di un simbolo.
selected
[in] Modalità tipo richiesta. S e il valore è true, il simbolo è tratto dalla lista dei simboli selezionati
in Mark etW atch. S e il valore è false, il simbolo è tratto dalla lista generale.
Valore restituito
V alore di tipo stringa con il nome del simbolo.
SymbolSelect
Consente di selezionare un simbolo nella finestra di controllo del mark et o rimuove un simbolo dalla
finestra.
bool SymbolSelect(
string name, // nome simbolo
bool select // aggiunge o rimuove
);
Parametri
name
[ in] Nome simbolo.
seleziona
[in] S witch. If the value is false, a s ymbol should be removed from Mark etW atch, otherwise a
s ymbol should be selected in this window. Un simbolo non può essere rimosso se il grafico simbolo
è aperto, o non ci sono posizioni aperte per questo simbolo.
Valore restituito
I n caso di fallimento restituisce false.
SymbolIsSynchronized
La funzione controlla se i dati di un simbolo selezionato nel terminale sono sincronizzati con i dati sul
server di trade.
bool SymbolIsSynchronized(
string name, // nome simbolo
);
Parametri
name
[ in] Nome del S imbolo.
Return value
S e i dati sono sincronizzati, restituisce 'true', in caso contrario restituisce 'false'.
Vedi anche
Sy mbolInfoInteger, Organizzazione Accesso Dati
SymbolInfoDouble
R estituisce la proprietà corrispondente di un simbolo specificato. Ci sono due varianti della funzione.
2. R estituisce true o false a seconda che una funzione viene eseguita con successo. In caso di
successo, il valore della proprietà è posto in una variabile recipiente, passato per riferimento dall'
ultimo parametro.
bool SymbolInfoDouble(
string name, // simbolo
ENUM_SYMBOL_INFO_DOUBLE prop_id, // identificatore della proprietà
double& double_var // qui assumiamo il valore della proprietà
);
Parametri
name
[ in] Nome simbolo.
prop_id
[in] Identificatore di una proprietà simbolo. Il valore può essere uno dei valori dell'enumerazione
ENUM _S YM BOL _INFO_DOUBLE.
double_var
[ out] Variabile di tipo double ricevente il valore della proprietà richiesta.
Valore restituito
Il valore di tipo double. In caso di esecuzione fallita, le informazioni circa l'errore possono essere
ottenute usando la funzione GetLastError():
· 5040 – invalid string parameter for specifying a s ymbol name [ trad. - parametri stringa non validi
Nota
E' raccomandato usare S ymbolInfoT ick () se la funzione viene usata per ottenere le informazioni circa
l'ultimo tick . Può ben essere che non una singola citazione sia già è apparsa da quando il terminale è
collegato ad un conto di trading. In tal caso, il valore richiesto sarà indefinito.
N ella maggior parte dei casi, è sufficiente utilizzare la funzione S ymbolInfoT ick () che permette a un
utente di ricevere i valori di As k , Bid, Last, Volume e l'orario di arrivo dell'ultimo tick durante una
singola chiamata.
La funzione S ymbolInfoMarginR ate() fornisce dati sulla quantità di margine addebitato in base al
tipo di ordine ed alla direzione.
Esempio:
void OnTick()
{
//--- ottiene lo spread dalle proprietà del simbolo
bool spreadfloat=SymbolInfoInteger(Symbol(),SYMBOL_SPREAD_FLOAT);
string comm=StringFormat("Spread %s = %I64d points\r\n",
spreadfloat?"floating":"fixed",
SymbolInfoInteger(Symbol(),SYMBOL_SPREAD));
//--- ora calcoliamo da noi stessi lo spread
double ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
double bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);
double spread=ask-bid;
int spread_points=(int)MathRound(spread/SymbolInfoDouble(Symbol(),SYMBOL_POINT));
comm=comm+"Calculated spread = "+(string)spread_points+" points";
Comment(comm);
}
SymbolInfoInteger
R estituisce la proprietà corrispondente di un simbolo specificato. Ci sono due varianti della funzione.
);
2. R estituisce true o false a seconda che una funzione viene eseguita con successo. In caso di
successo, il valore della proprietà è posto in una variabile recipiente, passato per riferimento dall'
ultimo parametro.
bool SymbolInfoInteger(
string name, // simbolo
ENUM_SYMBOL_INFO_INTEGER prop_id, // identificatore della proprietà
long& long_var // qui assumiamo il valore della proprietà
);
Parametri
name
[ in] Nome simbolo.
prop_id
[in] Identificatore di una proprietà simbolo. Il valore può essere uno dei valori dell' enumerazione
ENUM _S YM BOL _INFO_INT EGER .
long_var
[ out] Variabile di tipo long che riceve il valore della proprietà richiesta.
Valore restituito
Il valore di tipo long. In caso di esecuzione fallita, le informazioni circa l'errore possono essere
ottenute usando la funzione GetLastError():
· 5040 invalid string parameter for specifying a s ymbol name [trad. - parametri stringa non validi
–
Nota
E' raccomandato usare S ymbolInfoT ick () se la funzione viene usata per ottenere le informazioni circa
l'ultimo tick . Può ben essere che non una singola citazione sia già è apparsa da quando il terminale è
collegato ad un conto di trading. In tal caso, il valore richiesto sarà indefinito.
N ella maggior parte dei casi, è sufficiente utilizzare la funzione S ymbolInfoT ick () che permette a un
utente di ricevere i valori di As k , Bid, Last, Volume e l'orario di arrivo dell'ultimo tick durante una
singola chiamata.
Esempio:
void OnTick()
{
//--- ottiene lo spread dalle proprietà del simbolo
bool spreadfloat=SymbolInfoInteger(Symbol(),SYMBOL_SPREAD_FLOAT);
string comm=StringFormat("Spread %s = %I64d points\r\n",
spreadfloat?"floating":"fixed",
SymbolInfoInteger(Symbol(),SYMBOL_SPREAD));
//--- ora calcoliamo da noi stessi lo spread
double ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
double bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);
double spread=ask-bid;
int spread_points=(int)MathRound(spread/SymbolInfoDouble(Symbol(),SYMBOL_POINT));
comm=comm+"Calculated spread = "+(string)spread_points+" points";
Comment(comm);
}
SymbolInfoString
R estituisce la proprietà corrispondente di un simbolo specificato. Ci sono due varianti della funzione.
2. R estituisce true o false, a seconda se la funzione ha avuto successo. In caso di successo, il valore
della proprietà è posto in una variabile segnaposto passata per riferimento nell'ultimo parametro.
bool SymbolInfoString(
string name, // Simbolo
ENUM_SYMBOL_INFO_STRING prop_id, // Identificatore Proprietà
string& string_var // Qui si accetta il valore della proprietà
);
Parametri
name
[ in] Nome simbolo.
prop_id
[in] Identificatore di una proprietà simbolo. Il valore può essere uno dei valori dell'enumerazione
ENUM _S YM BOL _INFO_S TRING.
string_var
[ out] Variabile di tipo stringa riceve il valore della proprietà richiesta.
Valore restituito
Il valore di tipo stringa. In caso di esecuzione fallita, le informazioni circa l'errore possono essere
ottenute usando la funzione GetLastError():
· 5040 invalid string parameter for specifying a s ymbol name [trad. - parametri stringa non validi
–
Nota
E' raccomandato usare S ymbolInfoT ick () se la funzione viene usata per ottenere le informazioni circa
l'ultimo tick . Può ben essere che non una singola citazione sia già è apparsa da quando il terminale è
collegato ad un conto di trading. In tal caso, il valore richiesto sarà indefinito.
N ella maggior parte dei casi, è sufficiente utilizzare la funzione S ymbolInfoT ick () che permette a un
utente di ricevere i valori di As k , Bid, Last, Volume e l'orario di arrivo dell'ultimo tick durante una
singola chiamata.
SymbolInfoMarginRate
R eturns the margin rates depending on the order type and direction.
bool SymbolInfoMarginRate(
string name, // symbol name
ENUM_ORDER_TYPE order_type, // order type
double& initial_margin_rate, // initial margin rate
double& maintenance_margin_rate // maintenance margin rate
);
Parameters
name
[ in] mbol name.
Sy
order_type
[ in] Order type.
initial_margin_rate
[in] A double type variable for receiving an initial margin rate. Initial margin is a security deposit
for 1 lot deal in the appropriate direction. Multiplying the rate by the initial margin, we receive the
amount of funds to be reserved on the account when placing an order of the specified type.
maintenance_margin_rate
[out] A double type variable for receiving a maintenance margin rate. Maintenance margin is a
minimum amount for maintaining an open position of 1 lot in the appropriate direction. Multiplying
the rate by the maintenance margin, we receive the amount of funds to be reserved on the
account after an order of the specified type is activated.
Return Value
R eturns true if request for properties is successful, otherwise false.
SymbolInfoTick
La funzione restituisce i prezzi correnti di un simbolo specificato in una variabile del tipo M qlT ick .
bool SymbolInfoTick(
string symbol, // symbol name
MqlTick& tick // riferimento ad una struttura
);
Parametri
symbol
[ in] Nome del S imbolo.
tick
[out] Link alla struttura del tipo M qlT ick , a cui verranno apposti il prezzo ed orario correnti
dell'ultimo aggiornamento di prezzo.
Valore restituito
La funzione restituisce true in caso di successo, altrimenti restituisce false.
SymbolInfoSessionQuote
Permette di ricevere l'ora di inizio e fine delle sessioni quotate specificate per un simbolo e giorno
della settimana specifici.
bool SymbolInfoSessionQuote(
string name, // nome simbolo
ENUM_DAY_OF_WEEK day_of_week, // giorno della settimana
uint session_index, // indice della sessione
datetime& from, // orario di inizio della sessione
datetime& to // orario di fine della sessione
);
Parametri
name
[ in] Nome del S imbolo.
ENUM_DAY_OF_WEEK
[ in] Giorno della settimana, il valore dell' enumerazione ENUM _DAY_OF_W EEK.
uint
[in] Numero ordinale di una sessione, il cui tempo di inizio e di fine tempo si desidera ricevere. L '
indicizzazione delle sessioni inizia con 0.
da
[out] Deve essere ignorato nel valore della data restituito, l'orario di inizio della sessione in
secondi da 00 ore 00 minuti.
a
[out] Deve essere ignorato nel valore della data restituito, l'orario di fine della sessione in secondi
da 00 ore 00 minuti.
Valore restituito
Se i dati per la sessione specificata, simbolo e giorno della settimana vengono ricevuti, restituisce
true, altrimenti restituisce false.
Vedi anche
Proprietà S imbolo, T imeT oS truct, S trutture di Dati
SymbolInfoSessionTrade
Permette di ricevere l'ora di inizio e fine delle sessioni di trade specificate per un simbolo e giorno
della settimana specifici.
bool SymbolInfoSessionTrade(
string name, // nome simbolo
ENUM_DAY_OF_WEEK day_of_week, // giorno della settimana
uint session_index, // indice della sessione
datetime& from, // orario inizio sessione
datetime& to // orario fine sessione
);
Parametri
name
[ in] Nome del S imbolo.
ENUM_DAY_OF_WEEK
[ in] Giorno della settimana, il valore dell' enumerazione ENUM _DAY_OF_W EEK.
uint
[in] Numero ordinale di una sessione, il cui tempo di inizio e di fine tempo si desidera ricevere. L '
indicizzazione delle sessioni inizia con 0.
da
[out] Deve essere ignorato nel valore della data restituito, l'orario di inizio della sessione in
secondi da 00 ore 00 minuti.
a
[out] Deve essere ignorato nel valore della data restituito, l'orario di fine della sessione in secondi
da 00 ore 00 minuti.
Return value
Se i dati per la sessione specificata, simbolo e giorno della settimana vengono ricevuti, restituisce
true, altrimenti restituisce false.
Vedi anche
Proprietà S imbolo, T imeT oS truct, S trutture di Dati
MarketBookAdd
Fornisce l'apertura della profondità di mercato per un simbolo selezionato, e sottoscrive per ricevere le
notifiche dei cambiamenti DOM.
bool MarketBookAdd(
string symbol // simbolo
);
Parametri
symbol
[In] Il nome di un simbolo, la cui profondità di mercato deve essere utilizzata nell' Ex pert Advisor o
script.
Valore restituito
I l valore true se aperto con successo, altrimenti false.
Nota
N ormalmente, questa funzione deve essere chiamata dalla funzione OnInit() o nel costruttore della
classe. Per gestire gli avvisi in arrivo, nel programma Ex pert Advisor deve contenere la funzione
void OnBook Event(stringa e simbolo).
Vedi anche
S truttura della Profondità di Mercato, S trutture e Classi
MarketBookRelease
Fornisce la chiusura della Profondità di Mercato per un simbolo selezionato, e annulla la sottoscrizione
per ricevere le notifiche dei cambiamenti DOM.
bool MarketBookRelease(
string symbol // simbolo
);
Parametri
symbol
[ in] Nome simbolo.
Valore restituito
I l valore true se chiuso con successo, altrimenti false.
Nota
Normalmente, questa funzione deve essere chiamata dalla funzione OnDeinit(), se la corrispondente
funzione Mark etBookAdd() è stata richiamata nella funzione OnInit(). Oppure deve essere chiamata
dal distruttore della classe, se la corrispondente funzione Mark etBookAdd() è stata chiamata dal
costruttore della classe.
Vedi anche
S truttura della Profondità di Mercato,S trutture e Classi
MarketBookGet
R estituisce un array di strutture M qlBookInfo contenente i record della Profondità di Mercato di un
simbolo specifico.
bool MarketBookGet(
string symbol, // simbolo
MqlBookInfo& book[] // riferimento ad un array
);
Parametri
symbol
[ in] Nome simbolo.
book[]
n] R iferimento a un array di records di Profondità di Mercato. L ' array può essere pre-assegnato
[I
per un numero sufficiente di record. S e un array dinamico non è stato pre-assegnato nella
memoria operativa, il terminale client distribuirà l'array stesso.
Valore restituito
R estituisce true in caso di successo, altrimenti false.
Nota
La profondità di mercato deve essere pre-aperto dalla funzione Mark etBookAdd().
Esempio:
MqlBookInfo priceArray[];
bool getBook=MarketBookGet(NULL,priceArray);
if(getBook)
{
int size=ArraySize(priceArray);
Print("MarketBookInfo per ",Symbol());
for(int i=0;i<size;i++)
{
Print(i+":",priceArray[i].price
+" Volume = "+priceArray[i].volume,
" type = ",priceArray[i].type);
}
}
else
{
Print("Non si può ottenere il contenuto del simbolo DOM ",Symbol());
}
Vedi anche
S truttura della Profondità di Mercato,S trutture e Classi
T utte le funzioni per lavorare con il calendario economico utilizzano l'ora del trade server
(T imeT radeS erver). Ciò significa che il tempo nella struttura M qlCalendarValue e gli input di tempo
nelle funzioni CalendarValueH istoryByEvent/CalendarValueH istory sono impostate nel fuso orario del
trade server, piuttosto che nell'ora locale dell' utente.
Le funzioni del calendario economico consentono di condurre l'analisi automatica degli eventi in arrivo
in base a criteri di importanza personalizzati da una prospettiva del paese/valuta necessario.
Funzione Azione
CalendarCountryById Ottiene una descrizione del Paese tramite il suo
ID
change_id specificato
CalendarCountryById
Ottiene una descrizione del Paese tramite il suo ID.
bool CalendarCountryById(
const long country_id, // ID Paese
MqlCalendarCountry& country // variabile per ricevere una descrizione del Paese
);
Parametri
country_id
[ in] Country ID (IS O - ).
3166 1
country
[ out] M qlCalendarCountry: è il tipo di variabile per ricevere una descrizione del Paese.
Valore di ritorno
R estituisce true se ha successo, altrimenti - false. Per ottenere informazioni su un errore, chiamare
la funzione GetLastError(). Possibili errori:
· 4001 – ERR_INT ERNAL _ERR OR (errore di runtime generale),
· 5402 – ERR_CALENDAR_NO_DATA (Paese non trovato),
· 5401 – ERR_CALENDAR_TIMEOUT (tempo limite della richiesta ecceduto).
Esempio:
//+------------------------------------------------------------------+
//| Funzione Start del programma Script |
//+------------------------------------------------------------------+
void OnStart()
{
//--- ottiene l'elenco dei paesi dal calendario economico
MqlCalendarCountry countries[];
int count=CalendarCountries(countries);
//--- controlla il risultato
if(count==0)
PrintFormat("CalendarCountries() returned 0! Error %d",GetLastError());
//--- se ci sono due o più Paesi
if(count>=2)
{
MqlCalendarCountry country;
//--- ora ottiene una descrizione del Paese tramite il suo ID
if(CalendarCountryById(countries[1].id, country))
{
//--- prepara una descrizione del Paese
string descr="id = "+IntegerToString(country.id)+"\n";
descr+=("name = " + country.name+"\n");
descr+=("code = " + country.code+"\n");
descr+=("currency = " + country.currency+"\n");
descr+=("currency_symbol = " + country.currency_symbol+"\n");
Guarda anche
CalendarCountries, CalendarEventByCountry
CalendarEventById
Ottieni una descrizione dell'evento tramite il suo ID.
bool CalendarEventById(
ulong event_id, // ID evento
MqlCalendarEvent& event // variabile per ricevere una descrizione dell'evento
);
Parametri
event_id
[ in] Event ID.
event
[ out] M qlCalendarEvent: è il tipo di variabile per ricevere una descrizione dell'evento.
Valore di ritorno
R estituisce true se ha successo, altrimenti - false. Per ottenere informazioni su un errore, chiamare
la funzione GetLastError(). Possibili errori:
· 4001 – ERR_INT ERNAL _ERR OR (errore di runtime generale),
· 5402 – ERR_CALENDAR_NO_DATA (Paese non trovato),
· 5401 – ERR_CALENDAR_TIMEOUT (tempo limite della richiesta ecceduto).
Esempio:
//+------------------------------------------------------------------+
//| Funzione Start del programma Script |
//+------------------------------------------------------------------+
void OnStart()
{
//--- codice Paese per la Germania (ISO 3166-1 Alpha-2)
string germany_code="DE";
//--- ottiene eventi Tedeschi
MqlCalendarEvent events[];
int events_count=CalendarEventByCountry(germany_code,events);
//--- mostra gli eventi Tedeschi nel Journal
if(events_count>0)
{
PrintFormat("Germany events: %d",events_count);
ArrayPrint(events);
}
else
{
PrintFormat("Impossibile ricevere eventi per il codice Paese %s, errore %d",
germany_code,GetLastError());
//--- completamento precoce script
return;
}
//--- ottiene la descrizione dell'ultimo evento dall'array events[]
MqlCalendarEvent event;
ulong event_id=events[events_count-1].id;
if(CalendarEventById(event_id,event))
{
MqlCalendarCountry country;
CalendarCountryById(event.country_id,country);
PrintFormat("Descrizione evento con event_id=%d ricevuto",event_id);
PrintFormat("Paese: %s (country code = %d)",country.name,event.country_id);
PrintFormat("Nome evento: %s",event.name);
PrintFormat("Codice evento: %s",event.event_code);
PrintFormat("Importanza evento: %s",EnumToString((ENUM_CALENDAR_EVENT_IMPORTANCE)event.import
PrintFormat("Tipo di evento: %s",EnumToString((ENUM_CALENDAR_EVENT_TYPE)event.type));
PrintFormat("Settore evento: %s",EnumToString((ENUM_CALENDAR_EVENT_SECTOR)event.sector));
PrintFormat("Freuenza evento: %s",EnumToString((ENUM_CALENDAR_EVENT_FREQUENCY)event.frequency
PrintFormat("Modalità rilascio evento: %s",EnumToString((ENUM_CALENDAR_EVENT_TIMEMODE)event.t
PrintFormat("Unità di misura evento: %s",EnumToString((ENUM_CALENDAR_EVENT_UNIT)event.unit));
PrintFormat("Numero di cifre decimali: %d",event.digits);
PrintFormat("Moltiplicatore evento: %s",EnumToString((ENUM_CALENDAR_EVENT_MULTIPLIER)event.mu
PrintFormat("URL sorgente: %s",event.source_url);
}
else
PrintFormat("Impossibile ottenere la descrizione dell'evento per event_d =%s, errore %d",
event_id,GetLastError());
}
/*
Risultato:
Eventi Tedeschi: 50
[id] [type] [sector] [frequency] [time_mode] [country_id] [unit] [importance] [multipl
[ 0] 276010001 1 6 2 0 276 1 1
[ 1] 276010002 1 6 2 0 276 1 1
[ 2] 276010003 1 4 2 0 276 1 1
[ 3] 276010004 1 4 2 0 276 1 1
....
[47] 276500001 1 8 2 0 276 0 2
[48] 276500002 1 8 2 0 276 0 2
[49] 276500003 1 8 2 0 276 0 2
Descrizione dell'evento con event_id = 276500003 ricevuto
Paese: Germania (codice Paese = 276)
Nome dell'evento: Markit PMI Composito
Codice evento: markit-composite-pmi
Importanza evento: CALENDAR_IMPORTANCE_MODERATE
Tipo di evento: CALENDAR_TYPE_INDICATOR
Settore evento: CALENDAR_SECTOR_BUSINESS
Frequenza evento: CALENDAR_FREQUENCY_MONTH
Modalità rilascio evento: CALENDAR_TIMEMODE_DATETIME
Unità di misura evento: CALENDAR_UNIT_NONE
Numero di posizioni decimali: 1
Valore moltiplicatore: CALENDAR_MULTIPLIER_NONE
URL sorgente: https://www.markiteconomics.com
*/
Guarda anche
CalendarEventByCountry, CalendarEventByCurrency, CalendarValueById
CalendarValueById
Ottiene una descrizione del valore dell'evento tramite il suo ID.
bool CalendarValueById(
ulong value_id, // ID valore evento
MqlCalendarValue& value // variabile per la ricezione di un valore evento
);
Parametri
value_id
[ in] ID valore evento.
value
[ out] M qlCalendarValue: è il tipo di variabile per ricevere una descrizione dell'evento.
Valore di ritorno
R estituisce true se ha successo, altrimenti - false. Per ottenere informazioni su un errore, chiamare
la funzione GetLastError(). Possibili errori:
· 4001 – ERR_INT ERNAL _ERR OR (errore di runtime generale),
· 5402 – ERR_CALENDAR_NO_DATA (Paese non trovato),
· 5401 – ERR_CALENDAR_TIMEOUT (tempo limite della richiesta ecceduto).
Nota
T utte le funzioni per lavorare con il calendario economico utilizzano l'ora del trade server
(T imeT radeS erver). Ciò significa che il tempo nella struttura M qlCalendarValue e gli input di tempo
nelle funzioni CalendarValueH istoryByEvent/CalendarValueH istory sono impostate nel fuso orario del
trade server, piuttosto che nell'ora locale dell' utente.
Esempio:
//+------------------------------------------------------------------+
//| Funzione Start del programma Script |
//+------------------------------------------------------------------+
void OnStart()
{
//--- codice Paese per il Giappone (ISO 3166-1 Alpha-2)
string japan_code="JP";
//--- imposta i limiti dell'intervallo da cui prendiamo gli eventi
datetime date_from=D'01.01.2018'; // prende tutti gli eventi dal 2018
datetime date_to=0; // 0 indica tutti gli eventi noti, inclusi quelli che non si
//--- ottiene l'arra dei valori degli eventi in Giappone
MqlCalendarValue values[];
int values_count=CalendarValueHistory(values,date_from,date_to,japan_code);
//--- sposta i valori degli eventi rilevati
if(values_count>0)
{
PrintFormat("Numero di valori per gli eventi in Giappone: %d",values_count);
//--- elimina tutti i valori "vuoti" (actual_value==-9223372036854775808)
for(int i=values_count-1;i>=0;i--)
{
if(values[i].actual_value==-9223372036854775808)
ArrayRemove(values,i,1);
}
PrintFormat("Numero di valori dopo aver eliminato quelli vuoti: %d",ArraySize(values));
}
else
{
PrintFormat("Impossibile ricevere eventi per il codice Paese %s, errore %d",
japan_code,GetLastError());
//--- completamento precoce script
return;
}
//--- lascia non più di 10 valori nell' array values[]
if(ArraySize(values)>10)
{
PrintFormat("Riduce l'elenco dei valori a 10 e li visualizza");
ArrayRemove(values,0,ArraySize(values)-10);
}
ArrayPrint(values);
//--- ora mostriamo come ottenere una descrizione del valore di un evento in base al valore value_i
for(int i=0;i<ArraySize(values);i++)
{
MqlCalendarValue value;
CalendarValueById(values[i].id,value);
PrintFormat("%d: value_id=%d value=%d impact=%s",
i,values[i].id,value.actual_value,EnumToString(ENUM_CALENDAR_EVENT_IMPACT(value.i
}
//---
}
/*
Risultato:
Numero di valori per gli eventi in Giappone: 1734
Numero di valori dopo aver cancellato quelli vuoti: 1017
Riduce l'elenco dei valori a 10 e li visualizza
[id] [event_id] [time] [period] [revision] [actual_value] [prev_val
[0] 56500 392030004 2019.03.28 23:30:00 2019.03.01 00:00:00 0 900000 600
[1] 56501 392030005 2019.03.28 23:30:00 2019.03.01 00:00:00 0 700000 700
[2] 56502 392030006 2019.03.28 23:30:00 2019.03.01 00:00:00 0 1100000 1100
[3] 56544 392030007 2019.03.28 23:30:00 2019.02.01 00:00:00 0 2300000 2500
[4] 56556 392050002 2019.03.28 23:30:00 2019.02.01 00:00:00 0 1630000 1630
[5] 55887 392020003 2019.03.28 23:50:00 2019.02.01 00:00:00 0 400000 600
[6] 55888 392020004 2019.03.28 23:50:00 2019.02.01 00:00:00 0 -1800000 -3300
[7] 55889 392020002 2019.03.28 23:50:00 2019.02.01 00:00:00 0 200000 -2300
[8] 55948 392020006 2019.03.28 23:50:00 2019.02.01 00:00:00 1 1400000 -3400
[9] 55949 392020007 2019.03.28 23:50:00 2019.02.01 00:00:00 1 -1000000 300
Mostra dati brevi sui valori degli eventi in base a value_id
Guarda anche
CalendarValueH istoryByEvent, CalendarValueH istory, CalendarValueLastByEvent, CalendarValueLast
CalendarCountries
Ottiene la matrice dei nomi dei paesi disponibili nel Calendario.
int CalendarCountries(
MqlCalendarCountry& countries[] // array per la ricezione di un elenco di descrizioni d
);
Parametri
countries[]
[ out] U n array di tipo M qlCalendarCountry per ricevere descrizioni di tutti i Paesi del calendario.
Valore di ritorno
N umero di descrizioni ricevute. Per ottenere informazioni su un errore, chiamare la funzione
G etLastError(). Possibili errori:
· ERR_INT ERNAL _ERR OR (errore di runtime generale),
4001 –
· 5400 – ERR_CALENDAR_MOR E_DATA (la dimensione dell'array non è sufficiente per ricevere le
descrizioni di tutti i Paesi, solo quelli che sono riusciti a rientrare sono stati ricevuti).
Esempio:
//+------------------------------------------------------------------+
//| Funzione Start del programma Script |
//+------------------------------------------------------------------+
void OnStart()
{
//--- ottiene l'elenco dei paesi dal calendario economico
MqlCalendarCountry countries[];
int count=CalendarCountries(countries);
//--- visualizza l'array nel Journal
if(count>0)
ArrayPrint(countries);
else
PrintFormat("CalendarCountries() returned 0! Error %d",GetLastError());
/*
Risultato:
[id] [name] [code] [currency] [currency_symbol] [url_name] [reserved]
[ 0] 0 "Mondiale" "WW" "ALL" "" "mondiale" 0
[ 1] 999 "Unione Europea" "EU" "EUR" "€" "unione-europea" 0
[ 2] 840 "Stati uniti" "US" "USD" "$" "stati-uniti" 0
[ 3] 124 "Canada" "CA" "CAD" "$" "canada" 0
[ 4] 36 "Australia" "AU" "AUD" "$" "australia" 0
[ 5] 554 "Nuova Zelanda" "NZ" "NZD" "$" "nuova-zelanda" 0
[ 6] 392 "Giappone" "JP" "JPY" "Ґ" "giappone" 0
[ 7] 156 "Cina" "CN" "CNY" "Ґ" "cina" 0
[ 8] 826 "Regno Unito" "GB" "GBP" "Ј" "regno-unito" 0
[ 9] 756 "Svizzera" "CH" "CHF" "₣" "svizzera" 0
Guarda anche
CalendarEventByCountry, CalendarCountryById
CalendarEventByCountry
Ottiene l'array delle descrizioni di tutti gli eventi disponibili nel Calendario con un codice Paese
specificato.
int CalendarEventByCountry(
string country_code, // nome del codice del Paese (ISO 3166-1 alpha-2)
MqlCalendarEvent& events[] // variabile per ricevere l'array di descrizione
);
Parametri
country_code
[ in] Nome codice Paese (IS O - alpha-2)
3166 1
events[]
[out] M qlCalendarEvent: è il tipo di array per la ricezione di descrizioni di tutti gli eventi per un
Paese specificato.
Valore di ritorno
N umero di descrizioni ricevute. Per ottenere informazioni su un errore, chiamare la funzione
G etLastError(). Possibili errori:
· 4001 –ERR_INT ERNAL _ERR OR (errore di runtime generale),
· 4004 –ERR_NOT_ENOUGH_MEMORY (memoria insufficiente per l'esecuzione di una richiesta),
· 5401 – ERR_CALENDAR_TI MEOUT (tempo limite della richiesta ecceduto),
· errori di esecuzione fallita di ArrayR esize()
Esempio:
//+------------------------------------------------------------------+
//| Funzione Start del programma Script |
//+------------------------------------------------------------------+
void OnStart()
{
//--- codice Paese per EU (ISO 3166-1 Alpha-2)
string EU_code="EU";
//--- ottieni eventi UE
MqlCalendarEvent events[];
int events_count=CalendarEventByCountry(EU_code,events);
//--- visualizza gli eventi UE nel Journal
if(events_count>0)
{
PrintFormat("eventi EU: %d",events_count);
ArrayPrint(events);
}
//---
}
/*
Risultato:
eventi EU: 56
*/
Guarda anche
CalendarCountries, CalendarCountryById
CalendarEventByCurrency
Ottieni l'array delle descrizioni di tutti gli eventi disponibili nel Calendario in base ad una valuta
specificata.
int CalendarEventByCountry(
const string currency, // nome del codice valuta del Paese
MqlCalendarEvent& events[] // variabile per ricevere l'array della descrizione
);
Parametri
currency
[ in] Nome del codice valuta del Paese.
events[]
[out] M qlCalendarEvent: tipo di array per la ricezione delle descrizioni di tutti gli eventi per una
valuta specificata.
Valore di ritorno
N umero di descrizioni ricevute. Per ottenere informazioni su un errore, chiamare la funzione
G etLastError(). Possibili errori:
· 4001 –ERR_INT ERNAL _ERR OR (errore di runtime generale),
· 4004 –ERR_NOT_ENOUGH_MEMORY (memoria insufficiente per l'esecuzione di una richiesta),
· 5401 – ERR_CALENDAR_TI MEOUT (tempo limite della richiesta ecceduto),
· errori di esecuzione fallita di ArrayR esize()
Esempio:
//+------------------------------------------------------------------+
//| Funzione Start del programma Script |
//+------------------------------------------------------------------+
void OnStart()
{
//--- dichiara l'array per ricevere gli eventi del Calendario Economico
MqlCalendarEvent events[];
//--- ottieni eventi valutari UE
int count = CalendarEventByCurrency("EUR",events);
Print("count = ", count);
//--- 10 eventi sono sufficienti per l'esempio corrente
if(count>10)
ArrayResize(events,10);
//--- visualizza gli eventi nel diario
ArrayPrint(events);
}
/*
Risultato:
[id] [type] [country_id] [unit] [importance] [s
[0] 999010001 0 999 0 2 "https://www.ecb.europa.eu/home/html/index
Guarda anche
CalendarEventById, CalendarEventByCountry
CalendarValueHistoryByEvent
Ottiene l'array di valori per tutti gli eventi in un intervallo di tempo specificato da un ID evento.
bool CalendarValueById(
ulong event_id, // ID evento
MqlCalendarValue& values[], // array per le descrizioni dei valori
datetime datetime_from, // bordo sinistro di un intervallo di tempo
datetime datetime_to=0 // bordo destro di un intervallo di tempo
);
Parametri
event_id
[ in] Event ID.
values[]
[ out] M qlCalendarValue: è il tipo di array per ricevere i valori degli eventi
datetime_from
[in] La data iniziale di un intervallo temporale viene selezionata da un ID specificato, mentre
datetime_from < datetime_to.
datetime_to=0
[in] La data di fine di un intervallo di tempo viene selezionata da un ID specificato. S e
datetime_to non è impostato (o è 0), tutti i valori degli eventi che iniziano da quelli specificati
dalla data datetime_from nel database del calendario vengono restituiti (compresi i valori degli
eventi futuri).
Valore di ritorno
R estituisce true se ha successo, altrimenti - false. Per ottenere informazioni su un errore, chiamare
la funzione GetLastError(). Possibili errori:
· 4001 – ERR_INT ERNAL _ERR OR (errore di runtime generale),
· 4004 – ERR_NO T_ENO UGH_MEMO RY (memoria insufficiente per l'esecuzione di una richiesta),
allora il valore del campo mancante viene restituito come INT64_M IN (-9223372036854775808).
Vedere il valore campo revised_prev_value nell'esempio seguente.
Nota
T utte le funzioni per lavorare con il calendario economico utilizzano l'ora del trade server
(T imeT radeS erver). Ciò significa che il tempo nella struttura M qlCalendarValue e gli input di tempo
nelle funzioni CalendarValueH istoryByEvent/CalendarValueH istory sono impostate nel fuso orario del
trade server, piuttosto che nell'ora locale dell' utente.
Esempio:
//+------------------------------------------------------------------+
//| Funzione Start del programma Script |
//+------------------------------------------------------------------+
void OnStart()
{
//--- codice Paese per EU (ISO 3166-1 Alpha-2)
string EU_code="EU";
//--- ottieni eventi UE
MqlCalendarEvent events[];
int events_count=CalendarEventByCountry(EU_code,events);
//--- visualizza gli eventi UE nel Journal
if(events_count>0)
{
PrintFormat("eventi EU: %d",events_count);
//--- riduce la lista degli eventi, 10 eventi sono sufficienti per l'analisi
ArrayResize(events,10);
ArrayPrint(events);
}
//--- vedi che l'evento "Decisione tasso di interesse della BCE" abbia event_id = 999010007
ulong event_id=events[6].id; // l'ID dell'evento può cambiare nel Calendario, quindi assi
string event_name=events[6].name; // nome di un evento del calendario
PrintFormat("Ottiene valori per event_name =%s event_id=%d",event_name,event_id);
//--- ottiene tutti i valori dell'evento "Decisione tasso di interesse della BCE"
MqlCalendarValue values[];
//--- imposta i limiti dell'intervallo da cui prendiamo gli eventi
datetime date_from=0; // prende tutti gli eventi dall'inizio della cronologia disponib
datetime date_to=D'01.01.2016'; // prendere eventi non più vecchi del 2016
if(CalendarValueHistoryByEvent(event_id,values,date_from,date_to))
{
PrintFormat("Valori ricevuti per %s: %d",
event_name,ArraySize(values));
//--- riduci la lista valori, 10 eventi sono sufficienti per l'analisi
ArrayResize(values,10);
ArrayPrint(values);
}
else
{
PrintFormat("Errore! Impossibile ottenere valori per event_id=% d ", Event_id);
Guarda anche
CalendarCountries, CalendarEventByCountry, CalendarValueH istory, CalendarEventById,
CalendarValueById
CalendarValueHistory
Ottiene l'array di valori per tutti gli eventi in un intervallo di tempo specificato con la possibilità di
ordinare per Paese e/o valuta.
bool CalendarValueById(
MqlCalendarValue& values[], // array per le descrizioni dei valori
datetime datetime_from, // bordo sinistro dell' intervallo di tempo
datetime datetime_to=0 // bordo destro dell' intervallo di tempo
const string country_code=NULL, // codice nome Paese (ISO 3166-1 alpha-2)
const string currency=NULL // codice nome della valuta del Paese
);
Parametri
values[]
[ out] M qlCalendarValue: è il tipo di array per ricevere i valori degli eventi
datetime_from
[in] La data iniziale di un intervallo temporale viene selezionata da un ID specificato, mentre
datetime_from < datetime_to.
datetime_to=0
[in] La data di fine di un intervallo di tempo viene selezionata da un ID specificato. S e
datetime_to non è impostato (o è 0), tutti i valori degli eventi che iniziano da quelli specificati
dalla data datetime_from nel database del calendario vengono restituiti (compresi i valori degli
eventi futuri).
country_code=NULL
[ in] Nome codice Paese (IS O - alpha-2)
3166 1
currency=NULL
[ in] Nome del codice valuta del Paese.
Valore di ritorno
R estituisce true se ha successo, altrimenti - false. Per ottenere informazioni su un errore, chiamare
la funzione GetLastError(). Possibili errori:
· 4001 –ERR_INT ERNAL _ERR OR (errore di runtime generale),
· 4004 –ERR_NOT_ENOUGH_MEMORY (memoria insufficiente per l'esecuzione di una richiesta),
· 5401 – ERR_CALENDAR_TI MEOUT (tempo limite della richiesta ecceduto),
· 5400 – ERR_CALENDAR_MOR E_DATA (la dimensione dell'array è insufficiente per la ricezione delle
descrizioni di tutti i valori, solo quelli che sono riusciti a rientrare sono stati ricevuti),
· errori di esecuzione fallita di ArrayR esize()
Nota
T utte le funzioni per lavorare con il calendario economico utilizzano l'ora del trade server
(T imeT radeS erver). Ciò significa che il tempo nella struttura M qlCalendarValue e gli input di tempo
nelle funzioni CalendarValueH istoryByEvent/CalendarValueH istory sono impostate nel fuso orario del
trade server, piuttosto che nell'ora locale dell' utente.
Se l'array events[] di lunghezza fissa è stato passato alla funzione e non c'era spazio sufficiente per
salvare l'intero risultato, l'errore ERR_CALENDAR_MOR E_DATA (5400) viene attivato.
Se datetime_to non è impostato (o è 0), tutti i valori degli eventi che iniziano da quelli specificati
dalla data datetime_from nel database del calendario vengono restituiti (compresi i valori degli
eventi futuri).
Per i filtri country_code e currency, i valori NULL e "" sono equivalenti e significano l'assenza del
filtro.
Per country_code, deve essere utilizzato il campo code della struttura M qlCalendarCountry, ad
esempio " US " , " RU" o " EU" .
Per currency, deve essere utilizzato il campo currency della struttura M qlCalendarCountry, ad
esempio " US D" , " RUB" o " EUR" .
Ifiltri sono applicati per congiunzione, es. l' 'AND' logico viene utilizzato per selezionare solo i valori
degli eventi per cui vengono soddisfatte contemporaneamente entrambe le condizioni (Paese e
valuta).
allora il valore del campo mancante viene restituito come INT64_M IN (-9223372036854775808).
Vedere il valore campo revised_prev_value nell'esempio seguente.
Esempio:
//+------------------------------------------------------------------+
//| Funzione Start del programma Script |
//+------------------------------------------------------------------+
void OnStart()
{
//--- codice Paese per EU (ISO 3166-1 Alpha-2)
string EU_code="EU";
//--- ottiene tutti i valori degli eventi EU
MqlCalendarValue values[];
//--- imposta i limiti dell'intervallo da cui prendiamo gli eventi
datetime date_from=D'01.01.2018'; // prende tutti gli eventi dal 2018
datetime date_to=0; // 0 indica tutti gli eventi noti, inclusi quelli che non si
//--- richiede la cronologia degli eventi dell'UE dall'anno 2018
if(CalendarValueHistory(values,date_from,date_to,EU_code))
{
PrintFormat("Valori evento ricevuti per country_code=%s: %d",
EU_code,ArraySize(values));
//--- riduce la grandezza dell'array per l'output sul Journal
ArrayResize(values,10);
//--- visualizza i valori degli eventi nel Journal
ArrayPrint(values);
}
else
{
PrintFormat("Errore! Impossibile ricevere eventi per country_code=%s",EU_code);
PrintFormat("Codice errore: %d",GetLastError());
}
//---
}
/*
Risultato:
Valori evento ricevuti per country_code=EU: 1384
[id] [event_id] [time] [period] [revision] [actual_value] [prev_v
[0] 54215 999500001 2018.01.02 09:00:00 2017.12.01 00:00:00 3 60600000 60600
[1] 54221 999500002 2018.01.04 09:00:00 2017.12.01 00:00:00 3 56600000 56500
[2] 54222 999500003 2018.01.04 09:00:00 2017.12.01 00:00:00 3 58100000 58000
[3] 45123 999030005 2018.01.05 10:00:00 2017.11.01 00:00:00 0 600000 400
[4] 45124 999030006 2018.01.05 10:00:00 2017.11.01 00:00:00 0 2800000 2500
[5] 45125 999030012 2018.01.05 10:00:00 2017.12.01 00:00:00 1 900000 900
[6] 45126 999030013 2018.01.05 10:00:00 2017.12.01 00:00:00 1 1400000 1500
[7] 54953 999520001 2018.01.05 20:30:00 2018.01.02 00:00:00 0 127900000 92100
[8] 22230 999040003 2018.01.08 10:00:00 2017.12.01 00:00:00 0 9100000 8200
[9] 22231 999040004 2018.01.08 10:00:00 2017.12.01 00:00:00 0 18400000 16300
*/
Guarda anche
CalendarCountries, CalendarEventByCountry, CalendarValueH istoryByEvent, CalendarEventById,
CalendarValueById
CalendarValueLastByEvent
Ottiene l'array di valori di eventi in base al suo ID poiché lo stato del database di Calendar con un
change_id specificato.
int CalendarValueLastByEvent(
ulong event_id, // ID evento
ulong& change_id, // valore ID evento
MqlCalendarValue& values[] // array per le descrizioni dei valori
);
Parametri
event_id
[ in] Event ID.
change_id
[ in][out] Change ID.
values[]
[ out] M qlCalendarValue: è il tipo di array per ricevere i valori degli eventi
Valore di ritorno
N umero di valori di eventi ricevuti. Per ottenere informazioni su un errore, chiamare la funzione
G etLastError(). Possibili errori:
· ERR_INT ERNAL _ERR OR (errore di runtime generale),
4001 –
Nota
T utte le funzioni per lavorare con il calendario economico utilizzano l'ora del trade server
(T imeT radeS erver). Ciò significa che il tempo nella struttura M qlCalendarValue e gli input di tempo
nelle funzioni CalendarValueH istoryByEvent/CalendarValueH istory sono impostate nel fuso orario del
trade server, piuttosto che nell'ora locale dell' utente.
Se l'array events[] di lunghezza fissa è stato passato alla funzione e non c'era spazio sufficiente per
salvare l'intero risultato, l'errore ERR_CALENDAR_MOR E_DATA (5400) viene attivato.
Se change_id = 0 viene passato alla funzione, la funzione restituisce sempre zero ma il database del
calendario corrente viene restituito a change_id.
La funzione restituisce l'array per una notizia specificata ed un nuovo change_id che può essere
utilizzato per le chiamate successive della funzione per ricevere i nuovi valori della notizia.
Pertanto, è possibile aggiornare i valori per una notizia specificata chiamando questa funzione con
l'ultimo change_id noto.
{
...
long actual_value; // valore attuale dell'evento
long prev_value; // valore precedente dell'evento
long revised_prev_value; // valore rivisto dell'evento precedente
long forecast_value; // valore di previsione dell'evento
...
};
quindi il valore del campo mancante viene restituito come INT64_M IN (-9223372036854775808).
}
//+------------------------------------------------------------------+
//| Funzione del timer |
//+------------------------------------------------------------------+
void OnTimer()
{
//--- Cambia ID del database del calendario
ArrayRemove(events,event_pos+1);
//--- lascia 9 eventi prima di "Nonfarm Payrolls" per analisi più convenienti
ArrayRemove(events,0,event_pos-9);
ArrayPrint(events);
}
else
{
PrintFormat("%s: CalendarEventByCountry(%s) ha restituito 0 eventi, codice errore=%d",
USA_code,__FUNCTION__,GetLastError());
//--- operazione completata in errore, riprovare durante la prossima chiamata del timer
return;
}
//--- ottiene l'ID di modifica del database di Calendar per l'evento specificato
if(CalendarValueLastByEvent(event_id,calendar_change_id,values)>0)
{
//--- questo blocco di codice non può essere eseguito durante il primo avvio, ma aggiungia
PrintFormat("%s: Ricevuto l'ID corrente del database del calendario: change_id=%d",
__FUNCTION__,calendar_change_id);
//--- imposta la flag ed esce prima del prossimo evento del timer
first=false;
return;
}
else
{
//--- i dati non vengono ricevuti (questo è normale per il primo avvio), controllare per u
int error_code=GetLastError();
if(error_code==0)
{
PrintFormat("%s: Ricevuto l'ID corrente del database del calendario: change_id=%d",
__FUNCTION__,calendar_change_id);
//--- imposta la flag ed esce prima del prossimo evento del timer
first=false;
//--- ora abbiamo il valore calendar_change_id
return;
}
else
{
//--- e questo è davvero un errore
PrintFormat("%s: Fallimento nell'ottenere valori per event_id=%d",__FUNCTION__,event_id
PrintFormat("Codice errore: %d",error_code);
//--- operazione completata con errore, riprovare durante la prossima chiamata del time
return;
}
}
}
// --- abbiamo l'ultimo valore conosciuto del change ID del calendario (change_id)
ulong old_change_id=calendar_change_id;
*/
Guarda anche
CalendarValueLast, CalendarValueH istory, CalendarValueH istoryByEvent, CalendarValueById
CalendarValueLast
Ottiene l'array di valori per tutti gli eventi con la possibilità di ordinare per Paese e/o valuta dallo
stato del database del calendario con un change_id specificato.
int CalendarValueLast(
ulong& change_id, // change ID
MqlCalendarValue& values[], // array per le descrizioni dei valori
const string country_code=NULL, // nome codice Paese (ISO 3166-1 alpha-2)
const string currency=NULL // nome del codice valuta del Paese
);
Parametri
change_id
[ in][out] Change ID.
values[]
[ out] M qlCalendarValue: è il tipo di array per ricevere i valori degli eventi
country_code=NULL
[ in] Nome codice Paese (IS O - alpha-2)
3166 1
currency=NULL
[ in] Nome del codice valuta del Paese.
Valore di ritorno
Numero di valori di eventi ricevuti. Per ottenere informazioni su un errore, chiamare la funzione
GetLastError(). Possibili errori :
Nota
T utte le funzioni per lavorare con il calendario economico utilizzano l'ora del trade server
(T imeT radeS erver). Ciò significa che il tempo nella struttura M qlCalendarValue e gli input di tempo
nelle funzioni CalendarValueH istoryByEvent/CalendarValueH istory sono impostate nel fuso orario del
trade server, piuttosto che nell'ora locale dell' utente.
Se l'array events[] di lunghezza fissa è stato passato alla funzione e non c'era spazio sufficiente per
salvare l'intero risultato, l'errore ERR_CALENDAR_MOR E_DATA (5400) viene attivato.
Se change_id = 0 viene passato alla funzione, si otterrà il corrente change_id del database del
calendario su quel parametro; e la funzione restituisce 0
Per i filtri country_code e currency, i valori NU LL e "" sono equivalenti e significano l'assenza del
filtro.
Per country_code, deve essere utilizzato il campo code della struttura M qlCalendarCountry, ad
esempio " US " , " RU" o " EU" .
Per currency, deve essere utilizzato il campo currency della struttura M qlCalendarCountry, ad
esempio " US D" , " RUB" o " EUR" .
Ifiltri sono applicati per congiunzione, es. l' 'AND' logico viene utilizzato per selezionare solo i valori
degli eventi per cui vengono soddisfatte contemporaneamente entrambe le condizioni (paese e
valuta)
La funzione restituisce l'array per una notizia specificata ed un nuovo change_id che può essere
utilizzato per le chiamate successive della funzione per ricevere i nuovi valori della notizia.
Pertanto, è possibile aggiornare i valori per una notizia specificata chiamando questa funzione con
l'ultimo change_id noto.
q uindi il valore del campo mancante viene restituito come INT64_M IN (-9223372036854775808).
EventKillTimer();
}
//+------------------------------------------------------------------+
//| Funzione tick dell' Expert |
//+------------------------------------------------------------------+
void OnTick()
{
//---
}
//+------------------------------------------------------------------+
//| Funzione del timer |
//+------------------------------------------------------------------+
void OnTimer()
{
//--- Cambia ID del database del calendario
static ulong calendar_change_id=0;
//--- primo attributo di lancio
static bool first=true;
//--- arra del valore di evento
MqlCalendarValue values[];
//--- esegue l'inizializzazione - ottiene l'attuale calendar_change_id
if(first)
{
// --- ottiene l'ID di modifica del database del Calendario
if(CalendarValueLast(calendar_change_id,values)>0)
{
//--- questo blocco di codice non può essere eseguito durante il primo avvio, ma aggiungia
PrintFormat("%s: Ricevuto l'ID corrente del database del calendario: change_id=%d",
__FUNCTION__,calendar_change_id);
//--- imposta la flag ed esce prima del prossimo evento del timer
first=false;
return;
}
else
{
//--- i dati non vengono ricevuti (questo è normale per il primo avvio), controllare per u
int error_code=GetLastError();
if(error_code==0)
{
PrintFormat("%s: Ricevuto l'ID corrente del database del calendario: change_id=%d",
__FUNCTION__,calendar_change_id);
//--- imposta la flag ed esce prima del prossimo evento del timer
first=false;
//--- ora abbiamo il valore calendar_change_id
return;
}
else
{
// --- abbiamo l'ultimo valore conosciuto del change ID del calendario (change_id)
ulong old_change_id=calendar_change_id;
//--- controlla se ci sono nuovi eventi del calendario
if(CalendarValueLast(calendar_change_id,values)>0)
{
PrintFormat("%s: nuovi eventi del calendario ricevuti: %d",
__FUNCTION__,ArraySize(values));
//--- visualizza i dati dall' arra 'values' nel Journal
ArrayPrint(values);
//--- mostra i valori del precedente e del nuovo ID del diario
PrintFormat("%s: Precedente change_id=%d, nuovo change_id=%d",
__FUNCTION__,old_change_id,calendar_change_id);
//--- mostra nuovi eventi nel Journal
ArrayPrint(values);
/*
scrivi il tuo codice per gestire il verificarsi di eventi qui
*/
}
//---
}
/*
Esempio dell'operazione listener(di ascolto):
OnTimer: ha ricevuto l'ID corrente del database del calendario: change_id=33281792
On Timer: Ricevuti nuovi eventi per il calendario: 1
[id] [event_id] [time] [period] [revision] [actual_value] [prev_val
[0] 91040 76020013 2019.03.20 15:30:00 1970.01.01 00:00:00 0 -5077000 -1913
OnTimer: Previous change_id=33281792, new change_id=33282048
[id] [event_id] [time] [period] [revision] [actual_value] [prev_val
[0] 91040 76020013 2019.03.20 15:30:00 1970.01.01 00:00:00 0 -5077000 -1913
On Timer: Ricevuti nuovi eventi per il calendario: 1
[id] [event_id] [time] [period] [revision] [actual_value] [pr
[0] 91041 76020013 2019.03.27 15:30:00 1970.01.01 00:00:00 0 -9223372036854775808
OnTimer: Previous change_id=33282048, new change_id=33282560
[id] [event_id] [time] [period] [revision] [actual_value] [pr
[0] 91041 76020013 2019.03.27 15:30:00 1970.01.01 00:00:00 0 -9223372036854775808
*/
Guarda anche
CalendarValueLast, CalendarValueH istory, CalendarValueH istoryByEvent, CalendarValueById
C'è un' importante eccezione a questa regola: se i valori delle timeseries e degli indicatori devono
essere copiati spesso, ad esempio ad ogni chiamata di OnT ick () negli Ex pert Advisors o ad ogni
chiamata di OnCalculate() negli indicatori, in questo caso sarebbe meglio utilizzare gli array
staticamente distribuiti, perché operazioni di allocazione di memoria per gli array dinamici
richiedono più tempo, e ciò avrà un effetto durante il testing e l'ottimizzazione.
L 'accesso ai dati dell' indicatore e timeseries è implementato indipendentemente dal fatto se i dati
richiesti sono pronti (il cosiddetto accesso asincrono). Questo è estremamente importante per il
calcolo dell' indicatore personalizzato, quindi se non vi sono dati, funzioni di tipo Copy...()
restituiscono immediatamente un errore. T uttavia, quando si accede da Ex pert Advisor e script,
diversi tentativi di ricezione dei dati vengono realizzati in una piccola pausa, che è volta a fornire un
po' di tempo necessario per scaricare T imeS eries richieste per calcolare i valori degli indicatori.
La sezione Organizzare l' Accesso ai Dati descrive i dettagli di ricezione, archiviazione e richiede i dati
sui prezzi nel terminale client MetaT rader 5.
È storicamente accettato che un accesso ai dati dei prezzi in un array viene eseguito a partire dalla
fine dei dati. Fisicamente, i nuovi dati vengono sempre scritti alla fine dell'array, ma l'indice della
matrice è sempre uguale a zero. L 'indice 0 nell'array timeseries denota i dati della barra corrente, cioè
la barra che corrisponde all'intervallo di tempo non-finito in questo timeframe.
U n timeframe è il periodo di tempo, durante il quale viene formata una barra di prezzo unico. Ci sono
21 timeframes standard predefiniti.
Funzione Azione
S eries InfoInteger Restituisce le informazioni sullo stato dei dati
storici
Funzione Azione
specificati
Funzione Azione
iVolume Restituisce il volume tick della barra (indicato
dal parametro 'shift') sul chart corrispondente
Nonostante il fatto che con la funzione ArrayS etAs S eries() è possibile impostare negli array l'accesso
agli elementi come quelli nelle timeseries, va ricordato che gli elementi dell'array vengono fisicamente
memorizzati in un solo e medesimo ordine - solo la direzione di indicizzazione cambia. Per dimostrare
questo fatto cerchiamo di fare un esempio:
datetime TimeAsSeries[];
//--- imposta l' accesso all'array come ad una timeseries
ArraySetAsSeries(TimeAsSeries,true);
ResetLastError();
int copied=CopyTime(NULL,0,0,10,TimeAsSeries);
if(copied<=0)
{
Print("L'operazione di copia dei valori dell'orario di apertura per le ultime 10 barre, è fal
return;
}
Print("TimeCurrent =",TimeCurrent());
Print("ArraySize(Time) =",ArraySize(TimeAsSeries));
int size=ArraySize(TimeAsSeries);
for(int i=0;i<size;i++)
{
Print("TimeAsSeries["+i+"] =",TimeAsSeries[i]);
}
datetime ArrayNotSeries[];
ArraySetAsSeries(ArrayNotSeries,false);
ResetLastError();
copied=CopyTime(NULL,0,0,10,ArrayNotSeries);
if(copied<=0)
{
Print("L'operazione di copia dei valori dell'orario di apertura per le ultime 10 barre, è fal
return;
}
size=ArraySize(ArrayNotSeries);
for(int i=size-1;i>=0;i--)
{
Print("ArrayNotSeries["+i+"] =",ArrayNotSeries[i]);
}
ArraySize(Time) = 10
TimeAsSeries[0] = 2009.06.11 14:00:00
TimeAsSeries[1] = 2009.06.11 13:00:00
TimeAsSeries[2] = 2009.06.11 12:00:00
TimeAsSeries[3] = 2009.06.11 11:00:00
TimeAsSeries[4] = 2009.06.11 10:00:00
TimeAsSeries[5] = 2009.06.11 09:00:00
TimeAsSeries[6] = 2009.06.11 08:00:00
TimeAsSeries[7] = 2009.06.11 07:00:00
TimeAsSeries[8] = 2009.06.11 06:00:00
TimeAsSeries[9] = 2009.06.11 05:00:00
Come si vede dall' output, cos ì come aumenta l'indice dell'array T imeAs S eries, il valore temporale
dell'indice diminuisce, cioè si passa dal presente al passato. Per l'array comune ArrayNotS eries il
risultato è diverso - cos come indice cresce, si passa dal passato al presente.
Vedere anche
A rrayIs Dynamic, ArrayGetAs S eries, ArrayS etAs S eries, ArrayIs S eries
U n buffer indicatore è un array dinamico di tipo doppio, la cui grandezza è gestita dai terminali client,
in modo che corrisponda sempre al numero di barre su cui viene calcolato l'indicatore. Un solito array
dinamico di tipo double viene assegnato come un buffer utilizzando l'indicatore funzione
S etI ndexBuffer(). I buffers indicatore non richiedono l'impostazione delle loro grandezze con la
funzione ArrayR esize() - questo sarà fatto dal sistema di esecuzione del terminale.
Timeseries sono array con indicizzazione inversa, cioè il primo elemento di un timeseries è nella
posizione estrema destra, e l'ultimo elemento è nella posizione di estrema sinistra. T imeseries vengno
utilizzate per la memorizzazione di dati sui prezzi storici e contenere le informazioni di tempo,
possiamo dire che i dati più recenti vengono inseriti nella posizione estrema destra delle timeseries,
mentre i dati più vecchi sono in posizione di estrema sinistra.
Quindi l'elemento timeseries con indice 0 contiene le informazioni sulle ultime quotazioni di un
simbolo. S e una timeseries contiene dati su un timeframe giornaliero, i dati del giorno corrente ancora
incompleto si trovano sulla posizione zero, e la posizione di indice 1 contiene dati di ieri.
La direzione di indicizzazione non può essere modificata per array staticamente distribuiti. Anche se
un array viene passato come parametro ad una funzione, il tentativo di cambiare la direzione di
indicizzazione all'interno di questa funzione non porterà alcun effetto.
Per i buffer indicatore, come per gli array solitamente, la direzione di indicizzazione può anche essere
impostato come invertita (come nelle timeseries), cioè il riferimento alla posizione zero nel buffer
indicatore significherà riferimento all'ultimo valore sul buffer indicatore corrispondente e questo
corrisponderà al valore dell'indicatore sull'ultima barra. T uttavia, la posizione fisica delle barre
indicatori non verrà modificata.
G li Array passati alla funzione riflettono dati sui prezzi, vale a dire questi array hanno il segno di una
timeseries e la funzione ArrayIs S eries() restituirà true quando si controllano questi array. T uttavia,
qualsiasi direzione indicizzazione dovrebbe essere controllata solo per la funzione A rrayGetA s S eries().
Per non dipendere da valori predefiniti, ArrayS etAs S eries() deve essere incondizionatamente chiamato
per gli array che si stanno per lavorare, ed impostare la direzione desiderata.
T utte queste funzioni funzionano in modo simile. Prendiamo in considerazione i dati ottenendo
meccanismo sull'esempio di CopyBuffer(). È implicato che la direzione di indicizzazione dei dati
richiesti è quella delle timeseries, e la posizione di indice 0 (zero) memorizza i dati della barra
corrente ancora incompleta. Al fine di ottenere l'accesso a questi dati abbiamo bisogno di copiare il
volume necessario di dati nell' array ricevente, ad esempio in un array buffer.
Quando si copia è necessario specificare la posizione di partenza nell' array di origine, a partire dal
quale i dati saranno copiati nell' array destinatario. I n caso di successo, il numero specificato di
elementi verrà copiato nell' array destinatario dall' array di origine (dal buffer indicatore in questo
caso). Indipendentemente dal valore di indicizzazione nell'array destinatario, la copia viene sempre
eseguita come è mostrato nella figura precedente.
Se si prevede che i dati sui prezzi saranno trattati in un ciclo con un gran numero di iterazioni, si
consiglia di controllare il fatto di cessazione forzata del programma usando la funzione Is S topped():
Esempio:
input int per=10; // periodo dell'esponente
int ma_handle; // Handle indicatore
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione dell' Expert |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//---
ma_handle=iMA(_Symbol,0,per,0,MODE_EMA,PRICE_CLOSE);
//---
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione tick dell'Expert |
//+--------------------------------------------------------------------------------+
void OnTick()
{
//---
double ema[10];
int copied=CopyBuffer(ma_handle,// Handle indicatore
0, // indice del buffer indicatore
0, // posizione di partenza da cui copiare
10, // numero di valori per la copia
10, // array ricevente valori
);
if(copied<0) return;
// .... ulteriore codice
}
Vedi anche
Il meccanismo di riferimento server per i dati non dipende da come la richiesta è stata avviata - da un
utente durante la navigazione nel grafico o in modo con il programma nella linguaggio MQL5.
I dati vengono scritti in file con estensione .hcc . Ogni file memorizza i dati delle barre minute per un
anno. Ad esempio, il file denominato 2009.hcc nella cartella EURUS D contiene barre minute di EURUS D
per l'anno 2009. Questi file vengono utilizzati per la preparazione di dati sui prezzi per tutti i
timeframes e non sono destinati per l'accesso diretto.
Per risparmiare le risorse, i dati su un timeframe vengono memorizzati e salvati nella RAM solo se
necessario. S e non vengono chiamati per lungo tempo, vengono rilasciati dalla RAM e salvati in un file.
Per ogni timeframe, i dati vengono preparati indipendentemente dal fatto che ci sono dati pronti per
altri timeframes o meno. Le regole di formazione ed accesso ai dati sono gli stessi per tutti i
timeframes. S ignifica, che nonostante il fatto che i dati memorizzati in unità H CC siano nn minuto, la
disponibilità di dati H CC non significa la disponibilità di dati sulla tempistica M 1 come H C nello stesso
volume.
La ricezione di nuovi dati da un server chiama l'aggiornamento automatico dei dati sui prezzi utilizzati
in formato H C di tutti i timeframes. Essa comporta anche il ricalcolo di tutti gli indicatori che
implicitamente li utilizzano come dati di input per i calcoli.
Quando si imposta un valore elevato di questo parametro, va ricordato, che se sono disponibili dati
storici in profondità per piccoli timeframes, la memoria utilizzata per la memorizzazione dei buffers di
timeseries ed indicatori, possono diventare centinaia di megabyte e raggiungere la restrizione RAM
per il programma del terminale client (2Gb per applicazioni a 32 bit di M S W indows).
La modifica di " Max barre nei grafici" avrà effetto dopo che il terminale client viene riavviato. Il
cambio di questo parametro causa né il riferimento automatico ad un server per i dati aggiuntivi, né
formazione di barre aggiuntive di di timeseries. Dati relativi ai prezzi aggiuntivi vengono richiesti dal
server, e le timeseries vengono aggiornate tenendo conto della nuova limitazione, in caso di uno
scorrimento del grafico all'area senza dati, o quando i dati vengono richiesti da un programma MQL5.
Volume dei dati richiesti dal server corrisponde al numero di barre richiesto di questo timeframe con il
parametro " Max barre nel grafico" preso in considerazione. La restrizione impostata da questo
parametro non è rigida, e in alcuni casi il numero di barre disponibili per un periodo di tempo può
essere un po' di più del valore corrente del parametro.
Disponibilità dati
La presenza di dati su formato H CC o anche in preparazione per l'utilizzo del formato H C, non sempre
denota la disponibilità assoluta di tali dati da visualizzare nel chart o da utilizzare in programmi MQL5.
Quando si accede ai dati sui prezzi o valori degli indicatori da un programma MQL5 va ricordato che la
loro disponibilità in un certo istante di tempo o a partire da un certo momento di tempo non è
garantita. E' collegato con il fatto che con il fine di risparmiare risorse, la copia completa di dati
necessari per un programma MQL5 non è memorizzata in MetaT rader 5; viene dato solo l'accesso
diretto al database terminale.
La cronistoria dei prezzi per tutti i timeframes è costruita a partire da dati comuni di formato H CC, e
qualsiasi aggiornamento dei dati da un server conduce all'aggiornamento dei dati per tutti i
timeframes e al ricalcolo degli indicatori. A causa di tale accesso ai dati, può essere chiusa, anche se
questi dati erano disponibili poc'anzi.
G li algoritmi con cicli di latenza non sono la soluzione migliore. L 'unica eccezione in questo caso sono
gli script, perché non hanno nessun algoritmo alternativo a causa di non avere la gestione degli eventi
(event handling). Per gli indicatori personalizzati, tali algoritmi, nonché eventuali altri cicli di latenza
sono fortemente sconsigliati, perché portano alla cessazione del calcolo di tutti gli indicatori e
qualsiasi altra manipolazione dei dati sui prezzi del simbolo.
Per Ex pert Advisors ed indicatori, è meglio utilizzare il modello di eventi di handling. S e durante
l'handling di eventi OnT ick () o OnCalculate(), la ricezione di dati per le serie temporali richieste è
fallita, è necessario uscire dall'event handler, facendo affidamento sulla disponibilità di accesso
durante la chiamata successiva dell'handler.
Consideriamo l'esempio di uno script che esegue una richiesta per ricevere lo storico per il simbolo
selezionato da un trade server. Lo script è destinato all'esecuzione in un grafico di un simbolo
selezionato; non importa il timeframe, perché, come è stato detto sopra, i dati sui prezzi sono
ricevuti da un trade server come dei dati confezionati da 1 minuto, da cui tutte le
timeseriespredefiniti, vengono costruite poi .
Scriviamo tutte le azioni riguardanti la ricezione di dati come una funzione separata Check LoadH istory
(simbolo, timeframe , start_date):
La funzione Check LoadH istory() è concepita come una funzione universale che può essere chiamata da
qualsiasi programma (Ex pert A dvisor, S cript o I ndicatore), e pertanto richiede tre parametri di input:
nome simbolo, periodo e la data di inizio per indicare l'inizio dello storico prezzi di cui si bisogno.
Inserire i necessari controlli nel codice della funzione prima di richiedere la storia mancante. Prima di
tutto, dobbiamo fare in modo che il nome del simbolo ed il valore del periodo siano corretti:
Quindi facciamo in modo che il simbolo sia disponibile nella finestra di Mark etW atch, vale a dire, la
storia del simbolo sarà disponibile quando si invia una richiesta ad un trade server. S e non vi è un tale
simbolo in Mark etW atch, aggiungerlo utilizzando la funzione S ymbolS elect().
if(!SymbolInfoInteger(symbol,SYMBOL_SELECT))
{f
if(GetLastError()==ERR_MARKET_UNKNOWN_SYMBOL) return(-1);
SymbolSelect(symbol,true);
}
Ora dobbiamo ricevere la data di inizio dello storico disponibile per la coppia simbolo/periodo indicata.
Forse, il valore del parametro di input startdate, passato a Check LoadH istory(), è all'interno dello
storico disponibile; quindi la richiesta ad un trade server non è necessaria. Per ottenere la prima data
per il simbolo-periodo del momento, viene utilizzata la funzione S eries InfoInteger() con il modificatore
S ERI ES _FIRS TDAT E.
SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date);
if(first_date>0 && first_date<=start_date) return(1);
I l prossimo importante controllo sta controllando il tipo di programma, da cui la funzione viene
chiamata. Nota, inviando la richiesta per aggiornare le timeseries con lo stesso periodo di quello
dell'indicatore, che chiama l'aggiornamento, è indesiderabile. La non desiderabilità della richiesta dei
dati sullo stesso simbolo-periodo come quello dell'indicatore, è condizionata dal fatto che
l'aggiornamento dei dati storici viene eseguito nello stesso thread in cui opera l'indicatore. Quindi, la
possibilità di insorgenza di un punto morto è alta. Per controllare ciò, usare la funzione
MQL5InfoInteger() con il modificatore MQL5_PR OGRAM _TYPE.
S e tutti i controlli hanno dato risultati positivi, fa l'ultimo tentativo senza fare riferimento al server
commercio. Prima cerchiamo di scoprire la data di inizio, per i quali sono disponibili dati minute in
formato H CC. R ichiediamo questo valore utilizzando la funzione S eries InfoInteger() con il modificatore
S ERI ES _T ER M INA L _FIRS TDAT E e ancora confrontandolo con il valore del parametro start_date.
if(SeriesInfoInteger(symbol,PERIOD_M1,SERIES_TERMINAL_FIRSTDATE,first_date))
{
//--- ci sono dati caricati per costruire timeseries
if(first_date>0)
{
//--- forza la costruzione di timeseries
CopyTime(symbol,period,first_date+PeriodSeconds(period),1,times);
//--- controlla data
if(SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date))
if(first_date>0 && first_date<=start_date) return(2);
}
}
S e dopo tutti i controlli il thread di esecuzione è ancora nel corpo della funzione Check LoadH istory(),
significa che vi è una necessità di richiedere i dati mancanti dei prezzi da un trade server. In primo
luogo, viene restituito il valore di " Max barre nel chart" utilizzando la funzione T erminalInfoInteger():
int max_bars=TerminalInfoInteger(TERMINAL_MAXBARS);
A vremo bisogno per impedire la richiesta di dati aggiuntivi. Poi trovare la prima vera data nello
storico del simbolo sul trade server (indipendentemente dal periodo) utilizzando la già nota funzione
S eries I nfoI nteger() con il modificatore S ERI ES _S ERVER_FIRS TDAT E.
datetime first_server_date=0;
while(!SeriesInfoInteger(symbol,PERIOD_M1,SERIES_SERVER_FIRSTDATE,first_server_date) && !IsStopp
Sleep(5);
D al momento che la richiesta è un'operazione asincrona, la funzione viene richiamata nel ciclo con un
piccolo ritardo di 5 millisecondi fino a quando la variabile first_server_date riceve un valore, o
l'esecuzione del ciclo viene interrotta da un utente (Is S topped() restituirà true in questo caso).
I ndichiamo un valore corretto della data di inizio, a partire dalla quale richiediamo i dati sui prezzi da
un trade server.
if(first_server_date>start_date) start_date=first_server_date;
if(first_date>0 && first_date<first_server_date)
Print("Attenzione: prima data server ",first_server_date," for ",
symbol," non corrisponde alla prima data della serie",first_date);
Se la data di inizio first_server_date del server è inferiore alla data di inizio first_date del simbolo in
formato H CC, la voce corrispondente viene emessa nel Journal.
Ora siamo pronti a fare una richiesta ad un trade server per chiedere dati mancanti di prezzi.
Effettuare la richiesta sotto forma di un ciclo ed iniziare a riempire il suo corpo:
while(!IsStopped())
{
//1. attende la sincronizzazione tra le timeseries ri-costruite e lo storico intermedio come
//2. ricevee il numero corrente di barre in questa serie storica
while(!IsStopped())
{
//--- 1.attende finchè il processo di ricostruzione della timeseries viene completato
while(!SeriesInfoInteger(symbol,period,SERIES_SYNCHRONIZED) && !IsStopped())
Sleep(5);
//--- 2.richiede ora quante barre abbiamo
int bars=Bars(symbol,period);
if(bars>0)
{
//--- barre più di quelle che possono essere disegnate nel chart, uscita
if(bars>=max_bars) return(-2);
//--- 3. restituisce la corrente data di inizio nella timeseries
if(SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date))
// la data di inizio era prima di quella richiesta, task completato
if(first_date>0 && first_date<=start_date) return(0);
}
//4. Richiede da un server una nuova parte dello storico - 100 barre a partire dalla scorsa b
}
L 'ultimo quarto punto viene lasciato - richiesta storico. Non possiamo fare riferimento ad un server
direttamente, ma qualsiasi funzione-Copy inizia automaticamente la richiesta di invio ad un server, se
lo storico in formato H CC non è sufficiente. S iccome il tempo della primissima data di inizio nella
variabile first_date è il criterio semplice e naturale per valutare il grado richiesta di esecuzione, allora
il modo ancor più semplice è quello di utilizzare la funzione CopyT ime().
Quando si chiamano funzioni che copiano i dati provenienti da timeseries, si deve rilevare che il
parametro start (numero della barra, a partire dal quale i dati di prezzo dovrebbero essere copiati)
deve essere sempre all'interno dello storico disponibile del terminale. S e si hanno solo 100 barre, è
privo di senso provare a copiare 300 barre partendo dalla barra con l'indice 500. T ale richiesta sarà
intesa come erronea e non sarà trattata, cioè nessuna storia supplementare sarà caricata da un trade
server.
Ecco perché si copierà dala barra 100 a partire dalla barra con indice bars (l'index ). Ciò fornirà il
corretto caricamento dello storico mancante, da un trade server. In realtà verrà caricato un po' di più
rispetto alle 100 barre richieste, mentre il server invia lo storico di dimensioni più grandi.
int copied=CopyTime(symbol,period,bars,100,times);
opo l'operazione di copia, dobbiamo analizzare il numero di elementi copiati. S e il tentativo fallisce,
D
allora il valore di copied sarà uguale a null ed il valore del contatore fail_cnt sarà aumentato di 1. Dopo
100 tentativi di fallimento, l'operazione della funzione viene interrotta.
int fail_cnt=0;
...
int copied=CopyTime(symbol,period,bars,100,times);
if(copied>0)
{
//--- controllo dati
if(times[0]<=start_date) return(0); // il valore copiato è più piccolo,
if(bars+copied>=max_bars) return(-2); // le barre pronte sono più di quelle che possono esser
fail_cnt=0;
}
else
{
//--- non più di 100 tentativi di fallimento in successo
fail_cnt++;
if(fail_cnt>=100) return(-5);
Sleep(10);
}
Cos ì, non solo viene implementato nella funzione il corretto handling della situazione attuale in
qualsiasi fase di esecuzione, ma viene restituito anche il codice di terminazione, che può essere
gestito dopo la chiamata della funzione Check LoadH istory() per ottenere ulteriori informazioni. Ad
esempio, in questo modo:
int res=CheckLoadHistory(InpLoadedSymbol,InpLoadedPeriod,InpStartDate);
switch(res)
{
case -1 : Print("Simbolo sconosciuto",InpLoadedSymbol); break;
case -2 : Print("Richieste più barre di quelle che possono essere disegnate nel chart"); brea
case -3 : Print("Esecuzione fermata dall'utente"); break;
case -4 : Print("L'indicatore non deve caricare i suoi propri dati"); break;
case -5 : Print("Caricamento fallito"); break;
case 0 : Print("Tutti i dati caricati"); break;
case 1 : Print("I dati già disponibili nella timeseries sono sufficienti"); break;
case 2 : Print("La timeseries è costruita da dati disponibili sul terminale"); break;
default : Print("L'esecuzione risulta non definita");
}
Il codice completo della funzione può essere trovato nel esempio di uno script che mostra la corretta
organizzazione di accesso ai dati con l'handling dei risultati della richiesta.
Codice:
//+--------------------------------------------------------------------------------+
//| TestLoadHistory.mq5 |
//| Copyright 2009, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.02"
#property script_show_inputs
//--- parametri di input
//--- non chiedere per il caricamento dei propri dati se si tratta di un indicatore
if(MQL5InfoInteger(MQL5_PROGRAM_TYPE)==PROGRAM_INDICATOR && Period()==period && Symbol()==symbol
return(-4);
//--- secondo tentativo
if(SeriesInfoInteger(symbol,PERIOD_M1,SERIES_TERMINAL_FIRSTDATE,first_date))
{
//--- ci sono dati caricati per costruire timeseries
if(first_date>0)
{
//--- forza la costruzione di timeseries
CopyTime(symbol,period,first_date+PeriodSeconds(period),1,times);
//--- controlla data
if(SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date))
if(first_date>0 && first_date<=start_date) return(2);
}
}
//--- Massime barre nel chart dalle opzioni del terminale
int max_bars=TerminalInfoInteger(TERMINAL_MAXBARS);
//--- Carica info storiche dei simboli
datetime first_server_date=0;
while(!SeriesInfoInteger(symbol,PERIOD_M1,SERIES_SERVER_FIRSTDATE,first_server_date) && !IsStopp
Sleep(5);
//--- Fissa la data di inizio per il caricamento
if(first_server_date>start_date) start_date=first_server_date;
if(first_date>0 && first_date<first_server_date)
Print("Avviso: prima data del server",first_server_date," for ",symbol,
" non corrisponde alla data della prima serie ",first_date);
//--- Carica dati passo per passo
int fail_cnt=0;
while(!IsStopped())
{
//--- attendi per la costruzione di timeseries
while(!SeriesInfoInteger(symbol,period,SERIES_SYNCHRONIZED) && !IsStopped())
Sleep(5);
//--- chiedi per barre costruite
int bars=Bars(symbol,period);
if(bars>0)
{
if(bars>=max_bars) return(-2);
//--- chiedi per la prima data
if(SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date))
if(first_date>0 && first_date<=start_date) return(0);
}
//--- la copia della prossima parte, forza il caricamento dei dati
int copied=CopyTime(symbol,period,bars,100,times);
if(copied>0)
{
//--- controlla i dati
if(times[0]<=start_date) return(0);
if(bars+copied>=max_bars) return(-2);
fail_cnt=0;
}
else
{
//--- non più di 100 tentativi di fallimento
fail_cnt++;
if(fail_cnt>=100) return(-5);
Sleep(10);
}
}
//--- fermato
return(-3);
}
//+--------------------------------------------------------------------------------+
//| Restituisce i valori stringa del periodo |
//+--------------------------------------------------------------------------------+
string GetPeriodName(ENUM_TIMEFRAMES period)
{
if(period==PERIOD_CURRENT) period=Period();
//---
switch(period)
{
case PERIOD_M1: return("M1");
case PERIOD_M2: return("M2");
case PERIOD_M3: return("M3");
case PERIOD_M4: return("M4");
case PERIOD_M5: return("M5");
case PERIOD_M6: return("M6");
case PERIOD_M10: return("M10");
case PERIOD_M12: return("M12");
case PERIOD_M15: return("M15");
case PERIOD_M20: return("M20");
case PERIOD_M30: return("M30");
case PERIOD_H1: return("H1");
case PERIOD_H2: return("H2");
case PERIOD_H3: return("H3");
case PERIOD_H4: return("H4");
case PERIOD_H6: return("H6");
case PERIOD_H8: return("H8");
case PERIOD_H12: return("H12");
case PERIOD_D1: return("Daily");
case PERIOD_W1: return("Weekly");
case PERIOD_MN1: return("Monthly");
}
//---
return("periodo sconosciuto");
}
SeriesInfoInteger
R estituisce informazioni sullo stato dei dati storici. Ci sono 2 varianti di chiamate di funzione.
Parametri
symbol_name
[ in] Nome del S imbolo.
timeframe
[ in] Periodo.
prop_id
[in] Identificatore della richiesta di proprietà, il valore dell' enumerazione
ENUM _S ERIES _INFO_INT EGER .
long_var
[ out] Variabile per cui viene piazzato il valore della proprietà richiesta.
Valore restituito
N el primo caso, restituisce il valore di tipo tipo long.
Per il secondo caso, restituisce true, se la proprietà specificata è disponibile ed il suo valore è stato
messo nella variabile long _var, altrimenti restituisce false. Per ulteriori informazioni sull' errore,
chiamare GetLastError().
Esempio:
voidOnStart()
{
//---
Print("Numero totale di barre per il periodo-simbolo specificati al momento = ",
SeriesInfoInteger(Symbol(),Period(),SERIES_BARS_COUNT));
(datetime)SeriesInfoInteger(Symbol(),Period(),SERIES_FIRSTDATE));
Print("La prima data nello storico per il simbolo-periodo sul server = ",
(datetime)SeriesInfoInteger(Symbol(),Period(),SERIES_SERVER_FIRSTDATE));
Bars
Restituisce il numero di barre contate nello storico di un simbolo e periodo specificati. Ci sono 2
Parametri
symbol_name
[ in] Nome del S imbolo.
timeframe
[ in] Periodo.
start_time
[ in] Orario barra corrispondente al primo elemento.
stop_time
[ in] Orario barra corrispondente all'ultimo elemento.
Valore restituito
Se i parametri start_time e stop_time sono definiti, la funzione restituisce il numero di barre
nell'intervallo di tempo specificato, in caso contrario restituisce il numero totale di barre.
Nota
Se i dati per le timeseries con parametri specificati non sono formati nel terminale al momento della
chiamata di funzione Bars(), o i dati delle timeseries non sono sincronizzati con un trade server al
momento della chiamata di funzione, la funzione restituisce un valore pari a zero.
Quando si richiede il numero di barre in un intervallo di tempo specificato, solo le barre con un
tempo aperto che rientrano nell'intervallo vengono considerate. Ad esempio, se l'attuale giorno della
settimana è S abato e la richiesta è fatta per il numero di W 1 barre con start_time=last_tuesday e
stop_time=last_friday, la funzione restituirà 0 poiché il tempo di apertura di un lasso di tempo W 1 è
sempre Domenica e non una singola barra W 1 rientra nell'intervallo specificato.
int bars=Bars(_Symbol,_Period);
if(bars>0)
{
Print("Numero di barre nello storico del terminale per il simbolo-periodo al momento= ",bars)
}
else //non ci sono barre disponibili
{
//--- i dati sul simbolo possono non essere sincronizzati con i dati sul server
bool synchronized=false;
//--- contatore del ciclo
int attempts=0;
// fa 5 tentativi di attesa per la sincronizzazione
while(attempts<5)
{
if(SeriesInfoInteger(Symbol(),0,SERIES_SYNCHRONIZED))
{
//--- sincronizzazione eseguita, uscita
synchronized=true;
break;
}
//--- incrementa il contatore
attempts++;
//--- attende 10 millisecondi fino alla prossima iterazione
Sleep(10);
}
//--- esce dal loop dopo la sincronizzazione
if(synchronized)
{
Print("Numero di barre nello storico del terminale per il simbolo-periodo, al momento = ",
Print("La prima data nello storico del terminale per il simbolo-periodo al momento = ",
(datetime)SeriesInfoInteger(Symbol(),0,SERIES_FIRSTDATE));
Print("La prima data nello storico per il simbolo sul server = ",
(datetime)SeriesInfoInteger(Symbol(),0,SERIES_SERVER_FIRSTDATE));
}
//--- la sincronizzazione dei dati non è avvenuta
else
{
Print("Fallimento nell'ottenere il numero di barre per ",_Symbol);
}
}
Print("Numero di barre: ",n); // Output: "Numero di barre: 8", la barra H2 è considerata per il
n=Bars(_Symbol,PERIOD_D1,date1,date2);
Print("Numero di barre: ",n); // Output: "Numero di barre: 1", giacchè una barra aperta di una s
n=Bars(_Symbol,PERIOD_W1,date2,date3);
Print("Numero di barre: ",n); // Output: "Numero di barre: 0", giacchè nemmeno una singolo tempo
Vedi anche
F unzioni di elaborazione di Eventi
BarsCalculated
R estituisce il numero di dati calcolati per l'indicatore specificato.
int BarsCalculated(
int indicator_handle, // handle indicatore
);
Parametri
indicator_handle
[ in] L ' handle indicatore, restituito dalla funzione indicatore corrispondente.
Valore restituito
Restituisce la quantità di dati calcolati nel buffer indicatore o -1 in caso di errore (dati non ancora
calcolati)
Nota
La funzione è utile quando è necessario ottenere i dati degli indicatori immediatamente dopo la loro
creazione (l'handle indicatore diventa disponibile).
Esempio:
voidOnStart()
{
double Ups[];
//--- imposta l'ordine timeseries per gli array
ArraySetAsSeries(Ups,true);
//--- crea l'handle per l'indicatore Fractal
int FractalsHandle=iFractals(NULL,0);
//--- resetta il codice errore
ResetLastError();
//--- prova a copiare i valori degli indicatori
int i,copied=CopyBuffer(FractalsHandle,0,0,1000,Ups);
if(copied<=0)
{
Sleep(50);
for(i=0;i<100;i++)
{
if(BarsCalculated(FractalsHandle)>0)
break;
Sleep(50);
}
copied=CopyBuffer(FractalsHandle,0,0,1000,Ups);
if(copied<=0)
{
Print("Fallimento nel copiare i frattali superiori. Error = ",GetLastError(),
"i = ",i," copied = ",copied);
return;
}
else
Print("Frattali superiori copiati",
"i = ",i," copied = ",copied);
}
else Print("Frattali superiori copiati. ArraySize = ",ArraySize(Ups));
}
IndicatorCreate
La funzione restituisce l'handle di un indicatore tecnico specificato creato in base all'array di parametri
di M qlParam tipo.
int IndicatorCreate(
string symbol, // nome simbolo
ENUM_TIMEFRAMES period, // timeframe
ENUM_INDICATOR indicator_type, // tipo indicatore per l'enumerazione ENUM_I
int parameters_cnt=0, // numero di parametri
const MqlParam& parameters_array[]=NULL, // array di parametri
);
Parametri
symbol
[in] Nome di un simbolo, dei dati di cui viene calcolato l'indicatore. NULL significa il corrente
simbolo
period
[in] Il valore del periodo può essere uno dei valori dell' enumerazione ENUM _TIMEFRAMES , 0
indicator_type
[ in] T ipo indicatore, può essere uno dei valori dell' enumerazione ENUM _INDICAT OR .
parameters_cnt
[in] Il numero di parametri passati nell' array parameters _array[]. Gli elementi dell' array ha un
particolare tipo struttura M qlParam. Per impostazione predefinita, zero parametri - non vengono
passati. S e si specifica un numero di parametri diverso da zero, il parametro parameters_array è
obbligatorio. È possibile passare non più di 64 parametri.
parameters_array[]=NULL
[in] Un array di tipo M qlParam, i cui elementi contengono il tipo ed il valore di ciascun parametro
di input di un indicatore tecnico.
Valore restituito
R estituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE.
Nota
Se viene creato l'handle indicatore di tipo IND_CUS T OM, il campo tipo del primo elemento dell'array
di parametri di input parameters_array deve avere il valore dell'enumerazione
TYPE_S TRINGENUM _DATATYPE, ed il campo valore_stringa del primo elemento deve contenere il
nome dell'indicatore personalizzato. L 'indicatore personalizzato deve essere compilato (file con
estensione EX5) e localizzato nella directory MQL5/Indicators del terminale client o in una
sottodirectory.
Indicatori che richiedono il testing vengono definiti automaticamente dalla chiamata della funzione
iCustom(), se il parametro corrispondente è impostato attraverso la costante stringa. Per tutti gli
altri casi (utilizzo della funzione IndicatorCreate() o uso di una stringa non-costante nel parametro
che imposta il nome indicatore) la proprietà #property tester_indicator è necessaria:
#property tester_indicator "indicator_name.ex5"
Se la prima forma di chiamata viene usata nell'indicatore personalizzato, è possibile inoltre indicare
come ultimo parametro quali dati vengono calcolati quando si passano i parametri di input. S e il
parametro " Applica a" non viene indicato, il calcolo predefinito è basato su valori PRICE_CLOS E.
Esempio:
voidOnStart()
{
MqlParam params[];
int h_MA,h_MACD;
//--- crea iMA("EURUSD",PERIOD_M15,8,0,MODE_EMA,PRICE_CLOSE);
ArrayResize(params,4);
//--- imposta ma_period
params[0].type =TYPE_INT;
params[0].integer_value=8;
//--- imposta ma_shift
params[1].type =TYPE_INT;
params[1].integer_value=0;
//--- imposta ma_method
params[2].type =TYPE_INT;
params[2].integer_value=MODE_EMA;
//--- imposta applied_price
params[3].type =TYPE_INT;
params[3].integer_value=PRICE_CLOSE;
//--- crea MA
h_MA=IndicatorCreate("EURUSD",PERIOD_M15,IND_MA,4,params);
//--- crea iMACD("EURUSD",PERIOD_M15,12,26,9,h_MA);
ArrayResize(params,4);
//--- imposta fast ma_period
params[0].type =TYPE_INT;
params[0].integer_value=12;
//--- imposta slow ma_period
params[1].type =TYPE_INT;
params[1].integer_value=26;
//--- imposta periodo smooth for difference
params[2].type =TYPE_INT;
params[2].integer_value=9;
//--- imposta l'handle indicatore come applied_price
params[3].type =TYPE_INT;
params[3].integer_value=h_MA;
//--- crea MACD basato su moving average
h_MACD=IndicatorCreate("EURUSD",PERIOD_M15,IND_MACD,4,params);
//--- usa l'indicatore
//--- . . .
//--- rilascia indicatore (first h_MACD)
IndicatorRelease(h_MACD);
IndicatorRelease(h_MA);
}
IndicatorParameters
Basato sull' handle specificato, restituisce il numero di parametri di input dell'indicatore, nonché i
valori ed i tipi di parametri.
int IndicatorParameters(
int indicator_handle, // handle indicatore
ENUM_INDICATOR& indicator_type, // la variable per la ricezione del tipo di indicatore
MqlParam& parameters[] // l' array per la ricezione dei parametri
);
Parametri
indicator_handle
[in] L ' handle dell'indicatore, per cui è necessario conoscere il numero di parametri su cui è
calcolato.
indicator_type
[ out] A variable if the ENUM _INDICAT OR tipo, con il quale l'indicatore verrà scritto.
parameters[]
[out] Un array dinamico per ricevere valori di tipo M qlParam, in cui verrà scritto l'elenco dei
parametri indicatori. La grandezza dell'array viene restituita dalle funzione IndicatorParameters().
Valore restituito
Il numero di parametri di input dell'indicatore con l'handle specificato. In caso di un errore
restituisce -1. Per ulteriori informazioni sull'errore chiamare la funzione GetLastError().
Esempio:
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- Il numero di finestre sul grafico (almeno una finestra principale è sempre presente)
int windows=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL);
//--- Va attraverso le finestre grafico
for(int w=0;w<windows;w++)
{
// --- Il numero di indicatori in questa finestra/sottofinestra
int total=ChartIndicatorsTotal(0,w);
//--- Prende tutti gli indicatori nella finestra
for(int i=0;i<total;i++)
{
//--- Ottiene il nome breve dell'indicatore
string name=ChartIndicatorName(0,w,i);
//--- Ottiene l'handle indicatore
int handle=ChartIndicatorGet(0,w,name);
//--- Aggiunge al log
Vedi anche
ChartIndicatorGet()
IndicatorRelease
La funzione rimuove un handle indicatore e rilascia il blocco di calcolo dell'indicatore, se non è usato da
nessun altro.
bool IndicatorRelease(
int indicator_handle // handle indicatore
);
Valore restituito
R estituisce true in caso di successo, altrimenti restituisce false.
Nota
La funzione permette di rimuovere un handle indicatore, se è non è più necessario, risparmiando
cos ì memoria. L ' handle viene rimosso immediatamente, il blocco di calcolo viene eliminato in un
certo tempo (se non è più chiamato).
Quando si lavora nello strateg y tester, la funzione IndicatorR elease() non viene eseguita.
Esempio:
//+--------------------------------------------------------------------------------+
//| Test_IndicatorRelease.mq5 |
//| Copyright 2010, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "2010, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
//--- parametri di input
input int MA_Period=15;
input int MA_shift=0;
input ENUM_MA_METHOD MA_smooth=MODE_SMA;
input ENUM_APPLIED_PRICE price=PRICE_CLOSE;
//--- salverà l'handle indicatore
int MA_handle=INVALID_HANDLE;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione dell' Expert |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- crea l'handle indicatore
MA_handle=iMA(Symbol(),0,MA_Period,MA_shift,MA_smooth,PRICE_CLOSE);
//--- elimina la variabile globale
if(GlobalVariableCheck("MA_value"))
GlobalVariableDel("MA_value");
//---
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
CopyBuffer
Ottiene dati di un buffer specificato di un certo indicatore nella quantità necessaria.
Il conteggio degli elementi di dati copiati (buffer indicatore con l'indice buffer_num) dalla posizione
iniziale viene eseguito dal presente al passato, cioè, la posizione iniziale di 0 significa la barra di
corrente (valore indicatore per la barra corrente).
Quando si copia una quantità ancora sconosciuta di dati, si raccomanda di utilizzare un array dinamico
come un buffer[] recipient buffer, poiché la funzione CopyBuffer() tenta di allocare la dimensione
dell'array di ricezione per la dimensione dei dati copiati. S e un buffer di indicatore (array che è pre-
assegnato per memorizzare i valori degli indicatori dalla funzione S etIndexBufer()) viene usato come
buffer[] recipient array, la copia parziale è consentita. Un esempio può essere trovato nell' indicatore
personalizzato Awesome_Oscillator.mql5 nel pacchetto standard del terminale .
S e avete bisogno di fare una copia parziale dei valori degli indicatori in un altro array (buffer non-
indicatore), è necessario utilizzare un array intermedio, al quale il numero desiderato viene copiato.
Dopo ci ò, condurre la copia dell'elemento del numero richiesto di valori nel posto richiesto se un gruppo
Se si conosce la quantità necessaria di dati da copiare, dovrebbe essere meglio fatto in un buffer
allocato in modo statico, al fine di evitare un' allocazione eccessiva di memoria.
Non importa ciò che è di proprietà dell'array di destinazione - as _series =true o as _series =false. I dati
verranno copiati in modo che l'elemento più vecchio sarà situato all'inizio della memoria fisica allocata
per l'array. Ci sono 3 varianti di chiamate di funzione.
Parametri
indicator_handle
[ in] L ' handle indicatore, restituito dalla funzione indicatore corrispondente.
buffer_num
[ in] In numero di buffer indicatore.
start_pos
[ in] La posizione del primo elemento da copiare.
count
[ in] Conteggio dati da copiare.
start_time
[ in] T empo Barra, corrispondente al primo elemento.
stop_time
[ in] T empo Barra, corrispondente all'ultimo elemento.
buffer[]
[ out] A rray of double type.
Valore restituito
R estituisce il numero di dati copiati o -1 in caso di errore.
Nota
Quando si richiedono dati dall'indicatore, se le timeseries richieste non sono ancora costruite o
hanno bisogno di essere scaricati dal server, la funzione restituisce immediatamente -1, ma il
processo di download/costruzione verrà avviato.
Quando si richiedono dati da un Ex pert Advisor o uno script, verrà avviato il download dal server, se
il terminale non dispone di questi dati a livello locale, o la costruzione delle timeserie richieste avrà
inizio, se i dati possono essere costruiti dallo storico locale, ma non sono ancora pronti. La funzione
restituisce la quantità di dati che sarà pronta dal momento dell'espirazione del timeout.
Esempio:
//+--------------------------------------------------------------------------------+
//| TestCopyBuffer3.mq5 |
//| Copyright 2009, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//---- plot MA
#property indicator_label1 "MA"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- parametri di input
input bool AsSeries=true;
input int period=15;
input ENUM_MA_METHOD smootMode=MODE_EMA;
input ENUM_APPLIED_PRICE price=PRICE_CLOSE;
input int shift=0;
//--- buffers indicatore
double MABuffer[];
int ma_handle;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- mappatura buffers indicatore
SetIndexBuffer(0,MABuffer,INDICATOR_DATA);
Print("Parameter AsSeries = ",AsSeries);
Print("Buffer Indicatore dopo SetIndexBuffer() è una = ",
ArrayGetAsSeries(MABuffer));
//--- Imposta il nome breve indicatore
IndicatorSetString(INDICATOR_SHORTNAME,"MA("+period+")"+AsSeries);
//--- imposta AsSeries (dependes dal parametro di input)
ArraySetAsSeries(MABuffer,AsSeries);
Print("Buffer indicatore dopo ArraySetAsSeries(MABuffer,true); è una timeseries = ",
ArrayGetAsSeries(MABuffer));
//---
ma_handle=iMA(Symbol(),0,period,shift,smootMode,price);
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//--- controllare se tutti i dati calcolati
if(BarsCalculated(ma_handle)<rates_total) return(0);
//--- non possiamo copiarli tutti
int to_copy;
if(prev_calculated>rates_total || prev_calculated<=0) to_copy=rates_total;
else
{
to_copy=rates_total-prev_calculated;
//--- l'ultimo valore viene sempre copiato
to_copy++;
}
//--- prova a copiare
if(CopyBuffer(ma_handle,0,0,to_copy,MABuffer)<=0) return(0);
//--- restituisce il valore di prev_calculated per la prossima chiamata
return(rates_total);
}
//+--------------------------------------------------------------------------------+
L 'esempio precedente illustra come un buffer indicatore viene riempito con i valori di un altro buffer
indicatore, dall'indicatore sullo stesso simbolo/periodo.
Vedere l' esempio dettagliato della richiesta dati dello storico di cui al punto Metodi di Binding Oggetti.
Lo script disponibile in questa sezione mostra come ottenere i valori degli indicatori iFractals delle
ultime 1000 barre e come visualizzare gli ultimi 10 su e 10 giù frattali sul grafico. Una tecnica simile
può essere utilizzata per tutti gli indicatori che hanno dati mancanti e che sono solitamente elaborati
utilizzando i seguenti stili:
· DRAW _S ECTION,
· DRAW _ARR OW ,
· DRAW _ZIGZAG ,
· DRAW _ COLOR_S ECTION,
· DRAW _ COLOR_ARR OW ,
· DRAW _ COLOR_ZIGZAG.
Vedi anche
Proprietà degli Indicatori Personalizzati, S etIndexBuffer
CopyRates
Ottiene i dati storici della struttura M qlR ates di un determinat simbolo-periodo nella quantità
specificata nell' array rates _array. L 'ordinamento degli elementi dei dati copiati è dal presente al
passato, vale a dire, la posizione di partenza di 0 significa la barra corrente.
Quando si copia una quantità ancora sconosciuta di dati, si raccomanda di utilizzare gli array dinamici
come array di destinazione, perché se il conteggio dei dati richiesti è di meno (o più) rispetto alla
lunghezza dell'array di destinazione, la funzione cerca di riallocare la memoria in modo che i dati
richiesti vi entrino completamente.
Se si conosce la quantità necessaria di dati da copiare, dovrebbe essere meglio fatto in un buffer
allocato in modo statico, al fine di evitare un' allocazione eccessiva di memoria.
Non importa ciò che è di proprietà dell'array di destinazione - as _series =true o as _series =false. I dati
verranno copiati in modo che l'elemento più vecchio sarà situato all'inizio della memoria fisica allocata
per l'array. Ci sono 3 varianti di chiamate di funzione.
Parametri
symbol_name
[ in] Nome del S imbolo.
timeframe
[ in] Periodo.
start_time
[ in] Orario barra per il primo elemento da copiare.
start_pos
[ in] La posizione di partenza per il primo elemento da copiare.
count
[ in] Conteggio dati da copiare.
stop_time
[ in] Orario barra, corrispondente all'ultimo elemento da copiare.
rates_array[]
[ out] A rray di M qlR ates type.
Valore restituito
R estituisce il numero di elementi copiati o -1 in caso di errore.
Nota
Se l'intervallo di insieme dei dati richiesti è fuori dei dati disponibili sul server, la funzione
restituisce -1. S e sono richiesti i dati fuori da T ER M INAL _M AXBARS (numero massimo di barre nel
grafico), la funzione anche restituire -1.
Quando si richiedono dati dall'indicatore, se le timeseries richieste non sono ancora costruite o
hanno bisogno di essere scaricati dal server, la funzione restituisce immediatamente -1, ma il
processo di download/costruzione verrà avviato.
Quando si richiedono dati da un Ex pert Advisor o uno script, verrà avviato il download dal server, se
il terminale non dispone di questi dati a livello locale, o la costruzione delle timeserie richieste avrà
inizio, se i dati possono essere costruiti dallo storico locale, ma non sono ancora pronti. La funzione
restituisce la quantità di dati che sarà pronta entro il momento del timeout dell'espirazione, ma il
download dello storico continuerà, ed alla successiva richiesta simile la funzione restituisce più dati.
Quando si richiedono dati per la data di inizio ed il numero di elementi necessari, solo i dati la cui
data è minore (prima) o uguale alla data specificata. Vuol dire, che il tempo di apertura di ogni
barra, per il quale viene restituito il valore (volume, spread, valore sul buffer indicatore, i prezzi
Open, H igh, Low, Close o l'orario di apertura T ime) è sempre minore o uguale a quello specificato.
Quando si richiedono dati in un intervallo di date specificato, solo i dati di questo intervallo
verranno restituiti. L 'intervallo è impostato e contato fino ai secondi. Vuol dire, che il tempo di
apertura di ogni barra, per il quale viene restituito il valore (volume, spread, valore sul buffer
indicatore, i prezzi Open, H igh, Low, Close o l'orario di apertura T ime) è sempre entro l'intervallo
richiesto.
Se c'è bisogno di restituire il valore corrispondente alla corrente barra incompiuta, è possibile
utilizzare la prima forma di chiamata specificando start_pos =0 e count= 1.
Esempio:
voidOnStart()
{
//---
MqlRates rates[];
ArraySetAsSeries(rates,true);
int copied=CopyRates(Symbol(),0,0,100,rates);
if(copied>0)
{
Print("Barre copiate: "+copied);
string format="open = %G, high = %G, low = %G, close = %G, volume = %d";
string out;
int size=fmin(copied,10);
for(int i=0;i<size;i++)
{
out=i+":"+TimeToString(rates[i].time);
out=out+" "+StringFormat(format,
rates[i].open,
rates[i].high,
rates[i].low,
rates[i].close,
rates[i].tick_volume);
Print(out);
}
}
else Print("Fallimento nell'ottenimento dei dati dello storico per il simbolo ",Symbol());
}
Vedere un esempio dettagliato di richiesta dati storici di cui al punto Metodi di Binding Oggetti. Lo
script disponibile in questa sezione mostra come ottenere i valori degli indicatori iFractals delle ultime
1000 barre e come visualizzare gli ultimi 10 su e 10 gi ù frattali sul grafico. Una tecnica simile può
essere utilizzata per tutti gli indicatori che hanno dati mancanti e che sono solitamente elaborati
utilizzando i seguenti stili:
· DRAW _S ECTION,
· DRAW _ARR OW ,
· DRAW _ZIGZAG ,
· DRAW _ COLOR_S ECTION,
· DRAW _ COLOR_ARR OW ,
· DRAW _ COLOR_ZIGZAG.
Vedi anche
S trutture e Classi,T imeT oS tring, S tring Format
CopyTime
La funzione ottiene in time_array i dati storici dei prezzi di apertura delle barre la coppia simbolo-
periodo selezionati nella quantità specificata. Occorre notare che l'ordinamento degli elementi è dal
presente al passato, cioè, la posizione iniziale 0 significa la barra corrente.
Quando si copia una quantità ancora sconosciuta di dati, si raccomanda di utilizzare gli array dinamici
come array di destinazione, perché se il conteggio dei dati richiesti è di meno (o più) rispetto alla
lunghezza dell'array di destinazione, la funzione cerca di riallocare la memoria in modo che i dati
richiesti vi entrino completamente.
Se si conosce la quantità necessaria di dati da copiare, dovrebbe essere meglio fatto in un buffer
allocato in modo statico, al fine di evitare un' allocazione eccessiva di memoria.
Non importa ciò che è di proprietà dell'array di destinazione - as _series =true o as _series =false. I dati
verranno copiati in modo che l'elemento più vecchio sarà situato all'inizio della memoria fisica allocata
per l'array. Ci sono 3 varianti di chiamate di funzione.
Parametri
symbol_name
[ in] Nome del S imbolo.
timeframe
[ in] Periodo.
start_pos
[ in] La posizione di partenza per il primo elemento da copiare.
count
[ in] Conteggio dati da copiare.
start_time
[ in] L 'orario di avviamento per il primo elemento da copiare.
stop_time
[ in] Orario barra, corrispondente all'ultimo elemento da copiare..
time_array[]
[ out] A rray di tipo datetime.
Valore restituito
R estituisce il numero di dati copiati o -1 in caso di errore.
Nota
Se l'intervallo di insieme dei dati richiesti è fuori dei dati disponibili sul server, la funzione
restituisce -1. S e sono richiesti i dati fuori da T ER M INAL _M AXBARS (numero massimo di barre nel
grafico), la funzione anche restituire -1.
Quando si richiedono dati dall'indicatore, se le timeseries richieste non sono ancora costruite o
hanno bisogno di essere scaricati dal server, la funzione restituisce immediatamente -1, ma il
processo di download/costruzione verrà avviato.
Quando si richiedono dati da un Ex pert Advisor o uno script, verrà avviato il download dal server, se
il terminale non dispone di questi dati a livello locale, o la costruzione delle timeserie richieste avrà
inizio, se i dati possono essere costruiti dallo storico locale, ma non sono ancora pronti. La funzione
restituisce la quantità di dati che sarà pronta entro il momento del timeout dell'espirazione, ma il
download dello storico continuerà, ed alla successiva richiesta simile la funzione restituisce più dati.
Quando si richiedono dati per la data di inizio ed il numero di elementi necessari, solo i dati la cui
data è minore (prima) o uguale alla data specificata. Vuol dire, che il tempo di apertura di ogni
barra, per il quale viene restituito il valore (volume, spread, valore sul buffer indicatore, i prezzi
Open, H igh, Low, Close o l'orario di apertura T ime) è sempre minore o uguale a quello specificato.
Quando si richiedono dati in un intervallo di date specificato, solo i dati di questo intervallo
verranno restituiti. L 'intervallo è impostato e contato fino ai secondi. Vuol dire, che il tempo di
apertura di ogni barra, per il quale viene restituito il valore (volume, spread, valore sul buffer
indicatore, i prezzi Open, H igh, Low, Close o l'orario di apertura T ime) è sempre entro l'intervallo
richiesto.
Se c'è bisogno di restituire il valore corrispondente alla corrente barra incompiuta, è possibile
utilizzare la prima forma di chiamata specificando start_pos =0 e count= 1.
Vedere un esempio dettagliato di richiesta dati storici di cui al punto Metodi di Binding Oggetti. Lo
script disponibile in questa sezione mostra come ottenere i valori degli indicatori iFractals delle ultime
1000 barre e come visualizzare gli ultimi 10 su e 10 gi ù frattali sul grafico. Una tecnica simile può
essere utilizzata per tutti gli indicatori che hanno dati mancanti e che sono solitamente elaborati
utilizzando i seguenti stili:
· DRAW _S ECTION,
· DRAW _ARR OW ,
· DRAW _ZIGZAG ,
· DRAW _ COLOR_S ECTION,
· DRAW _ COLOR_ARR OW ,
· DRAW _ COLOR_ZIGZAG.
CopyOpen
La funzione ottiene in open_array i dati storici dei prezzi della barra open per la coppia simbolo-
periodo selezionati nella quantità specificata. Occorre notare che l'ordinamento degli elementi è dal
presente al passato, cioè, la posizione iniziale di 0 significa la barra corrente.
Quando si copia una quantità ancora sconosciuta di dati, si raccomanda di utilizzare gli array dinamici
come array di destinazione, perché se il conteggio dei dati richiesti è di meno (o più) rispetto alla
lunghezza dell'array di destinazione, la funzione cerca di riallocare la memoria in modo che i dati
richiesti vi entrino completamente.
Se si conosce la quantità necessaria di dati da copiare, dovrebbe essere meglio fatto in un buffer
allocato in modo statico, al fine di evitare un' allocazione eccessiva di memoria.
Non importa ciò che è di proprietà dell'array di destinazione - as _series =true o as _series =false. I dati
verranno copiati in modo che l'elemento più vecchio sarà situato all'inizio della memoria fisica allocata
per l'array. Ci sono 3 varianti di chiamate di funzione.
Parametri
symbol_name
[ in] Nome del S imbolo.
timeframe
[ in] Periodo.
start_pos
[ in] La posizione di partenza per il primo elemento da copiare.
count
[ in] Conteggio dati da copiare.
start_time
[ in] L 'orario di avviamento per il primo elemento da copiare.
stop_time
[ in] L 'orario di inizio per l'ultimo elemento da copiare.
open_array[]
[ out] A rray of double type.
Valore restituito
R estituisce il numero di elementi nell'array o -1 in caso di errore.
Nota
Se l'intervallo di insieme dei dati richiesti è fuori dei dati disponibili sul server, la funzione
restituisce -1. S e sono richiesti i dati fuori da T ER M INAL _M AXBARS (numero massimo di barre nel
grafico), la funzione anche restituire -1.
Quando si richiedono dati dall'indicatore, se le timeseries richieste non sono ancora costruite o
hanno bisogno di essere scaricati dal server, la funzione restituisce immediatamente -1, ma il
processo di download/costruzione verrà avviato.
Quando si richiedono dati da un Ex pert Advisor o uno script, verrà avviato il download dal server, se
il terminale non dispone di questi dati a livello locale, o la costruzione delle timeserie richieste avrà
inizio, se i dati possono essere costruiti dallo storico locale, ma non sono ancora pronti. La funzione
restituisce la quantità di dati che sarà pronta entro il momento del timeout dell'espirazione, ma il
download dello storico continuerà, ed alla successiva richiesta simile la funzione restituisce più dati.
Quando si richiedono dati per la data di inizio ed il numero di elementi necessari, solo i dati la cui
data è minore (prima) o uguale alla data specificata. Vuol dire, che il tempo di apertura di ogni
barra, per il quale viene restituito il valore (volume, spread, valore sul buffer indicatore, i prezzi
Open, H igh, Low, Close o l'orario di apertura T ime) è sempre minore o uguale a quello specificato.
Quando si richiedono dati in un intervallo di date specificato, solo i dati di questo intervallo
verranno restituiti. L 'intervallo è impostato e contato fino ai secondi. Vuol dire, che il tempo di
apertura di ogni barra, per il quale viene restituito il valore (volume, spread, valore sul buffer
indicatore, i prezzi Open, H igh, Low, Close o l'orario di apertura T ime) è sempre entro l'intervallo
richiesto.
Se c'è bisogno di restituire il valore corrispondente alla corrente barra incompiuta, è possibile
utilizzare la prima forma di chiamata specificando start_pos =0 e count= 1.
Vedere un esempio dettagliato di richiesta dati storici di cui al punto Metodi di Binding Oggetti. Lo
script disponibile in questa sezione mostra come ottenere i valori degli indicatori iFractals delle ultime
1000 barre e come visualizzare gli ultimi 10 su e 10 gi ù frattali sul grafico. Una tecnica simile può
essere utilizzata per tutti gli indicatori che hanno dati mancanti e che sono solitamente elaborati
utilizzando i seguenti stili:
· DRAW _S ECTION,
· DRAW _ARR OW ,
· DRAW _ZIGZAG ,
· DRAW _ COLOR_S ECTION,
· DRAW _ COLOR_ARR OW ,
· DRAW _ COLOR_ZIGZAG.
CopyHigh
La funzione ottiene in high_array i dati storici dei prezzi più alti della barra per il la coppia simbolo-
periodo selezionato nella quantità specificata. Occorre notare che l'ordinamento degli elementi è dal
presente al passato, cioè, la posizione iniziale di 0 significa la barra corrente.
Quando si copia una quantità ancora sconosciuta di dati, si raccomanda di utilizzare gli array dinamici
come array di destinazione, perché se il conteggio dei dati richiesti è di meno (o più) rispetto alla
lunghezza dell'array di destinazione, la funzione cerca di riallocare la memoria in modo che i dati
richiesti vi entrino completamente.
Se si conosce la quantità necessaria di dati da copiare, dovrebbe essere meglio fatto in un buffer
allocato in modo statico, al fine di evitare un' allocazione eccessiva di memoria.
Non importa ciò che è di proprietà dell'array di destinazione - as _series =true o as _series =false. I dati
verranno copiati in modo che l'elemento più vecchio sarà situato all'inizio della memoria fisica allocata
per l'array. Ci sono 3 varianti di chiamate di funzione.
Parametri
symbol_name
[ in] Nome del S imbolo.
timeframe
[ in] Periodo.
start_pos
[ in] La posizione di partenza per il primo elemento da copiare.
count
[ in] Conteggio dati da copiare.
start_time
[ in] L 'orario di avviamento per il primo elemento da copiare.
stop_time
[ in] Orario barra, corrispondente all'ultimo elemento da copiare.
high_array[]
[ out] A rray of double type.
Valore restituito
R estituisce il numero di dati copiati o -1 in caso di errore.
Nota
Se l'intervallo di insieme dei dati richiesti è fuori dei dati disponibili sul server, la funzione
restituisce -1. S e sono richiesti i dati fuori da T ER M INAL _M AXBARS (numero massimo di barre nel
grafico), la funzione anche restituire -1.
Quando si richiedono dati dall'indicatore, se le timeseries richieste non sono ancora costruite o
hanno bisogno di essere scaricati dal server, la funzione restituisce immediatamente -1, ma il
processo di download/costruzione verrà avviato.
Quando si richiedono dati da un Ex pert Advisor o uno script, verrà avviato il download dal server, se
il terminale non dispone di questi dati a livello locale, o la costruzione delle timeserie richieste avrà
inizio, se i dati possono essere costruiti dallo storico locale, ma non sono ancora pronti. La funzione
restituisce la quantità di dati che sarà pronta entro il momento del timeout dell'espirazione, ma il
download dello storico continuerà, ed alla successiva richiesta simile la funzione restituisce più dati.
Quando si richiedono dati per la data di inizio ed il numero di elementi necessari, solo i dati la cui
data è minore (prima) o uguale alla data specificata. Vuol dire, che il tempo di apertura di ogni
barra, per il quale viene restituito il valore (volume, spread, valore sul buffer indicatore, i prezzi
Open, H igh, Low, Close o l'orario di apertura T ime) è sempre minore o uguale a quello specificato.
Quando si richiedono dati in un intervallo di date specificato, solo i dati di questo intervallo
verranno restituiti. L 'intervallo è impostato e contato fino ai secondi. Vuol dire, che il tempo di
apertura di ogni barra, per il quale viene restituito il valore (volume, spread, valore sul buffer
indicatore, i prezzi Open, H igh, Low, Close o l'orario di apertura T ime) è sempre entro l'intervallo
richiesto.
Se c'è bisogno di restituire il valore corrispondente alla corrente barra incompiuta, è possibile
utilizzare la prima forma di chiamata specificando start_pos =0 e count= 1.
Esempio:
#property copyright "2009, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
double High[],Low[];
//+--------------------------------------------------------------------------------+
//| Ottiene Low per l'indice barra specificato |
//+--------------------------------------------------------------------------------+
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
{
double low=0;
ArraySetAsSeries(Low,true);
int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),Low);
if(copied>0 && index<copied) low=Low[index];
return(low);
}
//+--------------------------------------------------------------------------------+
//| Ottiene High per l'indice barra specificato |
//+--------------------------------------------------------------------------------+
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
{
double high=0;
ArraySetAsSeries(High,true);
int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High);
if(copied>0 && index<copied) high=High[index];
return(high);
}
//+--------------------------------------------------------------------------------+
//| Funzione tick dell'Expert |
//+--------------------------------------------------------------------------------+
void OnTick()
{
//--- su ogni tick diamo in output i valori High e Low per la barra con l'indice,
//--- che è uguale al secondo, su quale il tick è arrivato
datetime t=TimeCurrent();
int sec=t%60;
printf("High[%d] = %G Low[%d] = %G",
sec,iHigh(Symbol(),0,sec),
sec,iLow(Symbol(),0,sec));
}
Vedere un esempio dettagliato di dati storici richiedente nella Metodi di oggetti Binding sezione. Lo
script disponibile in questa sezione mostra come ottenere i valori degli indicatori iFractals delle ultime
1000 barre e come visualizzare gli ultimi 10 su e 10 gi ù frattali sul grafico. Una tecnica simile può
essere utilizzata per tutti gli indicatori che hanno dati mancanti e che sono solitamente elaborati
utilizzando i seguenti stili:
· DRAW _S ECTION,
· DRAW _ARR OW ,
· DRAW _ZIGZAG ,
· DRAW _ COLOR_S ECTION,
· DRAW _ COLOR_ARR OW ,
· DRAW _ COLOR_ZIGZAG.
CopyLow
La funzione ottiene in low_array i dati storici dei prezzi più bassi della barra per il la coppia simbolo-
periodo selezionato nella quantità specificata. Occorre notare che l'ordinamento degli elementi è dal
presente al passato, cioè, la posizione iniziale di 0 significa la barra corrente.
Quando si copia una quantità ancora sconosciuta di dati, si raccomanda di utilizzare gli array dinamici
come array di destinazione, perché se il conteggio dei dati richiesti è di meno (o più) rispetto alla
lunghezza dell'array di destinazione, la funzione cerca di riallocare la memoria in modo che i dati
richiesti vi entrino completamente.
Se si conosce la quantità necessaria di dati da copiare, dovrebbe essere meglio fatto in un buffer
allocato in modo statico, al fine di evitare un' allocazione eccessiva di memoria.
Non importa ciò che è di proprietà dell'array di destinazione - as _series =true o as _series =false. I dati
verranno copiati in modo che l'elemento più vecchio sarà situato all'inizio della memoria fisica allocata
per l'array. Ci sono 3 varianti di chiamate di funzione.
Parametri
symbol_name
[ in] S imbolo.
timeframe
[ in] Periodo.
start_pos
[ in] La posizione di partenza per il primo elemento da copiare.
count
[ in] Conteggio dati da copiare.
start_time
[ in] T empo barra, corrispondente al primo elemento da copiare.
stop_time
[ in] Orario barra, corrispondente all'ultimo elemento da copiare.
low_array[]
[ out] A rray of double type.
Valore restituito
R estituisce il numero di dati copiati o -1 in caso di errore.
Nota
Se l'intervallo di insieme dei dati richiesti è fuori dei dati disponibili sul server, la funzione
restituisce -1. S e sono richiesti i dati fuori da T ER M INAL _M AXBARS (numero massimo di barre nel
grafico), la funzione anche restituire -1.
Quando si richiedono dati dall'indicatore, se le timeseries richieste non sono ancora costruite o
hanno bisogno di essere scaricati dal server, la funzione restituisce immediatamente -1, ma il
processo di download/costruzione verrà avviato.
Quando si richiedono dati da un Ex pert Advisor o uno script, verrà avviato il download dal server, se
il terminale non dispone di questi dati a livello locale, o la costruzione delle timeserie richieste avrà
inizio, se i dati possono essere costruiti dallo storico locale, ma non sono ancora pronti. La funzione
restituisce la quantità di dati che sarà pronta entro il momento del timeout dell'espirazione, ma il
download dello storico continuerà, ed alla successiva richiesta simile la funzione restituisce più dati.
Quando si richiedono dati per la data di inizio ed il numero di elementi necessari, solo i dati la cui
data è minore (prima) o uguale alla data specificata. Vuol dire, che il tempo di apertura di ogni
barra, per il quale viene restituito il valore (volume, spread, valore sul buffer indicatore, i prezzi
Open, H igh, Low, Close o l'orario di apertura T ime) è sempre minore o uguale a quello specificato.
Quando si richiedono dati in un intervallo di date specificato, solo i dati di questo intervallo
verranno restituiti. L 'intervallo è impostato e contato fino ai secondi. Vuol dire, che il tempo di
apertura di ogni barra, per il quale viene restituito il valore (volume, spread, valore sul buffer
indicatore, i prezzi Open, H igh, Low, Close o l'orario di apertura T ime) è sempre entro l'intervallo
richiesto.
Se c'è bisogno di restituire il valore corrispondente alla corrente barra incompiuta, è possibile
utilizzare la prima forma di chiamata specificando start_pos =0 e count= 1.
Vedere un esempio dettagliato di richiesta dati storici di cui al punto Metodi di Binding Oggetti. Lo
script disponibile in questa sezione mostra come ottenere i valori degli indicatori iFractals delle ultime
1000 barre e come visualizzare gli ultimi 10 su e 10 gi ù frattali sul grafico. Una tecnica simile può
essere utilizzata per tutti gli indicatori che hanno dati mancanti e che sono solitamente elaborati
utilizzando i seguenti stili:
· DRAW _S ECTION,
· DRAW _ARR OW ,
· DRAW _ZIGZAG ,
· DRAW _ COLOR_S ECTION,
· DRAW _ COLOR_ARR OW ,
· DRAW _ COLOR_ZIGZAG.
Vedi anche
CopyH igh
CopyClose
La funzione ottiene in close_array i dati storici dei prezzi della barra close per la coppia simbolo-
periodo selezionati nella quantità specificata. Occorre notare che l'ordinamento degli elementi è dal
presente al passato, cioè, la posizione iniziale di 0 significa la barra corrente.
Quando si copia una quantità ancora sconosciuta di dati, si raccomanda di utilizzare gli array dinamici
come array di destinazione, perché se il conteggio dei dati richiesti è di meno (o più) rispetto alla
lunghezza dell'array di destinazione, la funzione cerca di riallocare la memoria in modo che i dati
richiesti vi entrino completamente.
Se si conosce la quantità necessaria di dati da copiare, dovrebbe essere meglio fatto in un buffer
allocato in modo statico, al fine di evitare un' allocazione eccessiva di memoria.
Non importa ciò che è di proprietà dell'array di destinazione - as _series =true o as _series =false. I dati
verranno copiati in modo che l'elemento più vecchio sarà situato all'inizio della memoria fisica allocata
per l'array. Ci sono 3 varianti di chiamate di funzione.
Parametri
symbol_name
[ in] Nome del S imbolo.
timeframe
[ in] Periodo.
start_pos
[ in] La posizione di partenza per il primo elemento da copiare.
count
[ in] Conteggio dati da copiare.
start_time
[ in] L 'orario di avviamento per il primo elemento da copiare.
stop_time
[ in] Orario barra, corrispondente all'ultimo elemento da copiare.
close_array[]
[ out] A rray of double type.
Valore restituito
R estituisce il numero di dati copiati o -1 in caso di errore.
Nota
Se l'intervallo di insieme dei dati richiesti è fuori dei dati disponibili sul server, la funzione
restituisce -1. S e sono richiesti i dati fuori da T ER M INAL _M AXBARS (numero massimo di barre nel
grafico), la funzione anche restituire -1.
Quando si richiedono dati dall'indicatore, se le timeseries richieste non sono ancora costruite o
hanno bisogno di essere scaricati dal server, la funzione restituisce immediatamente -1, ma il
processo di download/costruzione verrà avviato.
Quando si richiedono i dati da un Ex pert Advisor o da uno script, verrà avviato il downloading dal
server, se il terminale non dispone di questi dati a livello locale, o inizierà la costruzione di una
timeseries richiesta, se i dati possono essere costruiti dallo storico locale, ma non sono ancora
pronti. La funzione restituisce la quantità di dati che sarà pronta entro il momento del timeout
dell'espirazione, ma il download dello storico continuerà, ed alla successiva richiesta simile la
funzione restituisce più dati.
Quando si richiedono dati dalla data di inizio ed il numero di elementi richiesti, solo i dati con data
minore (prima) o uguale alla data specificata vengono restituiti. Vuol dire, che il tempo di apertura
di ogni barra, per il quale viene restituito il valore (volume, spread, valore sul buffer indicatore, i
prezzi Open, H igh, Low, Close o l'orario di apertura T ime) è sempre minore o uguale a uello
q
specificato.
Quando si richiedono dati in un intervallo di date specificato, solo i dati di questo intervallo
verranno restituiti. L 'intervallo è impostato e contato fino ai secondi. Vuol dire, che il tempo di
apertura di ogni barra, per il quale viene restituito il valore (volume, spread, valore sul buffer
indicatore, i prezzi Open, H igh, Low, Close o l'orario di apertura T ime) è sempre entro l'intervallo
richiesto.
Se c'è bisogno di restituire il valore corrispondente alla corrente barra incompiuta, è possibile
utilizzare la prima forma di chiamata specificando start_pos =0 e count= 1.
Vedere un esempio dettagliato di dati storici richiesti, nella sezione Metodi di Binding Oggetti. Lo
script disponibile in questa sezione mostra come ottenere i valori degli indicatori iFractals delle ultime
1000 barre e come visualizzare gli ultimi 10 su e 10 gi ù frattali sul grafico. Una tecnica simile può
essere utilizzata per tutti gli indicatori che hanno dati mancanti e che sono solitamente elaborati
utilizzando i seguenti stili:
· DRAW _S ECTION,
· DRAW _ARR OW ,
· DRAW _ZIGZAG ,
· DRAW _ COLOR_S ECTION,
· DRAW _ COLOR_ARR OW ,
· DRAW _ COLOR_ZIGZAG.
CopyTickVolume
La funzione ottiene in volume_array i dati storici dei volumi tick per la coppia simbolo-periodo
selezionati nella quantità specificata. Occorre notare che l'ordinamento degli elementi è dal presente al
passato, cioè, la posizione iniziale di 0 significa la barra corrente.
Quando si copia una quantità ancora sconosciuta di dati, si raccomanda di utilizzare gli array dinamici
come array di destinazione, perché se il conteggio dei dati richiesti è di meno (o più) rispetto alla
lunghezza dell'array di destinazione, la funzione cerca di riallocare la memoria in modo che i dati
richiesti vi entrino completamente.
Se si conosce la quantità necessaria di dati da copiare, dovrebbe essere meglio fatto in un buffer
allocato in modo statico, al fine di evitare un' allocazione eccessiva di memoria.
Non importa ciò che è di proprietà dell'array di destinazione - as _series =true o as _series =false. I dati
verranno copiati in modo che l'elemento più vecchio sarà situato all'inizio della memoria fisica allocata
per l'array. Ci sono 3 varianti di chiamate di funzione.
Parametri
symbol_name
[ in] Nome del S imbolo.
timeframe
[ in] Periodo.
start_pos
[ in] La posizione di partenza per il primo elemento da copiare.
count
[ in] Conteggio dati da copiare.
start_time
[ in] L 'orario di avviamento per il primo elemento da copiare.
stop_time
[ in] Orario barra, corrispondente all'ultimo elemento da copiare.
volume_array[]
[ out] A rray odi tipo long.
Valore restituito
R estituisce il numero di dati copiati o -1 in caso di errore.
Nota
Se l'intervallo di insieme dei dati richiesti è fuori dei dati disponibili sul server, la funzione
restituisce -1. S e sono richiesti i dati fuori da T ER M INAL _M AXBARS (numero massimo di barre nel
grafico), la funzione anche restituire -1.
Quando si richiedono dati dall'indicatore, se le timeseries richieste non sono ancora costruite o
hanno bisogno di essere scaricati dal server, la funzione restituisce immediatamente -1, ma il
processo di download/costruzione verrà avviato.
Quando si richiedono dati da un Ex pert Advisor o uno script, verrà avviato il download dal server, se
il terminale non dispone di questi dati a livello locale, o la costruzione delle timeserie richieste avrà
inizio, se i dati possono essere costruiti dallo storico locale, ma non sono ancora pronti. La funzione
restituisce la quantità di dati che sarà pronta entro il momento del timeout dell'espirazione, ma il
download dello storico continuerà, ed alla successiva richiesta simile la funzione restituisce più dati.
Quando si richiedono dati per la data di inizio ed il numero di elementi necessari, solo i dati la cui
data è minore (prima) o uguale alla data specificata. Vuol dire, che il tempo di apertura di ogni
barra, per il quale viene restituito il valore (volume, spread, valore sul buffer indicatore, i prezzi
Open, H igh, Low, Close o l'orario di apertura T ime) è sempre minore o uguale a quello specificato.
Quando si richiedono dati in un intervallo di date specificato, solo i dati di questo intervallo
verranno restituiti. L 'intervallo è impostato e contato fino ai secondi. Vuol dire, che il tempo di
apertura di ogni barra, per il quale viene restituito il valore (volume, spread, valore sul buffer
indicatore, i prezzi Open, H igh, Low, Close o l'orario di apertura T ime) è sempre entro l'intervallo
richiesto.
Se c'è bisogno di restituire il valore corrispondente alla corrente barra incompiuta, è possibile
utilizzare la prima forma di chiamata specificando start_pos =0 e count= 1.
Esempio:
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//---- plot TickVolume
#property indicator_label1 "TickVolume"
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_color1 C'143,188,139'
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- parametri di input
input int bars=3000;
//--- buffers indicatore
double TickVolumeBuffer[];
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
void OnInit()
{
//--- mappatura buffers indicatore
SetIndexBuffer(0,TickVolumeBuffer,INDICATOR_DATA);
IndicatorSetInteger(INDICATOR_DIGITS,0);
//---
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
Vedere un esempio dettagliato di dati storici richiesti, nella sezione Metodi di Binding Oggetti. Lo
script disponibile in questa sezione mostra come ottenere i valori degli indicatori iFractals delle ultime
1000 barre e come visualizzare gli ultimi 10 su e 10 gi ù frattali sul grafico. Una tecnica simile può
essere utilizzata per tutti gli indicatori che hanno dati mancanti e che sono solitamente elaborati
utilizzando i seguenti stili:
· DRAW _S ECTION,
· DRAW _ARR OW ,
· DRAW _ZIGZAG ,
· DRAW _ COLOR_S ECTION,
· DRAW _ COLOR_ARR OW ,
· DRAW _ COLOR_ZIGZAG.
CopyRealVolume
La funzione ottiene in volume_array i dati storici dei volumi trade per la coppia simbolo-periodo
selezionati nella quantità specificata. Occorre notare che l'ordinamento degli elementi è dal presente al
passato, cioè, la posizione iniziale di 0 significa la barra corrente.
Quando si copia una quantità ancora sconosciuta di dati, si raccomanda di utilizzare gli array dinamici
come array di destinazione, perché se il conteggio dei dati richiesti è di meno (o più) rispetto alla
lunghezza dell'array di destinazione, la funzione cerca di riallocare la memoria in modo che i dati
richiesti vi entrino completamente.
Se si conosce la quantità necessaria di dati da copiare, dovrebbe essere meglio fatto in un buffer
allocato in modo statico, al fine di evitare un' allocazione eccessiva di memoria.
Non importa ciò che è di proprietà dell'array di destinazione - as _series =true o as _series =false. I dati
verranno copiati in modo che l'elemento più vecchio sarà situato all'inizio della memoria fisica allocata
per l'array. Ci sono 3 varianti di chiamate di funzione.
Parametri
symbol_name
[ in] Nome del S imbolo.
timeframe
[ in] Periodo.
start_pos
[ in] La posizione di partenza per il primo elemento da copiare.
count
[ in] Conteggio dati da copiare.
start_time
[ in] L 'orario di avviamento per il primo elemento da copiare.
stop_time
[ in] Orario barra, corrispondente all'ultimo elemento da copiare.
volume_array[]
[ out] A rray odi tipo long.
Valore restituito
R estituisce il numero di dati copiati o -1 in caso dierrore.
Nota
Se l'intervallo di insieme dei dati richiesti è fuori dei dati disponibili sul server, la funzione
restituisce -1. S e sono richiesti i dati fuori da T ER M INAL _M AXBARS (numero massimo di barre nel
grafico), la funzione anche restituire -1.
Quando si richiedono dati dall'indicatore, se le timeseries richieste non sono ancora costruite o
hanno bisogno di essere scaricati dal server, la funzione restituisce immediatamente -1, ma il
processo di download/costruzione verrà avviato.
Quando si richiedono dati da un Ex pert Advisor o uno script, verrà avviato il download dal server, se
il terminale non dispone di questi dati a livello locale, o la costruzione delle timeserie richieste avrà
inizio, se i dati possono essere costruiti dallo storico locale, ma non sono ancora pronti. La funzione
restituisce la quantità di dati che sarà pronta entro il momento del timeout dell'espirazione, ma il
download dello storico continuerà, ed alla successiva richiesta simile la funzione restituisce più dati.
Quando si richiedono dati per la data di inizio ed il numero di elementi necessari, solo i dati la cui
data è minore (prima) o uguale alla data specificata. Vuol dire, che il tempo di apertura di ogni
barra, per il quale viene restituito il valore (volume, spread, valore sul buffer indicatore, i prezzi
Open, H igh, Low, Close o l'orario di apertura T ime) è sempre minore o uguale a quello specificato.
Quando si richiedono dati in un intervallo di date specificato, solo i dati di questo intervallo
verranno restituiti. L 'intervallo è impostato e contato fino ai secondi. Vuol dire, che il tempo di
apertura di ogni barra, per il quale viene restituito il valore (volume, spread, valore sul buffer
indicatore, i prezzi Open, H igh, Low, Close o l'orario di apertura T ime) è sempre entro l'intervallo
richiesto.
Se c'è bisogno di restituire il valore corrispondente alla corrente barra incompiuta, è possibile
utilizzare la prima forma di chiamata specificando start_pos =0 e count= 1.
Vedere l'esempio di dati storici richiesti nella sezione Metodi di Binding Oggetti. Lo script disponibile
in questa sezione mostra come ottenere i valori degli indicatori iFractals delle ultime 1000 barre e
come visualizzare gli ultimi 10 su e 10 giù frattali sul grafico. Una tecnica simile può essere utilizzata
per tutti gli indicatori che hanno dati mancanti e che sono solitamente elaborati utilizzando i seguenti
stili:
· DRAW _S ECTION,
· DRAW _ARR OW ,
· DRAW _ZIGZAG ,
· DRAW _ COLOR_S ECTION,
· DRAW _ COLOR_ARR OW ,
· DRAW _ COLOR_ZIGZAG.
CopySpread
La funzione ottiene in spread_array i dati storici dei valori spread per la coppia simbolo-periodo
selezionati nella quantità specificata. Occorre notare che l'ordinamento degli elementi è dal presente al
passato, cioè, la posizione iniziale di 0 significa la barra corrente.
Quando si copia una quantità ancora sconosciuta di dati, si raccomanda di utilizzare gli array dinamici
come array di destinazione, perché se il conteggio dei dati richiesti è di meno (o più) rispetto alla
lunghezza dell'array di destinazione, la funzione cerca di riallocare la memoria in modo che i dati
richiesti vi entrino completamente.
Se si conosce la quantità necessaria di dati da copiare, dovrebbe essere meglio fatto in un buffer
allocato in modo statico, al fine di evitare un' allocazione eccessiva di memoria.
Non importa ciò che è di proprietà dell'array di destinazione - as _series =true o as _series =false. I dati
verranno copiati in modo che l'elemento più vecchio sarà situato all'inizio della memoria fisica allocata
per l'array. Ci sono 3 varianti di chiamate di funzione.
Parametri
symbol_name
[ in] Nome del S imbolo.
timeframe
[ in] Periodo.
start_pos
[ in] La posizione di partenza per il primo elemento da copiare.
count
[ in] Conteggio dati da copiare.
start_time
[ in] L 'orario di avviamento per il primo elemento da copiare.
stop_time
[ in] Orario barra, corrispondente all'ultimo elemento da copiare.
spread_array[]
[ out] A rray di tipo int.
Valore restituito
R estituisce il numero di dati copiati o -1 in caso di errore.
Nota
Se l'intervallo di insieme dei dati richiesti è fuori dei dati disponibili sul server, la funzione
restituisce -1. S e sono richiesti i dati fuori da T ER M INAL _M AXBARS (numero massimo di barre nel
grafico), la funzione anche restituire -1.
Quando si richiedono dati dall'indicatore, se le timeseries richieste non sono ancora costruite o
hanno bisogno di essere scaricati dal server, la funzione restituisce immediatamente -1, ma il
processo di download/costruzione verrà avviato.
Quando si richiedono dati da un Ex pert Advisor o uno script, verrà avviato il download dal server, se
il terminale non dispone di questi dati a livello locale, o la costruzione delle timeserie richieste avrà
inizio, se i dati possono essere costruiti dallo storico locale, ma non sono ancora pronti. La funzione
restituisce la quantità di dati che sarà pronta entro il momento del timeout dell'espirazione, ma il
download dello storico continuerà, ed alla successiva richiesta simile la funzione restituisce più dati.
Quando si richiedono dati per la data di inizio ed il numero di elementi necessari, solo i dati la cui
data è minore (prima) o uguale alla data specificata. Vuol dire, che il tempo di apertura di ogni
barra, per il quale viene restituito il valore (volume, spread, valore sul buffer indicatore, i prezzi
Open, H igh, Low, Close o l'orario di apertura T ime) è sempre minore o uguale a quello specificato.
Quando si richiedono dati in un intervallo di date specificato, solo i dati di questo intervallo
verranno restituiti. L 'intervallo è impostato e contato fino ai secondi. Vuol dire, che il tempo di
apertura di ogni barra, per il quale viene restituito il valore (volume, spread, valore sul buffer
indicatore, i prezzi Open, H igh, Low, Close o l'orario di apertura T ime) è sempre entro l'intervallo
richiesto.
Se c'è bisogno di restituire il valore corrispondente alla corrente barra incompiuta, è possibile
utilizzare la prima forma di chiamata specificando start_pos =0 e count= 1.
Esempio:
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//---- plot Spread
#property indicator_label1 "Spread"
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- parametri di input
input int bars=3000;
//--- buffers indicatore
double SpreadBuffer[];
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
void OnInit()
{
//--- mappatura buffers indicatore
SetIndexBuffer(0,SpreadBuffer,INDICATOR_DATA);
IndicatorSetInteger(INDICATOR_DIGITS,0);
//---
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
Vedere l'esempio di dati storici richiesti nella sezione Metodi di Binding Oggetti. Lo script disponibile
in questa sezione mostra come ottenere i valori degli indicatori iFractals delle ultime 1000 barre e
come visualizzare gli ultimi 10 su e 10 giù frattali sul grafico. Una tecnica simile può essere utilizzata
per tutti gli indicatori che hanno dati mancanti e che sono solitamente elaborati utilizzando i seguenti
stili:
· DRAW _S ECTION,
· DRAW _ARR OW ,
· DRAW _ZIGZAG ,
· DRAW _ COLOR_S ECTION,
· DRAW _ COLOR_ARR OW ,
· DRAW _ COLOR_ZIGZAG.
CopyTicks
La funzione riceve tick s nel formato M qlT ick in tick s _array. In questo caso, i tick s sono indicizzati dal
passato al presente, cioè il tick indicizzato 0 (zero) è il più vecchio nell'array. Per l'analisi del tick ,
controllare il campo flags, che mostra esattamente cosa è cambiato nel tick .
int CopyTicks(
string symbol_name, // Nome simbolo
MqlTick& ticks_array[], // Array che riceve i Tick
uint flags=COPY_TICKS_ALL, // La flag che determina il tipo di tick ricevuti
ulong from=0, // La data dal quale vuoi richiedere ticks
uint count=0 // Il numero di ticks che vuoi ricevere
);
Parametri
symbol_name
[ in] S imbolo.
ticks_array
[ out] Un array di tipo M qlT ick per ricevere tick s.
flags
[in] Un flag per definire il tipo di tick s richiesti. COPY_TICKS _INFO – tick s con cambiamenti Bid
e/o As k , COPY_TICKS _TRADE – tick s con cambiamenti in Last e Volume, COPY_TICKS _ALL – all
tick s. Per qualsiasi tipo di richiesta, i valori dei tick precedenti vengono aggiunti ai campi
rimanenti della struttura M qlT ick .
from
[in] La data dal quale vuoi ricchiedere tick s. In millisecondi da . .
1970 01 01 . If from=0, l'ultimo
count tick s verrà restituito.
count
[in] Il numero di tick s richiesti. S e i parametri 'from' e 'count' non sono specificati, tutti i tick s
disponibili più recenti (ma non più di 2000) verranno scritti in per tick s _array [].
Valore restituito
I l numero di tick copiati o -1 in caso di errore.
Ulteriore nota
La funzione CopyT ick s() permette di richiedere ed analizzare tutti i tick s ricevuti. La prima
chiamata di CopyT ick s() avvia la sincronizzazione del database del simbolo del tick memorizzato sul
disco rigido. S e il database locale non fornisce tutti i tick s richiesti, allora i tick s mancanti verranno
scaricati automaticamente dal trade server. T ick s che cominciano dalla data from specificata in
CopyT ick s() fino al momento corrente, verranno sincronizzati. Dopo di che, saranno aggiunti tutti i
tick s in arrivo per questo simbolo al database dei tick s in modo da mantenerli nello stato
sincronizzato.
Se i parametri from e count non sono stati specificati, tutti i tick s disponibili (ma non più di 2000)
verranno scritti nel ticks_array[]. Il parametro flags permette di specificre il tipo di tick s richiesti.
COPY_TICKS _INFO – vengono restituiti tick s con cambiamento di prezzo Bid e/o As k . S aranno
inoltre aggiunti i dati di altri campi. Ad esempio, se solo Bid è cambiato, i campi ask e volume
saranno riempiti con ultimi valori noti. Per sapere esattamente che cosa è cambiato, analizzare il
campo flag, che avrà il valore di TICK_FL AG_BID e/o TICK_FL AG_AS K. S e un tick ha valore zero dei
prezzi Bid ed As k , e le flags mostrano che questi dati sono cambiati (flags = TICK_FL AG_BID |
TI C K_FL AG_AS K), ci ò significa che il libro degli ordini (Mark et Depth - Profondità Mercato) è vuoto.
COPY_TICKS _TRADE – vengono restituiti tick s con i cambiamenti di prezzo Last e Volume. S aranno
inoltre aggiunti i dati di altri campi, vale a dire gli ultimi noti valori di Bid ed As k che saranno
specificati nei campi appropriati. Per sapere esattamente che cosa è cambiato, analizzare il campo
field, che avrà il valore TICK_FL AG_L AS T e TICK_FL AG_VOL UME.
COPY_TICKS _ALL – vengono restituiti tutti i tick s con qualsiasi cambiamento. I cambi non cambiati
verranno riempiti con gli ultimi valori noti.
La chiamata di CopyT ick s() con il flag COPY_TICKS _ALL ritorna immediatamente tutti i tick s dall'
intervallo della richiesta, mentre le chiamate in altre modalità richiedono un certo tempo per
elaborare e selezionare i tick s, quindi non forniscono un significativo vantaggio di velocità.
Quando si richiedono i tick s (sia con COPY_TICKS _INFO che COPY_TICKS _TRADE), ogni tick e
conterrà le piene informazioni di prezzo cos ì come l'orario del tick (bid, ask, last e volume). Questa
funzione viene fornita per facilitare l'analisi dello stato di trade al momento di ogni tick , quindi non
è necessario richiedere una storia tick profonda e cercare i valori di altri campi.
CopyTicks() può attendere il risultato per 45 secondi in Expert Advisors e scripts: a differenza
degli indicatori, ogni Ex pert Advisor e script operano in un thread separato, e quindi possono
aspettare 45 secondi fino al completamento della sincronizzazione. S e la quantità necessaria di tick s
non riesce ad essere sincronizzata durante questo tempo, CopyT ick s() restituirà i tick s disponibili
per timeout e continuerà la sincronizzazione. OnT ick () in Ex pert Advisor non è un handler per ogni
tick , essa solo notifica ad un Ex pert Advisor i cambiamenti nel mercato. Può essere una serie di
cambiamenti: il terminale può contemporaneamente creare alcuni tick s, ma onT ick () sarà chiamato
solo una volta a notificare all' EA dello stato attuale del mercato.
Il tasso di restituzione dei dati: il terminale conserva nella cache l'accesso veloce a 4096 ultimi
tick s per ogni strumento (65536 tick s per simboli con corrente Mark et Depth). S e i tick s richiesti per
la sessione di trading corrente sono oltre la cache, CopyT ick s() chiama i tick s memorizzati nella
memoria del terminale. Queste richieste richiedono più tempo per l'esecuzione. Le richieste più
lente sono quelle che richiedono i tick s per altri giorni, dal momento che i dati vengono letti dal
disco in questo caso.
Esempio:
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property script_show_inputs
//--- Requesting 100 million ticks to be sure we receive the entire tick history
input int getticks=100000000; // The number of required ticks
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
int attempts=0; // Count of attempts
bool success=false; // The flag of a successful copying of ticks
MqlTick tick_array[]; // Tick receiving array
MqlTick lasttick; // To receive last tick data
SymbolInfoTick(_Symbol,lasttick);
//--- Make 3 attempts to receive ticks
while(attempts<3)
{
//--- Measuring start time before receiving the ticks
uint start=GetTickCount();
//--- Requesting the tick history since 1970.01.01 00:00.001 (parameter from=1 ms)
int received=CopyTicks(_Symbol,tick_array,COPY_TICKS_ALL,1,getticks);
if(received!=-1)
{
//--- Showing information about the number of ticks and spent time
PrintFormat("%s: received %d ticks in %d ms",_Symbol,received,GetTickCount()-start);
//--- If the tick history is synchronized, the error code is equal to zero
if(GetLastError()==0)
{
success=true;
break;
}
else
PrintFormat("%s: Ticks are not synchronized yet, %d ticks received for %d ms. Error=%d"
_Symbol,received,GetTickCount()-start,_LastError);
}
//--- Counting attempts
attempts++;
//--- A one-second pause to wait for the end of synchronization of the tick database
Sleep(1000);
}
//--- Receiving the requested ticks from the beginning of the tick history failed in three attempts
if(!success)
{
PrintFormat("Error! Failed to receive %d ticks of %s in three attempts",getticks,_Symbol);
return;
}
int ticks=ArraySize(tick_array);
//--- Showing the time of the first tick in the array
datetime firstticktime=tick_array[ticks-1].time;
//---
MqlDateTime today;
datetime current_time=TimeCurrent();
TimeToStruct(current_time,today);
PrintFormat("current_time=%s",TimeToString(current_time));
today.hour=0;
today.min=0;
today.sec=0;
datetime startday=StructToTime(today);
datetime endday=startday+24*60*60;
if((ticks=CopyTicksRange(_Symbol,tick_array,COPY_TICKS_ALL,startday*1000,endday*1000))==-1)
{
PrintFormat("CopyTicksRange(%s,tick_array,COPY_TICKS_ALL,%s,%s) failed, error %d",
_Symbol,TimeToString(startday),TimeToString(endday),GetLastError());
return;
}
ticks=MathMax(100,ticks);
//--- Showing the first 100 ticks of the last day
int counter=0;
for(int i=0;i<ticks;i++)
{
datetime time=tick_array[i].time;
if((time>=startday) && (time<endday) && counter<100)
{
counter++;
PrintFormat("%d. %s",counter,GetTickDescription(tick_array[i]));
}
}
//--- Showing the first 100 deals of the last day
counter=0;
for(int i=0;i<ticks;i++)
{
datetime time=tick_array[i].time;
if((time>=startday) && (time<endday) && counter<100)
{
if(((tick_array[i].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY) || ((tick_array[i].flags&TICK_FLAG
{
counter++;
PrintFormat("%d. %s",counter,GetTickDescription(tick_array[i]));
}
}
}
}
//+------------------------------------------------------------------+
//| Returns the string description of a tick |
//+------------------------------------------------------------------+
string GetTickDescription(MqlTick &tick)
{
string desc=StringFormat("%s.%03d ",
TimeToString(tick.time),tick.time_msc%1000);
//--- Checking flags
bool buy_tick=((tick.flags&TICK_FLAG_BUY)==TICK_FLAG_BUY);
bool sell_tick=((tick.flags&TICK_FLAG_SELL)==TICK_FLAG_SELL);
bool ask_tick=((tick.flags&TICK_FLAG_ASK)==TICK_FLAG_ASK);
bool bid_tick=((tick.flags&TICK_FLAG_BID)==TICK_FLAG_BID);
bool last_tick=((tick.flags&TICK_FLAG_LAST)==TICK_FLAG_LAST);
bool volume_tick=((tick.flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME);
//--- Checking trading flags in a tick first
if(buy_tick || sell_tick)
{
//--- Forming an output for the trading tick
desc=desc+(buy_tick?StringFormat("Buy Tick: Last=%G Volume=%d ",tick.last,tick.volume):"");
desc=desc+(sell_tick?StringFormat("Sell Tick: Last=%G Volume=%d ",tick.last,tick.volume):"");
desc=desc+(ask_tick?StringFormat("Ask=%G ",tick.ask):"");
desc=desc+(bid_tick?StringFormat("Bid=%G ",tick.ask):"");
desc=desc+"(Trade tick)";
}
else
{
//--- Form a different output for an info tick
desc=desc+(ask_tick?StringFormat("Ask=%G ",tick.ask):"");
desc=desc+(bid_tick?StringFormat("Bid=%G ",tick.ask):"");
desc=desc+(last_tick?StringFormat("Last=%G ",tick.last):"");
desc=desc+(volume_tick?StringFormat("Volume=%d ",tick.volume):"");
desc=desc+"(Info tick)";
}
//--- Returning tick description
return desc;
}
//+------------------------------------------------------------------+
/* Example of the output
Si-12.16: received 11048387 ticks in 4937 ms
Last tick time = 2016.09.26 18:32:59.775
First tick time = 2015.06.18 09:45:01.000
1. 2016.09.26 09:45.249 Ask=65370 Bid=65370 (Info tick)
2. 2016.09.26 09:47.420 Ask=65370 Bid=65370 (Info tick)
3. 2016.09.26 09:50.893 Ask=65370 Bid=65370 (Info tick)
4. 2016.09.26 09:51.827 Ask=65370 Bid=65370 (Info tick)
5. 2016.09.26 09:53.810 Ask=65370 Bid=65370 (Info tick)
6. 2016.09.26 09:54.491 Ask=65370 Bid=65370 (Info tick)
7. 2016.09.26 09:55.913 Ask=65370 Bid=65370 (Info tick)
Guarda anche
SymbolInfoT ick , S truttura per i Prezzi Correnti, OnT ick ()
CopyTicksRange
La funzione riceve tick s in formato M qlT ick nell'intervallo di date specificato in tick s _array.
I ndicizzazione va dal passato al presente che significa che un tick con l'indice 0 è il pi ù vecchio
nell'array. Per l'analisi dei tick , controllare la il campo flag, che mostra cosa esattamente è cambiato.
int CopyTicksRange(
const string symbol_name, // nome del simbolo
MqlTick& ticks_array[], // array ricevente i tick
uint flags=COPY_TICKS_ALL, // flag che definisce il tipo di ticks che vengono ricev
ulong from_msc=0, // data, dalla quale i ticks vengono richiesti
ulong to_msc=0 // data, fino a quando i ticks vengono richiesti
);
parametri
symbol_name
[ in] S imbolo.
ticks_array
[out] M qlT ick array statico o dinamicoper il ricevimento dei tick s. S e l'array statico non può
contenere tutti i tick s dall'intervallo di tempo richiesto, viene ricevuto l'ammontare massimo
possibile di tick s. In questo caso, la funzione genera l'errore ERR_HIS T ORY_S M ALL _BUFFER (4407).
flags
[in] Una flag per definire il tipo di tick s richiesti. COPY_TICKS _INFO – tick s con cambiamenti Bid
e/o As k , COPY_TICKS _TRADE – tick s con i cambiamenti in Last e Volume, COPY_TICKS _ALL – tutti
i tick s. Per qualsiasi tipo di richiesta, si aggiungono i valori del precedente tick ai campi rimanenti
della struttura M qlT ick .
from_msc
[ in] La data, dalla quale si desidera richiedere i tick s. In millisecondi dal 1970/01/01. S e il
parametro from_msc non è specificato, vengono inviati i tick s dall'inizio dello storico. T ick s con
l'orario >= from_msc vengono inviati.
to_msc
[in] La data, fino al quale si desidera richiedere tick s. In millisecondi dal 01.01.1970. Vengono
inviati T ick s con l'orario <= to_msc (ad_msc). S e il paramtro to_msc non è specificato, vengono
inviati tutti i tick s fino alla fine dello storico.
Valore di ritorno
Il numero di tick copiato oppure -1 in caso di errore. G etLastError() è in grado di restituire i
seguenti errori:
· ERR_HIS T ORY_TI MEOUT - il tempo di attesa della sincronizzazione tick s è scaduto, la funzione ha
inviato tutto quello che aveva.
· ERR_HIS T ORY_S M ALL _BUFFER - il buffer statico è troppo piccolo. S olo l'ammontare che l'array piò
memorizzare è stato inviato.
· ERR_NOT_ENOUGH_MEMORY - memoria insufficiente per la ricezione dello storico dal range
specificato all' array dinamico dei tick . Impossibile allocare la memoria sufficiente per l'array tick .
Nota
La funzione CopyT ick s R ange() viene utilizzata per richiedere tick s strettamente da un intervallo
specifico, per esempio, da un certo giorno nello storico. Allo stesso tempo, CopyT ick s() permette di
specificare solo la data di inizio, per esempio - ricevere tutti i tick s dall'inizio del mese fino al
momento attuale.
Guarda anche
SymbolInfoT ick , S truttura per i Prezzi Correnti, OnT ick , CopyT ick s
iBars
R estituisce il numero di barre di un simbolo e di un periodo corrispondenti, disponibili nello storico.
int iBars(
const string symbol, // Simbolo
ENUM_TIMEFRAMES timeframe // Periodo
);
Parametri
symbol
[ in] Il nome simbolico dello strumento finanziario. LL significa il simbolo corrente.
NU
timeframe
[in] Periodo. Può essere uno dei valori dell'enumerazione ENUM _TIMEFRAMES . 0 significa il
periodo del chart corrente.
Valore di ritorno
Il numero di barre di un simbolo e di un periodo corrispondenti, disponibili nello storico, ma non più
di quanto consentito dal parametro " Max barre nel chart" nelle impostazioni della piattaforma.
Esempio:
Print("Il conteggio Barre su 'EURUSD,H1' è ",iBars("EURUSD",PERIOD_H1));
Guarda anche
B ars
iBarShift
Cerca la barra per orario. La funzione restituisce l'indice della barra corrispondente al tempo/orario
specificato.
int iBarShift(
const string symbol, // Simbolo
ENUM_TIMEFRAMES timeframe, // Periodo
datetime time, // Orario
bool exact=false // Modalità
);
Parametri
symbol
[ in] Il nome simbolico dello strumento finanziario. LL significa il simbolo corrente.
NU
timeframe
[in] Periodo. Può essere uno dei valori dell'enumerazione ENUM _TIMEFRAMES . PERIOD_CURR ENT
significa il periodo chart corrente.
time
[ in] Valore temporale da cercare.
exact=false
[in] Un valore di ritorno, nel caso in cui la barra con l'ora specificata non venga trovata. S e
exact=false, iBarShift restituisce l'indice della barra più vicina, l'orario Open (di apertura) è
inferiore all'orario specificato (time_open<time). S e tale barra non viene trovata (lo storico prima
dell'orario specificato non è disponibile), la funzione restituisce -1. S e exact=true, iBarS hift non
cerca la barra più vicina, ma restituisce immediatamente -1.
Valore di ritorno
L 'indice della barra corrispondente all'orario specificato. S e la barra corrispondente all'orario
specificato non viene trovata (c'è una lacuna nello storico), la funzione restituisce -1 o l'indice della
barra più vicina (a seconda del parametro 'exact').
Esempio:
//+------------------------------------------------------------------+
//| Funzione Start programma Script |
//+------------------------------------------------------------------+
void OnStart()
{
//--- La data è domenica
datetime time=D'2002.04.25 12:00';
string symbol="GBPUSD";
ENUM_TIMEFRAMES tf=PERIOD_H1;
bool exact=false;
//--- Se non c'è alcuna barra all'ora specificata, iBarShift restituirà l'indice della barra più vi
int bar_index=iBarShift(symbol,tf,time,exact);
//--- Controlla il codice di errore dopo la chiamata di iBarShift()
int error=GetLastError();
if(error!=0)
{
PrintFormat("iBarShift(): GetLastError=%d - La data richiesta %s "+
"per %s %s non è stata trovata nello storico disponibile",
error,TimeToString(time),symbol,EnumToString(tf));
return;
}
//--- La funzione iBarShift() è stata eseguita correttamente, restituisce un risultato per exact=fa
PrintFormat("1. %s %s %s(%s): l'indice della barra è %d (exact=%s)",
symbol,EnumToString(tf),TimeToString(time),
DayOfWeek(time),bar_index,string(exact));
datetime bar_time=iTime(symbol,tf,bar_index);
PrintFormat("L'orario della barra #%d è %s (%s)",
bar_index,TimeToString(bar_time),DayOfWeek(bar_time));
//--- Richiede l'indice della barra con l'orario specificato; se non ci sono barre, verrà restituit
exact=true;
bar_index=iBarShift(symbol,tf,time,exact);
//--- La funzione iBarShift() è stata eseguita correttamente, restituisce un risultato per exact=tr
PrintFormat("2. %s %s %s (%s):bar index is %d (exact=%s)",
symbol,EnumToString(tf),TimeToString(time)
,DayOfWeek(time),bar_index,string(exact));
}
//+------------------------------------------------------------------+
//| Restituisce il nome del giorno della settimana |
//+------------------------------------------------------------------+
string DayOfWeek(const datetime time)
{
MqlDateTime dt;
string day="";
TimeToStruct(time,dt);
switch(dt.day_of_week)
{
case 0: day=EnumToString(SUNDAY);
break;
case 1: day=EnumToString(MONDAY);
break;
case 2: day=EnumToString(TUESDAY);
break;
case 3: day=EnumToString(WEDNESDAY);
break;
case 4: day=EnumToString(THURSDAY);
break;
case 5: day=EnumToString(FRIDAY);
break;
default:day=EnumToString(SATURDAY);
break;
}
//---
return day;
}
//+------------------------------------------------------------------+
/* Risultato dell'esecuzione
1. GBPUSD PERIOD_H1 2018.06.10 12:00(SUNDAY): l'indice della barra è 64 (exact=false)
Orario della barra #64 è 2018.06.08 23:00 (FRIDAY)
2. GBPUSD PERIOD_H1 2018.06.10 12:00 (SUNDAY):l'indice della barra è -1 (exact=true)
*/
iClose
Restituisce il prezzo Close (di chiusura) della barra (indicato dal parametro 'shift') sul chart
corrispondente.
double iClose(
const string symbol, // Simbolo
ENUM_TIMEFRAMES timeframe, // Periodo
int shift // Slittamento
);
Parametri
symbol
[ in] Il nome simbolico dello strumento finanziario. LL significa il simbolo corrente.
NU
timeframe
[in] Periodo. Può essere uno dei valori dell'enumerazione ENUM _TIMEFRAMES . 0 significa il
periodo del chart corrente.
shift
[in] L 'indice del valore ricevuto dalla timeseries (spostamento all'indietro di un numero specificato
di barre rispetto alla barra corrente).
Valore di ritorno
Il prezzo Close (di chiusura) della barra (indicato dal parametro 'shift') sul chart corrispondente o 0 in
caso di errore. Per i dettagli dell'errore, chiamare la funzione GetLastError().
Nota
La funzione restituisce sempre i dati effettivi. A tale scopo esegue una richiesta alle timeseries per
il simbolo/periodo specificato durante ogni chiamata. Ciò significa che se non ci sono dati pronti
durante la prima chiamata di funzione, potrebbe essere necessario un po' di tempo per preparare il
risultato.
La funzione non memorizza i risultati delle chiamate precedenti e non esiste una cache locale per il
ritorno rapido dei valori.
Esempio:
input int shift=0;
//+------------------------------------------------------------------+
//| Funzione-event handler "tick" |
//+------------------------------------------------------------------+
void OnTick()
{
datetime time = iTime(Symbol(),Period(),shift);
double open = iOpen(Symbol(),Period(),shift);
double high = iHigh(Symbol(),Period(),shift);
double low = iLow(Symbol(),Period(),shift);
double close = iClose(NULL,PERIOD_CURRENT,shift);
long volume= iVolume(Symbol(),0,shift);
Comment(Symbol(),",",EnumToString(Period()),"\n",
"Time: " ,TimeToString(time,TIME_DATE|TIME_SECONDS),"\n",
"Open: " ,DoubleToString(open,Digits()),"\n",
"High: " ,DoubleToString(high,Digits()),"\n",
"Low: " ,DoubleToString(low,Digits()),"\n",
"Close: " ,DoubleToString(close,Digits()),"\n",
"Volume: ",IntegerToString(volume),"\n",
"Bars: " ,IntegerToString(bars),"\n"
);
}
Guarda anche
CopyClose, CopyR ates
iHigh
R estituisce il prezzo H igh della barra (indicata dal parametro 'shift') sul chart corrispondente.
double iHigh(
const string symbol, // Simbolo
ENUM_TIMEFRAMES timeframe, // Periodo
int shift // Slittamento
);
Parametri
symbol
[ in] Il nome simbolico dello strumento finanziario. LL significa il simbolo corrente.
NU
timeframe
[in] Periodo. Può essere uno dei valori dell'enumerazione ENUM _TIMEFRAMES . 0 significa il
periodo del chart corrente.
shift
[in] L 'indice del valore ricevuto dalla timeseries (spostamento all'indietro di un numero specificato
di barre rispetto alla barra corrente).
Valore di ritorno
Il prezzo H igh della barra (indicato dal parametro 'shift') sul chart corrispondente o 0 in caso di
errore. Per i dettagli dell'errore, chiamare la funzione GetLastError().
Nota
La funzione restituisce sempre i dati effettivi. A tale scopo esegue una richiesta alle timeseries per
il simbolo/periodo specificato durante ogni chiamata. Ciò significa che se non ci sono dati pronti
durante la prima chiamata di funzione, potrebbe essere necessario un po' di tempo per preparare il
risultato.
La funzione non memorizza i risultati delle chiamate precedenti e non esiste una cache locale per il
ritorno rapido dei valori.
Esempio:
input int shift=0;
//+------------------------------------------------------------------+
//| Funzione-event handler "tick" |
//+------------------------------------------------------------------+
void OnTick()
{
datetime time = iTime(Symbol(),Period(),shift);
double open = iOpen(Symbol(),Period(),shift);
double high = iHigh(Symbol(),Period(),shift);
double low = iLow(Symbol(),Period(),shift);
double close = iClose(NULL,PERIOD_CURRENT,shift);
long volume= iVolume(Symbol(),0,shift);
int bars = iBars(NULL,0);
Comment(Symbol(),",",EnumToString(Period()),"\n",
"Time: " ,TimeToString(time,TIME_DATE|TIME_SECONDS),"\n",
"Open: " ,DoubleToString(open,Digits()),"\n",
"High: " ,DoubleToString(high,Digits()),"\n",
"Low: " ,DoubleToString(low,Digits()),"\n",
"Close: " ,DoubleToString(close,Digits()),"\n",
"Volume: ",IntegerToString(volume),"\n",
"Bars: " ,IntegerToString(bars),"\n"
);
}
Guarda anche
CopyH igh, CopyR ates
iHighest
Restituisce l'indice del valore più alto trovato sul chart corrispondente (spostamento relativo alla barra
corrente).
int iHighest(
const string symbol, // Simbolo
ENUM_TIMEFRAMES timeframe, // Periodo
ENUM_SERIESMODE type, // Identificatore Timeseries
int count=WHOLE_ARRAY, // Numero di elementi
int start=0 // Indice
);
Parametri
symbol
[ in] Il simbolo, su cui verrà eseguita la ricerca. LL significa il simbolo corrente.
NU
timeframe
[in] Periodo. Può essere uno dei valori dell'enumerazione ENUM _TIMEFRAMES . 0 significa il
periodo del chart corrente.
type
[in] L 'identificatore delle timeseries, in cui verrà eseguita la ricerca. Può essere uguale a qualsiasi
valore da ENUM _S ERIES MODE.
count=WHOLE_ARRAY
[in] Il numero di elementi nelle timeseries (dalla barra corrente verso la direzione crescente
dell'indice), tra i quali deve essere eseguita la ricerca.
start=0
[in] L 'indice (slittamento relativo alla barra corrente) della barra iniziale, da cui inizia la ricerca del
valore più alto. I valori negativi vengono ignorati e sostituiti con un valore zero.
Valore di ritorno
L 'indice del valore più alto trovato sul chart corrispondente (slittamento relativo alla barra corrente)
o -1 in caso di errore. Per i dettagli dell'errore, chiamare la funzione GetLastError().
Esempio:
double val;
//--- Calcolo del valore di chiusura Close più alto tra 20 barre consecutive
//--- Dall'indice 4 all'indice 23 incluso, nel timeframe corrente
int val_index=iHighest(NULL,0,MODE_CLOSE,20,4);
if(val_index!=-1)
val=High[val_index];
else
PrintFormat("iHighest() - errore di chiamata. Codice errore=%d",GetLastError());
iLow
R estituisce il prezzo Low della barra (indicato dal parametro 'shift') sul chart corrispondente.
double iLow(
const string symbol, // Simbolo
ENUM_TIMEFRAMES timeframe, // Periodo
int shift // Slittamento
);
Parametri
symbol
[ in] Il nome simbolico dello strumento finanziario. LL significa il simbolo corrente.
NU
timeframe
[in] Periodo. Può essere uno dei valori dell'enumerazione ENUM _TIMEFRAMES . 0 significa il
periodo del chart corrente.
shift
[in] L 'indice del valore ricevuto dalla timeseries (spostamento all'indietro di un numero specificato
di barre rispetto alla barra corrente).
Valore di ritorno
Il prezzo Low della barra (indicato dal parametro 'shift') sul chart corrispondente o 0 in caso di
errore. Per i dettagli dell'errore, chiamare la funzione GetLastError().
Nota
La funzione restituisce sempre i dati effettivi. A tale scopo esegue una richiesta alle timeseries per
il simbolo/periodo specificato durante ogni chiamata. Ciò significa che se non ci sono dati pronti
durante la prima chiamata di funzione, potrebbe essere necessario un po' di tempo per preparare il
risultato.
La funzione non memorizza i risultati delle chiamate precedenti e non esiste una cache locale per il
ritorno rapido dei valori.
Esempio:
input int shift=0;
//+------------------------------------------------------------------+
//| Funzione-event handler "tick" |
//+------------------------------------------------------------------+
void OnTick()
{
datetime time = iTime(Symbol(),Period(),shift);
double open = iOpen(Symbol(),Period(),shift);
double high = iHigh(Symbol(),Period(),shift);
double low = iLow(Symbol(),Period(),shift);
double close = iClose(NULL,PERIOD_CURRENT,shift);
long volume= iVolume(Symbol(),0,shift);
int bars = iBars(NULL,0);
Comment(Symbol(),",",EnumToString(Period()),"\n",
"Time: " ,TimeToString(time,TIME_DATE|TIME_SECONDS),"\n",
"Open: " ,DoubleToString(open,Digits()),"\n",
"High: " ,DoubleToString(high,Digits()),"\n",
"Low: " ,DoubleToString(low,Digits()),"\n",
"Close: " ,DoubleToString(close,Digits()),"\n",
"Volume: ",IntegerToString(volume),"\n",
"Bars: " ,IntegerToString(bars),"\n"
);
}
Guarda anche
CopyLow, CopyR ates
iLowest
Restituisce l'indice del valore più piccolo trovato sul chart corrispondente (slittamento relativo alla
barra corrente).
int iLowest(
const string symbol, // Simbolo
ENUM_TIMEFRAMES timeframe, // Periodo
ENUM_SERIESMODE type, // Identificatore Timeseries
int count=WHOLE_ARRAY, // Numero di elementi
int start=0 // Indice
);
Parametri
symbol
[ in] Il simbolo, su cui verrà eseguita la ricerca. LL significa il simbolo corrente.
NU
timeframe
[in] Periodo. Può essere uno dei valori dell'enumerazione ENUM _TIMEFRAMES . 0 indica il periodo
del chart corrente.
type
[in] L 'identificatore delle timeseries, in cui verrà eseguita la ricerca. Può essere uguale a qualsiasi
valore da ENUM _S ERIES MODE.
count=WHOLE_ARRAY
[in] Il numero di elementi nelle timeseries (dalla barra corrente verso la direzione crescente
dell'indice), tra i quali deve essere eseguita la ricerca.
start=0
[in] L 'indice (slittamento relativo alla barra corrente) della barra iniziale, da cui inizia la ricerca del
valore più basso. I valori negativi vengono ignorati e sostituiti con un valore zero.
Valore di ritorno
L 'indice del valore più basso trovato sul chart corrispondente (slittamento relativo alla barra
corrente) o -1 in caso di errore. Per i dettagli dell'errore, chiamare la funzione GetLastError().
Esempio:
double val;
//--- Cerca una barra con il valore più basso del volume reale tra 15 barre consecutive
//--- Dall'indice 10 all'indice 24 incluso, nel timeframe corrente
int val_index=iLowest(NULL,0,MODE_REAL_VOLUME,15,10);
if(val_index!=-1)
val=Low[val_index];
else
PrintFormat("iLowest() - errore di chiamata. Codice errore=%d",GetLastError());
iOpen
R estituisce il prezzo Open della barra (indicata dal parametro 'shift') sul chart corrispondente.
double iOpen(
const string symbol, // Simbolo
ENUM_TIMEFRAMES timeframe, // Periodo
int shift // Slittamento
);
Parametri
symbol
[ in] Il nome simbolico dello strumento finanziario. LL significa il simbolo corrente.
NU
timeframe
[in] Periodo. Può essere uno dei valori dell'enumerazione ENUM _TIMEFRAMES . 0 significa il
periodo del chart corrente.
shift
[in] L 'indice del valore ricevuto dalla timeseries (spostamento all'indietro di un numero specificato
di barre rispetto alla barra corrente).
Valore di ritorno
Il prezzo Open della barra (indicato dal parametro 'shift') sul chart corrispondente o 0 in caso di
errore. Per i dettagli dell'errore, chiamare la funzione GetLastError().
Nota
La funzione restituisce sempre i dati effettivi. A tale scopo esegue una richiesta alle timeseries per
il simbolo/periodo specificato durante ogni chiamata. Ciò significa che se non ci sono dati pronti
durante la prima chiamata di funzione, potrebbe essere necessario un po' di tempo per preparare il
risultato.
La funzione non memorizza i risultati delle chiamate precedenti e non esiste una cache locale per il
ritorno rapido dei valori.
Esempio:
input int shift=0;
//+------------------------------------------------------------------+
//| Funzione-event handler "tick" |
//+------------------------------------------------------------------+
void OnTick()
{
datetime time = iTime(Symbol(),Period(),shift);
double open = iOpen(Symbol(),Period(),shift);
double high = iHigh(Symbol(),Period(),shift);
double low = iLow(Symbol(),Period(),shift);
double close = iClose(NULL,PERIOD_CURRENT,shift);
long volume= iVolume(Symbol(),0,shift);
int bars = iBars(NULL,0);
Comment(Symbol(),",",EnumToString(Period()),"\n",
"Time: " ,TimeToString(time,TIME_DATE|TIME_SECONDS),"\n",
"Open: " ,DoubleToString(open,Digits()),"\n",
"High: " ,DoubleToString(high,Digits()),"\n",
"Low: " ,DoubleToString(low,Digits()),"\n",
"Close: " ,DoubleToString(close,Digits()),"\n",
"Volume: ",IntegerToString(volume),"\n",
"Bars: " ,IntegerToString(bars),"\n"
);
}
Guarda anche
CopyOpen, CopyR ates
iTime
R estituisce il tempo di apertura della barra (indicato dal parametro 'shift') sul chart corrispondente.
datetime iTime(
const string symbol, // Simbolo
ENUM_TIMEFRAMES timeframe, // Periodo
int shift // Slittamento
);
Parametri
symbol
[ in] Il nome simbolico dello strumento finanziario. LL significa il simbolo corrente.
NU
timeframe
[in] Periodo. Può essere uno dei valori dell'enumerazione ENUM _TIMEFRAMES . 0 significa il
periodo del chart corrente.
shift
[in] L 'indice del valore ricevuto dalla timeseries (spostamento all'indietro di un numero specificato
di barre rispetto alla barra corrente).
Valore di ritorno
Il tempo di apertura della barra (indicato dal parametro 'shift') sul chart corrispondente o 0 in caso di
errore. Per i dettagli dell'errore, chiamare la funzione GetLastError().
Nota
La funzione restituisce sempre i dati effettivi. A tale scopo esegue una richiesta alle timeseries per
il simbolo/periodo specificato durante ogni chiamata. Ciò significa che se non ci sono dati pronti
durante la prima chiamata di funzione, potrebbe essere necessario un po' di tempo per preparare il
risultato.
La funzione non memorizza i risultati delle chiamate precedenti e non esiste una cache locale per il
ritorno rapido dei valori.
Esempio:
//+------------------------------------------------------------------+
//| Funzione Start programma Script |
//+------------------------------------------------------------------+
void OnStart()
{
//--- La data è domenica
datetime time=D'2018.06.10 12:00';
string symbol="GBPUSD";
ENUM_TIMEFRAMES tf=PERIOD_H1;
bool exact=false;
//--- non c'è una barra all'orario specificato, iBarShift restituirà l'indice della barra più vicin
int bar_index=iBarShift(symbol,tf,time,exact);
PrintFormat("1. %s %s %s(%s): l'indice della barra è %d (exact=%s)",
symbol,EnumToString(tf),TimeToString(time),DayOfWeek(time),bar_index,string(exact));
datetime bar_time=iTime(symbol,tf,bar_index);
PrintFormat("L'orario della barra #%d è %s (%s)",
bar_index,TimeToString(bar_time),DayOfWeek(bar_time));
//PrintFormat(iTime(symbol,tf,bar_index));
//--- Richiede l'indice della barra con il timeframe specificato; ma non c'è la barra, restituisce
exact=true;
bar_index=iBarShift(symbol,tf,time,exact);
PrintFormat("2. %s %s %s (%s):bar index is %d (exact=%s)",
symbol,EnumToString(tf),TimeToString(time),DayOfWeek(time),bar_index,string(exact));
}
//+------------------------------------------------------------------+
//| Restituisce il nome del giorno della settimana |
//+------------------------------------------------------------------+
string DayOfWeek(const datetime time)
{
MqlDateTime dt;
string day="";
TimeToStruct(time,dt);
switch(dt.day_of_week)
{
case 0: day=EnumToString(SUNDAY);
break;
case 1: day=EnumToString(MONDAY);
break;
case 2: day=EnumToString(TUESDAY);
break;
case 3: day=EnumToString(WEDNESDAY);
break;
case 4: day=EnumToString(THURSDAY);
break;
case 5: day=EnumToString(FRIDAY);
break;
default:day=EnumToString(SATURDAY);
break;
}
//---
return day;
}
/* Il risultato:
1. GBPUSD PERIOD_H1 2018.06.10 12:00(SUNDAY): bar index is 64 (exact=false)
Time of bar #64 is 2018.06.08 23:00 (FRIDAY)
2. GBPUSD PERIOD_H1 2018.06.10 12:00 (SUNDAY):bar index is -1 (exact=true)
*/
Guarda anche
CopyT ime, CopyR ates
iTickVolume
R estituisce il volume tick della barra (indicato dal parametro 'shift') sul chart corrispondente.
long iTickVolume(
const string symbol, // Simbolo
ENUM_TIMEFRAMES timeframe, // Periodo
int shift // Slittamento
);
Parametri
symbol
[ in] Il nome simbolico dello strumento finanziario. LL significa il simbolo corrente.
NU
timeframe
[in] Periodo. Può essere uno dei valori dell'enumerazione ENUM _TIMEFRAMES . 0 significa il
periodo del chart corrente.
shift
[in] L 'indice del valore ricevuto dalla timeseries (spostamento all'indietro di un numero specificato
di barre rispetto alla barra corrente).
Valore di ritorno
Il volume del tick della barra (indicato dal parametro 'shift') sul chart corrispondente o 0 in caso di
errore. Per i dettagli dell'errore, chiamare la funzione GetLastError().
Nota
La funzione restituisce sempre i dati effettivi. A tale scopo esegue una richiesta alle timeseries per
il simbolo/periodo specificato durante ogni chiamata. Ciò significa che se non ci sono dati pronti
durante la prima chiamata di funzione, potrebbe essere necessario un po' di tempo per preparare il
risultato.
La funzione non memorizza i risultati delle chiamate precedenti e non esiste una cache locale per il
ritorno rapido dei valori.
Esempio:
input int shift=0;
//+------------------------------------------------------------------+
//| Funzione-event handler "tick" |
//+------------------------------------------------------------------+
void OnTick()
{
datetime time = iTime(Symbol(),Period(),shift);
double open = iOpen(Symbol(),Period(),shift);
double high = iHigh(Symbol(),Period(),shift);
double low = iLow(Symbol(),Period(),shift);
double close = iClose(NULL,PERIOD_CURRENT,shift);
long volume= iVolume(Symbol(),0,shift);
int bars = iBars(NULL,0);
Comment(Symbol(),",",EnumToString(Period()),"\n",
"Time: " ,TimeToString(time,TIME_DATE|TIME_SECONDS),"\n",
"Open: " ,DoubleToString(open,Digits()),"\n",
"High: " ,DoubleToString(high,Digits()),"\n",
"Low: " ,DoubleToString(low,Digits()),"\n",
"Close: " ,DoubleToString(close,Digits()),"\n",
"Volume: ",IntegerToString(volume),"\n",
"Bars: " ,IntegerToString(bars),"\n"
);
}
Guarda anche
CopyT ickVolume, CopyR ates
iRealVolume
R estituisce il volume reale della barra (indicato dal parametro 'shift') sul chart corrispondente.
long iRealVolume(
const string symbol, // Simbolo
ENUM_TIMEFRAMES timeframe, // Periodo
int shift // Slittamento
);
Parametri
symbol
[ in] Il nome simbolico dello strumento finanziario. LL significa il simbolo corrente.
NU
timeframe
[in] Periodo. Può essere uno dei valori dell'enumerazione ENUM _TIMEFRAMES . 0 significa il
periodo del chart corrente.
shift
[in] L 'indice del valore ricevuto dalla timeseries (spostamento all'indietro di un numero specificato
di barre rispetto alla barra corrente).
Valore di ritorno
Il volume reale della barra (indicato dal parametro 'shift') sul chart corrispondente o 0 in caso di
errore. Per i dettagli dell'errore, chiamare la funzione GetLastError().
Nota
La funzione restituisce sempre i dati effettivi. A tale scopo esegue una richiesta alle timeseries per
il simbolo/periodo specificato durante ogni chiamata. Ciò significa che se non ci sono dati pronti
durante la prima chiamata di funzione, potrebbe essere necessario un po' di tempo per preparare il
risultato.
La funzione non memorizza i risultati delle chiamate precedenti e non esiste una cache locale per il
ritorno rapido dei valori.
Esempio:
input int shift=0;
//+------------------------------------------------------------------+
//| Funzione-event handler "tick" |
//+------------------------------------------------------------------+
void OnTick()
{
datetime time = iTime(Symbol(),Period(),shift);
double open = iOpen(Symbol(),Period(),shift);
double high = iHigh(Symbol(),Period(),shift);
double low = iLow(Symbol(),Period(),shift);
double close = iClose(NULL,PERIOD_CURRENT,shift);
long volume= iVolume(Symbol(),0,shift);
int bars = iBars(NULL,0);
Comment(Symbol(),",",EnumToString(Period()),"\n",
"Time: " ,TimeToString(time,TIME_DATE|TIME_SECONDS),"\n",
"Open: " ,DoubleToString(open,Digits()),"\n",
"High: " ,DoubleToString(high,Digits()),"\n",
"Low: " ,DoubleToString(low,Digits()),"\n",
"Close: " ,DoubleToString(close,Digits()),"\n",
"Volume: ",IntegerToString(volume),"\n",
"Bars: " ,IntegerToString(bars),"\n"
);
}
Guarda anche
CopyR ealVolume, CopyR ates
iVolume
R estituisce il volume tick della barra (indicato dal parametro 'shift') sul chart corrispondente.
long iVolume(
const string symbol, // Simbolo
ENUM_TIMEFRAMES timeframe, // Periodo
int shift // Slittamento
);
Parametri
symbol
[ in] Il nome simbolico dello strumento finanziario. LL significa il simbolo corrente.
NU
timeframe
[in] Periodo. Può essere uno dei valori dell'enumerazione ENUM _TIMEFRAMES . 0 significa il
periodo del chart corrente.
shift
[in] L 'indice del valore ricevuto dalla timeseries (spostamento all'indietro di un numero specificato
di barre rispetto alla barra corrente).
Valore di ritorno
Il volume del tick della barra (indicato dal parametro 'shift') sul chart corrispondente o 0 in caso di
errore. Per i dettagli dell'errore, chiamare la funzione GetLastError().
Nota
La funzione restituisce sempre i dati effettivi. A tale scopo esegue una richiesta alle timeseries per
il simbolo/periodo specificato durante ogni chiamata. Ciò significa che se non ci sono dati pronti
durante la prima chiamata di funzione, potrebbe essere necessario un po' di tempo per preparare il
risultato.
La funzione non memorizza i risultati delle chiamate precedenti e non esiste una cache locale per il
ritorno rapido dei valori.
Esempio:
input int shift=0;
//+------------------------------------------------------------------+
//| Funzione-event handler "tick" |
//+------------------------------------------------------------------+
void OnTick()
{
datetime time = iTime(Symbol(),Period(),shift);
double open = iOpen(Symbol(),Period(),shift);
double high = iHigh(Symbol(),Period(),shift);
double low = iLow(Symbol(),Period(),shift);
double close = iClose(NULL,PERIOD_CURRENT,shift);
long volume= iVolume(Symbol(),0,shift);
int bars = iBars(NULL,0);
Comment(Symbol(),",",EnumToString(Period()),"\n",
"Time: " ,TimeToString(time,TIME_DATE|TIME_SECONDS),"\n",
"Open: " ,DoubleToString(open,Digits()),"\n",
"High: " ,DoubleToString(high,Digits()),"\n",
"Low: " ,DoubleToString(low,Digits()),"\n",
"Close: " ,DoubleToString(close,Digits()),"\n",
"Volume: ",IntegerToString(volume),"\n",
"Bars: " ,IntegerToString(bars),"\n"
);
}
Guarda anche
CopyT ickVolume, CopyR ates
iSpread
R estituisce il valore di spread della barra (indicato dal parametro 'shift') sul chart corrispondente.
long iSpread(
const string symbol, // Simbolo
ENUM_TIMEFRAMES timeframe, // Periodo
int shift // Slittamento
);
Parametri
symbol
[ in] Il nome simbolico dello strumento finanziario. LL significa il simbolo corrente.
NU
timeframe
[in] Periodo. Può essere uno dei valori dell'enumerazione ENUM _TIMEFRAMES . 0 significa il
periodo del chart corrente.
shift
[in] L 'indice del valore ricevuto dalla timeseries (spostamento all'indietro di un numero specificato
di barre rispetto alla barra corrente).
Valore di ritorno
Il valore S pread della barra (indicato dal parametro 'shift') sul chart corrispondente o 0 in caso di
errore. Per i dettagli dell'errore, chiamare la funzione GetLastError().
Nota
La funzione restituisce sempre i dati effettivi. A tale scopo esegue una richiesta alle timeseries per
il simbolo/periodo specificato durante ogni chiamata. Ciò significa che se non ci sono dati pronti
durante la prima chiamata di funzione, potrebbe essere necessario un po' di tempo per preparare il
risultato.
La funzione non memorizza i risultati delle chiamate precedenti e non esiste una cache locale per il
ritorno rapido dei valori.
Esempio:
input int shift=0;
//+------------------------------------------------------------------+
//| Funzione-event handler "tick" |
//+------------------------------------------------------------------+
void OnTick()
{
datetime time = iTime(Symbol(),Period(),shift);
double open = iOpen(Symbol(),Period(),shift);
double high = iHigh(Symbol(),Period(),shift);
double low = iLow(Symbol(),Period(),shift);
double close = iClose(NULL,PERIOD_CURRENT,shift);
long volume= iVolume(Symbol(),0,shift);
int bars = iBars(NULL,0);
Comment(Symbol(),",",EnumToString(Period()),"\n",
"Time: " ,TimeToString(time,TIME_DATE|TIME_SECONDS),"\n",
"Open: " ,DoubleToString(open,Digits()),"\n",
"High: " ,DoubleToString(high,Digits()),"\n",
"Low: " ,DoubleToString(low,Digits()),"\n",
"Close: " ,DoubleToString(close,Digits()),"\n",
"Volume: ",IntegerToString(volume),"\n",
"Bars: " ,IntegerToString(bars),"\n"
);
}
Guarda anche
CopyS pread, CopyR ates
Simboli Personalizzati
F unzioni per la creazione e la modifica delle proprietà dei simboli personalizzati.
Quando si collega il terminale a un determinato trade server, un utente è in grado di lavorare con le
time series dei simboli finanziari forniti da un brok er. I simboli finanziari disponibili vengono
visualizzati come un elenco nella finestra del Mark et W atch. Un gruppo separato di funzioni consente
di ricevere dati sulle proprietà dei simboli, sessioni di trading ed aggiornamenti della profondità di
mercato(mark et depth).
Il gruppo di funzioni descritte in questa sezione consente la creazione di simboli personalizzati. A tal
fine, gli utenti possono applicare i simboli esistenti del trade server, i file di testo o le origini dati
esterne.
Funzione Azione
CustomS ymbolCreate Creare un simbolo personalizzato con il nome
specificato nel gruppo specificato
CustomS ymbolS etS essionQuote Imposta l'ora di inizio e fine della sessione di
quotazioni specificata per il simbolo ed il giorno
CustomS ymbolS etS essionT rade Impostare l'ora di inizio e fine della sessione di
trading specificata per il simbolo e il giorno
della settimana specificati
CustomR ates Delete Elimina tutte le barre dalla cronologia dei prezzi
del simbolo personalizzato nell'intervallo di
tempo specificato
CustomR ates Update Aggiunge barre mancanti allo storico dei simboli
custom e sostituisce i dati esistenti con quelli
dell'array tipo M qlR ates
Funzione Azione
CustomT ick s Add Aggiunge i dati da un array del tipo M qlT ick alla
cronologia dei prezzi di un simbolo
personalizzato. Il simbolo personalizzato deve
essere selezionato nella finestra del W atch
Mark et.
CustomT ick s Delete Eliminare tutti i tick s dallo storico dei prezzi del
simbolo personalizzato nell'intervallo di tempo
specificato
CustomSymbolCreate
Crea un simbolo personalizzato con il nome specificato nel gruppo specificato.
bool CustomSymbolCreate(
const string symbol_name, // nome del simbolo personalizzato
const string symbol_path="", // nome di un gruppo in cui dev essere creato il simbolo
const string symbol_origin=NULL // nome del simbolo usato come base per creare un simbolo
);
Parametri
symbol_name
[in] Nome simbolo personalizzato. Non dovrebbe contenere gruppi o sottogruppi in cui si trova il
simbolo.
symbol_path=""
[ in] Il nome del gruppo in cui si trova un simbolo.
symbol_origin=NULL
[in] Nome del simbolo le cui proprietà di un simbolo personalizzato creato devono essere copiate.
D opo aver creato un simbolo personalizzato, qualsiasi valore di proprietà può essere modificato in
uno necessario utilizzando le funzioni appropriate.
Valore di Ritorno
true - successo, altrimenti - false. Per ottenere informazioni sull'errore, chiamare la funzione
GetLastError().
Nota
Tutti i simboli personalizzati vengono creati nella sezione speciale personalizzata. S e il nome di un
gruppo non è specificato (il parametro symbol_path nella funzione CustomS ymbolCreate contiene
una stringa vuota o NULL), un simbolo personalizzato viene generato nella sezione principale
Personalizzata. Qui possiamo tracciare un'analogia con il file s ystem, dove gruppi e sottogruppi
possono essere visualizzati come cartelle e sottocartelle
I nomi di simboli e gruppi possono contenere solo lettere latine senza punteggiatura, spazi o
caratteri speciali (possono contenere solo " ." , " _" , " &" E " #" ). Non è raccomandato l'uso dei caratteri
<, >, :, " , /, |, ?, *.
Il nome del simbolo personalizzato deve essere univoco indipendentemente dal nome del gruppo in
cui è stato creato. S e esiste già un simbolo con lo stesso nome, la funzione CustomS ymbolCreate()
restituisce " false" , mentre la successiva chiamata GetLastError() restituisce l'errore 5300
(ERR_NOT_CUS T OM _S YM BOL) o 5304 (ERR_CUS T OM _S YM BOL _EXIS T ).
La lunghezza del nome del simbolo non deve superare 31 caratteri. In caso contrario,
CustomS ymbolCreate() restituisce 'false' e l'errore 5302 - ERR_CUS T OM _S YM BOL _NAME_LONG viene
attivato.
· o nome < gruppo> + separatore gruppi " \\" +<nome simbolo personalizzato> ad esempio – " CFD\
\ Metals \\ Platinum" . I n questo caso, il nome del gruppo dovrebbe terminare con il nome esatto del
Si noti che la proprietà S YM BOL _PATH restituisce il percorso con il nome del simbolo alla fine.
Pertanto, non può essere copiato senza modifiche se si desidera creare un simbolo personalizzato
nello stesso identico gruppo. In questo caso, è necessario tagliare il nome del simbolo per non
ottenere il risultato sopra descritto.
Se un simbolo inesistente è impostato come symbol_origin parametro, quindi il simbolo
personalizzato viene creato vuoto come se il symbol_origin parametro non è impostato. In questo
caso viene attivato l'errore 4301 - ERR_M ARKET_UNKNOW N_S YM BOL.
La lunghezza del parametro symbol_path non deve superare i 127 caratteri considerando " Custom\\" ,
" \\" i separatori dei gruppi e il nome del simbolo se è specificato alla fine.
Guarda anche
Sy mbolName, SymbolS elect, CustomS ymbolDelete
CustomSymbolDelete
Elimina un simbolo personalizzato con il nome specificato.
bool CustomSymbolDelete(
const string symbol_name // nome del simobolo personalizzato
);
Parametri
symbol
[ in] ome simbolo personalizzato. Non deve corrispondere al nome di un simbolo già esistente.
N
Valore di Ritorno
true – successo, altrimenti – false. Per ottenere informazioni sull'errore, chiamare la funzione
GetLastError().
Nota
Non è possibile eliminare il simbolo personalizzato visualizzato nel Mark et W atch o quello in cui è
aperto un chart.
Guarda anche
Sy mbolName, Sy mbolS elect, CustomS ymbolCreate
CustomSymbolSetInteger
I mposta il valore della proprietà di tipo integer per un simbolo personalizzato.
bool CustomSymbolSetInteger(
const string symbol_name, // nome del simbolo
ENUM_SYMBOL_INFO_INTEGER property_id, // ID proprietà
long property_value // valore proprietà
);
Parametri
symbol_name
[ in] ome simbolo personalizzato.
N
property_id
[in] ID della proprietà del S imbolo. Il valore può essere uno dei valori dell'enumerazione
ENUM _S YM BOL _INFO_INT EGER .
property_value
[ in] Una variabile di tipo long contenente il valore della proprietà.
Valore di Ritorno
true – successo, altrimenti – false. Per ottenere informazioni sull'errore, chiamare la funzione
GetLastError().
Nota
La cronologia(storico) dei minuti e dei tick del simbolo personalizzato viene completamente rimossa
se una qualsiasi di queste proprietà viene modificata nelle specifiche del simbolo:
· SY M BOL _CHART_MODE - tipo di prezzo per la costruzione di barre (Bid o Last)
· SY M BOL _DIGITS - numero di cifre dopo il punto decimale per visualizzare il prezzo
Dopo aver eliminato la cronologia(storico) dei simboli personalizzati, il terminale tenta di creare una
nuova cronologia(storico) utilizzando le proprietà aggiornate. Lo stesso accade quando le proprietà
dei simboli personalizzati vengono modificate manualmente.
Guarda anche
Sy mbolInfoInteger
CustomSymbolSetDouble
I mposta il valore della proprietà di tipo real per un simbolo personalizzato.
bool CustomSymbolSetDouble(
const string symbol_name, // nome del simbolo
ENUM_SYMBOL_INFO_DOUBLE property_id, // ID proprietà
double property_value // valore proprietà
);
Parametri
symbol_name
[ in] ome simbolo personalizzato.
N
property_id
[in] ID della proprietà del S imbolo. Il valore può essere uno dei valori dell'enumerazione
ENUM _S YM BOL _INFO_DOUBLE.
property_value
[ in] Una variabile di tipo double contenente il valore della proprietà.
Valore di Ritorno
true – successo, altrimenti – false. Per ottenere informazioni sull'errore, chiamare la funzione
GetLastError().
Nota
La cronologia(storico) dei minuti e dei tick del simbolo personalizzato viene completamente rimossa
se una qualsiasi di queste proprietà viene modificata nelle specifiche del simbolo:
· M BOL _POINT – valore un punto
SY
· M BOL _TRADE_TICK_S IZE - valore di un tick che specifica la variazione di prezzo minima
SY
consentita
· S YM BOL _TRADE_TI CK_VAL UE - valore di variazione del prezzo di un-tick , per una posizione
redditizia
Dopo aver eliminato la cronologia(storico) dei simboli personalizzati, il terminale tenta di creare una
nuova cronologia(storico) utilizzando le proprietà aggiornate. Lo stesso accade quando le proprietà
dei simboli personalizzati vengono modificate manualmente.
Guarda anche
Sy mbolInfoDouble
CustomSymbolSetString
I mposta il valore della proprietà tipo string per un simbolo personalizzato.
bool CustomSymbolSetString(
const string symbol_name, // nome del simbolo
ENUM_SYMBOL_INFO_STRING property_id, // ID proprietà
string property_value // valore proprietà
);
Parametri
symbol_name
[ in] ome simbolo personalizzato.
N
property_id
[in] ID della proprietà del S imbolo. Il valore può essere uno dei valori dell'enumerazione
ENUM _S YM BOL _INFO_S TRING.
property_value
[ in] Una variabile di tipo string contenente il valore della proprietà.
Valore di Ritorno
true – successo, altrimenti – false. Per ottenere informazioni sull'errore, chiamare la funzione
GetLastError().
Nota
La cronologia dei minuti e dei segni di graduazione del simbolo personalizzato viene completamente
rimossa se la proprietà S YM BOL _FOR M UL A (che imposta l'equazione per la costruzione del prezzo del
simbolo personalizzato) viene modificata nella specifica del simbolo. Dopo aver eliminato lo
storico(cronologia) dei simboli personalizzati, il terminale tenta di creare un nuovo storico
utilizzando la nuova equazione. Lo stesso accade quando l'equazione del simbolo personalizzato
viene modificata manualmente.
Guarda anche
SymbolInfoS tring
CustomSymbolSetMarginRate
I mposta i tassi di margine in base al tipo di ordine ed alla direzione di un simbolo personalizzato.
bool CustomSymbolSetMarginRate(
const string symbol_name, // nome del simbolo
ENUM_ORDER_TYPE order_type, // tipo di ordine
double initial_margin_rate, // tasso del margine iniziale
double maintenance_margin_rate // tasso del margine di mantenimento
);
Parametri
symbol_name
[ in] N ome simbolo personalizzato.
order_type
[ in] T ipo di Ordine.
initial_margin_rate
[in] Una variabile di tipo double con una tasso di margine iniziale. Il margine iniziale è un deposito
cauzionale per un affare di 1 lotto nella direzione appropriata. Moltiplicando il tasso dal margine
iniziale, riceviamo l'importo dei fondi da riservare all'account quando piazziamo un ordine del tipo
specificato.
maintenance_margin_rate
[in] Una variabile di tipo double con una tasso di margine di mantenimento. Il margine di
mantenimento è un importo minimo per mantenere una posizione aperta di 1 lotto nella direzione
appropriata. Moltiplicando il tasso dal margine di mantenimento, riceviamo l'importo dei fondi da
riservare all'account dopo l'attivazione di un ordine del tipo specificato.
Valore di Ritorno
true – successo, altrimenti – false. Per ottenere informazioni sull'errore, chiamare la funzione
GetLastError().
Guarda anche
SymbolInfoMarginR ate
CustomSymbolSetSessionQuote
Imposta l'ora di inizio e fine della sessione di quotazione specificata per il simbolo specificato e il
giorno della settimana.
bool CustomSymbolSetSessionQuote(
const string symbol_name, // nome del simbolo
ENUM_DAY_OF_WEEK day_of_week, // giorno della settimana
uint session_index, // indice della sessione
datetime from, // orario d'inizio della sessione
datetime to // orario di fine della sessione
);
Parametri
symbol_name
[ in] ome simbolo personalizzato.
N
ENUM_DAY_OF_WEEK
[ in] Giorno della settimana, valore dall'enumerazione ENUM _DAY_OF_W EEK.
uint
[in] Indice della sessione, per il quale devono essere impostate le ore di inizio e fine.
L 'indicizzazione della sessione inizia da 0.
from
[ in] Orario di inizio sessione in secondi da 00:00 , il valore dati della variabile viene ignorato.
to
[ in] Orario di fine sessione in secondi da 00:00 , il valore dei dati nella variabile viene ignorato.
Valore di Ritorno
true – successo, altrimenti – false. Per ottenere informazioni sull'errore, chiamare la funzione
GetLastError().
Nota
S e la sessione con lo specificato session_index già esiste, la funzione modifica semplicemente
l'inizio e la fine della sessione.
Se sono stati passati i parametri di partenza e di fine, zero, per la sessione, (from=0 e to=0), la
sessione appropriata con il session_index viene eliminata, mentre l'indicizzazione della sessione
viene spostata verso il basso.
Le sessioni possono essere aggiunte solo sequenzialmente. In altre parole, puoi aggiungere
session_index=1 solo se la sessione con l'indice 0 esiste già. S e questa regola è interrotta, non viene
creata una nuova sessione, e la funzione restituisce " false" .
Guarda anche
Sy mbolInfoS essionQuote, Symbol info, T imeT oS truct, Date structure
CustomSymbolSetSessionTrade
Imposta l'ora di inizio e fine della sessione di trading specificata per il simbolo e il giorno della
settimana specificati.
bool CustomSymbolSetSessionTrade(
const string symbol_name, // nome simbolo
ENUM_DAY_OF_WEEK day_of_week, // giorno della settimana
uint session_index, // indice della sessione
datetime from, // orario d'inizio della sessione
datetime to // orario di fine della sessione
);
Parametri
symbol_name
[ in] ome simbolo personalizzato.
N
ENUM_DAY_OF_WEEK
[ in] Giorno della settimana, valore dall'enumerazione ENUM _DAY_OF_W EEK.
uint
[in] Indice della sessione, per il quale devono essere impostate le ore di inizio e fine.
L 'indicizzazione della sessione inizia da 0.
from
[ in] Orario di inizio sessione in secondi da 00:00 , il valore dati della variabile viene ignorato.
to
[ in] Orario di fine sessione in secondi da 00:00 , il valore dei dati nella variabile viene ignorato.
Valore di Ritorno
true – successo, altrimenti – false. Per ottenere informazioni sull'errore, chiamare la funzione
GetLastError().
Nota
S e la sessione con lo specificato session_index già esiste, la funzione modifica semplicemente
l'inizio e la fine della sessione.
Se sono stati passati i parametri di partenza e di fine, zero, per la sessione, (from=0 e to=0), la
sessione appropriata con il session_index viene eliminata, mentre l'indicizzazione della sessione
viene spostata verso il basso.
Le sessioni possono essere aggiunte solo sequenzialmente. In altre parole, puoi aggiungere
session_index=1 solo se la sessione con l'indice 0 esiste già. S e questa regola è interrotta, non viene
creata una nuova sessione, e la funzione restituisce " false" .
Guarda anche
Sy mbolInfoS essionT rade, Symbol info, T imeT oS truct, Date structure
CustomRatesDelete
Elimina tutte le barre dallo storico dei prezzi del simbolo personalizzato nell'intervallo di tempo
specificato.
int CustomRatesDelete(
const string symbol, // nome simbolo
datetime from, // inizio data
datetime to // fine data
);
Parametri
symbol
[ in] ome simbolo personalizzato.
N
from
[ in] Orario della prima barra dello storico dei prezzi entro l'intervallo specificato da rimuovere.
to
[ in] Orario dell'ultima barra nello storico dei prezzi entro l'intervallo specificato da rimuovere.
Valore di Ritorno
Numero di barre cancellate o -1 in caso di un errore.
Guarda anche
CustomR ates R eplace, CustomR ates Update, CopyR ates
CustomRatesReplace
Sostituisce completamente lo storico dei prezzi del simbolo personalizzato entro l'intervallo di tempo
specificato con i dati dell' array di tipo M qlR ates.
int CustomRatesReplace(
const string symbol, // nome del simbolo
datetime from, // data d'inizio
datetime to, // data di fine
const MqlRates& rates[], // array per i dati da applicare al simbolo personalizzato
uint count=WHOLE_ARRAY // numero degli elementi dell'array rates[] da utilizzare
);
Parametri
symbol
[ in] ome simbolo personalizzato.
N
from
[I n] Orario della prima barra nella cronologia dei prezzi entro l'intervallo specificato da aggiornare.
to
[ in] Orario dell'ultima bar nello storico dei prezzi entro l'intervallo specificato da aggiornare.
rates[]
[ in] Array dei dati storico di tipo M qlR ates per M 1.
Valore di Ritorno
N umero di barre aggiornate o -1 in caso di errore.
Nota
Se la barra dall'array rates[] va oltre l'intervallo specificato, viene ignorata. S e una tale barra è già
presente nello storico dei prezzi e rientra nell'intervallo specificato, viene sostituita. T utte le altre
barre dell'attuale storico dei prezzi al di fuori dell'intervallo specificato restano invariate. L 'array dati
rates[] dovrebbe essere corretto per quanto riguarda i prezzi OH LC, mentre i tempi di apertura della
barra dovrebbero corrispondere al timeframe M 1.
Guarda anche
CustomR ates Delete, CustomR ates Update, CopyR ates
CustomRatesUpdate
Aggiunge barre mancanti allo storico dei simboli personalizzati e sostituisce i dati esistenti con quelli
dell'array di tipo M qlR ates.
int CustomRatesUpdate(
const string symbol, // nome del simbolo personalizzato
const MqlRates& rates[], // array per i dati da applicare al simbolo personalizzato
uint count=WHOLE_ARRAY // numero degli elementi dell'array rates[] da utilizzare
);
Parametri
symbol
[ in] N ome simbolo personalizzato.
rates[]
[ in] A rray dei dati di storico di tipo M qlR ates per M 1.
count=WHOLE_ARRAY
[in] Numero di elementi dell'array rates[] da utilizzare per l'aggiornamento. WH OLE_ARRAY
significa che devono essere usati tutti gli elementi dell'array rates[].
Valore di Ritorno
N umero di barre aggiornate o -1 in caso di errore.
Nota
Se non esiste un barra dall'array rates[] nello storico del simbolo personalizzato corrente, viene
aggiunta. S e tale barra esiste già, viene sostituita. T utte le altre barre dello storico dei prezzi
corrente, rimangono invariate. L 'array dati rates[] dovrebbe essere corretto per quanto riguarda i
prezzi OH LC, mentre i tempi di apertura della barra dovrebbero corrispondere al timeframe M 1.
Guarda anche
CustomR ates R eplace, CustomR ates Delete, CopyR ates
CustomTicksAdd
A ggiunge i dati da un array di tipo M qlT ick allo storico dei prezzi di un simbolo personalizzato. Il
simbolo personalizzato deve essere selezionato nella finestra del W atch Mark et.
int CustomTicksAdd(
const string symbol, // Nome del simbolo
const MqlTick& ticks[], // L'array con i dati tick che devono essere applicati al s
uint count=WHOLE_ARRAY // numero degli elementi dell'array ticks[] da utilizzare
);
Parametri
symbol
[ in] Il nome del simbolo personalizzato.
ticks[]
[in] Un array di dati tick di tipo M qlT ick arrangiati in ordine di tempo da dati più vecchi a quelli più
recenti, cioè tick s [k].time_msc <= tick s [n].time_msc, if k<n.
count=WHOLE_ARRAY
[in] Numero di elementi dell'array ticks[] da utilizzare per l'aggiunta. WH OLE_ARRAY significa che
devono essere usati tutti gli elementi dell'array ticks[] .
Valore di Ritorno
I l numero di tick s aggiunti o -1 in caso di errore.
Ulteriori Note
La funzione CustomT ick s Add funziona solo per i simboli personalizzati aperti nella finestra del
W atch Mark et. S e il simbolo non è selezionato nel Mark et W atch, è necessario aggiungere tick s
La funzione CustomT ick s Add consente di trasmettere i tick s come se fossero stati consegnati dal
server del brok er. I dati vengono inviati alla finestra di Mark et W atch anziché essere scritti
direttamente nel database dei tick . Il terminale quindi salva i tick s dal Mark et W atch in un
database. S e la quantità di dati trasmessa durante la chiamata di funzione è ampia, il
comportamento della funzione cambia in modo da ridurre l'utilizzo delle risorse. S e si passano più di
256 tick s, i dati vengono divisi in due parti. La prima, cioè la parte pi ù grande, viene scritta
direttamente sul database dei tick (come avviene in CustomT ick s R eplace). La seconda parte
contenente 128 tick s viene passata alla finestra Mark et W atch, da cui il terminal salva i tick s nel
database.
La struttura M qlT ick ha due campi con il valore temporale: time (il tempo tick in secondi) e il
time_msc (il tempo tick in millisecondi) che vengono contati dal 1° gennaio 1970. Questi campi nei
codici aggiunti vengono elaborati nel seguente ordine:
1 . e tick s [k].time_msc!=0, lo usiamo per riempire il campo tick s [k].time, cioè
S
trade server fino ai millisecondi come da momento della chiamata CustomT ick s Add.
Se il valore di tick s [k].bid, tick s [k].as k , tick s [k].last or tick s [k].volume, è più grande di zero, una
combinazione di flags viene scritta nel campo tick s [k].flags :
· TICK_FL AG_BID – il tick ha cambiato il prezzo bid
· TI CK_FL AG_AS K – il tick ha cambiato il prezzo as k
· TI CK_FL AG_L AS T – il tick ha cambiato il prezzo last deal
· TI CK_FL AG_VOL UME – il tick ha cambiato volume
S e il valore di un campo è inferiore o uguale a zero, la corrispondente flag non viene scritta nel
Flags TICK_FL AG_BUY e TI CK_FL AG_S ELL non vengono aggiunte allo storico di un simbolo
personalizzato.
Guarda anche
CustomR ates Delete, CustomR ates Update, CustomT ick s R eplace, CopyT ick s, CopyT ick s R ange
CustomTicksDelete
Elimina tutti i tick s dalla cronologia dei prezzi del simbolo personalizzato nell'intervallo di tempo
specificato.
int CustomTicksDelete(
const string symbol, // nome del simbolo
long from_msc, // data inizio
long to_msc // data fine
);
Parametri
symbol
[ in] ome simbolo personalizzato.
N
from_msc
[in] Orario del primo tick nello storico dei prezzi entro l'intervallo specificato da rimuovere. Orario
in millisecondi dal 01.01.1970.
to_msc
[in] Orario dell'ultima cifra nello storico dei prezzi entro l'intervallo specificato da rimuovere.
Orario in millisecondi dal 01.01.1970.
Valore di Ritorno
Numero di tick s cancellati o -1 in caso di un errore.
Guarda anche
CustomR ates Delete, CustomR ates Update, CustomT ick s R eplace, CopyT ick s, CopyT ick s R ange
CustomTicksReplace
Sostituisce completamente lo storico dei prezzi del simbolo personalizzato entro l'intervallo di tempo
specificato con i dati dall'array di tipo M qlT ick .
int CustomTicksReplace(
const string symbol, // nome del simbolo
long from_msc, // data d'inizio
long to_msc, // data di fine
const MqlTick& ticks[], // array per i dati da applicare al periodo personalizzato
uint count=WHOLE_ARRAY // numero degli elementi dell'array tick[] da utilizzare
);
Parametri
symbol
[ in] ome simbolo personalizzato.
N
from_msc
[in] Orario del primo tick nello storico dei prezzi entro l'intervallo specificato da rimuovere. Orario
in millisecondi dal 01.01.1970.
to_msc
[in] Orario dell'ultima cifra nello storico dei prezzi entro l'intervallo specificato da rimuovere.
Orario in millisecondi dal 01.01.1970.
ticks[]
[ in] A rray dati tick di tipo M qlT ick ordinato per orario in ordine ascendente.
count=WHOLE_ARRAY
[in] Numero di elementi dell'array ticks[] da utilizzare per la sostituzione nell'intervallo di tempo
specificato. W H OLE_ARRAY significa che devono essere usati tutti gli elementi dell'array ticks[] .
Valore di Ritorno
N umero di tick s aggiornati o -1 in caso di errore.
Nota
Poiché diversi tick s spesso possono avere lo stesso orario fino ad un millisecondo in un flusso di
quotazioni (l'orario accurato dei tick è memorizzato nel campo time_msc della struttura M qlT ick ), la
funzione CustomT ick s R eplace non ordina automaticamente gli elementi dell'array ticks[] per orario.
Pertanto, l'array di tick s deve essere pre-arrangiato in ordine ascendente di tempo.
I tick s vengono sostituiti consecutivamente, giorno dopo giorno, fino al momento specificato in
to_msc o fino all'avvenimento di un errore. Viene elaborato il primo giorno dall'intervallo specificato
seguito da quello successivo, ecc. Non appena viene rilevata la mancata corrispondenza tra l'ora del
tick e l'ordine ascendente (non-discendente), la sostituzione del tick si arresta sul giorno corrente.
T utti i tick s dei giorni precedenti vengono sostituiti con successo, mentre il giorno corrente (al
Se l'array ticks[] non contiene dati per qulsiasi giorno (in genere, in qualsiasi intervallo di tempo),
un " buco" corrispondente ai dati mancanti viene visualizzato nello storico dei simboli personalizzati
dopo che i dati tick da ticks[] vengono applicati. In altre parole, la chiamata di
CustomT ick s R eplace con tick s mancanti equivale a cancellare una parte dello storico dei tick , come
se venisse chiamato CustomT ick s Delete con l'intervallo " buco" .
Se il database tick non dispone di dati per l'intervallo di tempo specificato, CustomT ick s R eplace
aggiungerà al database i tick s dall'array tick s [].
La funzione CustomT ick s R eplace funziona direttamente con il database dei tick .
Guarda anche
CustomR ates Delete, CustomR ates Update, CustomT ick s Delete, CopyT ick s, CopyT ick s R ange
CustomBookAdd
Passa lo status del Depth of Mark et per un simbolo personalizzato. La funzione consente di
trasmettere il Depth of Mark et come se i prezzi arrivassero dal server di un brok er.
int CustomBookAdd(
const string symbol, // nome del simbolo
const MqlBookInfo& books[] // array con la descrizione degli elementi del Depth of M
uint count=WHOLE_ARRAY // numero di elementi da usare
);
Parametri
simbolo
[ in] Nome simbolo personalizzato.
books[]
[in] L 'array di tipo di dati M qlBookInfo che descrivono completamente lo status del Depth of Mark et
— tutte le richieste di buy e sell. Lo status del Depth of Mark et passato sostituisce completamente
il precedente.
count=WHOLE_ARRAY
[in] Il numero di elementi dell'array 'book s ' da passare alla funzione. L 'intero array viene utilizzato
per impostazione predefinita.
Valore di ritorno
N umero di tick aggiunti, o -1 in caso di un errore.
Nota
La funzione CustomBookAdd funziona solo per i simboli personalizzati per cui viene aperto il Depth
of Mark et — tramite l'interfaccia della piattaforma o la funzione Mark etBookAdd.
Quando si lancia il Depth of Mark et, i prezzi Bid e As k del simbolo non vengono aggiornati. Dovresti
controllare il cambiamento dei prezzi migliori e lanciare i tick s usando CustomT ick s Add.
Idati passati vengono controllati per la validità: prezzi e volumi non dovrebbero essere negativi,
cos ì come tipo, prezzo e volume (M qlBookInfo.volume o M qlBookInfo.volume_real) dovrebbero
essere specificati per ciascun elemento. S e almeno un elemento Depth of Mark et è descritto in modo
errato, il sistema elimina completamente lo stato passato.
Il volume di accuratezza esteso M qlBookInfo.volume_real ha una priorità più alta rispetto al normale
M qlBookInfo.volume. S e entrambi i valori sono specificati per l'elemento Depth of Mark et, viene
utilizzato quello volume_real.
L 'ordine degli elementi di M qlBookInfo nell'array 'book s ' non ha importanza. Quando si salvano i dati,
il terminale li ordina in base al prezzo.
richieste di S ell supera questo valore nella Depth of Mark et passato, i livelli in eccesso vengono
scartati. Lo stesso vale per le richieste di Buy.
Esempio:
//+------------------------------------------------------------------+
//| Funzione inizializzazione expert |
//+------------------------------------------------------------------+
int OnInit()
{
//--- ailita il Depth of Market per un simbolo da cui prendiamo i dati
MarketBookAdd(Symbol());
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Funzione deinizializzazione expert |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Funzione Tick |
//+------------------------------------------------------------------+
void OnTick(void)
{
MqlTick ticks[];
ArrayResize(ticks,1);
Guarda anche
Mark etBookAdd, CustomT ick s Add, OnBook Event
eventi del chart. Le modifiche alle proprietà del chart vengono implementate insieme alla gestione
della coda degli eventi di questo chart.
Pertanto, non aspettarsi un aggiornamento immediato del chart dopo aver chiamato le funzioni
asincrone. Usare la funzione ChartR edraw () per aggiornare forzatamente l'aspetto e le proprietà del
chart.
Funzione Azione
ChartApplyT emplate A pplica un modello(template) specifico da un
file specificato al chart
Funzione Azione
ChartS etS tring Imposta il valore di stringa per una proprietà
corrispondente del chart specificato
Funzione Azione
ChartS etS ymbolPeriod Cambia il valore di simbolo e periodo di chart
specificato
ChartS creenS hot Fornisce uno screenshot del chart del suo stato
attuale in formato GIF, PNG o BMP a seconda
dell'estensione specificata
ChartApplyTemplate
Applica un modello specifico da un file specificato al grafico. Il comando viene aggiunto alla coda dei
messaggi del chart e verrà eseguito dopo l'elaborazione di tutti i comandi precedenti.
bool ChartApplyTemplate(
long chart_id, // Chart ID
const string filename // Nome file Template
);
Parametri
chart_id
[ in] ID del Grafico. 0 significa il grafico corrente.
filename
[ in] Il nome del file contenente il template.
Valore restituito
R estituisce true se il comando è stato aggiunto alla coda del chart, altrimenti false. Per avere
informazioni sull' errore, Chiamare la funzione GetLastError().
Nota
L 'Ex pert Advisor verrà de-caricato e non sarà in grado di continuare ad operare in caso di
caricamento di successo di un nuovo template per il grafico a cui è allegato.
W hen applying the template to the chart, trade permissions may be limited due to security reasons :
Live trading permission cannot be extended for the Expert Advisors launched by
applying the template using ChartApplyTemplate() function.
I f the mql5-program calling ChartApplyT emplate() function has no permission to trade, the Ex pert
A dvisor launched via the template will also not be able to trade regardless of the template settings.
If the mql5-program calling ChartApplyT emplate() function has permission to trade, while there is no
such permission in the template settings, the Ex pert Advisor launched via the template will not be
able to trade.
Inoltre, ci possono essere molteplici oggetti grafici ed indicatori su un grafico. È possibile impostare
un grafico con tutti gli indicatori necessari, e poi salvarlo come template. T ale template può essere
applicato a qualsiasi grafico.
La funzione ChartApplyT emplate() è intesa all' utilizzo di un template precedentemente salvato, e può
essere utilizzata in qualsiasi programma MQL5. Il percorso del file che memorizza il template è
passato come secondo parametro di ChartApplyT emplate(). Il file template viene cercato in base alle
seguenti regole:
· se il separatore barra rovesciata(back slash) " \" (scritto come " \\" ) è posto all'inizio del percorso, il
A d esempio:
Esempio:
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- example of applying template, located in \MQL5\Files
if(FileIsExist("my_template.tpl"))
{
Print("The file my_template.tpl found in \Files'");
//--- apply template
if(ChartApplyTemplate(0,"\\Files\\my_template.tpl"))
{
Print("The template 'my_template.tpl' applied successfully");
//--- redraw chart
ChartRedraw();
}
else
Print("Failed to apply 'my_template.tpl', error code ",GetLastError());
}
else
{
Print("File 'my_template.tpl' not found in "
+TerminalInfoString(TERMINAL_PATH)+"\\MQL5\\Files");
}
}
Vedi anche
R isorse
ChartSaveTemplate
S alva le impostazioni correnti del grafico in un template con un nome specificato.
bool ChartSaveTemplate(
long chart_id, // Chart ID
const string filename // Nomefile per salvare un template
);
Parametri
chart_id
[ in] ID del Grafico. 0 significa il grafico corrente.
filename
[in] Il nome del file per salvare il template. L 'estensione " .tpl" verrà aggiunta al nome del file
automaticamente, non c'è bisogno di specificarla. Il template viene salvato in
directory_terminale\Profiles \Templates \ e può essere utilizzato per l'applicazione manuale nel
terminale. S e un template con lo stesso nome esiste già, il contenuto di questo file verrà
sovrascritto.
Valore restituito
In caso di successo, la funzione restituisce true, altrimenti restituisce false. Per ottenere
informazioni sull'errore, chiamare la funzione GetLastError().
Nota
Usando i templates, è possibile salvare le impostazioni di grafico con tutti gli indicatori ed oggetti
grafici applicati, per poi applicarli ad un altro grafico.
Esempio:
//+--------------------------------------------------------------------------------+
//| Test_ChartSaveTemplate.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property script_show_inputs
//--- parametri di input
input string symbol="GBPUSD"; // Il simbolo di un nuovo grafico
input ENUM_TIMEFRAMES period=PERIOD_H3; // Il timeframe di un nuovo grafico
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- Per prima cosa alleghiamo gli indicatori al grafico
int handle;
ResetLastError();
//--- Copia gli ultimi 100 valori dell'indicatore
int copied=CopyBuffer(handle,0,0,size,values);
//--- Controlla il numero di valori copiati
if(copied<100)
{
PrintFormat("%s: Fallimento nel copiare %d valori dell' indicatore con l'handle=%d. Codice er
__FUNCTION__,size,handle,GetLastError());
return false;
}
//--- Definisce l'ordine di accesso alla matrice come in una timeseries
ArraySetAsSeries(values,true);
//--- Scrivi qui il numero di barre, in cui le fratture sono state trovate
int positions[];
//--- Imposta la grandezza dell'array
ArrayResize(get_values,3); ArrayResize(get_times,3); ArrayResize(positions,3);
//--- Contatori
int i=0,k=0;
//--- Avvia la ricerca delle fratture
while(i<100)
{
double v=values[i];
//--- Non siamo interessati a valori vuoti
if(v!=0.0)
{
//--- Ricorda il numero della barra
positions[k]=i;
//--- Ricorda il valore del zigzag sulla frattura
get_values[k]=values[i];
PrintFormat("%s: Zigzag[%d]=%G",__FUNCTION__,i,values[i]);
//--- Incrementa il contatore
k++;
//--- Se vengono trovate due fratture, interrompere il ciclo
if(k>2) break;
}
i++;
}
//--- Definisce l'ordine di accesso agli array come in una timeseries
ArraySetAsSeries(times,true); ArraySetAsSeries(get_times,true);
if(CopyTime(_Symbol,_Period,0,size,times)<=0)
{
PrintFormat("%s: Fallimento nella copia di %d valori da CopyTime(). Codice errore %d",
__FUNCTION__,size,GetLastError());
return false;
}
//--- Apre l'orario di apertura della barra, in cui le ultime 2 fratture si sono verificate
get_times[0]=times[positions[1]];// Il penultimo valore, sarà scritto come la prima frattura
get_times[1]=times[positions[2]];// Il terzultimo valore sarà la seconda frattura
PrintFormat("%s: first=%s, second=%s",__FUNCTION__,TimeToString(get_times[1]),TimeToString(get_
//--- Successo
return true;
}
Vedi anche
ChartApplyT emplate(), R esources
ChartW indowFind
La funzione restituisce il numero di una sottofinestra dove un indicatore viene disegnato. Ci sono due
varianti della funzione.
1. La funzione ricerca nel grafico indicato per la sottofinestra con il " nome breve" specificato dell'
indicatore (il nome breve è mostrato nella parta superiore sinistra della sottofinestra) e restitusce il
numero della sottofinestra in caso di sucesso.
int ChartWindowFind(
long chart_id, // identificatore del grafico
string indicator_shortname // nome breve dell'indicatore, vedere INDICATOR_SHORTNAME
Parametri
chart_id
[ in] ID del Grafico. 0 indica il grafico corrente.
indicator_shortname
[ in] N ome breve dell'indicatore.
Valore restituito
Numero della sottofinestra in caso di successo. In caso di fallimento, la funzione restituisce -1In
case of failure the function returns -1.
Nota
S e la seconda variante della funzione (senza parametri) è chiamata da uno S cript o Ex pert Advisor,
la funzione restituisce -1.
N on mischiare il nome breve dell'indicatore ed il nome del file, che viene specificato quando un
indicatore viene creato usando le funzioni iCustom() ed IndicatorCreate(). S e il nome breve
dell'indicatore non è impostato esplicitamente, allora il nome del file contenente il codice sorgente
dell'indicatore è specificato in esso durante la compilazione.
E' importante formare correttamente il nome breve dell'indicatore, che è registrato nella proprietà
INDI C AT O R_S H O RTNA ME usando la funzione I ndicatorS etS tring(). E' raccomandabile che il nome
breve contenga valori dei parametri di input dell'indicatore, perchè l'indicatore cancellato dal grafico
nella funzione ChartIndicatorDelete() viene identificato dal suo nome breve.
Esempio:
#property script_show_inputs
//--- parametri di input
input string shortname="MACD(12,26,9)";
//+--------------------------------------------------------------------------------+
//| Restituisce il numero delle finestra del chart con questo indicatore |
//+--------------------------------------------------------------------------------+
Vedi anche
ObjectCreate(), ObjectFind()
ChartTimePriceToXY
Converte le coordinate di un grafico da una rappresentazione tempo/prezzo nelle coordinate X ed Y.
bool ChartTimePriceToXY(
long chart_id, // ID del Grafico
int sub_window, // Il numero di sottofinestra
datetime time, // Orario sul grafico
double price, // Prezzo sul grafico
int& x, // Le coordinate X per l'orario sul grafico
int& y // Le coordinate Y per l'orario sul grafico
);
Parametri
chart_id
[ in] ID del Grafico. 0 significa il grafico corrente.
sub_window
[ in] Il numero della sottofinestra grafico. 0 significa la finestra principale del grafico.
time
[in] Il valore temporale sul grafico, per cui il valore in pix el, lungo l'asse X , verrà ricevuto.
L 'origine è l'angolo superiore sinistro della finestra principale del grafico.
price
[in] Il valore del prezzo sul grafico, per cui il valora in pix el lungo l'asse Y verrà ricevuto. L 'origine
è l'angolo superiore sinistro della finestra principale del grafico.
x
[ out] La variabile, in cui la conversione del tempo ad X verrà ricevuta.
y
[ out] La variabile, in cui la conversione del prezzo ad Y verrà ricevuta.
Valore restituito
Restituisce true se ha successo, altrimenti false. Per ottenere informazioni sull'errore, chiamare la
funzione GetLastError().
Vedi anche
ChartXYT oT imePrice()
ChartXYToTimePrice
Converte le coordinate X ed Y sul grafico, nei valori tempo e prezzo.
bool ChartXYToTimePrice(
long chart_id, // ID del Grafico
int x, // La coordinata X sul grafico
int y, // La coordinata Y sul grafico
int& sub_window, // Il numero di sottofinestra
datetime& time, // Orario sul grafico
double& price // Prezzo sul grafico
);
Parametri
chart_id
[ in] ID del Grafico. 0 significa il grafico corrente.
x
[ in] La coordinata X .
y
[ in] La coordinata Y.
sub_window
[out] La variabile, in cui verrà scritto il numero della sottofinestra del grafico. 0 significa la
finestra principale del grafico.
time
[out] Il valore temporale sul grafico, per cui il valore in pix el lungo l'asse X verrà ricevuto. L 'origine
è l'angolo superiore sinistro della finestra principale del grafico.
price
[ out] Il valore prezzo sul grafico, per cui il valore in pix el lungo l'asse Y verrà ricevuto. L 'origine è
l'angolo superiore sinistro della finestra principale del grafico.
Valore restituito
Restituisce true se ha successo, altrimenti false. Per ottenere informazioni sull'errore, chiamare la
funzione GetLastError().
Esempio:
//+--------------------------------------------------------------------------------+
//| Funzione ChartEvent |
//+--------------------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
//--- Mostra i parametri dell'evento sul chart
Vedi anche
ChartT imePriceT oXY()
ChartOpen
A pre un nuovo grafico con il simbolo e periodo specificati.
long ChartOpen(
string symbol, // Nome del Simbolo
ENUM_TIMEFRAMES period // Periodo
);
Parametri
symbol
[in] S imbolo del Grafico. LL significa il simbolo del grafico corrente (a cui è allegato l' Ex pert
NU
A dvisor).
period
[in] Periodo del Grafico (timeframe). Può essere uno dei valori ENUM _TIMEFRAMES . 0 indica il
corrente periodo del grafico.
Valore restituito
I n caso di successo, restituisce l'ID del grafico aperto. Altrimenti restituisce 0.
Nota
Il numero massimo possibile di grafici aperti simultaneamente nel terminale non può superare il
valore CHARTS _M AX.
ChartFirst
R estituisce l'ID del primo grafico del terminale client.
long ChartFirst();
Valore restituito
Chart ID.
ChartNext
R estituisce l'ID del Grafico successivo a quello specificato
long ChartNext(
long chart_id // ID del Grafico
);
Parametri
chart_id
[in] ID del G rafico. 0 non significa il grafico corrente. 0 significa " restituisce l' ID del primo
grafico" .
Valore restituito
ID del Grafico. S e questa è la fine dell'elenco del grafico, restituisce -1.
Esempio:
//--- variabili per l'ID del grafico
long currChart,prevChart=ChartFirst();
int i=0,limit=100;
Print("ChartFirst =",ChartSymbol(prevChart)," ID =",prevChart);
while(i<limit)// Abbiamo certamente non più di 100 grafici aperti
{
currChart=ChartNext(prevChart); // Ottiene l'ID del nuovo grafico usando l'ID del grafico pre
if(currChart<0) break; // Ha raggiunto la fine della lista dei grafici
Print(i,ChartSymbol(currChart)," ID =",currChart);
prevChart=currChart;// salviamo l'ID del grafico corrente per ChartNext()
i++;// Non dimentichiamo di incrementare il contatore
}
ChartClose
Chiude il grafico specificato.
bool ChartClose(
long chart_id=0 // ID del Grafico
);
Parametri
chart_id=0
[ in] ID del Grafico. 0 significa il grafico corrente.
Valore restituito
I n caso di successo, restituisce true, altrimenti false.
ChartSymbol
R estituisce il nome del simbolo per il grafico specificato.
string ChartSymbol(
long chart_id=0 // ID del Grafico
);
Parametri
chart_id=0
[ in] ID del Grafico. 0 significa il grafico corrente.
Valore restituito
S e il grafico non esiste, il risultato sarà una stringa vuota.
Vedi anche
ChartS etS ymbolPeriod
ChartPeriod
R estituisce il periodo timeframe del grafico specificato.
ENUM_TIMEFRAMES ChartPeriod(
long chart_id=0 // ID del Grafico
);
Parametri
chart_id=0
[ in] ID del Grafico. 0 significa il grafico corrente.
Valore restituito
La funzione restituisce uno dei valori ENUM _TIMEFRAMES . S e il grafico non esiste, restituisce 0.
ChartRedraw
Questa funzione chiama un ridisegno forzato di un grafico specificato.
void ChartRedraw(
long chart_id=0 // ID del Grafico
);
Parametri
chart_id=0
[ in] ID del Grafico. 0 significa il grafico corrente.
Nota
G eneralmente viene utilizzato dopo la modifica della proprietà di oggetti.
Vedi anche
F unzioni Oggetti
ChartSetDouble
Imposta un valore per la corrispondente proprietà del grafico specificato. La proprietà del chart dev '
essere di tipo double. Il comando viene aggiunto alla coda dei messaggi del chart e verrà eseguito
dopo l'elaborazione di tutti i comandi precedenti.
bool ChartSetDouble(
long chart_id, // ID del Grafico
int prop_id, // ID della Proprietà
double value // Valore
);
Parametri
chart_id
[ in] ID del Grafico. 0 significa il grafico corrente.
prop_id
[in] ID proprietà del Grafico. Puo essere uno dei valori ENUM _CHART_PR OPERTY_DOUBLE (eccetto
le proprietà di sola-lettura).
valore
[ in] Valore proprietà.
Valore restituito
R estituisce true se il comando è stato aggiunto alla coda del chart, altrimenti false. Per avere
informazioni sull' errore, Chiamare la funzione GetLastError().
Note
La funzione è asincrona, il che significa che la funzione non attende l'esecuzione del comando, che è
stato correttamente aggiunto alla coda di specifica del chart. Invece, restituisce immediatamente il
controllo. La proprietà cambierà solo dopo la gestione del comando appropriato dalla coda del chart.
Per eseguire immediatamente i comandi dalla coda del chart, chiamare la funzione ChartR edraw.
Per verificare il risultato dell'esecuzione del comando, è possibile utilizzare una funzione che
richiede la proprietà del chart specificata (ChartGetInteger, ChartGetDouble, ChartS etS tring).
T uttavia, notare che queste funzioni sono sincrone e attendere i risultati dell'esecuzione.
ChartSetInteger
Imposta un valore per la corrispondente proprietà del chart specificato. La proprietà del chart
dev 'essere datetime, int, color, bool or char. Il comando viene aggiunto alla coda dei messaggi del
chart e verrà eseguito dopo l'elaborazione di tutti i comandi precedenti.
bool ChartSetInteger(
long chart_id, // ID del Chart
int prop_id, // ID della Proprietà
long value // Valore
);
bool ChartSetInteger(
long chart_id, // ID del Chart
int prop_id, // ID della Proprietà
int sub_window, // Numero della Sottofinestra
long value // Valore
);
Parametri
chart_id
[ in] ID del Chart. 0 significa il chart corrente.
prop_id
[in] ID proprietà del Chart. Può essere uno dei valori ENUM _CHART_PR OPERTY_INT EGER (tranne
le proprietà di sola-lettura).
sub_window
[in] Numero di sottofinestra chart. Per il primo caso, il valore di default è 0 (finestra chart
principale). La maggior parte delle proprietà non richiedono un numero sottofinestra.
valore
[ in] Valore proprietà.
Valore restituito
R estituisce true se il comando è stato aggiunto alla coda del chart, altrimenti false. Per avere
informazioni sull' errore, chiamare la funzione GetLastError().
Note
La funzione è asincrona, il che significa che la funzione non attende l'esecuzione del comando, che è
stato correttamente aggiunto alla coda di specifica del chart. Invece, restituisce immediatamente il
controllo. La proprietà cambierà solo dopo la gestione del comando appropriato dalla coda del chart.
Per eseguire immediatamente i comandi dalla coda del chart, chiamare la funzione ChartR edraw.
Per verificare il risultato dell'esecuzione del comando, è possibile utilizzare una funzione che
richiede la proprietà del chart specificata (ChartGetInteger, ChartGetDouble, ChartS etS tring).
T uttavia, notare che queste funzioni sono sincrone e attendere i risultati dell'esecuzione.
Esempio:
//+------------------------------------------------------------------+
//| Funzione inizializzazione Expert |
//+------------------------------------------------------------------+
void OnInit()
{
//--- Abilitazione degli eventi dei movimenti del mouse sulla finestra del chart
ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,1);
//--- L'aggiornamento forzato delle proprietà del chart garantisce la preparazione per l'elaborazio
ChartRedraw();
}
//+------------------------------------------------------------------+
//| MouseState |
//+------------------------------------------------------------------+
string MouseState(uint state)
{
string res;
res+="\nML: " +(((state& 1)== 1)?"DN":"UP"); // mouse sinstra
res+="\nMR: " +(((state& 2)== 2)?"DN":"UP"); // mouse deastra
res+="\nMM: " +(((state&16)==16)?"DN":"UP"); // mouse centrale
res+="\nMX: " +(((state&32)==32)?"DN":"UP"); // mouse primo tasto X
res+="\nMY: " +(((state&64)==64)?"DN":"UP"); // mouse secondo tasto X
res+="\nSHIFT: "+(((state& 4)== 4)?"DN":"UP"); // tasto shift
res+="\nCTRL: " +(((state& 8)== 8)?"DN":"UP"); // tasto control
return(res);
}
//+------------------------------------------------------------------+
//| ChartEvent function |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
{
if(id==CHARTEVENT_MOUSE_MOVE)
Comment("POINT: ",(int)lparam,",",(int)dparam,"\n",MouseState((uint)sparam));
}
ChartSetString
Imposta un valore per la corrispondente proprietà del grafico specificato. La proprietà del grafico
dev 'essere di tipo stringa. Il comando viene aggiunto alla coda dei messaggi del chart e verrà eseguito
dopo l'elaborazione di tutti i comandi precedenti.
bool ChartSetString(
long chart_id, // ID del Grafico
int prop_id, // ID della Proprietà
string str_value // Valore
);
Parametri
chart_id
[ in] ID del Grafico. 0 significa il grafico corrente.
prop_id
[in] ID proprietà del Grafico. Il suo valore può essere uno dei valori
ENUM _CHART_PR OPERTY_S TRING (eccetto le proprietà di sola-lettura).
str_value
[in] Valore proprietà stringa. La lunghezza della stringa non può eccedere i 204 5 caratteri (i
caratteri ex tra verranno troncati).
Valore restituito
R estituisce true se il comando è stato aggiunto alla coda del chart, altrimenti false. Per avere
informazioni sull' errore, Chiamare la funzione GetLastError().
Nota
ChartS etS tring può essere usato per un output commento sul grafico al posto della funzione
Comment.
La funzione è asincrona, il che significa che la funzione non attende l'esecuzione del comando, che è
stato correttamente aggiunto alla coda di specifica del chart. Invece, restituisce immediatamente il
controllo. La proprietà cambierà solo dopo la gestione del comando appropriato dalla coda del chart.
Per eseguire immediatamente i comandi dalla coda del chart, chiamare la funzione ChartR edraw.
Per verificare il risultato dell'esecuzione del comando, è possibile utilizzare una funzione che
richiede la proprietà del chart specificata (ChartGetInteger, ChartGetDouble, ChartS etS tring).
T uttavia, notare che queste funzioni sono sincrone e attendere i risultati dell'esecuzione.
Esempio:
void OnTick()
{
//---
double Ask,Bid;
int Spread;
Ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
Bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);
Spread=SymbolInfoInteger(Symbol(),SYMBOL_SPREAD);
string comment=StringFormat("Stampo prezzi:\nAsk = %G\nBid = %G\nSpread = %d",
Ask,Bid,Spread);
ChartSetString(0,CHART_COMMENT,comment);
}
Vedi anche
Comment, ChartGetS tring
ChartGetDouble
Restituisce il valore di una proprietà corrispondente del chart specificato. La proprietà del chart dev '
essere di tipo double. Ci sono 2 varianti di chiamate di funzione.
2. R estituisce true o false, a seconda se la funzione ha avuto successo. In caso di successo, il valore
della proprietà viene posto in una variabile target double_var passata per riferimento.
bool ChartGetDouble(
long chart_id, // ID del Chart
int prop_id, // ID della Proprietà
int sub_window, // Numero della Sottofinestra
double& double_var // Variabile Target per la proprietà del chart
);
Parametri
chart_id
[ in] ID del Chart. 0 significa il chart corrente.
prop_id
[in] ID proprietà del Chart. Questo valore può essere uno dei valori
ENUM _CHART_PR OPERTY_DOUBLE.
sub_window
[in] Numero di sottofinestra chart. Per il primo caso, il valore di default è 0 (finestra chart
principale). La maggior parte delle proprietà non richiedono un numero sottofinestra.
double_var
[ out] Variabile target di tipo double per la proprietà richiesta.
Valore restituito
I l valore di tipo double.
Per il caso della seconda chiamata restituisce true se la proprietà specificata è disponibile es il suo
valore è stato inserito nella variabile double_var, altrimenti restituisce false. Per avere ulteriori
informazioni sull' errore, è necessario richiamare la funzione GetLastError().
Nota
La funzione è sincrona, il che significa che attende l'esecuzione di tutti i comandi che sono stati
aggiunti alla coda del chart prima della sua chiamata.
Esempio:
voidOnStart()
{
double priceMin=ChartGetDouble(0,CHART_PRICE_MIN,0);
double priceMax=ChartGetDouble(0,CHART_PRICE_MAX,0);
Print("CHART_PRICE_MIN =",priceMin);
Print("CHART_PRICE_MAX =",priceMax);
}
ChartGetInteger
Restituisce il valore di una proprietà corrispondente del grafico specificato. La proprietà del grafico
deve essere di tipo datetime, int o bool. Ci sono 2 varianti di chiamate di funzione.
2. R estituisce true o false, a seconda se la funzione ha avuto successo. In caso di successo, il valore
della proprietà viene posto in una variabile target long _var passata per riferimento.
bool ChartGetInteger(
long chart_id, // ID del Grafico
int prop_id, // ID della Proprietà
int sub_window, // numero sottofinestra
long& long_var // Variabile target per la proprietà
);
Parametri
chart_id
[ in] ID del Grafico. 0 significa il grafico corrente.
prop_id
[in] ID proprietà del Grafico. Questo valore può essere uno dei valori
ENUM _CHART_PR OPERTY_INT EGER .
sub_window
[in] Numero di sottofinestra grafico. Per il primo caso, il valore di default è 0 (finestra grafico
principale). La maggior parte delle proprietà non richiedono un numero sottofinestra.
long_var
[ out] Variabile target di tipo long per la proprietà richiesta.
Valore restituito
I l valore di tipo long.
Per il caso della seconda chiamata restituisce true se la proprietà specificata è disponibile ed il suo
valore è stato memorizzato nella variabile long _var, altrimenti restituisce false. Per ottenere
ulteriori informazioni sull' errore, è necessario richiamare la funzione GetLastError().
Nota
La funzione è sincrona, il che significa che attende l'esecuzione di tutti i comandi che sono stati
aggiunti alla coda del chart prima della sua chiamata.
Esempio:
voidOnStart()
{
int height=ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0);
int width=ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0);
Print("CHART_HEIGHT_IN_PIXELS =",height,"pixels");
Print("CHART_WIDTH_IN_PIXELS =",width,"pixels");
}
ChartGetString
Restituisce il valore di una proprietà corrispondente del grafico specificato. Proprietà del grafico deve
essere di tipo stringa. Ci sono 2 varianti della chiamata di funzione.
2. R estituisce true o false, a seconda se la funzione ha avuto successo. In caso di successo, il valore
della proprietà viene posto in una variabile target string _var passata per riferimento.
bool ChartGetString(
long chart_id, // ID del Grafico
int prop_id, // ID della Proprietà
string& string_var // Variable target per la proprietà
);
Parametri
chart_id
[ in] ID del Grafico. 0 significa il grafico corrente.
prop_id
[in] ID proprietà del Grafico. Questo valore può essere uno dei valori
ENUM _CHART_PR OPERTY_S TRING.
string_var
[ out] Variabile target di tipo stringa per la proprietà richiesta.
Valore restituito
I l valore di tipo stringa.
Per il caso della seconda chiamata restituisce true se la proprietà specificata è disponibile ed il suo
valore è stato memorizzato nella variabile string _var, altrimenti restituisce false. Per ottenere
ulteriori informazioni sull' errore, è necessario richiamare la funzione GetLastError().
Nota
ChartGetS tring può essere usato per leggere commenti riportato nel diagramma utilizzando le
funzioni Comment o ChartS etS tring.
La funzione è sincrona, il che significa che attende l'esecuzione di tutti i comandi che sono stati
aggiunti alla coda del chart prima della sua chiamata.
Esempio:
voidOnStart()
{
ChartSetString(0,CHART_COMMENT,"Test commento.\nSeconda linea.\nTerza!");
ChartRedraw();
Sleep(1000);
string comm=ChartGetString(0,CHART_COMMENT);
Print(comm);
}
Vedi anche
Comment, ChartS etS tring
ChartNavigate
Esegue lo slittamento del grafico indicato dal numero specificato di barre rispetto alla posizione
specificata nel grafico.
bool ChartNavigate(
long chart_id, // ID del Grafico
ENUM_CHART_POSITION position, // Posizione
int shift=0 // Valore di Slittamento
);
Parametri
chart_id
[ in] ID del Grafico. 0 significa il grafico corrente.
position
[in] Posizione Grafico per eseguire uno slittamento. Può essere uno dei valore
ENUM _CHART_POS ITION.
shift=0
[in] Numero di barre per slittare il grafico. Il valore positivo indica lo slittamento a destra (fino
alla fine del grafico), il valore negativo indica lo slittamento a sinistra (all'inizio del grafico). Lo
slittamento zero può essere utilizzato per spostarsi all'inizio o alla fine del grafico.
Valore restituito
R estituisce true se ha successo, altrimenti restituisce false.
Esempio:
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- ottiene l'handle del grafico corrente
long handle=ChartID();
string comm="";
if(handle>0) // se con successo, addizionalmente imposta il grafico
{
//--- disabilita auto scroll
ChartSetInteger(handle,CHART_AUTOSCROLL,false);
//--- imposta uno slittamento dal bordo destro del grafico
ChartSetInteger(handle,CHART_SHIFT,true);
//--- disegna candele
ChartSetInteger(handle,CHART_MODE,CHART_CANDLES);
//--- impostare la modalità di visualizzazione per i volumi tick
ChartSetInteger(handle,CHART_SHOW_VOLUMES,CHART_VOLUME_TICK);
}
}
ChartID
R estituisce l'ID del grafico corrente.
long ChartID();
Valore restituito
V alore di tipo long.
ChartIndicatorAdd
Aggiunge un indicatore con l'handle specificato in una finestra di grafico specificato. Indicatore e
grafico dovrebbero essere generati sullo stesso simbolo e timeframe.
bool ChartIndicatorAdd(
long chart_id, // ID del Grafico
int sub_window // numero di sotto-finestre
int indicator_handle // handle dell'indicatore
);
Parametri
chart_id
[ in] ID del Grafico. 0 significa il grafico corrente.
sub_window
[ in] Il numero del grafico sotto-finestra. 0 significa la finestra principale del grafico. Per
aggiungere un indicatore in una nuova finestra, il parametro deve esserne uno maggiore rispetto
all'indice dell'ultima finestra esistente, cioè uguale a CHART_W INDOW S _T OTAL. S e il valore del
parametro è maggiore di CHART_W INDOW S _T OTAL, una nuova finestra non verrà creata, e
l'indicatore non verrà aggiunto.
indicator_handle
[ in] H andle dell'indicatore.
Valore restituito
La funzione restituisce true in caso di successo, altrimenti restituisce false. Al fine di ottenere
informazioni sull' errore, chiamare la funzione GetLastError(). Errore 4114 significa che un grafico
ed un indicatore aggiunto differiscono dal loro simbolo o timeframe.
Nota
Se un indicatore che deve essere disegnato in una sottofinestra separata (per esempio, il iM ACD
built-in o un indicatore personalizzato con specificata la proprietà #property
indicator_separate_window) viene applicato alla finestra grafico principale, può non essere visibile
anche se sarà ancora presente nella lista degli indicatori. Ciò significa che la scala dell'indicatore è
diversa dalla scala del grafico dei prezzi ed i valori applicati agli indicatori non possono essere
inseriti nel campo visualizzato del grafico dei prezzi. In questo caso, GetLastError() restituisce
codice zero, indicando l'assenza di un errore. I valori di tale indicatore " invisibile" possono essere
visti nella Finestra Dati e ricevuti da altre applicazioni MQL5.
Esempio:
#property description "L' Expert Advisor dimostra il lavoro con la funzione ChartIndicatorAdd()."
#property description "Dopo il lancio sul chart (e la ricezione dell'errore nel Journal), aprire"
#property description "le proprietà dell'Expert Advisor e specificare correttamente i parametri <si
#property description "L' indicatore MACD verrà aggiunto al chart."
int indicator_handle=INVALID_HANDLE;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione dell' Expert |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//---
indicator_handle=iMACD(symbol,period,fast_ema_period,slow_ema_period,signal_period,apr);
//--- prova ad aggiungere l'indicatore sul grafico
if(!AddIndicator())
{
//--- La funzione AddIndicator() rifiuta di aggiungere l'indicatore sul chart
int answer=MessageBox("Vuoi aggiungere MACD sul chart ad ogni modo?",
"Non corretto simbolo e/o timeframe per aggiungere l'indicatore",
MB_YESNO // Le selezioni dei bottoni "Si" e "No" verranno mostrate
);
//--- se un utente insiste ancora sull'uso non corretto di ChartIndicatorAdd()
if(answer==IDYES)
{
//--- prima di tutto, verrà creata una riga del Journal a riguardo
PrintFormat("Attenzione! %s: Si sta tentando di aggiungere l'indicatore MACD(%s/%s) sul ch
__FUNCTION__,symbol,EnumToString(period),_Symbol,EnumToString(_Period));
//--- riceve il numero di una nuova sottofinestra, alla quale tenteremo di aggiungere l'in
int subwindow=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL);
//--- ora fa un tentativo destinato al fallimento
if(!ChartIndicatorAdd(0,subwindow,indicator_handle))
PrintFormat("Fallimento nell'aggiungere l'indicatore MACD sulla finestra del chart %d.
subwindow,GetLastError());
}
}
//---
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione tick dell'Expert |
//+--------------------------------------------------------------------------------+
void OnTick()
{
// L' Expert Advisor non esegue nulla
}
//+--------------------------------------------------------------------------------+
//| La funzione per controllare ed aggiungere l'indicatore sul chart |
//+--------------------------------------------------------------------------------+
bool AddIndicator()
{
//--- messaggio visualizzato
string message;
//--- controlla se il simbolo dell'indicatore ed il simbolo del chart corrispondono l'un l'altro
if(symbol!=_Symbol)
{
message="Visualizza l'uso della funzione Demo_ChartIndicatorAdd():";
message=message+"\r\n";
message=message+"Impossibile aggiungere l'indicatore calcolato su un altro simbolo sul chart.
message=message+"\r\n";
message=message+"Specifica il simbolo del chart nelle proprietà dell'Expert Advisor - "+_Symb
Alert(message);
//--- uscita prematura, l'indicatore non verrà aggiunto sul chart
return false;
}
//--- controlla se l'indicatore ed il timeframe del chart corrispondono l'un l'altro
if(period!=_Period)
{
message="Impossibile aggiungere l'indicatore calcolato su un altro timeframe sul chart.";
message=message+"\r\n";
message=message+"Specifica il timeframe del chart nelle proprietà dell'Expert Advisor - "+Enu
Alert(message);
//--- uscita prematura, l'indicatore non verrà aggiunto sul chart
return false;
}
//--- tutti i controlli completati, simbolo e timeframe dell'indicatore corrispondono al chart
if(indicator_handle==INVALID_HANDLE)
{
Print(__FUNCTION__," Crea l'indicatore MACD ");
indicator_handle=iMACD(symbol,period,fast_ema_period,slow_ema_period,signal_period,apr);
if(indicator_handle==INVALID_HANDLE)
{
Print("Fallimento nel creare l'indicatore MACD. Error code ",GetLastError());
}
}
//--- resetta il codice errore
ResetLastError();
//--- applica l'indicatore al chart
Print(__FUNCTION__," Aggiunge l'indicatore MACD sul chart");
Print("MACD viene generato su ",symbol,"/",EnumToString(period));
//--- riceve il numero di una nuova sottofinestra, a cui viene aggiunto l'indicatore MACD
int subwindow=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL);
PrintFormat("Aggiunta dell'indicatore MACD sulla finestra chart chart %d",subwindow);
if(!ChartIndicatorAdd(0,subwindow,indicator_handle))
{
PrintFormat("Fallimento nell'aggiungere l'indicatore MACD sulla finestra del chart %d. Codice
subwindow,GetLastError());
}
//--- Indicatore aggiunto con successo
return(true);
}
Vedere anche
ChartIndicatorDelete(), ChartIndicatorName(), ChartIndicators T otal(), iCustom(), IndicatorCreate()
ChartIndicatorDelete
R imuove un indicatore con il nome specificato dalla finestra del grafico specificato.
bool ChartIndicatorDelete(
long chart_id, // ID del Grafico
int sub_window // numero della sottofinestra
const string indicator_shortname // nome breve dell'indicatore
);
Parametri
chart_id
[ in] ID del Grafico. 0 indica il grafico corrente.
sub_window
[ in] Numero di sottofinestra grafico. 0 denota la principale sottofinestra del grafico.
const indicator_shortname
[in] Nome breve dell'indicatore che si trova nella proprietà INDICAT OR_S H ORTNAME con la
funzione IndicatorS etS tring(). Per ottenere il nome breve di un indicatore utilizzare la funzione
ChartIndicatorName().
Valore restituito
Restituisce true in caso di eliminazione di successo dell'indicatore. In caso contrario, restituisce
false. Per ottenere i dettagli dell' errore utilizzare la funzione GetLastError().
Nota
Se due indicatori con identici nomi brevi esistono nella sottofinestra del grafico, il primo in riga
verrà eliminato.
Se altri indicatori su questo grafico si basano sui valori dell'indicatore che viene eliminato, tali
indicatori verranno cancellati.
Non confondere il nome breve indicatore e il nome del file che viene specificato durante la creazione
di un indicatore con le funzioni iCustom() ed IndicatorCreate(). S e il nome breve di un indicatore
non è impostato in modo esplicito, il nome del file che contiene il codice sorgente dell'indicatore
verrà specificato durante la compilazione.
L ' eliminazione di un indicatore da un grafico non vuol dire che la sua parte di calcolo sarà cancellata
dalla memoria del terminale. Per rilasciare l'handle utilizzare la funzione IndicatorR elease().
Il nome breve dell'indicatore dovrebbe essere formato correttamente. Questo viene scritto nella
proprietà INDICAT OR_S H ORTNAME utilizzando la funzione IndicatorS etS tring(). E' raccomandato che
il nome breve deve contenere i valori di tutti i parametri di input dell'indicatore, poiché l'indicatore
eliminato dal grafico dalla funzione ChartIndicatorDelete() è identificato dal nome breve.
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- plot Histogram
#property indicator_label1 "Histogram"
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- parametri di input
input int first_param=1;
input int second_param=2;
input int third_param=3;
input bool wrong_init=true;
//--- buffers indicatore
double HistogramBuffer[];
string shortname;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
int res=INIT_SUCCEEDED;
//--- Collega l'array HistogramBuffer al buffer indicatore
SetIndexBuffer(0,HistogramBuffer,INDICATOR_DATA);
//--- Costruisce un nome indicatore corto basato sui parametri di input
shortname=StringFormat("Demo_ChartIndicatorDelete(%d,%d,%d)",
first_param,second_param,third_param);
IndicatorSetString(INDICATOR_SHORTNAME,shortname);
//--- Se viene impostato il completamento forzato di un indicatore, restituisce un valore non-zero
if(wrong_init) res=INIT_FAILED;
return(res);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
Vedi anche
ChartIndicatorAdd(), ChartIndicatorName(), ChartIndicators T otal(), iCustom(), IndicatorCreate(),
I ndicatorS etS tring()
ChartIndicatorGet
R estituisce l'handle dell'indicatore con il nome breve specificato nella finestra del grafico specificato.
int ChartIndicatorGet(
long chart_id, // ID del Grafico
int sub_window // Il numero di sottofinestra
const string indicator_shortname // Nome breve dell'indicatore
);
Parametri
chart_id
[ in] ID del Grafico. 0 significa il grafico corrente.
sub_window
[ in] Il numero della sottofinestra grafico. 0 significa la finestra principale del grafico.
const indicator_shortname
[in] Il nome breve se l'indicatore, che si trova nella proprietà INDICAT OR_S H ORTNAME utilizza la
funzione IndicatorS etS tring(). Per ottenere il nome breve di un indicatore, utilizzare la funzione
ChartIndicatorName().
Valore restituito
Restituisce un handle indicatore in caso di successo, altrimenti restituisce INVA L ID_HANDLE. Per
ottenere informazioni sull' errore, chiamare la funzione GetLastError().
Nota
L 'handle dell'indicatore ottenuto utilizzando la funzione ChartIndicatorGet() incrementa il contatore
dell'utilizzo interno dell'indicatore. Il sistema di runtime del terminale mantiene tutti gli indicatori, il
cui contatore è maggiore di zero, caricati. Pertanto, l' handle dell'indicatore che non è più necessario
deve essere rilasciato immediatamente ed esplicitamente utilizzando IndicatorR elease() nello stesso
programma che lo ha ricevuto, come mostrato nell'esempio seguente. Altrimenti, sarà impossibile
trovare l'handle " abbandonato" e rilasciarlo correttamente da un altro programma.
D urante la creazione di un indicatore, fare attenzione a formare il suo nome breve, che è scritto
nella proprietà INDICAT OR_S H ORTNAME utilizzando la funzione IndicatorS etS tring(). S i raccomanda
che un nome breve deve contenere i valori dei parametri di ingresso dell'indicatore, poiché
l'indicatore è identificato nella funzione ChartIndicatorGet() in base al suo nome breve.
Un altro modo per identificare l'indicatore è quello di ottenere una lista dei suoi parametri per una
handle dato, utilizzando la funzione IndicatorParameters() e quindi analizzare i valori ottenuti.
Esempio:
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- Il numero di finestre sul chart (almeno una finestra principale è sempre presente)
int windows=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL);
Vedi anche
ChartIndicatorAdd(), ChartIndicatorName(), ChartIndicators T otal(), IndicatorParameters()
ChartIndicatorName
Restituisce il nome breve dell'indicatore per il numero nella lista degli indicatori sulla finestra del
grafico specificato.
string ChartIndicatorName(
long chart_id, // ID del Grafico
int sub_window // numero di sottofinestra
int index // Indice dell'indicatore nell'elenco degli indicatori aggiunto alla sottof
);
Parametri
chart_id
[ in] ID del Grafico. 0 indica il grafico corrente.
sub_window
[ in] Numero di sottofinestra grafico. 0 denota la principale sottofinestra del grafico.
index
[in] l'indice dell'indicatore nell'elenco degli indicatori. La numerazione degli indicatori inizia con
zero, vale a dire che il primo indicatore della lista ha indice 0. Per ottenere il numero di indicatori
nella lista utilizzare la funzione ChartIndicators T otal().
Valore restituito
I l nome breve dell'indicatore che si trova nella proprietà INDICAT OR_S H ORTNAME con la funzione
I ndicatorS etS tring(). Per ottenere i dettagli dell'errore utilizzare la funzione GetLastError().
Nota
Non confondere il nome breve indicatore e il nome del file che viene specificato durante la creazione
di un indicatore con le funzioni iCustom() ed IndicatorCreate(). S e il nome breve di un indicatore
non è impostato in modo esplicito, il nome del file che contiene il codice sorgente dell'indicatore
verrà specificato durante la compilazione.
Il nome breve dell'indicatore dovrebbe essere formato correttamente. Questo viene scritto nella
proprietà INDICAT OR_S H ORTNAME utilizzando la funzione IndicatorS etS tring(). E' raccomandato che
il nome breve deve contenere i valori di tutti i parametri di input dell'indicatore, poiché l'indicatore
eliminato dal grafico dalla funzione ChartIndicatorDelete() è identificato dal nome breve.
Vedi anche
ChartIndicatorAdd(), ChartIndicatorDelete(), ChartIndicators T otal(), iCustom(), IndicatorCreate(),
I ndicatorS etS tring()
ChartIndicatorsTotal
R estituisce il numero di tutti gli indicatori applicati alla finestra del grafico specificato.
int ChartIndicatorsTotal(
long chart_id, // ID del Grafico
int sub_window // numero di sottofinestra
);
Parametri
chart_id
[ in] ID del Grafico. 0 indica il grafico corrente.
sub_window
[ in] Numero di sottofinestra grafico. 0 denota la principale sottofinestra del grafico.
Valore restituito
Il numero di indicatori nella finestra del grafico specificato. Per ottenere i dettagli dell' errore
utilizzare la funzione GetLastError().
Nota
La funzione permette di fare la ricerca attraverso tutti gli indicatori collegati al grafico. Il numero di
tutte le finestre del grafico può essere ottenuto dalla proprietà CHART_W INDOW S _T OTAL
utilizzando la funzione ChartGetInteger().
Vedi anche
ChartIndicatorAdd(), ChartIndicatorDelete(), iCustom(), IndicatorCreate(), IndicatorS etS tring()
ChartW indowOnDropped
R estituisce il numero (index ) della sottofinestra del grafico, a cui è allegato l'Ex pert Avisor o lo S cript.
0 significa la finestra principale del grafico.
int ChartWindowOnDropped();
Valore restituito
V alue of int type.
Esempio:
int myWindow=ChartWindowOnDropped();
int windowsTotal=ChartGetInteger(0,CHART_WINDOWS_TOTAL);
Print("Lo script sta girano sulla finestra #"+myWindow+
". Total windows on the chart "+ChartSymbol()+":",windowsTotal);
Vedi anche
ChartPriceOnDropped, ChartT imeOnDropped, ChartXOnDropped, ChartYOnDropped
ChartPriceOnDropped
R estituisce le coordinate prezzo corrispondenti al punto del grafico, dove cui un Ex pert A dvisor o
S cript è stato allegato.
double ChartPriceOnDropped();
Valore restituito
V alore di tipo double.
Esempio:
double p=ChartPriceOnDropped();
Print("ChartPriceOnDropped() = ",p);
Vedi anche
ChartXOnDropped, ChartYOnDropped
ChartTimeOnDropped
R estituisce le coordinate temporali corrispondenti del punto del grafico, a cui è stato allegato l'Ex pert
A dvisor.
datetime ChartTimeOnDropped();
Valore restituito
V alue of datetime type.
Esempio:
datetime t=ChartTimeOnDropped();
Print("Lo script era allegato su"+t);
Vedi anche
ChartXOnDropped, ChartYOnDropped
ChartXOnDropped
R estituisce la coordinata X del punto del grafico, a cui è stato allegato un Ex pert Advisor o S cript.
int ChartXOnDropped();
Valore restituito
I l valore della coordinata X.
Nota
D irezione dell'asse X da sinistra a destra.
Esempio:
int X=ChartXOnDropped();
int Y=ChartYOnDropped();
Print("(X,Y) = ("+X+","+Y+")");
Vedi anche
ChartW indowOnDropped, ChartPriceOnDropped, ChartT imeOnDropped
ChartYOnDropped
R estituisce le coordinate Y del punto del grafico, a cui è stato allegato un Ex pert Advisor o S cript..
int ChartYOnDropped();
Valore restituito
I l valore della coordinata Y.
Nota
D irezione dell'asse Y dall'alto al basso.
Vedi anche
ChartW indowOnDropped, ChartPriceOnDropped, ChartT imeOnDropped
ChartSetSymbolPeriod
Cambia il simbolo ed il periodo per il grafico specificato. La funzione è asincrona, cioè invia il
comando e non aspetta per il suo completamento. Il comando viene aggiunto alla coda dei messaggi
del chart e verrà eseguito dopo l'elaborazione di tutti i comandi precedenti.
bool ChartSetSymbolPeriod(
long chart_id, // ID del Grafico
string symbol, // Nome del Simbolo
ENUM_TIMEFRAMES period // Periodo
);
Parametri
chart_id
[ in] ID del Grafico. 0 significa il grafico corrente.
symbol
[in] S imbolo del Grafico. Il valore NU LL significa che il corrente simbolo del grafico (a cui l'Ex pert
A dvisor è allegato)
period
[in] Periodo del Grafico (timeframe). Può essere uno dei valori ENUM _TIMEFRAMES . 0 indica il
corrente periodo del grafico.
Valore restituito
R estituisce true se il comando è stato aggiunto alla coda del chart, altrimenti false. Per avere
informazioni sull' errore, Chiamare la funzione GetLastError().
Nota
I l cambio di simbolo/periodo porta alla re-inizializzazione dell' Ex pert Advisor allegato al grafico.
La chiamata di ChartS etS ymbolPeriod con lo stesso simbolo e timeframe può essere utilizzata per
aggiornare il grafico (simile al comando Aggiorna del terminale). A sua volta, l'aggiornamento del
chart innesca ri-calcolo degli indicatori ad esso collegati. Cos ì, è possibile calcolare un indicatore sul
grafico, anche se non ci sono tick s (ad esempio, nei fine settimana).
Vedi anche
ChartS ymbol, ChartPeriod
ChartScreenShot
La funzione fornisce uno screenshot del grafico nel suo stato corrente nel formato GIF , PNG o BMP a
seconda estensione specificata.
bool ChartScreenShot(
long chart_id, // ID del Grafico
string filename, // Nome del Simbol
int width, // Larghezza
int height, // Altezza
ENUM_ALIGN_MODE align_mode=ALIGN_RIGHT // Tipo di Allineamento
);
Parametri
chart_id
[ in] ID del Grafico. 0 significa il grafico corrente.
filename
[in] Il nome del file S creenshot. Non può superare i 63 caratteri. I files di S creenshot si trovano
nella directory \Files.
width
[ in] Larghezza S creenshot in pix els.
height
[ in] A ltezza S creenshot in pix els.
align_mode=ALIGN_RIGHT
[ in] Output mode di uno screenshot sottile. Valore dell'enumerazione ENUM _AL IGN_MODE .
A L IGN_RIGHT significa allinea al margine destro (l'output dalla fine). AL IGN_LEFT significa
j ustifica a S inistra.
Valore restituito
R estituisce true se ha successo, altrimenti false.
Nota
S e avete bisogno di prendere uno screenshot da un grafico a partire da una certa posizione, in primo
luogo è necessario posizionare il grafico utilizzando la funzione ChartNavigate(). S e la dimensione
orizzontale della schermata è più piccola della finestra del grafico, sia la parte destra della finestra
del grafico, che la sua parte sinistra, vengono date in output a seconda delle impostazioni
align_mode.
Esempio:
#property description "L'Expert Advisor dimostra come creare una serie di immagini del corrente"
#property description "grafico usando la funzione ChartScreenShot(). Per comodità, il nome del file
#property descrizione "mostrata sul grafico. L'altezza e la larghezza delle immagini è definita tra
}
//+--------------------------------------------------------------------------------+
//| Funzione ChartEvent |
//+--------------------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
//---Mostra il nome della funzione, orario di chiamata ed identificatore vento
Print(__FUNCTION__,TimeCurrent()," id=",id," mode=",mode);
//--- Maneggia l'evento CHARTEVENT_CLICK ("Un click del mouse sul grafico")
if(id==CHARTEVENT_CLICK)
{
//--- Slittamento iniziale dal lato del grafico
int pos=0;
//--- Operazione con il lato sinistro del grafico
if(mode>0)
{
//--- Slitam il grafico al lato sinistro
ChartNavigate(0,CHART_BEGIN,pos);
for(int i=0;i<pictures;i++)
{
Vedi anche
ChartNavigate(), R isorse
Funzioni di Trade
Questo è il gruppo di funzioni intese a gestire le attività di trading.
Prima di procedere a studiare le funzioni di trade della piattaforma, devi avere una chiara
comprensione dei termini di base: ordine(order), affare(o accordo, deal) e posizione(position).
· U nordine è un'istruzione che viene data a un brok er per acquistare o vendere uno strumento
finanziario. Ci sono due principali tipi di ordini: Mercato(mark et) e Pendente(pending). Inoltre, ci
sono speciali livelli T ak e Profit e S top Loss.
· Unaffare è lo scambio commerciale (acquisto o vendita) di una garanzia finanziaria. L 'acquisto viene
eseguito al prezzo di domanda (As k ) e la vendita viene eseguita al prezzo di offerta (Bid). Un affare
può essere aperto a seguito dell'esecuzione dell'ordine di mercato o dell'attivazione dell'ordine
pendente. S i noti che in alcuni casi l'esecuzione di un ordine può comportare numerosi affari.
· Una posizione é un obbligo di trade, vale a dire il numero di contratti acquistati o venduti di uno
strumento finanziario. Una posizione long è la sicurezza finanziaria acquistata in attesa che il prezzo
della sicurezza aumenti. Una posizione short è l'obbligo di fornire una sicurezza che prevede che il
prezzo scenderà in futuro.
G eneriche informazioni sulle operazioni di trading sono disponibili nella guida del terminale client.
F unzioni di trading possono essere utilizzate in Ex pert Advisor e scripts. Funzioni di trading possono
essere chiamate solo se nelle proprietà della Ex pert Advisor o dello script, l'opzione " Consenti trading
live" è abilitata.
Trading can be allowed or prohibited depending on various factors described in the T rade Permission
section.
Funzione Azione
OrderCalcMargin Calcola il margine richiesto per il tipo di ordine
specificato, nella valuta di deposito
number specified in it
Funzione Azione
PositionGetDouble Restituisce la proprietà richiesta di una
posizione aperta (double)
Funzione Azione
H istoryDeals T otal Restituisce il numero degli affari nella
cronistoria
OrderCalcMargin
La funzione calcola il margine richiesto per il tipo di ordine specificato, sul corrente account, nel
corrente contesto di mercato che non tiene conto dei correnti ordini pendenti e posizioni aperte.
Permette la valutazione del margine per l'operazione di trade prevista. Il valore viene restituito nella
valuta del conto.
bool OrderCalcMargin(
ENUM_ORDER_TYPE action, // tipo di ordine
string symbol, // nome del simbolo
double volume, // volume
double price, // prezzo di apertura
double& margin // valore per ottenere il valore del margine
);
Parametri
azione
[ in] Il tipo di ordine, può essere uno dei valori dell'enumerazione ENUM _ORDER_TYPE.
symbol
[ in] Nome del S imbolo.
volume
[ in] volume delle operazioni di trade.
price
[ in] Prezzo di apertura.
margin
[out] La variabile, per cui il valore del margine richiesto sarà scritto nel caso la funzione viene
eseguita correttamente. Il calcolo viene eseguito come se non c'erano ordini pendenti e posizioni
aperte, sul corrente account. Il valore del margine dipende da molti fattori, e può variare in
diversi contesti di mercato.
Valore restituito
La funzione restituisce true in caso di successo, altrimenti restituisce false. A l fine di ottenere
informazioni sull' errore, chiamare la funzione GetLastError().
Vedi anche
OrderS end(), Proprietà degli Ordini, T ipi di Operazioni di T rade
OrderCalcProfit
La funzione calcola il profitto per il corrente account, nelle attuali condizioni di mercato, in base ai
parametri passati. La funzione viene utilizzata per la pre-valutazione del risultato di un'operazione di
trade. Il valore viene restituito nella valuta del conto.
bool OrderCalcProfit(
ENUM_ORDER_TYPE action, // tipo di ordine (ORDER_TYPE_BUY or ORDER_TYPE_SELL)
string symbol, // nome del simbolo
double volume, // volume
double price_open, // prezzo di apertura
double price_close, // prezzo di chiusura
double& profit // variabile per ottenere il valore del profitto
);
Parametri
azione
[in] T ipo di ordine, può essere uno dei due valori dell'enumarazione ENUM _ORDER_TYPE:
ORDER_TYPE_BUY o ORDER_TYPE_S ELL.
symbol
[ in] Nome del S imbolo.
volume
[ in] volume delle operazioni di trade.
price_open
[ in] Prezzo di apertura.
price_close
[ in] Prezzo di chiusura.
profit
[out] La variabile, per cui il valore del profitto calcolato sarà scritto nel caso la funzione viene
eseguita correttamente. Il valore di profitto stimato dipende da molti fattori, e può variare nei
diversi contesti di mercato.
Valore restituito
La funzione restituisce true in caso di successo, altrimenti restituisce false. S e un tipo di ordine non
valido viene specificato, la funzione restituisce false. Al fine di ottenere informazioni sull' errore,
chiamare GetLastError().
Vedi anche
OrderS end(), Proprietà degli Ordini, T ipi di Operazioni di T rade
OrderCheck
La funzione OrderCheck () controlla se ci sono abbastanza soldi per eseguire un' operazione di
traderichiesta. I risultati del controllo sono posti ai campi della struttura M qlT radeCheckR esult.
bool OrderCheck(
MqlTradeRequest& request, // struttura della richiesta
MqlTradeCheckResult& result // struttura del risultato
);
Parametri
request
[ in] Puntatore alla struttura del tipo M qlT radeR equest, che descrive l'azione di trade richiesta.
result
[in,out] Puntatore alla struttura del tipo M qlT radeCheckR esult, un cui verrà posizionato il risultato
del controllo.
Valore restituito
S e i fondi non sono sufficienti per l'operazione, oi parametri sono compilati in modo errato, la
funzione restituisce il valore false. In caso di un controllo di base di successo delle strutture
(controllo di puntatori), restituisce true. Tuttavia, questo non significa che l'operazione di trade
richiesta, è sicuro che venga eseguita con successo. Per una descrizione più dettagliata del
risultato dell'esecuzione della funzione, analizzare i campi della struttura result .
Vedi anche
OrderS end(), T ipi di Operazione di T rade, S truttura delle R ichieste di T rade, S truttura dei R isultati
del Controllo della R ichiesta, S truttura del R isultato della R ichiesta di T rade
OrderSend
OrderS end() viene utilizzato per l'esecuzione di operazioni di trade inviando richieste al trade server .
bool OrderSend(
MqlTradeRequest& request, // struttura della query
MqlTradeResult& result // struttura della risposta
);
Parametri
request
[ in] Puntatore ad una struttura di tipo M qlT radeR equest descrivente l'attività di trade del client.
result
[in, out] Puntatore ad una struttura di tipo M qlT radeR esult che descrive il risultato dell' operazione
di trade in caso di completamento (se viene restituito true).
Valore restituito
In caso di un controllo di base di successo delle strutture (controllo index ) restituisce true. Tuttavia,
questo non è segno di esecuzione di un'operazione di trade avvenuta con successo. Per una
descrizione più dettagliata del risultato dell'esecuzione della funzione, analizzare i campi della
struttura result .
Nota
Le richieste di trade passano attraverso diverse fasi di verifica su un trade server. Prima di tutto,
controlla se tutti i campi richiesti del parametro request vengono compilati correttamente. S e non ci
sono errori, il server accetta l'ordine per ulteriori elaborazioni. S e l'ordine è correttamente accettato
dal trade server, la funzione OrderS end() restituisce true.
· il livello di margine che sarà fissato dopo che l'operazione di trade è eseguita;
· commento al codice di risposta, descrizione dell'errore.
di trades corrispondenti ad un ordine possono verificarsi dopo aver inviato una risposta alla
chiamata OrderS end(). Pertanto, per qualsiasi tipo di richiesta di trade, quando si riceve il risultato
delll'esecuzione di OrderS end(), dovremmo prima controllare il codice di responso del trade server
retcode e (se necessario) il codice di responso del sistema esterno retcode_external disponibile nel
risultato della struttura ottenuto.
Ogni ordine accettato viene memorizzato sul trade server in attesa di elaborazione fino a quando si
verifica una delle condizioni per la sua esecuzione:
· espirazione (scadenza),
· comparsa di una richiesta opposta,
· esecuzione dell'ordine quando appare il prezzo di esecuzione,
· una richiesta di annullare viene ricevuta.
Il risultato della esecuzione della richiesta di trade su un server, inviata da OrderS end() può essere
monitorata dall'handler OnT radeT ransaction. Va notato che l'handler OnT radeT ransaction verrà
chiamato più volte durante l'esecuzione di una richiesta di trade.
Per esempio, quando si invia un ordine di acquisto di mercato, esso viene gestito, un ordine di
acquisto appropriata viene creato per l'account, l'ordine quindi viene eseguito e rimosso dalla lista di
quelli aperti, e poi viene aggiunto alla cronistoria ordini, un appropriato aff viene aggiunto alla
cronistoria ed una nuova posizione viene creata. La funzione OnT radeT ransaction verrà chiamata
per ognuno di questi eventi.
Esempio:
//--- valore per ORDER_MAGIC
input long order_magic=55555;
//+--------------------------------------------------------------------------------+
//| Funzione di start del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- si assicura che l'account sia demo
if(AccountInfoInteger(ACCOUNT_TRADE_MODE)==ACCOUNT_TRADE_MODE_REAL)
{
Alert("L'operazione dello Script non è consentita su un account live!");
return;
}
//--- piazza l'ordine o lo cancella
if(GetOrdersTotalByMagic(order_magic)==0)
{
//--- nessun ordine correntemente - piazza un ordine
uint res=SendRandomPendingOrder(order_magic);
Print("Codice di ritorno del trade server",res);
}
else // ci sono ordini - elimina ordini
{
DeleteAllOrdersByMagic(order_magic);
}
//---
}
//+--------------------------------------------------------------------------------+
//| Riceve il numero attuale di ordini con ORDER_MAGIC specificato |
//+--------------------------------------------------------------------------------+
int GetOrdersTotalByMagic(long const magic_number)
{
ulong order_ticket;
int total=0;
//--- passa attraverso tutti gli ordini pendenti
for(int i=0;i<OrdersTotal();i++)
if((order_ticket=OrderGetTicket(i))>0)
if(magic_number==OrderGetInteger(ORDER_MAGIC)) total++;
//---
return(total);
}
//+--------------------------------------------------------------------------------+
//| Elimina tutti gli ordini pendenti con ORDER_MAGIC specificato |
//+--------------------------------------------------------------------------------+
void DeleteAllOrdersByMagic(long const magic_number)
{
ulong order_ticket;
//--- passa attraverso tutti gli ordini pendenti
for(int i=OrdersTotal()-1;i>=0;i--)
if((order_ticket=OrderGetTicket(i))>0)
//--- ordine con l'appropriato ORDER_MAGIC
if(magic_number==OrderGetInteger(ORDER_MAGIC))
{
MqlTradeResult result={};
MqlTradeRequest request={};
request.order=order_ticket;
request.action=TRADE_ACTION_REMOVE;
OrderSend(request,result);
//--- scrive la risposta del server nel registro
Print(__FUNCTION__,": ",result.comment," reply code ",result.retcode);
}
//---
}
//+--------------------------------------------------------------------------------+
//| Importa un ordine pendente in modo casuale |
//+--------------------------------------------------------------------------------+
uint SendRandomPendingOrder(long const magic_number)
{
//--- prepara una richiesta
MqlTradeRequest request={};
request.action=TRADE_ACTION_PENDING; // imposta un ordine pendente
request.magic=magic_number; // ORDER_MAGIC
request.symbol=_Symbol; // symbol
request.volume=0.1; // volume in 0.1 lotti
}
else // ORDER_TYPE_SELL_LIMIT or ORDER_TYPE_BUY_STOP
{
price=last_tick.ask; // partenza dal prezzo Ask
price=price+(distance+(MathRand()%10)*5)*_Point;
}
//---
return(price);
}
Vedi anche
Tipi di Operazioni di T rade, S truttura R ichieste di T rade, S truttura dei R isultati della R ichiesta del
Controllo, S truttura del R isultato della R ichiesta di T rade
OrderSendAsync
Il OrderS endAs ync() viene utilizzato per lo svolgimento di operazioni di trade asincrone, senza
attendere la risposta del trade server ad una richiesta inviata. La funzione è progettata per il trading
ad alta-frequenza, quando sotto i termini della algoritmo di trading, è inaccettabile perdere tempo in
attesa di una risposta dal server.
bool OrderSendAsync(
MqlTradeRequest& request, // Struttura dela Richiesta
MqlTradeResult& result // Struttura della Risposta
);
Parametri
request
[ in] Puntatore alla struttura di tipo M qlT radeR equest che descrive l'azione di trade del client.
result
[in,out] Un puntatore alla struttura di tipo M qlT radeR esult che descrive il risultato di un'operazione
di trade in caso di corretta esecuzione della funzione (se true viene restituito).
Valore restituito
R estituisce true se la richiesta viene inviata al trade server. Nel caso in cui la richiesta non venga
inviata, restituisce false. Nel caso in cui la richiesta venga inviata, nella variabile result il codice di
risposta contiene il valore TRADE_R ET CODE_PL ACED (codice 10008) - " ordine piazzato" . L '
esecuzione di successo significa solo il fatto di inviare, ma non fornisce alcuna garanzia che la
richiesta ha raggiunto il trade server ed che sia stata accettata per l'elaborazione. Quando si elabora
la richiesta ricevuta, il trade server invia una risposta al terminale client notificando sul
cambiamento dello stato attuale delle posizioni, ordini ed affari, che portano alla generazione dell'
evento T rade.
Il risultato dell' esecuzione della richiesta di trade sul server inviata da OrderS endAs ync() può essere
monitorato dall'handler OnT radeT ransaction. Va notato che l'handler OnT radeT ransaction verrà
chiamato più volte durante l'esecuzione di una richiesta di trade.
Per esempio, quando si invia un ordine di acquisto di mercato, esso viene gestito, un ordine di
acquisto appropriata viene creato per l'account, l'ordine quindi viene eseguito e rimosso dalla lista di
quelli aperti, e poi viene aggiunto alla cronistoria ordini, un appropriato aff viene aggiunto alla
cronistoria ed una nuova posizione viene creata. La funzione OnT radeT ransaction verrà chiamata
per ognuno di questi eventi. Per ottenere tali dati, devono essere analizzati i parametri della
funzione:
· trans - questo parametro riceve la struttura M qlTradeTransaction che descrive una transazione di
trade applicata ad un account;
· request - questo parametro riceve la struttura M qlT radeR equest che descrive la richiesta di trade
risultata in una transazione di trade;
· result - questo parametro riceve la struttura M qlT radeR esult che descrive un risultato di
esecuzione di una richiesta di trade.
Nota
In termini di obiettivi e parametri, la funzione è simile ad OrderS end(), ma diversamente da essa, è
asincrona, cioè non mantiele il funzionamento del programma in attesa del risultato dell'esecuzione
della funzione. È possibile confrontare il tasso delle operazioni di trade di ueste due funzioni
q
Esempio:
#property description "Expert Advisor per inviare richieste di trade "
" usando la duznione OrderSendAsync().\r\n"
#property description "Handling degli eventi di trading usando"
" le funzioni handler OnTrade() ed OnTradeTransaction() (viene visualizzato)\
#property description "I parametri dell' Expert Advisor consentono di impostare il Magic Number"
" (ID univoco) "
#property description "e la modalità di visualizzazione dei messaggi nell' Experts log. Tutti i det
//--- parametri di input
input int MagicNumber=1234567; // ID Expert Advisor
input bool DescriptionModeFull=true; // Modalità dettagliata di output
//--- variabile per usare nella chiamata HistorySelect()
datetime history_start;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione dell' Expert |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- controlla se l'autotrading è consentito
if(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
{
Alert("L' Autotrading nel terminale è disabilitato, l' Expert Advisor verrà rimosso");
ExpertRemove();
return(-1);
}
//--- Non in grado di operare su un conto reale
if(AccountInfoInteger(ACCOUNT_TRADE_MODE)==ACCOUNT_TRADE_MODE_REAL)
{
Alert("L' Expert Advisor non può fare trading sun un account reale!");
ExpertRemove();
return(-2);
}
//--- verifica se è possibile fare trading su questo account (per esempio, il trading è impossibile
if(!AccountInfoInteger(ACCOUNT_TRADE_ALLOWED))
{
Alert("Il trading su questo account è disabilitato");
ExpertRemove();
return(-3);
}
//--- salva l'orario di lancio dell'Expert Advisor per la ricezione della cronistoria di trading
history_start=TimeCurrent();
//---
CreateBuySellButtons();
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione Expert |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- elimina tutti gli oggetti grafici
ObjectDelete(0,"Buy");
ObjectDelete(0,"Sell");
//---
}
//+--------------------------------------------------------------------------------+
//| Funzione TradeTransaction |
//+--------------------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
//--- intestazione nominata dopo l'event handler della funzione di trading
Print("=> ",__FUNCTION__," at ",TimeToString(TimeCurrent(),TIME_SECONDS));
//--- riceve il tipo di transazione come valore dell'enumerazione
ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- se la trascrizione è il risultato di una richiesta di handling
if(type==TRADE_TRANSACTION_REQUEST)
{
//--- mostra il nome della transazione
Print(EnumToString(type));
//--- quindi mostra la descrizione della stringa della richiesta di handling
Print("------------RequestDescription\r\n",
RequestDescription(request,DescriptionModeFull));
//--- e mostra la desceizione del risultato della richiesta
Print("------------ ResultDescription\r\n",
TradeResultDescription(result,DescriptionModeFull));
}
else // mostra la descrizione completa della transazione per la transazione di altro tipo
{
Print("------------ TransactionDescription\r\n",
TransactionDescription(trans,DescriptionModeFull));
}
//---
}
//+--------------------------------------------------------------------------------+
//| Funzione di Trade |
//+--------------------------------------------------------------------------------+
void OnTrade()
{
//--- membro statico per la memorizzazione dello status dell'account di trading
static int prev_positions=0,prev_orders=0,prev_deals=0,prev_history_orders=0;
//--- richiesta cronistoria di trading
bool update=HistorySelect(history_start,TimeCurrent());
if(detailed)
{
desc+="Simbolo: "+request.symbol+"\r\n";
desc+="Magic Number: "+StringFormat("%d",request.magic)+"\r\n";
desc+="Ticket dell'Ordine: "+(string)request.order+"\r\n";
desc+="Tipo di Ordine: "+EnumToString(request.type)+"\r\n";
desc+="Riempimento dell'Ordine: "+EnumToString(request.type_filling)+"\r\n";
desc+="Tipo di orario dell'Ordine: "+EnumToString(request.type_time)+"\r\n";
desc+="Espirazione dell'Ordine: "+TimeToString(request.expiration)+"\r\n";
desc+="Prezzo: "+StringFormat("%G",request.price)+"\r\n";
desc+="Punti di Deviazione: "+StringFormat("%G",request.deviation)+"\r\n";
desc+="Stop Loss: "+StringFormat("%G",request.sl)+"\r\n";
desc+="Take Profit: "+StringFormat("%G",request.tp)+"\r\n";
desc+="Stop Limit: "+StringFormat("%G",request.stoplimit)+"\r\n";
desc+="Volume: "+StringFormat("%G",request.volume)+"\r\n";
desc+="Commento: "+request.comment+"\r\n";
}
//--- restituisce la stringa ricevuta
return desc;
}
//+--------------------------------------------------------------------------------+
//| Restituisce la descrizione testuale del risultato della richiesta di handling |
//+--------------------------------------------------------------------------------+
string TradeResultDescription(const MqlTradeResult &result,
const bool detailed=true)
{
//--- prepara la stringa per il ritorno dalla funzione
string desc="Retcode "+(string)result.retcode+"\r\n";
//--- aggiunge tutti i dati disponibili in modalità dettagliata
if(detailed)
{
desc+="ID della Richiesta: "+StringFormat("%d",result.request_id)+"\r\n";
desc+="Ticket dell'Ordine: "+(string)result.order+"\r\n";
desc+="Ticket dell'Affare: "+(string)result.deal+"\r\n";
desc+="Volume: "+StringFormat("%G",result.volume)+"\r\n";
desc+="Prezzo: "+StringFormat("%G",result.price)+"\r\n";
desc+="Ask: "+StringFormat("%G",result.ask)+"\r\n";
desc+="Bid: "+StringFormat("%G",result.bid)+"\r\n";
desc+="Commento: "+result.comment+"\r\n";
}
//--- restituisce la stringa ricevuta
return desc;
}
//+--------------------------------------------------------------------------------+
//| Crea due bottoni per l'acquisto e la vendita |
//+--------------------------------------------------------------------------------+
void CreateBuySellButtons()
{
//--- controlla l'oggetto nominato "Buy"
if(ObjectFind(0,"Buy")>=0)
{
//--- se l'oggetto trovato non è un bottone, lo elimina
if(ObjectGetInteger(0,"Buy",OBJPROP_TYPE)!=OBJ_BUTTON)
ObjectDelete(0,"Buy");
}
else
ObjectCreate(0,"Buy",OBJ_BUTTON,0,0,0); // crea il bottone "Buy"
//--- configura il bottone "Sell"
ObjectSetInteger(0,"Buy",OBJPROP_CORNER,CORNER_RIGHT_UPPER);
ObjectSetInteger(0,"Buy",OBJPROP_XDISTANCE,100);
ObjectSetInteger(0,"Buy",OBJPROP_YDISTANCE,50);
ObjectSetInteger(0,"Buy",OBJPROP_XSIZE,70);
ObjectSetInteger(0,"Buy",OBJPROP_YSIZE,30);
ObjectSetString(0,"Buy",OBJPROP_TEXT,"Buy");
ObjectSetInteger(0,"Buy",OBJPROP_COLOR,clrRed);
//--- controlla la presenza di un oggetto chiamato "Sell"
if(ObjectFind(0,"Sell")>=0)
{
//--- se l'oggetto trovato non è un bottone, lo elimina
if(ObjectGetInteger(0,"Sell",OBJPROP_TYPE)!=OBJ_BUTTON)
ObjectDelete(0,"Sell");
}
else
ObjectCreate(0,"Sell",OBJ_BUTTON,0,0,0); // crea il bottone "Sell"
//--- configura il bottone "Sell"
ObjectSetInteger(0,"Sell",OBJPROP_CORNER,CORNER_RIGHT_UPPER);
ObjectSetInteger(0,"Sell",OBJPROP_XDISTANCE,100);
ObjectSetInteger(0,"Sell",OBJPROP_YDISTANCE,100);
ObjectSetInteger(0,"Sell",OBJPROP_XSIZE,70);
ObjectSetInteger(0,"Sell",OBJPROP_YSIZE,30);
ObjectSetString(0,"Sell",OBJPROP_TEXT,"Sell");
ObjectSetInteger(0,"Sell",OBJPROP_COLOR,clrBlue);
//--- esegue l'aggiornamento forzato del chart per visualizzare i bottoni immediatamente
ChartRedraw();
//---
}
//+--------------------------------------------------------------------------------+
//| Compra usando la funzione asincrona OrderSendAsync() |
//+--------------------------------------------------------------------------------+
void BuyAsync(double volume)
{
//--- prepara la richiesta
MqlTradeRequest req={};
req.action =TRADE_ACTION_DEAL;
req.symbol =_Symbol;
req.magic =MagicNumber;
req.volume =0.1;
req.type =ORDER_TYPE_BUY;
req.price =SymbolInfoDouble(req.symbol,SYMBOL_ASK);
req.deviation =10;
req.comment ="Buy(compra), usando OrderSendAsync()";
MqlTradeResult res={};
if(!OrderSendAsync(req,res))
{
Print(__FUNCTION__,": error ",GetLastError(),", retcode = ",res.retcode);
}
//---
}
//+--------------------------------------------------------------------------------+
//| Vende usando la funzione asincrona OrderSendAsync() |
//+--------------------------------------------------------------------------------+
void SellAsync(double volume)
{
//--- prepara la richiesta
MqlTradeRequest req={};
req.action =TRADE_ACTION_DEAL;
req.symbol =_Symbol;
req.magic =MagicNumber;
req.volume =0.1;
req.type =ORDER_TYPE_SELL;
req.price =SymbolInfoDouble(req.symbol,SYMBOL_BID);
req.deviation =10;
req.comment ="Sell(vende) usando OrderSendAsync()";
MqlTradeResult res={};
if(!OrderSendAsync(req,res))
{
Print(__FUNCTION__,": error ",GetLastError(),", retcode = ",res.retcode);
}
//---
}
//+--------------------------------------------------------------------------------+
PositionsTotal
R estituisce il numero di posizioni aperte.
int PositionsTotal();
Valore restituito
V alue of int type.
Nota
F or the " netting " interpretation of positions (ACCOUNT_M ARGIN_MODE_R ETAIL _NETTING and
A CCOUNT_M ARGIN_MODE_EXCHANGE), only one position can ex ist for a s ymbol at any moment of
time. T his position is a result of one or more deals. Do not confuse positions with valid pending
orders, which are also displayed on the T rading tab of the T oolbox window.
If individual positions are allowed (ACCOUNT_M ARGIN_MODE_R ETAIL _H EDGING), multiple positions
can be open for one s ymbol.
Vedi anche
PositionGetS ymbol(), PositionS elect(), Proprietà Posizioni
PositionGetSymbol
Restituisce il simbolo corrispondente alla posizione aperta e seleziona automaticamente la posizione
per l'ulteriore lavoro con essa utilizzando le funzioni PositionGetDouble, PositionGetInteger,
PositionGetS tring.
string PositionGetSymbol(
int index // Numero nella lista delle posizioni
);
Parametri
index
[ in] Numero della posizione nella lista delle posizioni aperte.
Valore restituito
Valore di tipo string. S e la posizione non è stata trovata, verrà restituita una stringa vuota. Per
ottenere il codice di errore, chiamare la funzione GetLastError().
Nota
Per ciascun simbolo, in un dato momento di tempo, solo una posizione può essere aperta, che è il
risultato di uno o più affari. Da non confondere i correnti ordini pendenti con le posizioni, che sono
anch'esse visualizzate nella scheda " T rade" del " BoxAttrezzi" del terminale client.
Il numero totale di posizioni su un trade account non può superare il totale del numero di strumenti
finanziari.
Vedi anche
Positions T otal(), PositionS elect(), Proprietà delle Posizioni
PositionSelect
Sceglie una posizione aperta per l'ulteriore lavoro con essa. R estituisce true se la funzione è
completata con successo. R estituisce false in caso di fallimento. Per ottenere informazioni sull'errore,
chiamare GetLastError().
bool PositionSelect(
string symbol // Nome del simbolo
);
Parametri
symbol
[ in] Nome dello strumento finanziario.
Valore restituito
Valore di tipo bool.
Nota
Per ciascun simbolo, in un dato momento di tempo, solo una posizione può essere aperta, che è il
risultato di uno o più affari. Da non confondere posizioni con correnti ordini pendenti, che sono
anche visualizzate nella scheda " T rade" del " BoxAttrezzi" del terminale client.
La funzione PositionS elect() copia i dati relativi ad una posizione nell'ambiente del programma, e
successive chiamate di PositionGetDouble(), PositionGetInteger() e PositionGetS tring() restituiscono
i dati precedentemente copiati. Questo significa che la posizione stessa non esiste più (o il suo
volume, direzione, ecc. è cambiato), ma i dati di quela posizione possono ancora essere ottenuti.
Per garantire la ricezione di nuovi dati su una posizione, si consiglia di chiamare PositionS elect()
giusto prima di fare riferimento ad essi.
Vedi anche
PositionGetS ymbol(), Positions T otal(), Proprietà della Posizione
PositionSelectByTicket
Selects an open position to work with based on the tick et number specified in the position. If
successful, returns true. R eturns false if the function failed. Call GetLastError() for error details.
bool PositionSelectByTicket(
ulong ticket // Position ticket
);
Parameters
ticket
[ in] Position tick et.
Return Value
A value of the bool type.
Note
The PositionS electByT ick et() function copies position data to the program environment. Further calls
of PositionGetDouble(), PositionGetInteger() and PositionGetS tring() return the previously copied
data. Even if a position does not ex ist already (or its size, direction etc. has changed), the data may
still be received sometimes. T o mak e sure that you receive valid position data, it is recommended
to call PositionS electByT ick et() before you access the data.
See also
PositionGetS ymbol(), Positions T otal(), Position Properties
PositionGetDouble
La funzione restituisce la proprietà richiesta di una posizione aperta, pre-selezionata usando
PositionGetS ymbol o PositionS elect. La proprietà della funzione deve essere di tipo double. Ci sono 2
varianti della funzione.
2. R estituisce true o false, a seconda del successo della esecuzione della funzione. If successful, the
value of the property is placed in a receiving variable passed by reference by the last parameter.
bool PositionGetDouble(
ENUM_POSITION_PROPERTY_DOUBLE property_id, // Property identifier
double& double_var // Qui si accetta il valore della proprietà
);
Parametri
property_id
[in] Identificatore della proprietà della posizione. Il valore può essere uno dei valori
dell'enumerazione ENUM _POS ITION_PR OPERTY_DOUBLE.
double_var
[ out] Variabile di tipo double, che accetta il valore della proprietà richiesta.
Valore restituito
V alore del tipo double. S e la funzione fallisce, viene restituito 0.
Nota
F or the " netting " interpretation of positions (ACCOUNT_M ARGIN_MODE_R ETAIL _NETTING and
A CCOUNT_M ARGIN_MODE_EXCHANGE), only one position can ex ist for a s ymbol at any moment of
time. T his position is a result of one or more deals. Do not confuse positions with valid pending
orders, which are also displayed on the T rading tab of the T oolbox window.
If individual positions are allowed (ACCOUNT_M ARGIN_MODE_R ETAIL _H EDGING), multiple positions
can be open for one s ymbol.
Per garantire la ricezione dei nuovi dati sulla posizione, si raccomanda di chiamare PositionS elect()
giusto prima di fare riferimento ad essi.
Vedi anche
PositionGetS ymbol(), PositionS elect(), Proprietà Posizioni
PositionGetInteger
La funzione restituisce la proprietà richiesta di una posizione aperta, pre-selezionata usando
PositionGetS ymbol o PositionS elect. La proprietà della posizione deve essere datetime, tipo int. Ci
sono 2 varianti della funzione.
2 . R estituisce true o false, a seconda del successo della esecuzione della funzione. In caso di successo,
il valore della proprietà è posto in una variabile passata per riferimento per l'ultimo parametro.
bool PositionGetInteger(
ENUM_POSITION_PROPERTY_INTEGER property_id, // Property identifier
long& long_var // Qui si accettano i valori della proprietà
);
Parametri
property_id
[in] Identificatore della proprietà della posizione. Il valore può essere uno dei valori
dell'enumerazione ENUM _POS ITION_PR OPERTY_INT EGER .
long_var
[ out] Variabile di tipo long che accetta il valore della proprietà richiesta.
Valore restituito
V alore del tipo long. S e la funzione fallisce, viene restituito 0.
Nota
F or the " netting " interpretation of positions (ACCOUNT_M ARGIN_MODE_R ETAIL _NETTING and
A CCOUNT_M ARGIN_MODE_EXCHANGE), only one position can ex ist for a s ymbol at any moment of
time. T his position is a result of one or more deals. Do not confuse positions with valid pending
orders, which are also displayed on the T rading tab of the T oolbox window.
If individual positions are allowed (ACCOUNT_M ARGIN_MODE_R ETAIL _H EDGING), multiple positions
can be open for one s ymbol.
Per garantire la ricezione dei nuovi dati sulla posizione, si raccomanda di chiamare PositionS elect()
giusto prima di fare riferimento ad essi.
Esempio:
//+--------------------------------------------------------------------------------+
//| Funzione di Trade |
//+--------------------------------------------------------------------------------+
void OnTrade()
{
//--- controlla se una posizione è presente e visualizza l'orario del suo cambiamento
if(PositionSelect(_Symbol))
{
//--- riceve l'ID della posizione per l'ulteriore lavoro
ulong position_ID=PositionGetInteger(POSITION_IDENTIFIER);
Print(_Symbol," posizione #",position_ID);
//--- riceve l'orario di formazione della posizione in millisecondi dal 01.01.1970
long create_time_msc=PositionGetInteger(POSITION_TIME_MSC);
PrintFormat("Posizione #%d POSITION_TIME_MSC = %i64 millisecondi => %s",position_ID,
create_time_msc,TimeToString(create_time_msc/1000));
//--- riceve l'orario dell'ultimo cambiamento della posizione, in secondi, dal 01.01.1970
long update_time_sec=PositionGetInteger(POSITION_TIME_UPDATE);
PrintFormat("Position #%d POSITION_TIME_UPDATE = %i64 secondi => %s",
position_ID,update_time_sec,TimeToString(update_time_sec));
//--- riceve l'orario dell'ultimo cambiamento della posizione, in millisecondi, dal 01.01.1970
long update_time_msc=PositionGetInteger(POSITION_TIME_UPDATE_MSC);
PrintFormat("Position #%d POSITION_TIME_UPDATE_MSC = %i64 millisecondi => %s",
position_ID,update_time_msc,TimeToString(update_time_msc/1000));
}
//---
}
Vedi anche
PositionGetS ymbol(), PositionS elect(), Proprietà Posizioni
PositionGetString
La funzione restituisce la proprietà richiesta di una posizione aperta, pre-selezionata usando
PositionGetS ymbol o PositionS elect. La proprietà della posizione deve essere di tipo stringa. Ci sono 2
varianti della funzione.
2 . R estituisce true o false, a seconda del successo della esecuzione della funzione. In caso di successo,
il valore della proprietà è posto in una variabile passata per riferimento per l'ultimo parametro.
bool PositionGetString(
ENUM_POSITION_PROPERTY_STRING property_id, // Property identifier
string& string_var // Qui si accetta il valore della proprietà
);
Parametri
property_id
[in] Identificatore della proprietà della posizione. Il valore può essere uno dei valori
dell'enumerazione ENUM _POS ITION_PR OPERTY_S TRING.
string_var
[ out] Variabile di tipo stringa che accetta il valore della proprietà richiesta.
Valore restituito
V alore di tipo string. S e la funzione fallisce, viene restituita una stringa vuota.
Nota
F or the " netting " interpretation of positions (ACCOUNT_M ARGIN_MODE_R ETAIL _NETTING and
A CCOUNT_M ARGIN_MODE_EXCHANGE), only one position can ex ist for a s ymbol at any moment of
time. T his position is a result of one or more deals. Do not confuse positions with valid pending
orders, which are also displayed on the T rading tab of the T oolbox window.
If individual positions are allowed (ACCOUNT_M ARGIN_MODE_R ETAIL _H EDGING), multiple positions
can be open for one s ymbol.
Per garantire la ricezione dei nuovi dati sulla posizione, si raccomanda di chiamare PositionS elect()
giusto prima di fare riferimento ad essi.
Vedi anche
PositionGetS ymbol(), PositionS elect(), Proprietà Posizioni
PositionGetTicket
The function returns the tick et of a position with the specified index in the list of open positions and
automatically selects the position to work with using functions PositionGetDouble, PositionGetInteger,
PositionGetS tring.
ulong PositionGetTicket(
int index // The number of a position in the list
);
Parameters
index
[ in] T he index of a position in the list of open positions, numeration starts ith 0.
w
Return Value
T he tick et of the position. R eturns 0 if the function fails.
Note
F or the " netting " interpretation of positions (ACCOUNT_M ARGIN_MODE_R ETAIL _NETTING and
A CCO UNT_M ARGIN_MO DE_EXC HANGE), only one position can ex ist for a s ymbol at any moment of
time. T his position is a result of one or more deals. Do not confuse positions with valid pending
orders, which are also displayed on the T rading tab of the T oolbox window.
If individual positions are allowed (ACCOUNT_M ARGIN_MODE_R ETAIL _H EDGING), multiple positions
can be open for one s ymbol.
To ensure receipt of fresh data about a position, it is recommended to call PositionS elect() right
before referring to them.
See also
PositionGetS ymbol(), PositionS elect(), Position Properties
OrdersTotal
R estituisce il numero dei correnti ordini.
int OrdersTotal();
Valore restituito
V alore di tipo int.
Nota
Non confondere i correnti ordini pendenti con posizioni, che sono anche visualizzati nella scheda
"Trade" del " BoxAttrezzi" del terminale client. Un ordine è una richiesta di condurre un' operazione,
mentre una posizione è il risultato di uno o più affari.
F or the " netting " interpretation of positions (ACCOUNT_M ARGIN_MODE_R ETAIL _NETTING and
A CCOUNT_M ARGIN_MODE_EXCHANGE), only one position can ex ist for a s ymbol at any moment of
time. T his position is a result of one or more deals. Do not confuse positions with valid pending
orders, which are also displayed on the T rading tab of the T oolbox window.
If individual positions are allowed (ACCOUNT_M ARGIN_MODE_R ETAIL _H EDGING), multiple positions
can be open for one s ymbol.
Vedi anche
OrderS elect(), OrderGetT ick et(), Proprietà degli Ordini
OrderGetTicket
R estituisce il T ick et di un ordine corrispondente e seleziona automaticamente l'ordine per un ulteriore
lavoro con esso utilizzando le funzioni.
ulong OrderGetTicket(
int index // Numero nella lista degli ordini
);
Parametri
index
[ in] Numero di un ordine nella lista degli ordini pendenti.
Valore restituito
V alore del tipo ulong . S e la funzione fallisce, viene restituito 0.
Nota
Non confondere i correnti ordini pendenti con posizioni, che sono anche visualizzati nella scheda
"Trade" del " BoxAttrezzi" del terminale client. Un ordine è una richiesta di condurre un' operazione,
mentre una posizione è il risultato di uno o più affari.
F or the " netting " interpretation of positions (ACCOUNT_M ARGIN_MODE_R ETAIL _NETTING and
A CCO UNT_M ARGIN_MO DE_EXC HANGE), only one position can ex ist for a s ymbol at any moment of
time. T his position is a result of one or more deals. Do not confuse positions with valid pending
orders, which are also displayed on the T rading tab of the T oolbox window.
If individual positions are allowed (ACCOUNT_M ARGIN_MODE_R ETAIL _H EDGING), multiple positions
can be open for one s ymbol.
La funzione OrderGetT ick et() copia i dati di un ordine nell'ambiente del programma, e successive
chiamate di OrderGetDouble(), OrderGetInteger(), OrderGetS tring() restituiscono i dati
precedentemente copiati. Ciò significa che l'ordine stesso non esiste più (o il suo prezzo di apertura,
S top Loss /T ak e Profit o scadenza sono cambiati), ma i dati di questo ordine possono essere ancora
ottenuti. Per garantire la ricezione di nuovi dati relativi ad un ordine, si consiglia di chiamare
OrderGetT ick et() giusto prima di fare riferimento ad essi.
Esempio:
voidOnStart()
{
//---variabili per la restituzione di valori dalle proprietà dell'ordine
ulong ticket;
double open_price;
double initial_volume;
datetime time_setup;
string symbol;
string type;
long order_magic;
long positionID;
//--- numero degli attuali ordini in corso
uint total=OrdersTotal();
Vedi anche
Orders T otal(), OrderS elect(), OrderGetInteger()
OrderSelect
Seleziona un ordine con cui lavorare. R estituisce true se la funzione è stata completata con successo.
Restituisce false se il completamento della funzione non è riuscito. Per ulteriori informazioni su un
errore chiamare GetLastError().
bool OrderSelect(
ulong ticket // Ticket ordine
);
Parametri
ticket
[ in] Order tick et.
Valore restituito
V alore di tipo bool.
Nota
N on confondere i correnti ordini pendenti con posizioni, che sono anche visualizzati nella scheda
" T rade" del " BoxA ttrezzi " del terminale client.
F or the " netting " interpretation of positions (ACCOUNT_M ARGIN_MODE_R ETAIL _NETTING and
A CCO UNT_M ARGIN_MO DE_EXC HANGE), only one position can ex ist for a s ymbol at any moment of
time. T his position is a result of one or more deals. Do not confuse positions with valid pending
orders, which are also displayed on the T rading tab of the T oolbox window.
If individual positions are allowed (ACCOUNT_M ARGIN_MODE_R ETAIL _H EDGING), multiple positions
can be open for one s ymbol.
La funzione OrderS elect() copia i dati di un ordine nell'ambiente del programma, e successive
chiamate di OrderGetDouble(), OrderGetInteger(), OrderGetS tring() restituiscono i dati
precedentemente copiati. Ciò significa che l'ordine stesso non esiste più (o il suo prezzo di apertura,
S top Loss /T ak e Profit o scadenza sono cambiati), ma i dati di questo ordine possono essere ancora
ottenuti. Per garantire la ricezione di nuovi dati relativi ad un ordine, si consiglia di chiamare
OrderS elect() giusto prima di fare riferimento ad essi.
Vedi anche
OrderGetInteger(), OrderGetDouble(), OrderGetS tring(), OrderCalcProfit(), OrderGetT ick et(), Order
Properties
OrderGetDouble
Restituisce la proprietà richiesta di un ordine, pre-selezionato utilizzando OrderGetT ick et o
OrderS elect. La proprietà dell'ordine deve essere di tipo double. Ci sono 2 varianti della funzione.
2. R estituisce true o false, a seconda se la funzione ha avuto successo. If successful, the value of the
property is placed in a target variable passed by reference by the last parameter.
bool OrderGetDouble(
ENUM _ORDER_PR OPERTY_DOUBLE property_id, // Property identifier
double& double_var // Qui si accettano i valori della proprietà
);
Parametri
property_id
[in] Identificatore della proprietà dell'ordine. Il valore può essere uno dei valori dell' enumarazione
ENUM _ORDER_PR OPERTY_DOUBLE.
double_var
[ out] Variabile del tipo double che accetta il valore della proprietà richiesta.
Valore restituito
V alore del tipo double. S e la funzione fallisce, viene restituito 0.
Nota
N on confondere i correnti ordini pendenti con posizioni, che sono anche visualizzati nella scheda
"T rade" del " BoxAttrezzi" del terminale client.
F or the " netting " interpretation of positions (ACCOUNT_M ARGIN_MODE_R ETAIL _NETTING and
A CCOUNT_M ARGIN_MODE_EXCHANGE), only one position can ex ist for a s ymbol at any moment of
time. T his position is a result of one or more deals. Do not confuse positions with valid pending
orders, which are also displayed on the T rading tab of the T oolbox window.
If individual positions are allowed (ACCOUNT_M ARGIN_MODE_R ETAIL _H EDGING), multiple positions
can be open for one s ymbol.
Per garantire la ricezione di dati freschi su un ordine, si consiglia di chiamare OrderS elect() giusto
prima di fare riferimento ad essi.
Vedi anche
Orders T otal(), OrderGetT ick et(), Proprietà degli Ordini
OrderGetInteger
Restituisce la proprietà ordine richiesta, pre-selezionto utilizzando OrderGetT ick et o OrderS elect. Le
proprietà degli ordini devono essere del datetime, tipo int. Ci sono 2 varianti della funzione.
2. R estituisce true o false a seconda del successo della funzione. In caso di successo, il valore della
proprietà è posto in una variabile di destinazione passata per riferimento dall ultimo parametro.
bool OrderGetInteger(
ENUM_ORDER_PROPERTY_INTEGER property_id, // Proprietà Identificatore
long& long_var // Qui si accetta il valore della proprietà
);
Parametri
property_id
[in] Identificatore della proprietà dell'ordine. Il valore può essere uno dei valori dell' enumerazione
ENUM _ORDER_PR OPERTY_INT EGER .
long_var
[ out] Variabile di tipo long che accetta il valore della proprietà richiesta.
Valore restituito
V alore del tipo long. S e la funzione fallisce, viene restituito 0.
Nota
N on confondere i correnti ordini pendenti con posizioni, che sono anche visualizzati nella scheda
"T rade" del " BoxAttrezzi" del terminale client.
F or the " netting " interpretation of positions (ACCOUNT_M ARGIN_MODE_R ETAIL _NETTING and
A CCOUNT_M ARGIN_MODE_EXCHANGE), only one position can ex ist for a s ymbol at any moment of
time. T his position is a result of one or more deals. Do not confuse positions with valid pending
orders, which are also displayed on the T rading tab of the T oolbox window.
If individual positions are allowed (ACCOUNT_M ARGIN_MODE_R ETAIL _H EDGING), multiple positions
can be open for one s ymbol.
Per garantire la ricezione di dati freschi su un ordine, si consiglia di chiamare OrderS elect() giusto
prima di fare riferimento ad essi.
Vedi anche
Orders T otal(), OrderGetT ick et(), Proprietà degli Ordini
OrderGetString
Restituisce la proprietà ordine richiesta, pre-selezionto utilizzando OrderGetT ick et o OrderS elect. La
proprietà dell'ordine deve essere di tipo stringa. Ci sono 2 varianti della funzione.
2. R estituisce true o false, a seconda del successo della funzione. In caso di successo, il valore della
proprietà è posto in una variabile di destinazione passata per riferimento dall ultimo parametro.
bool OrderGetString(
ENUM_ORDER_PROPERTY_STRING property_id, // Proprietà Identificatore
string& string_var // Qui si accetta il valore della proprietà
);
Parametri
property_id
[in] Identificatore della proprietà dell'ordine. Il valore può essere uno dei valori dell' enumerazione
ENUM _ORDER_PR OPERTY_S TRING.
string_var
[ out] Variabile di tipo stringa che accetta il valore della proprietà richiesta.
Valore restituito
V alore di tipo stringa.
Nota
N on confondere i correnti ordini pendenti con posizioni, che sono anche visualizzati nella scheda
"T rade" del " BoxAttrezzi" del terminale client.
F or the " netting " interpretation of positions (ACCOUNT_M ARGIN_MODE_R ETAIL _NETTING and
A CCOUNT_M ARGIN_MODE_EXCHANGE), only one position can ex ist for a s ymbol at any moment of
time. T his position is a result of one or more deals. Do not confuse positions with valid pending
orders, which are also displayed on the T rading tab of the T oolbox window.
If individual positions are allowed (ACCOUNT_M ARGIN_MODE_R ETAIL _H EDGING), multiple positions
can be open for one s ymbol.
Per garantire la ricezione di dati freschi su un ordine, si consiglia di chiamare OrderS elect() giusto
prima di fare riferimento ad essi.
Vedi anche
Orders T otal(), OrderGetT ick et(), Proprietà degli Ordini
HistorySelect
R ecupera la cronistoria degli affari e degli ordini per il periodo di tempo specificato del server time
bool HistorySelect(
datetime from_date, // Dalla data di
datetime to_date // Alla data di
);
Parametri
from_date
[ in] Data di inizio della richiesta.
to_date
[ in] F ine della data della richiesta.
Valore restituito
R estituisce true se ha successo, altrimenti restituisce false.
Nota
H istoryS elect() crea un elenco di ordini e un elenco di trades in un programma-mql5, per l'ulteriore
riferimento agli elementi di lista che usano le funzioni corrispondenti. La grandezza dell'elenco degli
affari può essere restituita con la funzione H istoryDeals T otal (), la grandezza della lista degli ordini
nella cronistoria può essere ottenuta usando H istoryOrders T otal(). La selezione nella lista degli
ordini dovrebbe essere meglio eseguita da H istoryOrderGetT ick et(), per gli elementi nella lista delle
offerte H istoryDealGetT ick et() si adatta meglio.
Dopo aver usato H istoryOrderS elect(), l'elenco degli ordini nella cronistoria disponibile per il
programma mql5 è resettata e nuovamente riempita dall'ordine trovato, se la ricerca di un ordine da
parte del tick et è stata completata con successo. Lo stesso vale per l'elenco delle offerte disponibili
per il programma mql5 - è resettato da H istoryDealS elect() e riempito nuovamente in caso di
avvenuta ricezione di un numero di tick et di un affare.
Esempio:
voidOnStart()
{
color BuyColor =clrBlue;
color SellColor=clrRed;
//--- richiede la cronistoria di trade
HistorySelect(0,TimeCurrent());
//--- crea oggetti
string name;
uint total=HistoryDealsTotal();
ulong ticket=0;
double price;
double profit;
datetime time;
string symbol;
long type;
long entry;
//--- per tutti gli affari
for(uint i=0;i<total;i++)
{
//--- cerca di ottenere i ticket degli affari
if((ticket=HistoryDealGetTicket(i))>0)
{
//--- ottiene le proprietà delle offerte
price =HistoryDealGetDouble(ticket,DEAL_PRICE);
time =(datetime)HistoryDealGetInteger(ticket,DEAL_TIME);
symbol=HistoryDealGetString(ticket,DEAL_SYMBOL);
type =HistoryDealGetInteger(ticket,DEAL_TYPE);
entry =HistoryDealGetInteger(ticket,DEAL_ENTRY);
profit=HistoryDealGetDouble(ticket,DEAL_PROFIT);
//--- solo per simbolo corrente
if(price && time && symbol==Symbol())
{
//--- crea l'oggetto prezzo
name="TradeHistory_Deal_"+string(ticket);
if(entry) ObjectCreate(0,name,OBJ_ARROW_RIGHT_PRICE,0,time,price,0,0);
else ObjectCreate(0,name,OBJ_ARROW_LEFT_PRICE,0,time,price,0,0);
//--- imposta le proprietà dell'oggetto
ObjectSetInteger(0,name,OBJPROP_SELECTABLE,0);
ObjectSetInteger(0,name,OBJPROP_BACK,0);
ObjectSetInteger(0,name,OBJPROP_COLOR,type?BuyColor:SellColor);
if(profit!=0) ObjectSetString(0,name,OBJPROP_TEXT,"Profit: "+string(profit));
}
}
}
//--- applica sul grafico
ChartRedraw();
}
Vedi anche
H istoryOrderS elect(), H istoryDealS elect()
HistorySelectByPosition
Parametri
position_id
[ in] Position identifier che è impostato per ogni ordine eseguito ed ogni affare.
Valore restituito
R estituisce true se ha successo, altrimenti restituisce false.
Nota
Non confondere gli ordini della cronistoria di trading con gli attuali ordini pendenti che vengono
visualizzati nella scheda " T rade" della barra " BoxAttrezzi" . L 'elenco degli ordini che sono stati
cancellati o hanno portato ad una transazione, possono essere visualizzati nella scheda " Cronistoria"
del " BoxAttrezzi" del terminale client.
H istoryS electByPosition() crea in un programma mql5 un elenco di ordini ed un elenco degli affari
con un determinato position identifier per ulteriore riferimento agli elementi dell'elenco utilizzando
le funzioni appropriate. Per conoscere la grandezza della lista delle offerte, utilizzare la funzione
H istoryDeals T otal(), la grandezza della lista degli ordini nella cronistoria può essere ottenuta usando
H istoryOrders T otal(). Per scorrere attraverso gli elementi della lista degli ordini, utilizzare
H istoryOrderGetT ick et(), per gli elementi della lista delle offerte - H istoryDealGetT ick et().
Dopo aver usato H istoryOrderS elect(), l'elenco degli ordini della cronistoria disponibili per il
programma mql5 viene azzerato e riempito di nuovo con l'ordine trovato, se la ricerca di un ordine
dal suo tick et ha avuto successo. Lo stesso si riferisce alla lista delle offerte disponibili per il
programma mql5 - viene resettato dalla funzione H istoryDealS elect() ed è riempito di nuovo, se un
affare è stato trovato con successo dal numero di tick et.
Vedi anche
H istoryS elect(), H istoryOrderGetT ick et(), Proprietà degli Ordini
HistoryOrderSelect
Seleziona un ordine dalla cronistoria per ulteriori chiamate attraverso funzioni appropriate. R estituisce
true se la funzione è stata completata con successo. R estituisce false se la funzione ha fallito. Per
ulteriori dettagli sull errore chiamare GetLastError().
bool HistoryOrderSelect(
ulong ticket // Ticket Ordine
);
Parametri
ticket
[ in] Order tick et.
Valore restituito
R estituisce true se ha successo, altrimenti false.
Nota
Non confondere gli ordini della cronistoria di trading con gli attuali ordini pendenti che vengono
visualizzati nella scheda " T rade" della barra " BoxAttrezzi" . L 'elenco degli ordini che sono stati
cancellati o hanno portato ad una transazione, possono essere visualizzati nella scheda " Cronistoria"
del " BoxAttrezzi" del terminale client.
H istoryOrderS elect() cancella in un programma-mql5 l'elenco degli ordini dalla cronistoria, disponibile
per le chiamate, e copia in esso un singolo ordine, se l'esecuzione di H istoryOrderS elect() è stata
completato con successo. S e avete bisogno di passare attraverso tutti gli affari selezionati da
H istoryS elect(), si dovrebbe meglio utilizzare H istoryOrderGetT ick et().
Vedi anche
H istoryS elect(), H istoryOrderGetT ick et(), Proprietà degli Ordini
HistoryOrdersTotal
Restituisce il numero di ordini nella cronistoria. Prima di chiamare H istoryOrders T otal(), per prima
cosa è necessario ricevere la cronistoria di offerte ed ordini con la funzione H istoryS elect() o la
funzione H istoryS electByPosition().
int HistoryOrdersTotal();
Valore restituito
Valore di tipo int.
Nota
Non confondere gli ordini della cronistoria di trading con gli attuali ordini pendenti che vengono
visualizzati nella scheda " T rade" della barra " BoxAttrezzi" . L 'elenco degli ordini che sono stati
cancellati o hanno portato ad una transazione, possono essere visualizzati nella scheda " Cronistoria"
del " BoxAttrezzi" del terminale client.
Vedi anche
H istoryS elect(), H istoryOrderS elect(), H istoryOrderGetT ick et(), Proprietà Ordini
HistoryOrderGetTicket
Parametri
index
[ in] Numero dell' ordine nella lista degli ordini.
Valore restituito
Valore del tipo ulong . S e la funzione fallisce, viene restituito 0.
Nota
Non confondere gli ordini della cronistoria di trading con gli attuali ordini pendenti che vengono
visualizzati nella scheda " T rade" della barra " BoxAttrezzi" . L 'elenco degli ordini che sono stati
cancellati o hanno portato ad una transazione, possono essere visualizzati nella scheda " Cronistoria"
del " BoxAttrezzi" del terminale client.
Esempio:
voidOnStart()
{
datetime from=0;
datetime to=TimeCurrent();
//--- richiede l'intera cronistoria
HistorySelect(from,to);
//---variabili per la restituzione di valori dalle proprietà dell'ordine
ulong ticket;
double open_price;
double initial_volume;
datetime time_setup;
datetime time_done;
string symbol;
string type;
long order_magic;
long positionID;
//--- numero degli attuali ordini in corso
uint total=HistoryOrdersTotal();
//--- passa attraverso gli ordini in un ciclo
for(uint i=0;i<total;i++)
{
//--- restituisce il ticket dell'ordine per la sua posizione nella lista
if((ticket=HistoryOrderGetTicket(i))>0)
{
Vedi anche
H istoryS elect(), H istoryOrders T otal(), H istoryOrderS elect(), Proprietà Ordini
HistoryOrderGetDouble
Restituisce la proprietà richiesta dell'ordine. La proprietà dell'ordine deve essere di tipo double. Ci
sono due varianti della funzione.
2. R estituisce true o false, a seconda del successo della funzione. In caso di successo, il valore della
proprietà è posto in una variabile di destinazione passata per riferimento dall ultimo parametro.
bool HistoryOrderGetDouble(
ulong ticket_number, // Ticket
ENUM_ORDER_PROPERTY_DOUBLE property_id, // Proprietà Identificatore
double& double_var // Qui si accetta il valore della proprietà
);
Parametri
ticket_number
[ in] Order tick et.
property_id
[in] Identificatore della proprietà dell'ordine. Il valore può essere uno dei valori dell' enumarazione
ENUM _ORDER_PR OPERTY_DOUBLE.
double_var
[ out] Variabile del tipo double che accetta il valore della proprietà richiesta.
Valore restituito
Valore del tipo double.
Nota
Non confondere gli ordini della cronistoria di trading con gli attuali ordini pendenti che vengono
visualizzati nella scheda " T rade" della barra " BoxAttrezzi" . L 'elenco degli ordini che sono stati
cancellati o hanno portato ad una transazione, possono essere visualizzati nella scheda " Cronistoria"
del " BoxAttrezzi" del terminale client.
Vedi anche
H istoryS elect(), H istoryOrders T otal(), H istoryOrderS elect(), Proprietà Ordini
HistoryOrderGetInteger
Restituisce la proprietà richiesta di un ordine. La proprietà dell'ordine deve essere datetime, tipo int.
Ci sono due varianti della funzione.
2. R estituisce true o false, a seconda del successo della funzione. In caso di successo, il valore della
proprietà è posto in una variabile di destinazione passata per riferimento dall ultimo parametro.
bool HistoryOrderGetInteger(
ulong ticket_number, // Ticket
ENUM_ORDER_PROPERTY_INTEGER property_id, // Proprietà Identificatore
long& long_var // Qui si accetta il valore della proprietà
);
Parametri
ticket_number
[ in] Order tick et.
property_id
[in] Identificatore della proprietà dell'ordine. Il valore può essere uno dei valori dell' enumerazione
ENUM _ORDER_PR OPERTY_INT EGER .
long_var
[ out] Variabile di tipo long che accetta il valore della proprietà richiesta.
Valore restituito
Valore di tipo long.
Nota
Non confondere gli ordini della cronistoria di trading con gli attuali ordini pendenti che vengono
visualizzati nella scheda " T rade" della barra " BoxAttrezzi" . L 'elenco degli ordini che sono stati
cancellati o hanno portato ad una transazione, possono essere visualizzati nella scheda " Cronistoria"
del " BoxAttrezzi" del terminale client.
Esempio:
//+--------------------------------------------------------------------------------+
//| Funzione di Trade |
//+--------------------------------------------------------------------------------+
void OnTrade()
{
//--- riceve i ticket dell'ultimo ordine dalla cronistoria di trading della settimana
ulong last_order=GetLastOrderTicket();
if(HistoryOrderSelect(last_order))
{
//--- orario di esecuzione dell'ordine in millisecondi dal 01.01.1970
long time_setup_msc=HistoryOrderGetInteger(last_order,ORDER_TIME_SETUP_MSC);
PrintFormat("Ordine #%d ORDER_TIME_SETUP_MSC=%i64 => %s",
last_order,time_setup_msc,TimeToString(time_setup_msc/1000));
//--- orario di esecuzione/annullamento dell'ordine, in millisecondi dal 01.01.1970
long time_done_msc=HistoryOrderGetInteger(last_order,ORDER_TIME_DONE_MSC);
PrintFormat("Ordine #%d ORDER_TIME_DONE_MSC=%i64 => %s",
last_order,time_done_msc,TimeToString(time_done_msc/1000));
}
else // notifica di fallimento
PrintFormat("HistoryOrderSelect() fallito per #%d. Codice Errore=%d",
last_order,GetLastError());
//---
}
//+--------------------------------------------------------------------------------+
//| Restituisce il ticket dell'ultimo ordine nella cronistoria oppure -1 |
//+--------------------------------------------------------------------------------+
ulong GetLastOrderTicket()
{
//--- richiede la cronistoria per gli ultimi 7 giorni
if(!GetTradeHistory(7))
{
//--- notifica sull'insuccesso della chiamata e restituisce -1
Print(__FUNCTION__," HistorySelect() ha restituito false");
return -1;
}
//---
ulong first_order,last_order,orders=HistoryOrdersTotal();
//--- lavora con gli ordini se ce ne sono
if(orders>0)
{
Print("Ordini = ",orders);
first_order=HistoryOrderGetTicket(0);
PrintFormat("primo_ordine = %d",first_order);
if(orders>1)
{
last_order=HistoryOrderGetTicket((int)orders-1);
PrintFormat("ultimo_ordine = %d",last_order);
return last_order;
}
return first_order;
}
//--- nessun ordine trovato, restituisco -1
return -1;
}
//+-----------------------------------------------------------------------------------------+
//| Richiede la cronistoria per gli ultimi giorni e restituisce false in caso di fallimento |
//+-----------------------------------------------------------------------------------------+
bool GetTradeHistory(int days)
{
//--- imposta il periodo di una settimana per richiedere la cronistoria di trading
datetime to=TimeCurrent();
datetime from=to-days*PeriodSeconds(PERIOD_D1);
ResetLastError();
//---- fa una richiesta e controlla il risultato
if(!HistorySelect(from,to))
{
Print(__FUNCTION__," HistorySelect=false. Error code=",GetLastError());
return false;
}
//--- cronitoria ricevuta con successo
return true;
}
Vedi anche
H istoryS elect(), H istoryOrders T otal(), H istoryOrderS elect(), Proprietà Ordini
HistoryOrderGetString
Restituisce la proprietà richiesta di un ordine. La proprietà dell'ordine deve essere di tipo stringa. Ci
sono due varianti della funzione.
2. R estituisce true o false, a seconda del successo della funzione. In caso di successo, il valore della
proprietà è posto in una variabile di destinazione passata per riferimento dall ultimo parametro.
bool HistoryOrderGetString(
ulong ticket_number, // Ticket
ENUM_ORDER_PROPERTY_STRING property_id, // Proprietà Identificatore
string& string_var // Qui si accetta il valore della proprietà
);
Parametri
ticket_number
[ in] Order tick et.
property_id
[in] Identificatore della proprietà dell'ordine. Il valore può essere uno dei valori dell' enumerazione
ENUM _ORDER_PR OPERTY_S TRING.
string_var
[ out] Variabile di tipo stringa.
Valore restituito
Valore di tipo stringa.
Nota
Non confondere gli ordini della cronistoria di trading con gli attuali ordini pendenti che vengono
visualizzati nella scheda " T rade" della barra " BoxAttrezzi" . L 'elenco degli ordini che sono stati
cancellati o hanno portato ad una transazione, possono essere visualizzati nella scheda " Cronistoria"
del " BoxAttrezzi" del terminale client.
Vedi anche
H istoryS elect(), H istoryOrders T otal(), H istoryOrderS elect(), Proprietà Ordini
HistoryDealSelect
Seleziona un affare nella cronistoria per un ulteriore chiamata attraverso funzioni appropriate.
Restituisce true se la funzione è stata completata con successo. R estituisce false se la funzione ha
fallito. Per ulteriori dettagli sull errore chiamare GetLastError().
bool HistoryDealSelect(
ulong ticket // Ticket dell'affare
);
Parametri
ticket
[ in] D eal tick et.
Valore restituito
R estituisce true se ha successo, altrimenti false.
Nota
Attenzione a non confondere ordini, affari e posizioni. Ogni affare è il risultato dell'esecuzione di un
ordine, ogni posizione è il risultato di riepilogo di uno o più affari.
HistoryDealS elect() cancella in un programma-mql5 la lista degli affari disponibili per riferimento, e
copia il singolo affare, se l'esecuzione di H istoryDealS elect() è stata completata con successo. S e
avete bisogno di passare attraverso tutti gli affari selezionati dalla funzioneH istoryS elect(), è
meglio usare H istoryDealGetT ick et().
Vedi anche
H istoryS elect(), H istoryDealGetT ick et(), Proprietà Affare
HistoryDealsTotal
Restituisce il numero di affare nella cronistoria. Prima di chiamare H istoryDeals T otal(), per prima cosa
è necessario ricevere la cronistoria di affari ed ordini con la funzione H istoryS elect() o
H istoryS electByPosition().
int HistoryDealsTotal();
Valore restituito
Valore di tipo int.
Nota
Attenzione a non confondere ordini, affari e posizioni. Ogni affare è il risultato dell'esecuzione di un
ordine, ogni posizione è il risultato di riepilogo di uno o più affari.
Vedi anche
H istoryS elect(), H istoryDealGetT ick et(), Proprietà Affare
HistoryDealGetTicket
La funzione seleziona un accordo per l'ulteriore elaborazione e restituisce il tick et nella cronistoria.
Prima di chiamare H istoryDealGetT ick et(), per prima cosa è necessario ricevere la cronitoria di affari
ed ordini con le funzioni H istoryS elect() o H istoryS electByPosition().
ulong HistoryDealGetTicket(
int index // ticket affare
);
Parametri
index
[ in] Numero di un affare nella lista degli affari
Valore restituito
Valore del tipo ulong . S e la funzione fallisce, viene restituito 0.
Nota
Attenzione a non confondere ordini, affari e posizioni. Ogni affare è il risultato dell'esecuzione di un
ordine, ogni posizione è il risultato di riepilogo di uno o più affari.
Esempio:
voidOnStart()
{
ulong deal_ticket; // ticket dell'affare
ulong order_ticket; // ticket dell'ordine su cui l'affare è stato eseguito
datetime transaction_time; // orario di esecuzione dell'affare
long deal_type ; // tipo di operazione di trade
long position_ID; // ID della posizione
string deal_description; // descrizione dell'operazione
double volume; // volume dell'operazione
string symbol; // simbolo dell'affare
//--- imposta la data di inizio e di fine per richiedere la cronistoria degli affari
datetime from_date=0; // dall'inizio inizio
datetime to_date=TimeCurrent();// fino al momento corrente
//--- richiede la cronistoria degli affari all'interno del periodo specificato
HistorySelect(from_date,to_date);
//--- numero totale nella lista degli affari
int deals=HistoryDealsTotal();
//--- ora elabora ogni trade
for(int i=0;i<deals;i++)
{
deal_ticket= HistoryDealGetTicket(i);
volume= HistoryDealGetDouble(deal_ticket,DEAL_VOLUME);
transaction_time=(datetime)HistoryDealGetInteger(deal_ticket,DEAL_TIME);
order_ticket= HistoryDealGetInteger(deal_ticket,DEAL_ORDER);
deal_type= HistoryDealGetInteger(deal_ticket,DEAL_TYPE);
symbol= HistoryDealGetString(deal_ticket,DEAL_SYMBOL);
position_ID= HistoryDealGetInteger(deal_ticket,DEAL_POSITION_ID);
deal_description= GetDealDescription(deal_type,volume,symbol,order_ticket,position_I
//--- esegue la buona formattazione per il numero dell'affare
string print_index=StringFormat("% 3d",i);
//--- mostra informazioni sull'affare
Print(print_index+": deal #",deal_ticket," at ",transaction_time,deal_description);
}
}
//+--------------------------------------------------------------------------------+
//| Restituisce la descrizione della stringa dell'operazione |
//+--------------------------------------------------------------------------------+
string GetDealDescription(long deal_type,double volume,string symbol,long ticket,long pos_ID)
{
string descr;
//---
switch(deal_type)
{
case DEAL_TYPE_BALANCE: return ("balance");
case DEAL_TYPE_CREDIT: return ("credit");
case DEAL_TYPE_CHARGE: return ("charge");
case DEAL_TYPE_CORRECTION: return ("correction");
case DEAL_TYPE_BUY: descr="buy"; break;
case DEAL_TYPE_SELL: descr="sell"; break;
case DEAL_TYPE_BONUS: return ("bonus");
case DEAL_TYPE_COMMISSION:© 2000-2021, MetaQuotes
return
Ltd ("additional commission");
case DEAL_TYPE_COMMISSION_DAILY: return ("daily commission");
case DEAL_TYPE_COMMISSION_MONTHLY: return ("monthly commission");
case DEAL_TYPE_COMMISSION_AGENT_DAILY: return ("daily agent commission");
1562 Funzioni di Trade
HistoryDealGetDouble
Restituisce la proprietà richiesta di un affare. La proprietà dell' affare deve essere di tipo double. Ci
sono due varianti della funzione.
2. R estituisce true o false, a seconda del successo della funzione. In caso di successo, il valore della
proprietà è posto in una variabile di destinazione passata per riferimento dall ultimo parametro.
bool HistoryDealGetDouble(
ulong ticket_number, // Ticket
ENUM_DEAL_PROPERTY_DOUBLE property_id, // Identificatore Proprietà
double& double_var // Qui si accetta il valore della proprietà
);
Parametri
ticket_number
[ in] D eal tick et.
property_id
[in] Identificatore di una proprietà affare. Il valore può essere uno dei valori dell' enumerazione
ENUM _DEAL _PR OPERTY_DOUBLE.
double_var
[ out] Variabile del tipo double che accetta il valore della proprietà richiesta.
Valore restituito
Valore del tipo double.
Nota
Attenzione a non confondere ordini, affari e posizioni. Ogni affare è il risultato dell'esecuzione di un
ordine, ogni posizione è il risultato di riepilogo di uno o più affari.
Vedi anche
H istoryS elect(), H istoryDeals T otal(), H istoryDealGetT ick et(), Deal Properties
HistoryDealGetInteger
Restituisce la proprietà richiesta di un affare. La proprietà dell' affare deve essere datetime, tipo int.
Ci sono due varianti della funzione.
2. R estituisce true o false, a seconda del successo della funzione. In caso di successo, il valore della
proprietà è posto in una variabile di destinazione passata per riferimento dall ultimo parametro.
bool HistoryDealGetInteger(
ulong ticket_number, // Ticket
ENUM_DEAL_PROPERTY_INTEGER property_id, // Proprietà Identificatore identifier
long& long_var // Qui si accetta il valore della proprietà
);
Parametri
ticket_number
[ in] T rade tick et.
property_id
[in] Identificatore della proprietà dell' affare. Il valore può essere uno dei valori dell'enumerazione
ENUM _DEAL _PR OPERTY_INT EGER .
long_var
[ out] Variabile di tipo long che accetta il valore della proprietà richiesta.
Valore restituito
Valore di tipo long.
Nota
Attenzione a non confondere ordini, affari e posizioni. Ogni affare è il risultato dell'esecuzione di un
ordine, ogni posizione è il risultato di riepilogo di uno o più affari.
Esempio:
//+--------------------------------------------------------------------------------+
//| Funzione di Trade |
//+--------------------------------------------------------------------------------+
void OnTrade()
{
//--- riceve i ticket dell'ultimo affare dalla cronistoria di trading della settimana
ulong last_deal=GetLastDealTicket();
if(HistoryDealSelect(last_deal))
{
ResetLastError();
//---- fa una richiesta e controlla il risultato
if(!HistorySelect(from,to))
{
Print(__FUNCTION__," HistorySelect=false. Error code=",GetLastError());
return false;
}
//--- cronitoria ricevuta con successo
return true;
}
Vedi anche
H istoryDeals T otal(), H istoryS elect(), H istoryDealGetT ick et(), Proprietà Affari
HistoryDealGetString
Restituisce la proprietà richiesta di un affare. La proprietà dell'affare deve essere di tipo stringa. Ci
sono due varianti della funzione.
2. R estituisce true o false, a seconda del successo della funzione. In caso di successo, il valore della
proprietà è posto in una variabile di destinazione passata per riferimento dall ultimo parametro.
bool HistoryDealGetString(
ulong ticket_number, // Ticket
ENUM_DEAL_PROPERTY_STRING property_id, // Proprietà Identificatore
string& string_var // Qui si accetta il valore della proprietà
);
Parametri
ticket_number
[ in] D eal tick et.
property_id
[in] Identificatore della proprietà dell' affare. Il valore può essere uno dei valori dell'enumerazione
ENUM _DEAL _PR OPERTY_S TRING.
string_var
[ out] Variabile di tipo stringa che accetta il valore della proprietà richiesta.
Valore restituito
Valore di tipo stringa.
Nota
Attenzione a non confondere ordini, affari e posizioni. Ogni affare è il risultato dell'esecuzione di un
ordine, ogni posizione è il risultato di riepilogo di uno o più affari.
Vedi anche
H istoryDeals T otal(), H istoryS elect(), H istoryDealGetT ick et(), Proprietà Affari
Segnali di Trade
Questo è il gruppo di funzioni consente di gestire segnali di trade. Le funzioni consentono:
· di iscriversi e cancellarsi alla copia del segnale utilizzando le funzioni del linguaggio MQL5.
Funzione Azione
S ignalBaseGetDouble Restituisce il valore della proprietà di tipo
double per il segnale selezionato
SignalBaseGetDouble
R estituisce il valore della proprietà di tipo double per il segnale selezionato.
double SignalBaseGetDouble(
ENUM_SIGNAL_BASE_DOUBLE property_id, // identificatore proprietà
);
Parametri
property_id
[in] Identificatore proprietà del S egnale. Il valore può essere uno dei valori dell'enumerazione
ENUM _S IGNAL _BAS E_DOUBLE.
Valore restituito
I l valore della proprietà di tipo double del segnale selezionato.
SignalBaseGetInteger
R estituisce il valore della proprietà di tipo integer per il segnale selezionato.
long SignalBaseGetInteger(
ENUM_SIGNAL_BASE_INTEGER property_id, // identificatore proprietà
);
Parametri
property_id
[in] Identificatore proprietà del S egnale. Il valore può essere uno dei valori dell' enumerazione
ENUM _S IGNAL _BAS E_INT EGER .
Valore restituito
I l valore della proprietà di tipo integer del segnale selezionato.
SignalBaseGetString
R estituisce il valore della proprietà di tipo string per il segnale selezionato.
string SignalBaseGetString(
ENUM_SIGNAL_BASE_STRING property_id, // identificatore proprietà
);
Parametri
property_id
[in] Identificatore proprietà del S egnale. Il valore può essere uno dei valori dell' enumerazione
ENUM _S IGNAL _BAS E_S TRING.
Valore restituito
I l valore della proprietà di tipo string del segnale selezionato.
SignalBaseSelect
S eleziona un segnale da segnali, disponibili nel terminale per ulteriore lavorazione con esso.
bool SignalBaseSelect(
int index // indice dei segnali
);
Parametri
index
[ in] L 'indice del segnale in base ai segnali di trading.
Valore restituito
R estituisce vero se ha successo, altrimenti restituisce false. Per saperne di più sull' errore chiamare
G etLastError().
Esempio:
void OnStart()
{
//--- ottiene il numero totale di segnali nel terminale
int total=SignalBaseTotal();
//--- elabora tutti i segnali
for(int i=0;i<total;i++)
{
//--- seleziona il segnale per indice
if(SignalBaseSelect(i))
{
//--- ottiene le proprietа del segnale
long id =SignalBaseGetInteger(SIGNAL_BASE_ID); // id segnale
long pips =SignalBaseGetInteger(SIGNAL_BASE_PIPS); // profitto in pips
long subscr=SignalBaseGetInteger(SIGNAL_BASE_SUBSCRIBERS); // numero di sottoscritti
string name =SignalBaseGetString(SIGNAL_BASE_NAME); // nome del segnale
double price =SignalBaseGetDouble(SIGNAL_BASE_PRICE); // prezzo del segnale
string curr =SignalBaseGetString(SIGNAL_BASE_CURRENCY); // signal currency
//--- stampa tutti i segnali con profitto, gratuiti, con i sottoscritti
if(price==0.0 && pips>0 && subscr>0)
PrintFormat("id=%d, name=\"%s\", currency=%s, pips=%d, subscribers=%d",id,name,curr,pip
}
else PrintFormat("Errore nella chiamata di SignalBaseSelect. Error code=%d",GetLastError());
}
}
SignalBaseTotal
R estituisce la quantità totale di segnali, disponibile nel terminale.
int SignalBaseTotal();
Valore restituito
La quantità totale di segnali, disponibile in terminale.
SignalInfoGetDouble
R estituisce il valore della proprietà di tipo double delle impostazioni di copia del segnale.
double SignalInfoGetDouble(
ENUM_SIGNAL_INFO_DOUBLE property_id, // identificatore proprietà
);
Parametri
property_id
[in] Identificatore proprietà di parametri di copia del segnale. Il valore può essere uno dei valori
dell'enumerazione ENUM _S IGNAL _INFO_DOUBLE.
Valore restituito
I l valore della proprietà di tipo double delle impostazioni di copia del segnale.
SignalInfoGetInteger
R estituisce il valore della proprietà di tipo integer delle impostazioni di copia del segnale.
long SignalInfoGetInteger(
ENUM_SIGNAL_INFO_INTEGER property_id, // identificatore proprietà
);
Parametri
property_id
[in] Identificatore proprietà di parametri di copia del segnale. Il valore può essere uno dei valori
dell'enumerazione ENUM _S IGNAL _INFO_INT EGER .
Valore restituito
I l valore della proprietà di tipo integer delle impostazioni di copia del segnale.
SignalInfoGetString
R estituisce il valore della proprietà di tipo string delle impostazioni di copia del segnale.
string SignalInfoGetString(
ENUM_SIGNAL_INFO_STRING property_id, // identificatore proprietà
);
Parametri
property_id
[in] Identificatore proprietà di parametri di copia del segnale. Il valore può essere uno dei valori
dell'enumerazione ENUM _S IGNAL _INFO_S TRING.
Valore restituito
I l valore della proprietà di tipo double delle impostazioni di copia del segnale.
SignalInfoSetDouble
I mposta il valore della proprietà di tipo double delle impostazioni di copia del segnale.
bool SignalInfoSetDouble(
ENUM_SIGNAL_INFO_DOUBLE property_id, // identificatore proprietà
double value // nuovo valore
);
Parametri
property_id
[in] Identificatore proprietà di parametri di copia del segnale. Il valore può essere uno dei valori
dell'enumerazione ENUM _S IGNAL _INFO_DOUBLE.
valore
[ in] Il valore delle proprietà di impostazioni di copia dei segnali.
Valore restituito
Restituisce true se la proprietà è stata modificata, altrimenti restituisce false. Per saperne di più
sull' errore chiamare GetLastError().
SignalInfoSetInteger
I mposta il valore della proprietà di tipo integer delle impostazioni di copia del segnale.
bool SignalInfoSetInteger(
ENUM_SIGNAL_INFO_INTEGER property_id, // identificatore proprietà
long value // nuovo valore
);
Parametri
property_id
[in] Identificatore proprietà di parametri di copia del segnale. Il valore può essere uno dei valori
dell'enumerazione ENUM _S IGNAL _INFO_INT EGER .
valore
[ in] Il valore delle proprietà di impostazioni di copia dei segnali.
Valore restituito
Restituisce true se la proprietà è stata modificata, altrimenti restituisce false. Per saperne di più
sull' errore chiamare GetLastError().
SignalSubscribe
S ottoscrizione al segnale di trading.
bool SignalSubscribe(
long signal_id // signal id
);
Parametri
signal_id
[ in] Identificatore S egnale.
Valore restituito
Restituisce true se la sottoscrizione ha avuto successo, altrimenti restituisce false. Per saperne di
più sull' errore chiamare GetLastError().
SignalUnsubscribe
A nnulla sottoscrizione
bool SignalUnsubscribe();
Valore restituito
Restituisce true se sottoscrizione é stata annullata correttamente, altrimenti restituisce false. Per
saperne di più sull' errore chiamare GetLastError().
Funzioni di Rete
Iprogrammi MQL5 possono scambiare dati con server remoti, nonché inviare notifiche push, e-mail e
dati via FT P.
· I l gruppo di funzioni ock et * consente di stabilire una connessione T CP (incluso un T L S sicuro) con
S
Per la sicurezza dell'utente finale, l'elenco degli indirizzi IP consentiti è implementato dal lato client.
L 'elenco contiene gli indirizzi IP a cui il programma MQL5 può connettersi tramite le funzioni S ock et* e
W ebR equest. A d esempio, se il programma deve connettersi a https ://www.someserver.com, questo
indirizzo deve essere esplicitamente indicato da un utente terminale nell'elenco. Un indirizzo non può
essere aggiunto a livello di codice.
Aggiunge un messaggio esplicito al programma MQL5 per notificare all'utente la necessità di una
configurazione aggiuntiva. Puoi farlo via descrizione #property , Alert o Print.
Funzione Azione
S ock etCreate Creare un sock et con flag specificati e
restituisce il relativo handle
Funzione Azione
S ock etIs R eadable Ottiene un numero di byte che può essere letto
da un sock et
SocketCreate
Crea un sock et con flag specificati e restituisce il relativo handle.
int SocketCreate(
uint flags // flags
);
Pparametri
flags
[in] Combinazione di flag che definiscono la modalità di funzionamento con un sock et. Attualmente
è supportato un solo flag : — S OCKET_DEFAUL T .
Valore di Ritorno
In caso di successo di creazione di un sock et, restituisce il relativo handle, altrimenti
INVA L ID_HANDLE.
Note
Per liberare memoria del computer da un sock et non utilizzato, chiamare S ock etClose per questo.
È possibile creare un massimo di 128 sock et da un programma MQL5. S e il limite viene superato,
viene scritto l'errore 5271 (ERR_NETS OCKET_T OO_M ANY_OPENED) _LastError.
La funzione può essere chiamata solo da Ex pert Advisors e scripts, poiché vengono eseguiti nei
relativi thread di esecuzione. S e si chiama da un indicatore, GetLastError() restituisce l'errore 4014
- " Function is not allowed for call (la funzione non è consentita per la chiamata)" .
Esempio:
//+------------------------------------------------------------------+
//| SocketExample.mq5 |
//| Copyright 2018, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "Aggiungi indirizzo all'elenco di quelli consentiti nelle impostazioni del te
#property script_show_inputs
if(len<0)
return(false);
//--- se viene utilizzata una connessione TLS sicura tramite la porta 443
if(ExtTLS)
return(SocketTlsSend(socket,req,len)==len);
//--- se viene utilizzata la connessione TCP standard
return(SocketSend(socket,req,len)==len);
}
//+------------------------------------------------------------------+
//| Legge la risposta del server |
//+------------------------------------------------------------------+
bool HTTPRecv(int socket,uint timeout)
{
char rsp[];
string result;
uint timeout_check=GetTickCount()+timeout;
//--- legge i dati dai socket finché sono ancora presenti ma non più lunghi del timeout
do
{
uint len=SocketIsReadable(socket);
if(len)
{
int rsp_len;
// --- vari comandi di lettura a seconda che la connessione sia sicura o meno
if(ExtTLS)
rsp_len=SocketTlsRead(socket,rsp,len);
else
rsp_len=SocketRead(socket,rsp,len,timeout);
// --- analizza la risposta
if(rsp_len>0)
{
result+=CharArrayToString(rsp,0,rsp_len);
// --- stampa solo l'intestazione della risposta
int header_end=StringFind(result,"\r\n\r\n");
if(header_end>0)
{
Print("Header risposta HTTP ricevuto:");
Print(StringSubstr(result,0,header_end));
return(true);
}
}
}
}
while(GetTickCount()<timeout_check && !IsStopped());
return(false);
}
//+------------------------------------------------------------------+
//| Funzione Start del programma di script |
//+------------------------------------------------------------------+
void OnStart()
{
int socket=SocketCreate();
//--- controlla l'handle
if(socket!=INVALID_HANDLE)
{
//--- connetti se tutto va bene
if(SocketConnect(socket,Address,Port,1000))
{
Print("Connessione stabilita a ",Address,":",Port);
string subject,issuer,serial,thumbprint;
datetime expiration;
// --- se la connessione è protetta dal certificato, visualizza i suoi dati
if(SocketTlsCertificate(socket,subject,issuer,serial,thumbprint,expiration))
{
Print("TLS certificate:");
Print(" Owner: ",subject);
Print(" Issuer: ",issuer);
Print(" Number: ",serial);
Print(" Print: ",thumbprint);
Print(" Expiration: ",expiration);
ExtTLS=true;
}
// --- invia richiesta GET al server
if(HTTPSend(socket,"GET / HTTP/1.1\r\nHost: www.mql5.com\r\n\r\n"))
{
Print("GET request inviata");
// --- leggi la risposta
if(!HTTPRecv(socket,1000))
Print("Impossibile ottenere una risposta, errore ",GetLastError());
}
else
Print("Impossibile inviare la richiesta GET, errore",GetLastError());
}
else
{
Print("Connessione a ",Address,":",Port," fallita, errore ",GetLastError());
}
//--- chiude un socket dopo averlo usato
SocketClose(socket);
}
else
Print("Impossibile creare un socket, errore ",GetLastError());
}
//+------------------------------------------------------------------+
SocketClose
Chiude un sock et.
bool SocketClose(
const int socket // handle del socket
);
Pparametri
socket
[in] H andle del sock et da chiudere. L 'handle viene restituito dalla funzione S ock etCreate. Quando
viene passato un handle errato, viene scritto l'errore 5270 (ERR_NETS OCKET_INVAL IDHANDLE)
_LastError.
Valore di Ritorno
R estituisce true se ha successo, altrimenti false.
Nota
Se una connessione tramite S ock etConnect è stata precedentemente creata per un sock et, viene
interrotta.
La funzione può essere chiamata solo da Ex pert Advisors e scripts, poiché vengono eseguiti nei
relativi thread di esecuzione. S e si chiama da un indicatore, GetLastError() restituisce l'errore 4014
- " Function is not allowed for call (la funzione non è consentita per la chiamata)" .
Esempio:
//+------------------------------------------------------------------+
//| SocketExample.mq5 |
//| Copyright 2018, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "Aggiungi indirizzo all'elenco di quelli consentiti nelle impostazioni del te
#property script_show_inputs
return(false);
//--- se viene utilizzata una connessione TLS sicura tramite la porta 443
if(ExtTLS)
return(SocketTlsSend(socket,req,len)==len);
//--- se viene utilizzata la connessione TCP standard
return(SocketSend(socket,req,len)==len);
}
//+------------------------------------------------------------------+
//| Legge la risposta del server |
//+------------------------------------------------------------------+
bool HTTPRecv(int socket,uint timeout)
{
char rsp[];
string result;
uint timeout_check=GetTickCount()+timeout;
//--- legge i dati dai socket finché sono ancora presenti ma non più lunghi del timeout
do
{
uint len=SocketIsReadable(socket);
if(len)
{
int rsp_len;
// --- vari comandi di lettura a seconda che la connessione sia sicura o meno
if(ExtTLS)
rsp_len=SocketTlsRead(socket,rsp,len);
else
rsp_len=SocketRead(socket,rsp,len,timeout);
// --- analizza la risposta
if(rsp_len>0)
{
result+=CharArrayToString(rsp,0,rsp_len);
// --- stampa solo l'intestazione della risposta
int header_end=StringFind(result,"\r\n\r\n");
if(header_end>0)
{
Print("Header risposta HTTP ricevuto:");
Print(StringSubstr(result,0,header_end));
return(true);
}
}
}
}
while(GetTickCount()<timeout_check && !IsStopped());
return(false);
}
//+------------------------------------------------------------------+
//| Funzione Start del programma di script |
//+------------------------------------------------------------------+
void OnStart()
{
int socket=SocketCreate();
//--- controlla l'handle
if(socket!=INVALID_HANDLE)
{
//--- connetti se tutto va bene
if(SocketConnect(socket,Address,Port,1000))
{
Print("Connessione stabilita a ",Address,":",Port);
string subject,issuer,serial,thumbprint;
datetime expiration;
// --- se la connessione è protetta dal certificato, visualizza i suoi dati
if(SocketTlsCertificate(socket,subject,issuer,serial,thumbprint,expiration))
{
Print("TLS certificate:");
Print(" Owner: ",subject);
Print(" Issuer: ",issuer);
Print(" Number: ",serial);
Print(" Print: ",thumbprint);
Print(" Expiration: ",expiration);
ExtTLS=true;
}
// --- invia richiesta GET al server
if(HTTPSend(socket,"GET / HTTP/1.1\r\nHost: www.mql5.com\r\n\r\n"))
{
Print("GET request inviata");
// --- leggi la risposta
if(!HTTPRecv(socket,1000))
Print("Impossibile ottenere una risposta, errore ",GetLastError());
}
else
Print("Impossibile inviare la richiesta GET, errore",GetLastError());
}
else
{
Print("Connessione a ",Address,":",Port," fallita, errore ",GetLastError());
}
//--- chiude un socket dopo averlo usato
SocketClose(socket);
}
else
Print("Impossibile creare un socket, errore ",GetLastError());
}
//+------------------------------------------------------------------+
SocketConnect
Connette al server con il controllo del timeout.
bool SocketConnect(
int socket, // socket
const string server, // indirizzo di connessione
uint port, // porta di connessione
uint timeout_receive_ms // timeout connesione
);
Pparametri
socket
[in] Il sock et handle restituito dalla funzione S ock etCreate. Quando viene passato un handle
errato, viene scritto l'errore 5270 (ERR_NETS OCKET_INVAL IDHANDLE) _LastError.
server
[ in] Nome del dominio del server a cui ci si vuole connettere, o il suo indirizzo IP.
port
[ in] Numero della porta di connessione.
timeout_receive_ms
[in] T imeout della connessione in millisecondi. S e la connessione non viene stabilita entro tale
intervallo di tempo, i tentativi vengono interrotti.
Valore di Ritorno
S e la connessione ha esito positivo, restituisce true, altrimenti false.
Nota
L 'indirizzo di connessione deve essere aggiunto all'elenco di quelli consentiti sul lato client
(S trumenti\Opzioni\Ex pert Advisor).
La funzione può essere chiamata solo da Ex pert Advisors e scripts, poiché vengono eseguiti nei
relativi thread di esecuzione. S e si chiama da un indicatore, GetLastError() restituisce l'errore 4014
- " Function is not allowed for call (la funzione non è consentita per la chiamata)" .
Esempio:
//+------------------------------------------------------------------+
//| SocketExample.mq5 |
//| Copyright 2018, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "Aggiungi indirizzo all'elenco di quelli consentiti nelle impostazioni del te
#property script_show_inputs
Print(StringSubstr(result,0,header_end));
return(true);
}
}
}
}
while(GetTickCount()<timeout_check && !IsStopped());
return(false);
}
//+------------------------------------------------------------------+
//| Funzione Start del programma di script |
//+------------------------------------------------------------------+
void OnStart()
{
int socket=SocketCreate();
//--- controlla l'handle
if(socket!=INVALID_HANDLE)
{
//--- connetti se tutto va bene
if(SocketConnect(socket,Address,Port,1000))
{
Print("Connessione stabilita a ",Address,":",Port);
string subject,issuer,serial,thumbprint;
datetime expiration;
// --- se la connessione è protetta dal certificato, visualizza i suoi dati
if(SocketTlsCertificate(socket,subject,issuer,serial,thumbprint,expiration))
{
Print("TLS certificate:");
Print(" Owner: ",subject);
Print(" Issuer: ",issuer);
Print(" Number: ",serial);
Print(" Print: ",thumbprint);
Print(" Expiration: ",expiration);
ExtTLS=true;
}
// --- invia richiesta GET al server
if(HTTPSend(socket,"GET / HTTP/1.1\r\nHost: www.mql5.com\r\n\r\n"))
{
Print("GET request inviata");
// --- leggi la risposta
if(!HTTPRecv(socket,1000))
Print("Impossibile ottenere una risposta, errore ",GetLastError());
}
else
Print("Impossibile inviare la richiesta GET, errore",GetLastError());
}
else
{
SocketIsConnected
Controlla se il sock et è attualmente connesso.
bool SocketIsConnected(
const int socket // handle del socket
);
Pparametri
socket
[in] H andle del sock et restituito dalla funzione S ock etCreate(). Quando viene passato un handle
errato _LastError, si attiva l'errore 5270 (ERR_NETS OCKET_INVAL IDHANDLE).
Valore di Ritorno
R estituisce true se il sock et è connesso, altrimenti - false.
Nota
La funzione S ock etIsConnected() consente di verificare lo stato corrente della connessione sock et.
La funzione può essere chiamata solo da Ex pert Advisors e scripts, poiché vengono eseguiti nei
relativi thread di esecuzione. S e si chiama da un indicatore, GetLastError() restituisce l'errore 4014
- " Function is not allowed for call (la funzione non è consentita per la chiamata)" .
Guarda anche
S ock etConnect, S ock etIs W ritable, S ock etCreate, S ock etClose
SocketIsReadable
Ottieni un numero di byte che può essere letto da un sock et.
uint SocketIsReadable(
const int socket // handle del socket
);
Pparametri
socket
[ in] Il sock et handle restituito dalla funzione S ock etCreate. Quando viene passato un handle errato
_ LastError, si attiva l'errore 5270 (ERR_NETS OCKET_INVAL IDHANDLE).
Valore di Ritorno
N umero di byte che possono essere letti. In caso di errore, viene restituito 0.
Nota
Se si verifica un errore su un sock et di sistema durante l'esecuzione della funzione, la connessione
stabilita tramite S ock etConnect viene interrotta.
Prima di chiamare S ock etR ead, controlla se il sock et contiene dati per la lettura. Altrimenti, se non
ci sono dati, la funzione S ock etR ead attende i dati entro il timeout_ms ritardando l'esecuzione del
programma.
La funzione può essere chiamata solo da Ex pert Advisors e scripts, poiché vengono eseguiti nei
relativi thread di esecuzione. S e si chiama da un indicatore, GetLastError() restituisce l'errore 4014
- " Function is not allowed for call (la funzione non è consentita per la chiamata)" .
Esempio:
//+------------------------------------------------------------------+
//| SocketExample.mq5 |
//| Copyright 2018, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "Aggiungi indirizzo all'elenco di quelli consentiti nelle impostazioni del te
#property script_show_inputs
int len=StringToCharArray(request,req)-1;
if(len<0)
return(false);
//--- se viene utilizzata una connessione TLS sicura tramite la porta 443
if(ExtTLS)
return(SocketTlsSend(socket,req,len)==len);
//--- se viene utilizzata la connessione TCP standard
return(SocketSend(socket,req,len)==len);
}
//+------------------------------------------------------------------+
//| Legge la risposta del server |
//+------------------------------------------------------------------+
bool HTTPRecv(int socket,uint timeout)
{
char rsp[];
string result;
uint timeout_check=GetTickCount()+timeout;
//--- legge i dati dai socket finché sono ancora presenti ma non più lunghi del timeout
do
{
uint len=SocketIsReadable(socket);
if(len)
{
int rsp_len;
// --- vari comandi di lettura a seconda che la connessione sia sicura o meno
if(ExtTLS)
rsp_len=SocketTlsRead(socket,rsp,len);
else
rsp_len=SocketRead(socket,rsp,len,timeout);
// --- analizza la risposta
if(rsp_len>0)
{
result+=CharArrayToString(rsp,0,rsp_len);
// --- stampa solo l'intestazione della risposta
int header_end=StringFind(result,"\r\n\r\n");
if(header_end>0)
{
Print("Header risposta HTTP ricevuto:");
Print(StringSubstr(result,0,header_end));
return(true);
}
}
}
}
while(GetTickCount()<timeout_check && !IsStopped());
return(false);
}
//+------------------------------------------------------------------+
//| Funzione Start del programma di script |
//+------------------------------------------------------------------+
void OnStart()
{
int socket=SocketCreate();
//--- controlla l'handle
if(socket!=INVALID_HANDLE)
{
//--- connetti se tutto va bene
if(SocketConnect(socket,Address,Port,1000))
{
Print("Connessione stabilita a ",Address,":",Port);
string subject,issuer,serial,thumbprint;
datetime expiration;
// --- se la connessione è protetta dal certificato, visualizza i suoi dati
if(SocketTlsCertificate(socket,subject,issuer,serial,thumbprint,expiration))
{
Print("TLS certificate:");
Print(" Owner: ",subject);
Print(" Issuer: ",issuer);
Print(" Number: ",serial);
Print(" Print: ",thumbprint);
Print(" Expiration: ",expiration);
ExtTLS=true;
}
// --- invia richiesta GET al server
if(HTTPSend(socket,"GET / HTTP/1.1\r\nHost: www.mql5.com\r\n\r\n"))
{
Print("GET request inviata");
// --- leggi la risposta
if(!HTTPRecv(socket,1000))
Print("Impossibile ottenere una risposta, errore ",GetLastError());
}
else
Print("Impossibile inviare la richiesta GET, errore",GetLastError());
}
else
{
Print("Connessione a ",Address,":",Port," fallita, errore ",GetLastError());
}
//--- chiude un socket dopo averlo usato
SocketClose(socket);
}
else
Print("Impossibile creare un socket, errore ",GetLastError());
}
//+------------------------------------------------------------------+
SocketIsW ritable
Verifica se i dati possono essere scritti su un sock et al momento attuale.
bool SocketIsWritable(
const int socket // handle del socket
);
Pparametri
socket
[in] Il sock et handle restituito dalla funzione S ock etCreate. Quando viene passato un handle
errato, viene scritto l'errore 5270 (ERR_NETS OCKET_INVAL IDHANDLE) _LastError.
Valore di Ritorno
R estituisce true se la scrittura è possibile, altrimenti false.
Nota
Questa funzione ti permette di verificare se è possibile scrivere dati su un sock et in questo
momento.
La funzione può essere chiamata solo da Ex pert Advisors e scripts, poiché vengono eseguiti nei
relativi thread di esecuzione. S e si chiama da un indicatore, GetLastError() restituisce l'errore 4014
- " Function is not allowed for call (la funzione non è consentita per la chiamata)" .
SocketTimeouts
I mposta i timeout per la ricezione e l'invio di dati per un oggetto di sistema sock et.
bool SocketTimeouts(
int socket, // socket
uint timeout_send_ms, // timeout di invio dati
uint timeout_receive_ms // timeout ottenimento dati
);
Pparametri
socket
[in] Il sock et handle restituito dalla funzione S ock etCreate. Quando viene passato un handle
errato, viene scritto l'errore 5270 (ERR_NETS OCKET_INVAL IDHANDLE) _LastError.
timeout_send_ms
[ in] T imeout di invio dati, in millisecondi.
timeout_receive_ms
[ in] T imeout di ottenimento dati, in millisecondi.
Valore di Ritorno
R estituisce true se ha successo, altrimenti false.
Nota
N on confondere i timeout degli oggetti di sistema con quelli impostati durante la lettura dei dati
tramite S ock etR ead. S ock etT imeout imposta una volta i timeout per un oggetto sock et nel sistema
operativo. Questi timeout devono essere applicati a tutte le funzioni per la lettura e l'invio di dati
tramite questo sock et. In S ock etR ead, il timeout è impostato per una determinata operazione di
lettura dei dati.
La funzione può essere chiamata solo da Ex pert Advisors e scripts, poiché vengono eseguiti nei
relativi thread di esecuzione. S e si chiama da un indicatore, GetLastError() restituisce l'errore 4014
- " Function is not allowed for call (la funzione non è consentita per la chiamata)" .
SocketRead
Legge i dati da un sock et.
int SocketRead(
int socket, // socket
uchar& buffer[], // buffer per la lettura dei dati dal socket
uint buffer_maxlen, // numero di byte da leggere
uinttimeout_ms// timeout lettura
);
Pparametri
socket
[ in] Il sock et handle restituito dalla funzione S ock etCreate. Quando viene passato un handle errato
_ LastError, si attiva l'errore 5270 (ERR_NETS OCKET_INVAL IDHANDLE).
buffer
[out] R iferimento all'array di tipo uchar in cui vengono letti i dati. La dimensione dinamica
dell'array è aumentata dal numero di byte letti. La dimensione dell'array non può superare INT_M AX
(2147483647).
buffer_maxlen
[in] Numero di byte da leggere nell'arraybuffer[]. I dati non adattati all'array rimangono nel sock et.
Possono essere ricevuti dalla prossima chiamata S ock etR ead. buffer_maxlen cannot ex ceed
INT_M AX ( 2147483647).
timeout_ms
[in] T empo di lettura dei dati in millisecondi. S e i dati non vengono ottenuti entro questo tempo, i
tentativi vengono interrotti e la funzione restituisce -1.
Valore di Ritorno
S e ha successo, restituisce il numero di byte letti. In caso di errore, viene restituito -1.
Nota
Se si verifica un errore su un sock et di sistema durante l'esecuzione della funzione, la connessione
stabilita tramite S ock etConnect viene interrotta.
I n caso di errore di lettura dei dati, l'errore 5273 (ERR_NETS OCKET_IO_ERR OR ) viene scritto in
_ LastError.
La funzione può essere chiamata solo da Ex pert Advisors e scripts, poiché vengono eseguiti nei
relativi thread di esecuzione. S e si chiama da un indicatore, GetLastError() restituisce l'errore 4014
- " Function is not allowed for call (la funzione non è consentita per la chiamata)" .
Esempio:
//+------------------------------------------------------------------+
//| SocketExample.mq5 |
//| Copyright 2018, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
int header_end=StringFind(result,"\r\n\r\n");
if(header_end>0)
{
Print("Header risposta HTTP ricevuto:");
Print(StringSubstr(result,0,header_end));
return(true);
}
}
}
}
while(GetTickCount()<timeout_check && !IsStopped());
return(false);
}
//+------------------------------------------------------------------+
//| Funzione Start del programma di script |
//+------------------------------------------------------------------+
void OnStart()
{
int socket=SocketCreate();
//--- controlla l'handle
if(socket!=INVALID_HANDLE)
{
//--- connetti se tutto va bene
if(SocketConnect(socket,Address,Port,1000))
{
Print("Connessione stabilita a ",Address,":",Port);
string subject,issuer,serial,thumbprint;
datetime expiration;
// --- se la connessione è protetta dal certificato, visualizza i suoi dati
if(SocketTlsCertificate(socket,subject,issuer,serial,thumbprint,expiration))
{
Print("TLS certificate:");
Print(" Owner: ",subject);
Print(" Issuer: ",issuer);
Print(" Number: ",serial);
Print(" Print: ",thumbprint);
Print(" Expiration: ",expiration);
ExtTLS=true;
}
// --- invia richiesta GET al server
if(HTTPSend(socket,"GET / HTTP/1.1\r\nHost: www.mql5.com\r\n\r\n"))
{
Print("GET request inviata");
// --- leggi la risposta
if(!HTTPRecv(socket,1000))
Print("Impossibile ottenere una risposta, errore ",GetLastError());
}
else
Guarda anche
S ock etT imeouts, MathS wap
SocketSend
S crivi dati su un sock et.
int SocketSend(
int socket, // socket
const uchar& buffer[], // buffer dati
uint buffer_len // grandezza buffer
);
Pparametri
socket
[in] Il sock et handle restituito dalla funzione S ock etCreate. Quando viene passato un handle
errato, viene scritto l'errore 5270 (ERR_NETS OCKET_INVAL IDHANDLE) _LastError.
buffer
[ in] R iferimento array di tipo uchar con i dati da inviare al sock et.
buffer_len
[ in] grandezza dell'array 'buffer'.
Valore di Ritorno
In caso di successo, restituisce il numero di byte scritti su un sock et. In caso di errore, viene
restituito -1.
Nota
Se si verifica un errore su un sock et di sistema durante l'esecuzione della funzione, la connessione
stabilita tramite S ock etConnect viene interrotta.
I n caso di errore di scrittura dei dati, viene scritto l'errore 5273 (ERR_NETS OCKET_IO_ERR OR ) in
_ LastError.
La funzione può essere chiamata solo da Ex pert Advisors e scripts, poiché vengono eseguiti nei
relativi thread di esecuzione. S e si chiama da un indicatore, GetLastError() restituisce l'errore 4014
- " Function is not allowed for call (la funzione non è consentita per la chiamata)" .
Esempio:
//+------------------------------------------------------------------+
//| SocketExample.mq5 |
//| Copyright 2018, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "Aggiungi indirizzo all'elenco di quelli consentiti nelle impostazioni del te
#property script_show_inputs
}
}
}
while(GetTickCount()<timeout_check && !IsStopped());
return(false);
}
//+------------------------------------------------------------------+
//| Funzione Start del programma di script |
//+------------------------------------------------------------------+
void OnStart()
{
int socket=SocketCreate();
//--- controlla l'handle
if(socket!=INVALID_HANDLE)
{
//--- connetti se tutto va bene
if(SocketConnect(socket,Address,Port,1000))
{
Print("Connessione stabilita a ",Address,":",Port);
string subject,issuer,serial,thumbprint;
datetime expiration;
// --- se la connessione è protetta dal certificato, visualizza i suoi dati
if(SocketTlsCertificate(socket,subject,issuer,serial,thumbprint,expiration))
{
Print("TLS certificate:");
Print(" Owner: ",subject);
Print(" Issuer: ",issuer);
Print(" Number: ",serial);
Print(" Print: ",thumbprint);
Print(" Expiration: ",expiration);
ExtTLS=true;
}
// --- invia richiesta GET al server
if(HTTPSend(socket,"GET / HTTP/1.1\r\nHost: www.mql5.com\r\n\r\n"))
{
Print("GET request inviata");
// --- leggi la risposta
if(!HTTPRecv(socket,1000))
Print("Impossibile ottenere una risposta, errore ",GetLastError());
}
else
Print("Impossibile inviare la richiesta GET, errore",GetLastError());
}
else
{
Print("Connessione a ",Address,":",Port," fallita, errore ",GetLastError());
}
//--- chiude un socket dopo averlo usato
SocketClose(socket);
}
else
Print("Impossibile creare un socket, errore ",GetLastError());
}
//+------------------------------------------------------------------+
Guarda anche
S ock etT imeouts, MathS wap, S tring T oCharArray
SocketTlsHandshake
Avvia connessione T L S sicura (S S L) ad un host specificato tramite il protocollo T L S H andshak e.
Durante l'handshak e, un client ed un server concordano sui parametri di connessione: versione del
protocollo applicata e metodo di crittografia dei dati.
bool SocketTlsHandshake(
int socket, // socket
const string host // indirizzo dell'host
);
Pparametri
socket
[in] Il sock et handle restituito dalla funzione S ock etCreate. Quando viene passato un handle
errato, viene scritto l'errore 5270 (ERR_NETS OCKET_INVAL IDHANDLE) _LastError.
host
[ in] L 'indirizzo di un host con cui è stabilita una connessione sicura.
Valore di Ritorno
R estituisce true se ha successo, altrimenti false.
Note
Prima di una connessione sicura, il programma dovrebbe stabilire una connessione T CP standard con
l'host che utilizza S ock etConnect.
N on è necessario chiamare la funzione quando vi è collegamento alla porta 443 . Questa è una porta
T CP standard utilizzata per connessioni T L S (S S L) sicure.
La funzione può essere chiamata solo da Ex pert Advisors e scripts, poiché vengono eseguiti nei
relativi thread di esecuzione. S e si chiama da un indicatore, GetLastError() restituisce l'errore 4014
- " Function is not allowed for call (la funzione non è consentita per la chiamata)" .
SocketTlsCertificate
Ottieni dati sul certificato utilizzato per proteggere la connessione di rete.
int SocketTlsCertificate(
int socket, // socket
string& subject, // proprietario del certificato
string& issuer, // emittente del certificato
string& serial, // numero di serie del certificato
stringa& identificazione personale,// impronta(print) del certificato
datetime& expiration // scadenza del certificato
);
Pparametri
socket
[in] Il sock et handle restituito dalla funzione S ock etCreate. Quando viene passato un handle
errato, viene scritto l'errore 5270 (ERR_NETS OCKET_INVAL IDHANDLE) _LastError.
subject
[ in] Nome del proprietario del certificato. Corrisponde al campo S ubject.
issuer
[ in] Nome dell'emittente del certificato. Corrisponde al campo Issuer.
serial
[ in] Numero di serie del certificato. Corrisponde al campo S erialNumber.
thumbprint
[in] Print(impronta) del Certificato. Corrisponde all'hash S HA-1 dell'intero file del certificato (tutti i
campi inclusa la firma dell'emittente).
expiration
[ in] Data di scadenza del certificato in formato datetime.
Valore di Ritorno
R estituisce true se ha successo, altrimenti false.
Nota
I dati del certificato possono essere richiesti solo dopo aver stabilito una connessione sicura
utilizzando S ock etT ls H andshak e.
La funzione può essere chiamata solo da Ex pert Advisors e scripts, poiché vengono eseguiti nei
relativi thread di esecuzione. S e si chiama da un indicatore, GetLastError() restituisce l'errore 4014
- " Function is not allowed for call (la funzione non è consentita per la chiamata)" .
Esempio:
//+------------------------------------------------------------------+
//| SocketExample.mq5 |
//| Copyright 2018, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "Aggiungi indirizzo all'elenco di quelli consentiti nelle impostazioni del te
#property script_show_inputs
if(rsp_len>0)
{
result+=CharArrayToString(rsp,0,rsp_len);
// --- stampa solo l'intestazione della risposta
int header_end=StringFind(result,"\r\n\r\n");
if(header_end>0)
{
Print("Header risposta HTTP ricevuto:");
Print(StringSubstr(result,0,header_end));
return(true);
}
}
}
}
while(GetTickCount()<timeout_check && !IsStopped());
return(false);
}
//+------------------------------------------------------------------+
//| Funzione Start del programma di script |
//+------------------------------------------------------------------+
void OnStart()
{
int socket=SocketCreate();
//--- controlla l'handle
if(socket!=INVALID_HANDLE)
{
//--- connetti se tutto va bene
if(SocketConnect(socket,Address,Port,1000))
{
Print("Connessione stabilita a ",Address,":",Port);
string subject,issuer,serial,thumbprint;
datetime expiration;
// --- se la connessione è protetta dal certificato, visualizza i suoi dati
if(SocketTlsCertificate(socket,subject,issuer,serial,thumbprint,expiration))
{
Print("TLS certificate:");
Print(" Owner: ",subject);
Print(" Issuer: ",issuer);
Print(" Number: ",serial);
Print(" Print: ",thumbprint);
Print(" Expiration: ",expiration);
ExtTLS=true;
}
// --- invia richiesta GET al server
if(HTTPSend(socket,"GET / HTTP/1.1\r\nHost: www.mql5.com\r\n\r\n"))
{
Print("GET request inviata");
// --- leggi la risposta
if(!HTTPRecv(socket,1000))
Print("Impossibile ottenere una risposta, errore ",GetLastError());
}
else
Print("Impossibile inviare la richiesta GET, errore",GetLastError());
}
else
{
Print("Connessione a ",Address,":",Port," fallita, errore ",GetLastError());
}
//--- chiude un socket dopo averlo usato
SocketClose(socket);
}
else
Print("Impossibile creare un socket, errore ",GetLastError());
}
//+------------------------------------------------------------------+
SocketTlsRead
Legge i dati dalla connessione T L S protetta.
int SocketTlsRead(
int socket, // socket
uchar& buffer[], // buffer per la lettura dei dati dal socket
uint buffer_maxlen // numero di byte da leggere
);
Pparametri
socket
[ in] Il sock et handle restituito dalla funzione S ock etCreate. Quando viene passato un handle errato
_ LastError, si attiva l'errore 5270 (ERR_NETS OCKET_INVAL IDHANDLE).
buffer
[out] R iferimento all'array di tipo uchar in cui vengono letti i dati. La dimensione dinamica
dell'array è aumentata dal numero di byte letti. La dimensione dell'array non può superare INT_M AX
(2147483647).
buffer_maxlen
[in] Numero di byte da leggere nell'arraybuffer[]. I dati non adattati all'array rimangono nel sock et.
Possono essere ricevuti dalla prossima chiamata S ock etT L S R ead. buffer_maxlen cannot ex ceed
INT_M AX ( 2147483647).
Valore di Ritorno
S e ha successo, restituisce il numero di byte letti. In caso di errore, viene restituito -1.
Nota
Se si verifica un errore su un sock et di sistema durante l'esecuzione della funzione, la connessione
stabilita tramite S ock etConnect viene interrotta.
La funzione viene eseguita finché non riceve la quantità specificata di dati o viene raggiunto il
timeout (S ock etT imeouts).
I n caso di errore di lettura dei dati, l'errore 5273 (ERR_NETS OCKET_IO_ERR OR ) viene scritto in
_ LastError.
La funzione può essere chiamata solo da Ex pert Advisors e scripts, poiché vengono eseguiti nei
relativi thread di esecuzione. S e si chiama da un indicatore, GetLastError() restituisce l'errore 4014
- " Function is not allowed for call (la funzione non è consentita per la chiamata)" .
Esempio:
//+------------------------------------------------------------------+
//| SocketExample.mq5 |
//| Copyright 2018, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
{
Print("Header risposta HTTP ricevuto:");
Print(StringSubstr(result,0,header_end));
return(true);
}
}
}
}
while(GetTickCount()<timeout_check && !IsStopped());
return(false);
}
//+------------------------------------------------------------------+
//| Funzione Start del programma di script |
//+------------------------------------------------------------------+
void OnStart()
{
int socket=SocketCreate();
//--- controlla l'handle
if(socket!=INVALID_HANDLE)
{
//--- connetti se tutto va bene
if(SocketConnect(socket,Address,Port,1000))
{
Print("Connessione stabilita a ",Address,":",Port);
string subject,issuer,serial,thumbprint;
datetime expiration;
// --- se la connessione è protetta dal certificato, visualizza i suoi dati
if(SocketTlsCertificate(socket,subject,issuer,serial,thumbprint,expiration))
{
Print("TLS certificate:");
Print(" Owner: ",subject);
Print(" Issuer: ",issuer);
Print(" Number: ",serial);
Print(" Print: ",thumbprint);
Print(" Expiration: ",expiration);
ExtTLS=true;
}
// --- invia richiesta GET al server
if(HTTPSend(socket,"GET / HTTP/1.1\r\nHost: www.mql5.com\r\n\r\n"))
{
Print("GET request inviata");
// --- leggi la risposta
if(!HTTPRecv(socket,1000))
Print("Impossibile ottenere una risposta, errore ",GetLastError());
}
else
Print("Impossibile inviare la richiesta GET, errore",GetLastError());
}
else
{
Print("Connessione a ",Address,":",Port," fallita, errore ",GetLastError());
}
//--- chiude un socket dopo averlo usato
SocketClose(socket);
}
else
Print("Impossibile creare un socket, errore ",GetLastError());
}
//+------------------------------------------------------------------+
Guarda anche
S ock etT imeouts, MathS wap
SocketTlsReadAvailable
Leggi tutti i dati disponibili dalla connessione T L S protetta.
int SocketTlsReadAvailable(
int socket, // socket
uchar& buffer[], // buffer per la lettura dei dati dal socket
const uint buffer_maxlen // numero di byte da leggere
);
Pparametri
socket
[ in] Il sock et handle restituito dalla funzione S ock etCreate. Quando viene passato un handle errato
_ LastError, si attiva l'errore 5270 (ERR_NETS OCKET_INVAL IDHANDLE).
buffer
[out] R iferimento all'array di tipo uchar in cui vengono letti i dati. La dimensione dinamica
dell'array è aumentata dal numero di byte letti. La dimensione dell'array non può superare INT_M AX
(2147483647).
buffer_maxlen
[in] Numero di byte da leggere sull'array del buffer[]. I dati non adattati all'array rimangono nel
sock et. Possono essere ricevuti dalla prossima chiamata S ock etT ls R eadAvailable oS ock etT ls R ead.
buffer_max len cannot ex ceed INT_M AX (2147483647).
Valore di Ritorno
S e ha successo, restituisce il numero di byte letti. In caso di errore, viene restituito -1.
Nota
Se si verifica un errore su un sock et di sistema durante l'esecuzione della funzione, la connessione
stabilita tramite S ock etConnect viene interrotta.
I n caso di errore di lettura dei dati, l'errore 5273 (ERR_NETS OCKET_IO_ERR OR ) viene scritto in
_ LastError.
La funzione può essere chiamata solo da Ex pert Advisors e scripts, poiché vengono eseguiti nei
relativi thread di esecuzione. S e si chiama da un indicatore, GetLastError() restituisce l'errore 4014
- " Function is not allowed for call (la funzione non è consentita per la chiamata)" .
Guarda anche
S ock etT imeouts, MathS wap
SocketTlsSend
I nvia dati tramite connessione T L S protetta.
int SocketTlsSend(
int socket, // socket
const uchar& buffer[], // buffer dati
uint buffer_len // grandezza buffer
);
Pparametri
socket
[in] Il sock et handle restituito dalla funzione S ock etCreate. Quando viene passato un handle
errato, viene scritto l'errore 5270 (ERR_NETS OCKET_INVAL IDHANDLE) _LastError.
buffer
[ in] R iferimento all'array di tipo uchar con i dati da inviare.
buffer_len
[ in] grandezza dell'array 'buffer'.
Valore di Ritorno
In caso di successo, restituisce il numero di byte scritti su un sock et. In caso di errore, viene
restituito -1.
Nota
Se si verifica un errore su un sock et di sistema durante l'esecuzione della funzione, la connessione
stabilita tramite S ock etConnect viene interrotta.
I n caso di errore di scrittura dei dati, viene scritto l'errore 5273 (ERR_NETS OCKET_IO_ERR OR ) in
_ LastError.
La funzione può essere chiamata solo da Ex pert Advisors e scripts, poiché vengono eseguiti nei
relativi thread di esecuzione. S e si chiama da un indicatore, GetLastError() restituisce l'errore 4014
- " Function is not allowed for call (la funzione non è consentita per la chiamata)" .
Guarda anche
S ock etT imeouts, MathS wap, S tring T oCharArray
W ebRequest
La funzione invia una richiesta HTT P ad un server specificato. La funzione ha due versioni:
1. Invio richieste semplici di tipo "k ey=value" usando l'header Content-Type: application/x -www-
form-urlencoded.
int WebRequest(
const string method, // metodo HTTP
const string url, // URL
const string cookie, // cookie
const string referer, // referer
int timeout, // timeout
const char &data[], // l'array del corpo del messaggio HTTP
int data_size, // grandezza array data[] in bytes
char &result[], // un array contenente i dati di risposta del server
string &result_headers // headers della risposta del server
);
2. Invio di una richiesta di qualunque tipo specificando il personalizzato set di headers per una
interazione più flessibile con vari servizi W eb.
int WebRequest(
const string method, // metodo HTTP
const string url, // URL
const string headers, // headers
int timeout, // timeout
const char &data[], // l'array del corpo del messaggio HTTP
char &result[], // un array contenente i dati di risposta del server
string &result_headers // headers della risposta del server
);
Parametri
metodo
[ in] metodo HTT P.
url
[ in] UR L.
headers
[ in] R ichiedi intestazioni di tipo " chiave: valore" , separate da un'interruzione di riga " \\ r \\ n" .
cookie
[ in] Valore del cook ie.
referente
[ in] Valore dell'intestazione R eferer della richiesta HTT P.
timeout
[ in] T imeout in millisecondi.
data[]
[ in] Array di dati del corpo del messaggio HTT P.
data_size
[ in] Dimensione dell'array di dati[].
result[]
[ out] Un array contenente dati di risposta del server.
result_headers
[ out] Intestazioni di risposta del server.
Valore restituito
Codice di risposta del server HTT P o -1 per un errore.
Nota
Per utilizzare la funzione W ebR equest(), aggiungere gli indirizzi dei server richiesti nell'elenco di
UR L consentiti nella scheda " Ex pert A dvisors " della finestra " Opzioni " . La porta del server viene
selezionata automaticamente sulla base del protocollo specificato - 80 per " http://" e 443 per
" https ://" .
La funzione W ebR equest() è sincrona, il che significa che interrompe l'esecuzione del programma e
attende la risposta dal server richiesto. Poiché i ritardi nella ricezione di una risposta possono
essere elevati, la funzione non è disponibile per le chiamate dagli indicatori, poiché gli indicatori
vengono eseguiti in un thread comune condiviso da tutti gli indicatori e charts su un unico simbolo.
I l ritardo delle prestazioni dell'indicatore su uno dei charts di un simbolo può interrompere
La funzione può essere chiamata solo da Ex pert Advisors e script, poiché vengono eseguiti nei
relativi thread di esecuzione. S e provi a chiamare la funzione da un indicatore, GetLastError()
restituirà l'errore 4014 - " Funzione non consentita" .
Esempio:
void OnStart()
{
string cookie=NULL,headers;
char post[],result[];
string url="https://finance.yahoo.com";
//--- Per abilitare l'accesso al server, è necessario aggiungere l'URL "https://finance.yahoo.com"
//--- alla lista di URL consentiti (Main Menu->Tools->Options, scheda "Expert Advisors"):
// --- Reimpostazione dell'ultimo codice di errore
ResetLastError();
// --- Download di una pagina html da Yahoo Finance
int res=WebRequest("GET",url,cookie,NULL,500,post,0,result,headers);
if(res==-1)
{
Print("Errore in WebRequest. Error code =",GetLastError());
//--- Forse l'URL non è elencato, mostra un messaggio sulla necessità di aggiungere l'indiriz
MessageBox("Aggiungi l'indirizzo ' "+url+" ' alla lista di URL consentiti sulla scheda 'Exper
}
else
{
if(res==200)
{
//--- Download riuscito
PrintFormat("Il file è stato scaricato con successo, Dimensione File %d byte.",ArraySize(r
//PrintFormat("Server headers: %s",headers);
//--- Salvataggio dati in un file
int filehandle=FileOpen("url.htm",FILE_WRITE|FILE_BIN);
if(filehandle!=INVALID_HANDLE)
{
//--- Salvataggio contenuto dell'array result[] in un file
FileWriteArray(filehandle,result,0,ArraySize(result));
//--- Chiusura file
FileClose(filehandle);
}
else
Print("Errore in FileOpen. Error code =",GetLastError());
}
else
PrintFormat("Downloading '%s' fallito, codice errore %d",url,res);
}
}
SendFTP
I nvia un file all'indirizzo, specificato nella finestra di impostazione della scheda " FT P" .
bool SendFTP(
string filename, // file da spedire con ftp
string ftp_path=NULL // ftp catalog
);
Parametri
filename
[ in] ome del file spedito.
N
ftp_path=NULL
[in] catalogo FT P. S e una directory non è specificata, viene utilizzata la directory descritta nelle
impostazioni.
Valore restituito
I n caso di fallimento restituisce 'false'.
Nota
Il file inviato deve essere posizionato nella cartella terminal_directory\MQL5\files o sue relative
sottocartelle. L 'invio non viene eseguito se l'indirizzo FT P e/o la pass word di accesso non sono
specificate nelle impostazioni.
SendMail
I nvia una e-mail all'indirizzo specificato nella finestra delle impostazioni della scheda " Email" .
bool SendMail(
string subject, // header
string some_text // testo email
);
Parametri
soggetto
[ in] header Email.
un_qualche_testo
[ in] Corpo dell'e-mail.
Valore restituito
true - se una e-mail viene messa in coda di invio, in caso contrario - false.
Nota
L 'invio può essere vietato nelle impostazioni, l' indirizzo e-mail può essere omesso, pure. Per le
informazioni di errore chiamare GetLastError().
SendNotification
I nvia le notifiche push per i terminali mobili, i cui MetaQuotes ID s sono specificati nella scheda
"N otifiche" .
bool SendNotification(
string text // Testo della notifica
);
Parametri
text
[ in] I l testo della notifica. La lunghezza del messaggio non deve superare i 255 caratteri.
Valore restituito
true se la notifica è stata inviata con successo dal terminale, in caso di fallimento restituisce false.
Durante il controllo dopo una notifica push fallita, GetLastError() può restituire uno dei seguenti
errori:
· 5 5
4 1 – ERR_NOTIFICATION_S END_FAILED,
· 4516 – ERR_NOTIFICATION_W R ONG_PARAMET ER ,
· 4517 – ERR_NOTIFICATION_W R ONG_S ETTINGS ,
· 4518 – ERR_NOTIFICATION_T OO_FR EQUENT .
Nota
Severe restrizioni d'uso sono impostate per la funzione S endNotification(): non più di 2 chiamate al
secondo e non più di 10 chiamate al minuto. Il monitoraggio della frequenza di utilizzo è dinamico.
La funzione può essere disattivata in caso di violazione restrizione.
Le variabili globali del terminale client non devono essere confuse con le variabili dichiarate
nell'ambito globale del programma mql5.
Le variabili globali sono conservate nel terminale client per 4 settimane dopo l'ultimo accesso, poi
verranno cancellate automaticamente. Un accesso ad una variabile è non solo l'impostazione di un
nuovo valore, ma la lettura del valore della variabile globale, anche.
Le variabili globali del terminale client sono accessibili simultaneamente da tutti i programmi mql5
avviati nel terminale client.
Funzione Azione
G lobalVariableCheck Controlla l'esistenza di una variabile globale con
il nome specificato
GlobalVariableCheck
Controlla l'esistenza di una variabile globale con il nome specificato
bool GlobalVariableCheck(
string name // Nome della variabile globale
);
Parametri
name
[ in] ome della variabile globale.
N
Valore restituito
R estituisce true se la variabile globale esiste, altrimenti restituisce false.
Le variabili globali presenti nel terminale client per 4 settimane dopo il loro ultimo uso, vengono
dunque cancellati automaticamente.
Vedi anche
G lobalVariableT ime()
GlobalVariableTime
R estituisce l'orario dell' ultimo accesso alla variabile globale.
datetime GlobalVariableTime(
string name // nome
);
Parametri
name
[ in] Nome della variabile globale.
Valore restituito
La funzione restituisce l'ora dell'ultimo accesso alla variabile globale specificata. La chiamata di una
variabile per ottenere il valore è anche considerata come un accesso ad essa. Per ottenere dettaggli
sull'errore, chiamare la funzione GetLastError().
Nota
Le variabili globali esistono nel terminale client per 4 settimane da quando sono state chiamate
l'ultima volta. Dopo di che vengono automaticamente cancellati.
Vedi anche
G lobalVariableCheck ()
GlobalVariableDel
Elimina una variabile globale del terminale client.
bool GlobalVariableDel(
string name // Nome della variabile globale
);
Parametri
name
[ in] ome della variabile globale.
N
Valore restituito
In caso di successo, la funzione restituisce true, altrimenti restituisce false. Per ottenere
informazioni sull' errore è necessario chiamare la funzione GetLastError().
Nota
Le variabili globali presenti nel terminale client per 4 settimane dopo il loro ultimo uso, vengono
dunque cancellati automaticamente.
GlobalVariableGet
Restituisce il valore di una variabile globale esistente del terminale client. Ci sono due varianti della
funzione.
2. R estituisce true o false a seconda del successo dell'esecuzione della funzione. In caso di successo, la
variabile globale del terminale client è posta in una variabile passata per riferimento nel secondo
parametro.
bool GlobalVariableGet(
string name, // Nome variabile globale
double& double_var // Questa variabile conterrà il valore della variabile globale
);
Parametri
name
[ in] ome della variabile globale.
N
double_var
[out] Variabile target di tipo double, che accetta il valore memorizzato in una variabile globale del
terminale client.
Valore restituito
Il valore della variabile globale esistente oppure 0 in caso di errore. Per ulteriori informazioni
sull'errore, chiamare GetLastError().
Nota
Le variabili globali presenti nel terminale client per 4 settimane dopo il loro ultimo uso, vengono
dunque cancellati automaticamente.
GlobalVariableName
R estituisce il nome di una variabile globale dal suo numero ordinale.
string GlobalVariableName(
int index // Numero della variabile globale nell'elenco delle variabili globali
);
Parametri
index
n] Numero di sequenza nella lista delle variabili globali. Essa deve essere maggiore o uguale a
[ 0 e
minore di GlobalVariables T otal().
Valore restituito
Il nome della variabile globale per il suo numero ordinale nell'elenco delle variabili globali. Per più
dettagli riguardo lerrore, call GetLastError().
Nota
Le variabili globali presenti nel terminale client per 4 settimane dopo il loro ultimo uso, vengono
dunque cancellati automaticamente.
GlobalVariableSet
Imposta un nuovo valore per una variabile globale. S e la variabile non esiste, il sistema crea una
nuova variabile globale.
datetime GlobalVariableSet(
string name, // Nome della variabile globale
double value // Valore da impostare
);
Parametri
name
[ in] ome della variabile globale.
N
valore
[ in] Il nuovo valore numerico.
Valore restituito
In caso di successo, la funzione restituisce l'ora dell'ultima modifica, altrimenti 0 . Per maggiori
dettagli sull'errore, chiamare GetLastError().
Nota
A global variable name should not ex ceed 63 characters. Le variabili globali presenti nel terminale
client per 4 settimane dopo il loro ultimo uso, vengono dunque cancellati automaticamente.
GlobalVariablesFlush
S alva forzatamente contenuto di tutte le variabili globali nel disco.
void GlobalVariablesFlush();
Valore restituito
N essun valore restituito.
Nota
Il terminale scrive tutte le variabili globali quando il lavoro è finito, ma i dati possono andare persi
in caso di guasto improvviso del funzionamento del computer. Questa funzione permette di
controllare in modo indipendente il processo di salvataggio delle variabili globali in caso di
emergenza.
GlobalVariableTemp
La funzione tenta di creare una variabile globale temporanea. S e la variabile non esiste, il sistema
crea una nuova variabile globale temporanea.
bool GlobalVariableTemp(
string name // Nome della variabile globale
);
Parametri
name
[ in] Il nome della variabile temporanea globale.
Valore restituito
In caso di successo, la funzione restituisce true, in caso contrario - false. Per dettagli sull' errore, è
necessario chiamare la funzione GetLastError().
Nota
Le variabili globali temporanee sono uniche mentre il terminale client è in esecuzione, dopo la
chiusura del terminale vengono automaticamente eliminate. Notare che durante l'esecuzione di
GlobalVariables Flush() le variabili globali temporanee non vengono scritte nel disco.
Dopo che una variabile globale temporanea è stato creata, è possibile accedere e modificare la
stessa come variabile globale del terminale client.
GlobalVariableSetOnCondition
Imposta il nuovo valore della variabile globale esistente se il valore corrente è uguale al terzo
parametro check_value. S e non vi è nessuna variabile globale, la funzione genererà un errore
ERR_GLOBAL VARIABLE_NOT_FOUND (4501) e restituisce false.
bool GlobalVariableSetOnCondition(
string name, // Nome della variabile globale
double value, // Nuovo valore per la variabile se la condizione è true
double check_value // Condizione di controllo valore
);
Parametri
name
[ in] Il nome di una variabile globale.
valore
[ in] e value.
N w
check_value
[ in] Il valore per controllare il valore corrente della variabile globale.
Valore restituito
In caso di successo, la funzione restituisce true, altrimenti restituisce false. Per i dettagli sull'errore
chiamare GetLastError(). S e il valore corrente della variabile globale è diverso da check_value, la
funzione restituisce false.
Nota
La funzione fornisce l'accesso atomico per la variabile globale, in modo che possa essere utilizzata
per fornire un mutex all' interazione dei diversi Ex pert Advisors che lavorano simultaneamente
all'interno del terminale client.
GlobalVariablesDeleteAll
Elimina le variabili globali del terminale cliente.
int GlobalVariablesDeleteAll(
string prefix_name=NULL, // Tutte le variabili globali con nomi che iniziano con il pref
datetime limit_data=0 // Tutte le variabili globali che sono state modificate prima d
);
Parametri
prefix_name=NULL
[in] Nome prefisso delle variabili globali da rimuovere. S e si specifica un prefisso NULL o una
stringa vuota, allora tutte le variabili che soddisfano il criterio dati, verranno eliminate.
limit_data=0
[in] Data per selezionare le variabili globali al momento della loro ultima modifica. La funzione
rimuove le variabili globali, che sono state cambiati prima di questa data. S e il parametro è zero,
allora tutte le variabili che soddisfano il primo criterio (prefisso) vengono soppresse.
Valore restituito
I l numero delle variabili eliminate.
Nota
Se entrambe le opzioni sono uguali a zero (prefix_name = NULL e limit_data = 0), allora la funzione
elimina tutte le variabili globali del terminale. S e entrambi i parametri vengono specificati, allora
elimina le variabili globali corrispondenti ad entrambi i parametri.
Le variabili globali presenti nel terminale client per 4 settimane dopo il loro ultimo uso, poi vengono
cancellate automaticamente.
GlobalVariablesTotal
R estituisce il numero totale di variabili globali del terminale cliente.
int GlobalVariablesTotal();
Valore restituito
N umero di variabili globali.
Nota
Le variabili globali presenti nel terminale cliente per 4 settimane dopo il loro ultimo uso, poi
vengono cancellate automaticamente. La chiamata di una variabile non avviene solo impostando un
nuovo valore, ma anche con la lettura del valore della variabile globale.
Per motivi di sicurezza, il lavoro con i file è strettamente controllato nel linguaggio MQL5. I file con cui
sono condotte le operazioni di file utilizzando i mezzi MQL5, non possono esservi al di fuori della
sandbox del file.
Ci sono due directory (con le sottodirectory) in cui i file di lavoro possono essere ubicati:
· terminal_data_folder\ MQL5\FI LES \ (nel menu del terminale scegliere di visualizzare "F ile" - "A pri la
directory dei dati" );
· la cartella comune per tutti i terminali installati in un computer - di solito si trova nella directory C:
\D ocuments and S ettings \All Users \Application Data\MetaQuotes \T erminal\Common\Files.
C'è un metodo di programma per ottenere nomi di questi cataloghi utilizzando la funzione
T erminalI nfoS tring(), utilizzando l'enumerazione ENUM _T ER M INA L _INFO _S TRING
Le funzioni dei file permettono di lavorare con i cosiddetti " named pipe" . Per fare q uesto, è
sufficiente chiamare la funzione FileOpen() con parametri appropriati.
Funzione Azione
F ileS electDialog Crea una finestra di dialogo di
apertura/creazione di file o cartelle
Funzione Azione
F ileClose Chiude un file aperto in precedenza
F ileR eadDatetime Legge dal file di tipo CS V una stringa in uno dei
formati: " AAAA .MM. GG. HH: MM :S S " ,
in un valore datetime
Funzione Azione
F ileW rite S crive dati in un file di tipo CS V o TXT
Se il file viene aperto per la scrittura usando FileOpen(), tutte le sottocartelle specificate nel percorso
verranno create se queste non ci sono .
FileSelectDialog
Crea una finestra di dialogo di apertura/creazione di file o cartelle.
int FileSelectDialog(
string caption, // header della finestra
string initial_dir, // directory iniziale
string filter, // filtro di estensione
uint flags, // combinazione di flags
string& filenames[], // array con nomi di file
string default_filename // nome predefinito del file
);
Parametri
caption
[ in] H eader della finestra di dialogo.
initial_dir
[in] Nome della directory iniziale relativo a MQL5\Files, il cui contenuto deve essere visualizzato
nella finestra di dialogo. S e il valore è NULL, MQL5\Files viene visualizzato nella finestra di
dialogo.
filter
[in] Filtro di estensione dei file da visualizzare nella finestra di dialogo di selezione. I file di altri
formati sono nascosti.
flags
[nel] Combinazione di flags definizione della modalità della finestra di dialogo. I flag sono definiti
come segue:
FS D_W RIT E_FI LE – finestra di dialogo di apertura file;
FS D_COMMO N_FOL DER – il file si trova nella cartella comune di tutti i terminali client
\T erminal\ Common\Files.
filenames[]
[ out] Array di stringhe in cui vengono inseriti i nomi dei file/cartelle selezionati.
default_filename
[in] Nome file/cartella predefinito. S e specificato, un nome viene automaticamente aggiunto alla
finestra di dialogo aperta e restituito nell'array filenames[] durante il test.
Valore di Ritorno
In caso di completamento corretto, la funzione restituisce il numero di file selezionati i cui nomi è
possibile ottenerli da filenames[]. S e un utente chiude la finestra di dialogo senza selezionare un
file, la funzione restituisce 0. In caso di esito negativo, viene restituito un valore inferiore a 0. Il
codice di errore può essere ottenuto utilizzando GetLastError().
Nota
Per motivi di sicurezza, lavorare con i file è rigorosamente controllato nel linguaggio MQL5. I file
utilizzati nelle operazioni sui file mediante il linguaggio MQL5 non possono trovarsi al di fuori della
sandbox dei file (vale a dire, al di fuori della directory MQL5\Files).
Il nome initial_dir viene cercato nella directory del terminale client in MQL5\Files (o
directory_agente_di_testing \MQL5\Files in caso di testing). S e FS D_COMMON_FOL DER è impostato
tra i flag, la ricerca della directory iniziale viene eseguita nella cartella comune di tutti i terminali
client \T erminal\Common\Files.
Il parametro filter indica file validi e deve essere impostato nel formato " <descrizione 1>|
<estensione 1>|<descrizione 2>|<estensione 2>... " , ad esempio, " File di testo ( * .tx t) |* .tx t|T utti i
file (*.*)|*.*" . La prima estensione " File di testo (*.tx t)|*.tx t" è selezionata come tipo di file
predefinito.
S e filter=NULL, la maschera di selezione dei file nella finestra di dialogo è " T utti i file ( * . * ) |* . *|"
risposta dell'utente. Poiché tutti gli indicatori per ciascun simbolo vengono eseguiti in un singolo
thread, tutti i charts di tutti i timeframes per questo simbolo vengono sospesi.
Esempio:
//+------------------------------------------------------------------+
//| Funzione di avvio del programma di Script |
//+------------------------------------------------------------------+
void OnStart()
{
//--- ottiene i nomi dei file di testo per il download dalla cartella comune dei terminali client
string filenames[];
if(FileSelectDialog("Selezionare i file da scaricare", NULL,
"Text files (*.txt)|*.txt|All files (*.*)|*.*",
FSD_ALLOW_MULTISELECT|FSD_COMMON_FOLDER, filenames, "data.txt")>0)
{
//--- visualizza il nome di ciascun file selezionato
int total=ArraySize(filenames);
for(int i=0; i<total; i++)
Print(i, ": ", filenames[i]);
}
else
{
Print("File non selezionato");
}
//---
}
Guarda anche
FileFindFirst
La funzione inizia la ricerca di file o sottodirectory in una directory in conformità con il filtro
specificato.
long FileFindFirst(
const string file_filter, // Stringa - filtro di ricerca
string& returned_filename, // Nome del file o sottodirectory trovata
int common_flag=0 // Definisce la ricerca
);
Parametri
file_filter
[in] Filtro di ricerca. Una sottodirectory (o sequenza di sottodirectory nidificate) relativa alla
directory \Files, in cui i file devono essere cercati, può essere specificata nel filtro.
returned_filename
[out] Il parametro restituito, dove, in caso di successo, viene piazzato il nome del primo file o
sottodirectory trovati. Only the file name is returned (including the ex tension), the directories and
subdirectories are not included no matter if they are specified or not in the search filter.
common_flag
[in] Flag determinante la posizione del file. S e common_flag = FILE_COMMON, allora il file si trova
in una cartella condivisa per tutti i terminali client \T erminal\Common\Files. In caso contrario, il
file si trova in una cartella locale.
Valore restituito
Restituisce l'handle dell'oggetto cercato, che dev 'essere usato per l'ulteriore ordinamento dei file e
sottodirectory dalla funzione FileFindNex t(), o restituisce INVAL ID_HANDLE quando non ci sono file e
sottodirectory corrispondenti al filtro (nel caso particolare - quando la directory è vuota). Dopo aver
cercato, l'handle dev 'essere chiuso usando la funzione FileFindClose().
Nota
Per motivi di sicurezza, il lavoro con i file è strettamente controllato nel linguaggio MQL5. I file con
cui sono condotte le operazioni di file utilizzando i mezzi MQL5, non possono esservi al di fuori della
sandbox del file.
Esempio:
//--- display the window of input parameters when launching the script
#property script_show_inputs
//--- filter
input string InpFilter="Dir1\\*";
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
string file_name;
string int_dir="";
int i=1,pos=0,last_pos=-1;
//--- search for the last backslash
while(!IsStopped())
{
pos=StringFind(InpFilter,"\\",pos+1);
if(pos>=0)
last_pos=pos;
else
break;
}
//--- the filter contains the folder name
if(last_pos>=0)
int_dir=StringSubstr(InpFilter,0,last_pos+1);
//--- get the search handle in the root of the local folder
long search_handle=FileFindFirst(InpFilter,file_name);
//--- check if the FileFindFirst() is executed successfully
if(search_handle!=INVALID_HANDLE)
{
//--- in a cycle, check if the passed strings are the names of files or directories
do
{
ResetLastError();
//--- if it's a file, the function returns true, and if it's a directory, it returns error
FileIsExist(int_dir+file_name);
PrintFormat("%d : %s name = %s",i,GetLastError()==ERR_FILE_IS_DIRECTORY ? "Directory" : "F
i++;
}
while(FileFindNext(search_handle,file_name));
//--- close the search handle
FileFindClose(search_handle);
}
else
Print("Files not found!");
}
Vedi anche
F ileFindNex t, FileFindClose
FileFindNext
La funzione continua la ricerca iniziata da FileFindFirst().
bool FileFindNext(
long search_handle, // Handle di ricerca
string& returned_filename // Nome del file o sottodirectory trovata
);
Parametri
search_handle
[ in] H andle di ricerca, recuperato da FileFindFirst().
returned_filename
[out] Il nome del prossimo file o prossima sottodirectory trovata. Only the file name is returned
(including the ex tension), the directories and subdirectories are not included no matter if they are
specified or not in the search filter.
Valore restituito
S e ha successo, restituisce vero, altrimenti false.
Esempio:
//--- mostra la finestra dei parametri di input quando lancia lo script
#property script_show_inputs
//--- filtro
input string InpFilter="*";
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
string file_name;
int i=1;
//--- riceve l'handle di ricerca nella root della cartella locale
long search_handle=FileFindFirst(InpFilter,file_name);
//--- controlla se la funzioneFileFindFirst() è eseguita con successo
if(search_handle!=INVALID_HANDLE)
{
//--- controlla se le stringhe passate nel loop sono file o nomi di directory
do
{
ResetLastError();
//--- se questo è un file, la funzione restituirà true, se è una directory la funzione gen
FileIsExist(file_name);
PrintFormat("%d : %s nome = %s",i,GetLastError()==ERR_FILE_IS_DIRECTORY ? "Directory" : "F
i++;
}
while(FileFindNext(search_handle,file_name));
Vedi anche
F ileFindFirst, FileFindClose
FileFindClose
La funzione chiude l'handle di ricerca.
void FileFindClose(
long search_handle // Handle di ricerca
);
Parametri
search_handle
[ in] H andle di ricerca, recuperato da FileFindFirst().
Valore restituito
Nessun valore restituito.
Nota
La funzione deve essere chiamata per liberare le risorse di sistema.
Esempio:
//--- mostra la finestra dei parametri di input quando lancia lo script
#property script_show_inputs
//--- filtro
input string InpFilter="*";
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
string file_name;
int i=1;
//--- riceve l'handle di ricerca nella root della cartella locale
long search_handle=FileFindFirst(InpFilter,file_name);
//--- controlla se la funzioneFileFindFirst() è eseguita con successo
if(search_handle!=INVALID_HANDLE)
{
//--- controlla se le stringhe passate nel loop sono file o nomi di directory
do
{
ResetLastError();
//--- se questo è un file, la funzione restituirà true, se è una directory la funzione gen
FileIsExist(file_name);
PrintFormat("%d : %s nome = %s",i,GetLastError()==5018 ? "Directory" : "File",file_name);
i++;
}
while(FileFindNext(search_handle,file_name));
//--- chiude l'handle di ricerca
FileFindClose(search_handle);
}
else
Print("File non trovato!");
}
Vedi anche
F ileFindFirst, FileFindNex t
FileIsExist
Verifica l'esistenza di un file.
bool FileIsExist(
const string file_name, // Nome del file
int common_flag=0 // Area di ricerca
);
Parametri
file_name
[ in] Il nome del file che viene verificato
common_flag=0
[in] Flag determinante la posizione del file. S e common_flag = FILE_COMMON, allora il file si trova
in una cartella condivisa per tutti i terminali client \T erminal\Common\Files. In caso contrario, il
file si trova in una cartella locale.
Valore restituito
R estituisce true, se il file specifico esiste.
Nota
>Il file controllato può rivelarsi essere una sottodirectory. In questo caso, la funzione FileIsEx ist()
restituirà false, mentre l'errore 5018 verrà loggato nella variabile _LastError variable - " Questa è
una directory, non un file" (vedi l'esempio per la funzione FileFindFirst).
Per motivi di sicurezza, il lavoro con i file è strettamente controllato nel linguaggio MQL5. I file con
cui sono condotte le operazioni di file utilizzando i mezzi MQL5, non possono esservi al di fuori della
sandbox del file.
S e common_flag = FILE_COMMON, allora la funzione guarda al file in una cartella condivisa per tutti
i terminali client \T erminal\Common\Files, altrimenti la funzione cerca il file in una cartella locale
(MQL5\Files o MQL5\T ester\Files in caso di testing).
Esempio:
//--- mostra la finestra dei parametri di input quando si lancia lo script
#property script_show_inputs
//--- data per i vecchi file
input datetime InpFilesDate=D'2013.01.01 00:00';
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
string file_name; // variabile per memorizzare i nomi dei file
string filter="*.txt"; // filtro per cercare i file
datetime create_date; // data di creazione file
string files[]; // lista dei nomi file
int def_size=25; // grandezza array per default
Vedi anche
F ileFindFirst
FileOpen
La funzione apre il file con il nome e flag specificati.
int FileOpen(
string file_name, // Nome del File
int open_flags, // Combinazione dei flags
short delimiter='\t', // Delimitatore
uint codepage=CP_ACP // Codice della Pagina
);
Parametri
file_name
[in] Il nome del file può contenere sottocartelle. S e il file è aperto per la scrittura, ueste
q
open_flags
[in] la combinazione di flags determina la modalità di operazione per il file. I flags sono definiti
come segue:
FI LE_R EAD il file è aperto per la lettura
FI LE_C S V file di tipo csv (tutti gli elementi registrati vengono convertiti in tipo unicode o ansi, e
considerazione)
FI LE_ANS I righe di tipo ANS I (simboli a singolo-byte)
FI LE_COMMO N locazione nel file in una cartella condivisa per tutti i terminali client
\T erminal\ Common\Files
delimitatore='\t
[in] valore che deve essere usato come un separatore nel file tx t o cvs. S e il delimitatore del file
csv non viene specificato, il suo default è tab. S e il delimitatore del file tx t non viene specificato,
allora non viene usato nessun separatore. S e il separatore non è chiaramente impostato a 0, allora
non viene usato nessun separatore.
codepage=CP_ACP
[ in] Il valore del codice pagina. Per i codici pagina più usati, provvedere appropriate costanti.
Valore restituito
Se un file è stato aperto con successo, la funzione restituisce l'handle file, che è quindi usato per
accedere ai dati del file. In caso di fallimento restituisce INVAL ID_HANDLE.
Nota
Per motivi di sicurezza, il lavoro con i file è strettamente controllato nel linguaggio MQL5. I file con
cui sono condotte le operazioni di file utilizzando i mezzi MQL5, non possono esservi al di fuori della
sandbox del file.
Assicurarsi di impostare il flag FILE_ANS I se il file deve essere letto in una codifica specifica (il
parametro codepage con il valore una pagina di codice è specificato). S e non esiste alcun flag
FI LE_ANS I specificato, il file di testo viene letto in Unicode senza alcuna conversione.
Il file è aperto nella cartella del terminale client, nella sottocartella MQL5\files (o
testing _agent_directory\MQL5\files in caso di testing). S e FILE_COMMON viene specificato tra i
flags, il file viene aperto ina una cartella condivisa per tutti i terminali client MetaT rader 5.
Le " Named pipes " possono essere aperte secondo le seguenti regole:
· Il nome della Pipe è una stringa, che dovrebbe avere il seguente aspetto: " \
servername\pipe\pipename" , dove nomeserver - nome del server nella rete, mentre pipeName è
\
un nome di pipe. S e vengono usate le pipes sullo stesso computer, il nome del server può essere
omesso ma un punto dev 'essere inserito al posto di esso" \\.\pipe\pipename" . Un client che cerca
di collegasi al pipe dovrebbe conoscere il suo nome.
· FileFlush() e FileS eek () dovrebbero essere chiamate all'inizio di un file tra operazioni sequenziali
di lettura della pipe e scrittura ad essa.
Un simbolo speciale '\' viene utilizzato nelle stringhe mostrate. Pertanto, '\' dovrebbe essere
raddoppiata quando si scrive un nome in un'applicazione MQL5. Ciò significa che l'esempio di cui
sopra dovrebbe avere il seguente aspetto nel codice: " \\\\servername\\pipe\\pipename" .
U lteriori informazioni su come lavorare con le named pipes possono essere trovate nell'articolo
" Comunicare con MetaT rader 5 tramite Named Pipe senza utilizzare DLL " .
Esempio:
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- metodo scorretto di apertura file
string terminal_data_path=TerminalInfoString(TERMINAL_DATA_PATH);
string filename=terminal_data_path+"\\MQL5\\Files\\"+"fractals.csv";
int filehandle=FileOpen(filename,FILE_WRITE|FILE_CSV);
if(filehandle<0)
{
Print("Fallimento nell'apertura del file per percorso assoluto ");
Print("Error code ",GetLastError());
}
//--- modalitа corretta di lavoro con la "file sandbox"
ResetLastError();
filehandle=FileOpen("fractals.csv",FILE_WRITE|FILE_CSV);
if(filehandle!=INVALID_HANDLE)
{
FileWrite(filehandle,TimeCurrent(),Symbol(), EnumToString(_Period));
FileClose(filehandle);
Print("FileOpen OK");
}
else Print("Operation FileOpen failed, error ",GetLastError());
//--- altro esempio con la creazione di una directory racchiusa in MQL5\Files\
string subfolder="Research";
filehandle=FileOpen(subfolder+"\\fractals.txt",FILE_WRITE|FILE_CSV);
if(filehandle!=INVALID_HANDLE)
{
FileWrite(filehandle,TimeCurrent(),Symbol(), EnumToString(_Period));
FileClose(filehandle);
Print("The file most be created in the folder "+terminal_data_path+"\\"+subfolder);
}
else Print("Apertura file fallita, errore ",GetLastError());
}
Vedi anche
U so di un Codepage, FileFindFirst, FolderCreate, Flags di apertura file
FileClose
Chiude il file precedentemente aperto da FileOpen().
void FileClose(
int file_handle // File handle
);
Parametri
file_handle
[ in] Il descrittore di file restituito da FileOpen().
Valore restituito
Nessun valore restituito.
Esempio:
//--- mostra la finestra dei parametri di input quando si lancia lo script
#property script_show_inputs
//--- parametri di input
input string InpFileName="file.txt"; // nome del file
input string InpDirectoryName="Data"; // nome della directory
input int InpEncodingType=FILE_ANSI; // ANSI=32 or UNICODE=64
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- stampa il percorso al file che stiamo per usare
PrintFormat("Working %s\\Files\\ folder",TerminalInfoString(TERMINAL_DATA_PATH));
//--- resetta il valore dell' errore
ResetLastError();
//--- apre il file per la lettura (se il file non esiste, avverrà l'errore)
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_TXT|InpEncodingType);
if(file_handle!=INVALID_HANDLE)
{
//--- stampa il contenuto del file
while(!FileIsEnding(file_handle))
Print(FileReadString(file_handle));
//--- chiude il file
FileClose(file_handle);
}
else
PrintFormat("Errore, codice = %d",GetLastError());
}
FileCopy
La funzione copia il file originale da una cartella locale o condivisa in un altro file.
bool FileCopy(
const string src_file_name, // Nome del file sorgente
int common_flag, // Posizione
const string dst_file_name, // Nome del file di destinazione
int mode_flags // Modalità di accesso
);
Parametri
src_file_name
[ in] Nome del file da copiare.
common_flag
[in] Flag determinante la posizione del file. S e common_flag = FILE_COMMON, allora il file si trova
in una cartella condivisa per tutti i terminali client \T erminal\Common\Files. In caso contrario, il
file si trova in una cartella locale (ad esempio, common_flag = 0).
dst_file_name
[ in] il nome del file dei risultati.
mode_flags
[in]Flag di Accesso. Il parametro può contenere solo 2 flags : FILE_R EW RIT E e/o FILE_COMMON -
altri flags vengono ignorati. S e il file esiste già, ed il flag FILE_R EW RIT E non è stato specificato, il
file non viene riscritto, e la funzione restituisce false.
Valore restituito
I n caso di fallimento la funzione restituisce false.
Nota
Per motivi di sicurezza, il lavoro con i file è strettamente controllato nel linguaggio MQL5. I file con
cui sono condotte le operazioni di file utilizzando i mezzi MQL5, non possono esservi al di fuori della
sandbox del file.
Se il nuovo file esiste già, la copia verrà effettuata in base alla disponibilità del flag FI LE_R EW RIT E
nel parametro mode_flags.
Esempio:
//--- mostra la finestra dei parametri di input quando lancia lo script
#property script_show_inputs
//--- parametri di input
input string InpSrc="source.txt"; // sorgente
input string InpDst="destination.txt"; // copia
input int InpEncodingType=FILE_ANSI; // ANSI=32 or UNICODE=64
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- visualizza il contenuto del sorgente (deve esistere)
if(!FileDisplay(InpSrc))
return;
//--- controlla se il file della copia già esiste (può non essere creato)
if(!FileDisplay(InpDst))
{
//--- il file della copia non esiste, copiatura senza il flag FILE_REWRITE (copia corretta)
if(FileCopy(InpSrc,0,InpDst,0))
Print("Il file è stato copiato!");
else
Print("Il file non è stato copiato!");
}
else
{
//--- il file della copia già esiste, prova copia senza FILE_REWRITE flag (copia sbagliata)
if(FileCopy(InpSrc,0,InpDst,0))
Print("Il file è stato copiato!");
else
Print("Il file non è stato copiato!");
//--- il contenuto file InpDst rimane lo stesso
FileDisplay(InpDst);
//--- copia ancora una volta con il flag FILE_REWRITE (copiatura corretta se il file esiste)
if(FileCopy(InpSrc,0,InpDst,FILE_REWRITE))
Print("Il file è stato copiato!");
else
Print("Il file non è stato copiato!");
}
//--- riceve la copia del file InpSrc
FileDisplay(InpDst);
}
//+--------------------------------------------------------------------------------+
//| Legge il contenuto del file |
//+--------------------------------------------------------------------------------+
bool FileDisplay(const string file_name)
{
//--- resetta il valore dell' errore
ResetLastError();
//--- apre il file
int file_handle=FileOpen(file_name,FILE_READ|FILE_TXT|InpEncodingType);
if(file_handle!=INVALID_HANDLE)
{
//--- visualizza il contenuto del file nel loop
Print("+---------------------+");
PrintFormat("Nome del file = %s",file_name);
while(!FileIsEnding(file_handle))
Print(FileReadString(file_handle));
Print("+---------------------+");
FileDelete
Elimina il file specificato in una cartella locale del terminale cliente.
bool FileDelete(
const string file_name, // Nome del file da eliminare
int common_flag=0 // Posizione del file da eliminare
);
Parametri
file_name
[ in] ome file.
N
common_flag=0
[in] Flag determinante la posizione. S e common_flag = FILE_COMMON, allora il file si trova in una
cartella condivisa per tutti i terminali client \T erminal\Common\Files. In caso contrario, il file si
trova in una cartella locale.
Valore restituito
I n caso di fallimento la funzione restituisce false.
Nota
Per motivi di sicurezza, il lavoro con i file è strettamente controllato nel linguaggio MQL5. I file con
cui sono condotte le operazioni di file utilizzando i mezzi MQL5, non possono esservi al di fuori della
sandbox del file.
Elimina il file specificato da una cartella locale del terminale client (MQL5\files oppure
MQL5\tester\files in caso di testing). S e common_flag = FILE_COMMON, allora la funzione rimuove il
file dalla cartella condivisa per tutti i terminali client.
Esempio:
//--- mostra la finestra dei parametri di input quando si lancia lo script
#property script_show_inputs
//--- data per i vecchi file
input datetime InpFilesDate=D'2013.01.01 00:00';
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
string file_name; // variabile per memorizzare i nomi dei file
string filter="*.txt"; // filtro per cercare i file
datetime create_date; // data di creazione file
string files[]; // lista dei nomi file
int def_size=25; // grandezza array per default
int size=0; // numero di file
//--- alloca la memoria per l'array
ArrayResize(files,def_size);
//--- riceve l'handle di ricerca nella root della cartella locale
long search_handle=FileFindFirst(filter,file_name);
//--- controlla se FileFindFirst() è stato eseguito con successo
if(search_handle!=INVALID_HANDLE)
{
//--- cerca i file nel loop
do
{
files[size]=file_name;
//--- incrementa la grandezza dell'array
size++;
if(size==def_size)
{
def_size+=25;
ArrayResize(files,def_size);
}
//--- resetta il valore dell'errore
ResetLastError();
//--- riceve la data di creazione del file
create_date=(datetime)FileGetInteger(file_name,FILE_CREATE_DATE,false);
//--- controlla se il file è vecchio
if(create_date<InpFilesDate)
{
PrintFormat("%s file eliminato!",file_name);
//--- elimina il vecchio file
FileDelete(file_name);
}
}
while(FileFindNext(search_handle,file_name));
//--- chiude l'handle di ricerca
FileFindClose(search_handle);
}
else
{
Print("File non trovato!");
return;
}
//--- controlla quale file è rimasto
PrintFormat("Risultato:");
for(int i=0;i<size;i++)
{
if(FileIsExist(files[i]))
PrintFormat("%s file esiste!",files[i]);
else
PrintFormat("%s file eliminato!",files[i]);
}
}
FileMove
S posta il file da una cartella locale o condivisa in un altra cartella.
bool FileMove(
const string src_file_name, // Il nome del file per l'operazione di spostamento
int common_flag, // Locazione
const string dst_file_name, // Nome del file di destinazione
int mode_flags // Modalità di accesso
);
Parametri
src_file_name
[ in] ome del file da spostare/rinominare.
N
common_flag
[in] Flag determinante la posizione del file. S e common_flag = FILE_COMMON, allora il file si trova
in una cartella condivisa per tutti i terminali client \T erminal\Common\Files. In caso contrario, il
file si trova in una cartella locale (common_flag=0).
dst_file_name
[ in] ome del file dopo l'operazione
N
mode_flags
[in]Flag di Accesso. Il parametro può contenere solo 2 flags : FILE_R EW RIT E e/o FILE_COMMON -
altri flags vengono ignorati. S e il file già esiste ed il flag FILE_R EW RIT E non è specificato, il file
non verrà riscritto, e la funzione resituità false.
Valore restituito
I n caso di fallimento la funzione restituisce false.
Nota
Per motivi di sicurezza, il lavoro con i file è strettamente controllato nel linguaggio MQL5. I file con
cui sono condotte le operazioni di file utilizzando i mezzi MQL5, non possono esservi al di fuori della
sandbox del file.
Se il nuovo file esiste già, la copia verrà effettuata in base alla disponibilità del flag FI LE_R EW RIT E
nel parametro mode_flags.
Esempio:
//--- mostra la finestra dei parametri di input quando lancia lo script
#property script_show_inputs
//--- parametri di input
input string InpSrcName="data.txt";
input string InpDstName="newdata.txt";
input string InpSrcDirectory="SomeFolder";
input string InpDstDirectory="OtherFolder";
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
string local=TerminalInfoString(TERMINAL_DATA_PATH);
string common=TerminalInfoString(TERMINAL_COMMONDATA_PATH);
//--- riceve i percorsi dei file
string src_path;
string dst_path;
StringConcatenate(src_path,InpSrcDirectory,"//",InpSrcName);
StringConcatenate(dst_path,InpDstDirectory,"//",InpDstName);
//--- controlla se il file sorgente esiste (se no - esce)
if(FileIsExist(src_path))
PrintFormat("il file %s esiste nella cartella %s\\Files\\%s",InpSrcName,local,InpSrcDirectory
else
{
PrintFormat("Errore, %s file sorgente non trovato",InpSrcName);
return;
}
//--- controlla se il file risultato già esiste
if(FileIsExist(dst_path,FILE_COMMON))
{
PrintFormat("il file %s esiste nella cartella %s\\Files\\%s",InpDstName,common,InpDstDirector
//--- il file esiste, lo spostamento dev'essere eseguito con la flag FILE_REWRITE
ResetLastError();
if(FileMove(src_path,0,dst_path,FILE_COMMON|FILE_REWRITE))
PrintFormat("il %s è stato spostato",InpSrcName);
else
PrintFormat("Errore! Code = %d",GetLastError());
}
else
{
PrintFormat("il file %s non esiste nella cartella %s\\Files\\%s",InpDstName,common,InpDstDire
//--- il file non esiste, lo spostamento dev'essere eseguito senza la flag FILE_REWRITE
ResetLastError();
if(FileMove(src_path,0,dst_path,FILE_COMMON))
PrintFormat("il %s è stato spostato",InpSrcName);
else
PrintFormat("Errore! Code = %d",GetLastError());
}
//--- il file è stato spostato; controlliamo
if(FileIsExist(dst_path,FILE_COMMON) && !FileIsExist(src_path,0))
Print("Ok!");
else
Print("Errore!");
}
Vedi anche
F ileIsEx ist
FileFlush
S crive su un disco tutti i dati rimasti nel buffer input/output del file.
void FileFlush(
int file_handle // File handle
);
Parametri
file_handle
[ in] Il descrittore di file restituito da FileOpen().
Valore restituito
Nessun valore restituito.
Nota
Quando si scrive un file, i dati possono essere effettivamente trovato lì solo dopo qualche tempo.
Per salvare i dati nel file immediatamente, utilizzare la funzione FileFlush(). S e la funzione non
viene utilizzata, parte dei dati che non sono stati archiviati nel disco ancora, verranno forzatamente
scritta lì solo quando il file viene chiuso mediante la funzione FileClose().
La funzione deve essere utilizzata quando i dati scritti sono di un certo valore. Va tenuto presente
che chiamate di funzioni frequenti possono influire sulla velocità di funzionamento del programma.
La funzione FileFlush() deve essere chiamata tra le operazioni di lettura da un file, e di scrittura su
esso.
Esempio:
//--- mostra la finestra dei parametri di input quando si lancia lo script
#property script_show_inputs
//--- nome del file per la scrittura
input string InpFileName="example.csv"; // nome del file
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- resetta il valore dell'errore
ResetLastError();
//--- apre il file
int file_handle=FileOpen(InpFileName,FILE_READ|FILE_WRITE|FILE_CSV);
if(file_handle!=INVALID_HANDLE)
{
//--- scrive i dati sul file
for(int i=0;i<1000;i++)
{
//--- chiama la funzione di scrittura
FileWrite(file_handle,TimeCurrent(),SymbolInfoDouble(Symbol(),SYMBOL_BID),SymbolInfoDouble
//--- salva i dati sul disco ogni 128essima iterazione
Vedi anche
F ileClose
FileGetInteger
Ottiene una proprietà integer di un file. Ci sono due varianti della funzione.
Parametri
file_handle
[ in] Il descrittore di file restituito da FileOpen().
file_name
[ in] ome file.
N
property_id
[in] ID proprietà File . Il valore può essere uno dei valori dell'enumerazione
ENUM _FILE_PR OPERTY_INT EGER . S e la seconda variante della fuzione viene usata, puoi ricevere
solo i valori delle seguenti proprietà: FILE_EXIS TS , FILE_CR EAT E_DAT E, FILE_MODIFY_DAT E,
FI LE_A CCES S _DAT E e FI LE_S IZE.
common_folder=false
[in] Punta alla locazione del file. S e il parametro è false, viene visualizzata la cartella dati del
terminale. Altrimenti è sottointeso che il file è in una cartella condivisa da tutti i terminali
\T erminal\ Common\Files ( FI LE_COMMO N).
Valore restituito
Il valore della proprietà. In caso di errore, viene restituito -1. Per ottenere un codice di errore usare
la funzione GetLastError().>
Se una cartella viene specificata quando si ottengono le proprietà dal nome, la funzione avrà errore
5018 (ERR_MQL _FILE_IS _DIR ECT ORY) in ogni caso, though the return value will be correct.
Nota
La funzione cambia sempre il codice dell'errore. In caso di completamento di successo, il codice
dell'errore è resettato a NULL.
Esempio:
//--- mostra la finestra dei parametri di input quando lancia lo script
#property script_show_inputs
//--- parametri di input
input string InpFileName="data.csv";
input string InpDirectoryName="SomeFolder";
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
string path=InpDirectoryName+"//"+InpFileName;
long l=0;
//--- apre il file
ResetLastError();
int handle=FileOpen(path,FILE_READ|FILE_CSV);
if(handle!=INVALID_HANDLE)
{
//--- fa il print di tutte le informazioni sul file
Print(InpFileName," file info:");
FileInfo(handle,FILE_EXISTS,l,"bool");
FileInfo(handle,FILE_CREATE_DATE,l,"date");
FileInfo(handle,FILE_MODIFY_DATE,l,"date");
FileInfo(handle,FILE_ACCESS_DATE,l,"date");
FileInfo(handle,FILE_SIZE,l,"other");
FileInfo(handle,FILE_POSITION,l,"other");
FileInfo(handle,FILE_END,l,"bool");
FileInfo(handle,FILE_IS_COMMON,l,"bool");
FileInfo(handle,FILE_IS_TEXT,l,"bool");
FileInfo(handle,FILE_IS_BINARY,l,"bool");
FileInfo(handle,FILE_IS_CSV,l,"bool");
FileInfo(handle,FILE_IS_ANSI,l,"bool");
FileInfo(handle,FILE_IS_READABLE,l,"bool");
FileInfo(handle,FILE_IS_WRITABLE,l,"bool");
//--- chiude il file
FileClose(handle);
}
else
PrintFormat("%s il file non è stato aperto, ErrorCode = %d",InpFileName,GetLastError());
}
//+--------------------------------------------------------------------------------+
//| Mostra il valore della proprietà del file |
//+--------------------------------------------------------------------------------+
void FileInfo(const int handle,const ENUM_FILE_PROPERTY_INTEGER id,
long l,const string type)
{
//--- ricevere il valore della proprietà
ResetLastError();
if((l=FileGetInteger(handle,id))!=-1)
{
//--- il valore ricevuto, lo mostra nel formato corretto
if(!StringCompare(type,"bool"))
Print(EnumToString(id)," = ",l ? "true" : "false");
if(!StringCompare(type,"date"))
Print(EnumToString(id)," = ",(datetime)l);
if(!StringCompare(type,"other"))
Print(EnumToString(id)," = ",l);
}
else
Print("Error, Code = ",GetLastError());
}
Vedi anche
Operazioni sui File, Proprietà dei File
FileIsEnding
D efinisce la fine di un file nel processo di lettura.
bool FileIsEnding(
int file_handle // File handle
);
Parametri
file_handle
[ in] Il descrittore di file restituito da FileOpen().
Valore restituito
La funzione restituisce true se la fine del file è stata raggiunta nel processo di lettura o spostamento
del puntatore file.
Nota
Per definire la fine del file, la funzione tenta di leggere la successiva stringa da esso. S e la stringa
non esiste, la funzione restituisce true, altrimenti restituisce false.
Esempio:
//--- mostra la finestra dei parametri di input quando si lancia lo script
#property script_show_inputs
//--- parametri di input
input string InpFileName="file.txt"; // nome del file
input string InpDirectoryName="Data"; // nome della directory
input int InpEncodingType=FILE_ANSI; // ANSI=32 or UNICODE=64
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- stampa il percorso al file che stiamo per usare
PrintFormat("Working %s\\Files\\ folder",TerminalInfoString(TERMINAL_DATA_PATH));
//--- resetta il valore dell' errore
ResetLastError();
//--- apre il file per la lettura (se il file non esiste, avverrà l'errore)
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_TXT|InpEncodingType);
if(file_handle!=INVALID_HANDLE)
{
//--- stampa il contenuto del file
while(!FileIsEnding(file_handle))
Print(FileReadString(file_handle));
//--- chiude il file
FileClose(file_handle);
}
else
PrintFormat("Errore, codice = %d",GetLastError());
FileIsLineEndin
D efinisce la fine della riga in un file di testo nel processo di lettura.
bool FileIsLineEnding(
int file_handle // File handle
);
Parametri
file_handle
[ in] Il descrittore di file restituito da FileOpen().
Valore restituito
R estituisce true se il processo di lettura del file tx t o csv raggiunge la fine della riga (i caratteri CR -
L F).
Example (il file ottenuto durante l'esecuzione di un esempio per la funzione FileW riteS tring viene qui
utilizzato)
//+--------------------------------------------------------------------------------+
//| Demo_FileIsLineEnding.mq5 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 5
#property indicator_plots 1
//---- plot Label1
#property indicator_label1 "Overbought & Oversold"
#property indicator_type1 DRAW_COLOR_BARS
#property indicator_color1 clrRed, clrBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 2
//--- parametri per la lettura dei dati
input string InpFileName="RSI.csv"; // nome del file
input string InpDirectoryName="Data"; // nome della directory
//--- buffers indicatore
double open_buff[];
double high_buff[];
double low_buff[];
double close_buff[];
double color_buff[];
//--- variabili overbought
int ovb_ind=0;
int ovb_size=0;
datetime ovb_time[];
//---- imposta i valori dell'indicatore che non saranno visibili sul chart
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//---
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Legge i dati stringa del file |
//+--------------------------------------------------------------------------------+
void ReadData(const int file_handle,datetime &arr[],int &size,int &def_size)
{
bool flag=false;
//--- legge fino alla che viene raggiunta la fine della stringa o del file
while(!FileIsLineEnding(file_handle) && !FileIsEnding(file_handle))
{
//--- slitta il carriage dopo aver letto il numero
if(flag)
FileReadNumber(file_handle);
//--- memorizza la data corrente
arr[size]=FileReadDatetime(file_handle);
size++;
//--- incrementa la grandezza dell'array se necessario
if(size==def_size)
{
def_size+=100;
ArrayResize(arr,def_size);
}
//--- va oltre la prima iterazione
flag=true;
}
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
ArraySetAsSeries(time,false);
ArraySetAsSeries(open,false);
ArraySetAsSeries(high,false);
ArraySetAsSeries(low,false);
ArraySetAsSeries(close,false);
//+--------------------------------------------------------------------------------+
//| Event handler ChartEvent |
//+--------------------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam
)
{
//--- cambia lo spessore indicatore secondo la scala
if(ChartGetInteger(0,CHART_SCALE)>3)
PlotIndexSetInteger(0,PLOT_LINE_WIDTH,2);
else
PlotIndexSetInteger(0,PLOT_LINE_WIDTH,1);
}
Vedi anche
F ileW riteS tring
FileReadArray
Legge da un file di tipo BIN l'array di qualunque tipo eccetto stringa (può essere un array di strutture,
non contenente stringhe, ed array dinamici).
uint FileReadArray(
int file_handle, // File handle
void& array[], // Array da registrare
int start=0, // posizione di inizio dell'array, da scrivere
int count=WHOLE_ARRAY // conteggio a leggere
);
Parametri
file_handle
[ in] Il descrittore di file restituito da FileOpen().
array[]
[ out] Un array dove i dati verranno caricati.
start=0
[ in] Posizione di inizio per scrivere nell'array.
count=WHOLE_ARRAY
[ in] umero di elementi da leggere. Per default, legge l'intero array (count=W H OLE_ARRAY).
N
Valore restituito
N umero di elementi letti.
Nota
A rray stringa può essere sola lettura dal file di tipo TXT . S e necessario, la funzione prova ad
incrementare la grandezza dell'array.
Esempio (il file ottenuto dopo l'esecuzione dell'esempio per la funzione FileW riteArray è qui usato)
//--- mostra la finestra dei parametri di input quando lancia lo script
#property script_show_inputs
//--- parametri di input
input string InpFileName="data.bin";
input string InpDirectoryName="SomeFolder";
//+--------------------------------------------------------------------------------+
//| Struttura per memorizzare i dati dei prezzi |
//+--------------------------------------------------------------------------------+
struct prices
{
datetime date; // date
double bid; // prezzo bid
double ask; // prezzo ask
};
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- struttura array
prices arr[];
//--- percorso file
string path=InpDirectoryName+"//"+InpFileName;
//--- apre il file
ResetLastError();
int file_handle=FileOpen(path,FILE_READ|FILE_BIN);
if(file_handle!=INVALID_HANDLE)
{
//--- legge tutti i dati dal file nell'array
FileReadArray(file_handle,arr);
//--- riceve la grandezza dell'array
int size=ArraySize(arr);
//--- fa il print dei dati dall'array
for(int i=0;i<size;i++)
Print("Date = ",arr[i].date," Bid = ",arr[i].bid," Ask = ",arr[i].ask);
Print("Total data = ",size);
//--- chiude il file
FileClose(file_handle);
}
else
Print("Fallimento nell'aprire il file, errore ",GetLastError());
}
Vedi anche
Variabili, FileW riteArray
FileReadBool
Legge dal file di tipo CS V la stringa dalla posizione corrente fino al delimitatore (o fino alla fine della
riga del testo) e converte la stringa letta in valore di tipo bool.
bool FileReadBool(
int file_handle // File handle
);
Parametri
file_handle
[ in] Il descrittore di file restituito da FileOpen().
Valore restituito
La riga letta può essere impostata a " true" , " false" o la simbolica rappresentazione di integers " 0" o
" 1" . Un valore non-zero viene convertito nel valore logico true. La funzione restituisce il valore
convertito.
Esempio (il file ottenuto fopo l'esecuzione dell'esempio per la funzione FileW rite è qui utilizzato)
//+--------------------------------------------------------------------------------+
//| Demo_FileReadBool.mq5 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 2
//---- plot Label1
#property indicator_label1 "UpSignal"
#property indicator_type1 DRAW_ARROW
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 4
//---- plot Label2
#property indicator_label2 "DownSignal"
#property indicator_type2 DRAW_ARROW
#property indicator_color2 clrRed
#property indicator_style2 STYLE_SOLID
#property indicator_width2 4
//--- parametri per la lettura dei dati
input string InpFileName="MACD.csv"; // nome del file
input string InpDirectoryName="Data"; // nome della directory
//--- variabili globali
int ind=0; // indice
double upbuff[]; // buffer indicatore di freccia su
Vedi anche
T ipo bool, FileW rite
FileReadDatetime
Legge dal file di tipo CS V una stringa di uno dei formati : " AAAA .MM.GG OO:M I:S S " , " AAAA .MM.GG" or
" OO : M I:S S " - e la converte in un valore di tipo datetime.
datetime FileReadDatetime(
int file_handle // File handle
);
Parametri
file_handle
[ in] Il descrittore di file restituito da FileOpen().
Valore restituito
I l valore di tipo datetime.
Esempio (il file ottenuto fopo l'esecuzione dell'esempio per la funzione FileW rite è qui utilizzato)
//+--------------------------------------------------------------------------------+
//| Demo_FileReadDateTime.mq5 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 2
//---- plot Label1
#property indicator_label1 "UpSignal"
#property indicator_type1 DRAW_ARROW
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 4
//---- plot Label2
#property indicator_label2 "DownSignal"
#property indicator_type2 DRAW_ARROW
#property indicator_color2 clrRed
#property indicator_style2 STYLE_SOLID
#property indicator_width2 4
//--- parametri per la lettura dei dati
input string InpFileName="MACD.csv"; // nome del file
input string InpDirectoryName="Data"; // nome della directory
//--- variabili globali
int ind=0; // indice
double upbuff[]; // buffer indicatore di freccia su
double downbuff[]; // buffer indicatore di freccia giu
bool sign_buff[]; // array signal (true - buy, false - sell)
Vedi anche
T ipo datetime, S tring T oT ime, T imeT oS tring, FileW rite
FileReadDouble
Legge un numero a doppia-precisione floating point (double) dalla corrente posizione del file binario.
double FileReadDouble(
int file_handle // File handle
);
Parametri
file_handle
[ in] Il descrittore di file restituito da FileOpen().
Valore restituito
I l valore di tipo double.
Nota
Per più dettagli riguardo l'errore, chiamare GetLastError().
Esempio (il file ottenuto dopo l'esecuzione dell'esempio per la funzione F ileW riteDouble è qui
utilizzato)
//+--------------------------------------------------------------------------------+
//| Demo_FileReadDouble.mq5 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//---- plot Label1
#property indicator_label1 "MA"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1 2
#property indicator_separate_window
//--- parametri di lettura dei dati
input string InpFileName="MA.csv"; // nome del file
input string InpDirectoryName="Data"; // nome della directory
//--- variabili globali
int ind=0;
int size=0;
double ma_buff[];
datetime time_buff[];
//--- buffer indicatore
double buff[];
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- apre il file
ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_BIN);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("%s il file è disponibile per la lettura",InpFileName);
PrintFormat("Percorso file: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
//--- prima, legge la quantità di dati nel file
size=(int)FileReadDouble(file_handle);
//--- alloca la memoria per gli array
ArrayResize(ma_buff,size);
ArrayResize(time_buff,size);
//--- legge i dati dal file
for(int i=0;i<size;i++)
{
time_buff[i]=(datetime)FileReadDouble(file_handle);
ma_buff[i]=FileReadDouble(file_handle);
}
//--- chiude il file
FileClose(file_handle);
PrintFormat("I dati vengono scritti, il file %s è chiuso",InpFileName);
}
else
{
PrintFormat("Fallimento nell'aprire il file %s, Codice errore = %d",InpFileName,GetLastError(
return(INIT_FAILED);
}
//--- lega l'array al buffer indicatore con l'indice 0
SetIndexBuffer(0,buff,INDICATOR_DATA);
//---- imposta i valori dell'indicatore che non saranno visibili sul chart
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//---
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
Vedi anche
T ipi R eal (double, float), S tring T oDouble, DoubleT oS tring, FileW riteDouble
FileReadFloat
Legge un numero a singola-precisione floating point (float) dalla corrente posizione del file binario.
float FileReadFloat(
int file_handle // File handle
);
Parametri
file_handle
[ in] Il descrittore di file restituito da FileOpen().
Valore restituito
I l valore di tipo float.
Nota
Per più dettagli riguardo l'errore, chiamare GetLastError().
Esempio (il file ottenuto dopo l'esecuzione dell'esempio per la funzione FileW riteFloat è qui usato)
//+--------------------------------------------------------------------------------+
//| Demo_FileReadFloat.mq5 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots 1
//---- plot Label1
#property indicator_label1 "CloseLine"
#property indicator_type1 DRAW_COLOR_LINE
#property indicator_color1 clrRed,clrBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 2
//--- parametri per la lettura dei dati
input string InpFileName="Close.bin"; // nome del file
input string InpDirectoryName="Data"; // nome della directory
//--- variabili globali
int ind=0;
int size=0;
double close_buff[];
datetime time_buff[];
//--- buffers indicatore
double buff[];
double color_buff[];
//+--------------------------------------------------------------------------------+
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
ArraySetAsSeries(time,false);
//--- il loop per la barra che non è stata ancora maneggiata
for(int i=prev_calculated;i<rates_total;i++)
{
//--- 0 per default
buff[i]=0;
color_buff[i]=0; // colore rosso per default
//--- controlla se ci sono ancora dati presenti
if(ind<size)
{
for(int j=ind;j<size;j++)
{
//--- se le date coincidono, viene usato il valore dal file
if(time[i]==time_buff[j])
{
//--- riceve il prezzo
buff[i]=close_buff[j];
//--- se il prezzo corrente eccede quello previsto, il colore è blu
if(buff[i-1]>buff[i])
color_buff[i]=1;
//--- incrementa il contatore
ind=j+1;
break;
}
}
}
}
//--- restituisce il valore di prev_calculated per la prossima chiamata
return(rates_total);
}
Vedi anche
T ipi reali (double, float), FileR eadDouble, FileW riteFloat
FileReadInteger
La funzione legge int, short o il valore char dalla posizione corrente del puntatore del file a seconda
della lunghezza specificata in byte.
int FileReadInteger(
int file_handle, // File handle
int size=INT_VALUE // Grandezza di un integer in byte
);
Parametri
file_handle
[ in] Il descrittore di file restituito da FileOpen().
size=INT_VALUE
[in] Numero di byte (fino a 4 inclusivi), che dev 'essere letto. Le corrispondenti costanti vengono
fornite: CHAR_VAL UE = 1, S H ORT_VAL UE = 2 and INT_VAL UE = 4, cos ì la funzione può leggere il
valore intero del tipo char, short o int.
Valore restituito
U n valore del tipo int. Il risultato di questa funzione deve essere esplicitamente castato ad un tipo
target, cioè al tipo di dati che si ha bisogno di leggere. Giacchè viene restituito un valore di tipo
int, esso può essere facilmente convertito in qualunque valore integer. Il puntatore del file è slittato
per il numero dei byte letti.
Nota
Quando si legge meno di 4 byte, il risultato ricevuto è sempre positivo. If one or two bytes are read,
the sign of the number can be determined by ex plicit casting to type char (1 byte) or short (2 bytes).
Ottenere il segno per un numero tre-byte non è banale, poiché non vi è corrispondenza di tipo
sottostante.
Esempio (il file ottenuto fopo l'esecuzione dell'esempio per la funzione F ileW riteInteger è ui
q
utilizzato)
//+--------------------------------------------------------------------------------+
//| Demo_FileReadInteger.mq5 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//---- plot Label1
#property indicator_label1 "Trends"
#property indicator_type1 DRAW_SECTION
#property indicator_color1 clrRed
}
}
}
//--- restituisce il valore di prev_calculated per la prossima chiamata
return(rates_total);
}
Vedi anche
I ntegerT oS tring, S tring T oInteger, Integer types, FileW riteInteger
FileReadLong
La funzione legge un numero intero di tipo long (8 byte) dalla posizione corrente del file binario.
long FileReadLong(
int file_handle // File handle
);
Parametri
file_handle
[ in] Il descrittore di file restituito da FileOpen().
Valore restituito
I l valore di tipo long.
Esempio (il file ottenuto durante l'esecuzione di un esempio per la funzione FileW riteLong viene qui
utilizzato)
//+--------------------------------------------------------------------------------+
//| Demo_FileReadLong.mq5 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_buffers 1
#property indicator_plots 1
//---- plot Label1
#property indicator_label1 "Volume"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrYellow
#property indicator_style1 STYLE_SOLID
#property indicator_width1 2
#property indicator_separate_window
//--- parametri per la lettura dei dati
input string InpFileName="Volume.bin"; // nome del file
input string InpDirectoryName="Data"; // nome directory
//--- variabili globali
int ind=0;
int size=0;
long volume_buff[];
datetime time_buff[];
//--- buffers indicatore
double buff[];
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- apre il file
ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_BIN);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("il file %s viene aperto per la lettura",InpFileName);
PrintFormat("Percorso file: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
//--- prima, legge la quantità di dati nel file
size=(int)FileReadLong(file_handle);
//--- alloca la memoria per gli array
ArrayResize(volume_buff,size);
ArrayResize(time_buff,size);
//--- legge i dati dal file
for(int i=0;i<size;i++)
{
time_buff[i]=(datetime)FileReadLong(file_handle);
volume_buff[i]=FileReadLong(file_handle);
}
//--- chiude il file
FileClose(file_handle);
PrintFormat("I dati vengono letti, il file %s è chiuso",InpFileName);
}
else
{
PrintFormat("Fallimento nell'aprire il file %s, Codice errore = %d",InpFileName,GetLastError(
return(INIT_FAILED);
}
//--- associa l'array al buffer indicatore con indice 0
SetIndexBuffer(0,buff,INDICATOR_DATA);
/ ---- imposta i valori degli indicatori che saranno visibili sul grafico
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//---
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
ArraySetAsSeries(time,false);
//--- il loop per la barra che non è stata ancora maneggiata
for(int i=prev_calculated;i<rates_total;i++)
{
//--- 0 per default
buff[i]=0;
//--- controlla se ci sono ancora dati presenti
if(ind<size)
{
for(int j=ind;j<size;j++)
{
//--- se le date coincidono, viene usato il valore dal file
if(time[i]==time_buff[j])
{
buff[i]=(double)volume_buff[j];
ind=j+1;
break;
}
}
}
}
//--- restituisce il valore di prev_calculated per la prossima chiamata
return(rates_total);
}
Vedi anche
I nteger types, FileR eadInteger, FileW riteLong
FileReadNumber
La funzione legge dal file CS V una stringa dalla posizione corrente fino ad un separatore (o fino alla
fine di una stringa di testo) e converte la stringa letta in un valore di tipo double.
double FileReadNumber(
int file_handle // File handle
);
Parametri
file_handle
[ in] Il descrittore di file restituito da FileOpen().
Valore restituito
I l valore di tipo double.
Example (il file ottenuto durante l'esecuzione di un esempio per la funzione FileW riteS tring viene qui
utilizzato)
//+--------------------------------------------------------------------------------+
//| Demo_FileReadNumber.mq5 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 5
#property indicator_plots 1
//---- plot Label1
#property indicator_label1 "Overbought & Oversold"
#property indicator_type1 DRAW_COLOR_BARS
#property indicator_color1 clrRed, clrBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 2
//--- parametri per la lettura dei dati
input string InpFileName="RSI.csv"; // nome del file
input string InpDirectoryName="Data"; // nome della directory
//--- buffers indicatore
double open_buff[];
double high_buff[];
double low_buff[];
double close_buff[];
double color_buff[];
//--- variabili overbought
int ovb_ind=0;
int ovb_size=0;
datetime ovb_time[];
//---- imposta i valori dell'indicatore che non saranno visibili sul chart
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//---
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Legge i dati stringa del file |
//+--------------------------------------------------------------------------------+
void ReadData(const int file_handle,datetime &arr[],int &size,int &def_size)
{
bool flag=false;
//--- legge fino alla che viene raggiunta la fine della stringa o del file
while(!FileIsLineEnding(file_handle) && !FileIsEnding(file_handle))
{
//--- slitta il carriage dopo aver letto il numero
if(flag)
FileReadNumber(file_handle);
//--- memorizza la data corrente
arr[size]=FileReadDatetime(file_handle);
size++;
//--- incrementa la grandezza dell'array se necessario
if(size==def_size)
{
def_size+=100;
ArrayResize(arr,def_size);
}
//--- va oltre la prima iterazione
flag=true;
}
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
ArraySetAsSeries(time,false);
ArraySetAsSeries(open,false);
ArraySetAsSeries(high,false);
ArraySetAsSeries(low,false);
ArraySetAsSeries(close,false);
//+--------------------------------------------------------------------------------+
//| Event handler ChartEvent |
//+--------------------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam
)
{
//--- cambia lo spessore indicatore secondo la scala
if(ChartGetInteger(0,CHART_SCALE)>3)
PlotIndexSetInteger(0,PLOT_LINE_WIDTH,2);
else
PlotIndexSetInteger(0,PLOT_LINE_WIDTH,1);
}
Vedi anche
F ileW riteS tring
FileReadString
La funzione legge da una stringa dalla posizione corrente di un puntatore di file in un file.
string FileReadString(
int file_handle, // File handle
int length=-1 // Lunghezza della stringa
);
Parametri
file_handle
[ in] Il descrittore di file restituito da FileOpen().
length=-1
[ in] Numero di caratteri da leggere.
Valore restituito
Linea letta (stringa).
Nota
D urante si legge da un file-bin. la lunghezza della stringa da leggere deve essere specificata. Quando
si legge da un file-tx t la lunghezza della stringa non è richiesta, e la stringa sarà letta dalla posizione
attuale al carattere di avanzamento riga " \r\n" . Durante la lettura da un file CS V, la lunghezza della
stringa non è necessaria inoltre, la stringa verrà letta dalla posizione corrente fino al più vicino
delimitatore o fino al carattere di fine stringa di testo.
S e il file viene aperto con il flag FI LE_ANS I, allora la riga letta viene convertita in Unicode.
Esempio (il file ottenuto fopo l'esecuzione dell'esempio per la funzione F ileW riteInteger è ui
q
utilizzato)
string str;
//--- legge i dati dal file
while(!FileIsEnding(file_handle))
{
//--- trova come molti simboli vengono usati per scrivere l'orario
str_size=FileReadInteger(file_handle,INT_VALUE);
//--- legge la stringa
str=FileReadString(file_handle,str_size);
//--- fa il print della stringa
PrintFormat(str);
}
//--- chiude il file
FileClose(file_handle);
PrintFormat("I dati vengono letti, il file %s è chiuso",InpFileName);
}
else
PrintFormat("Fallimento nell'aprire il file %s, Codice errore = %d",InpFileName,GetLastError(
}
Vedi anche
T ipo string, Conversione Dati, FileW riteInteger
FileReadStruct
La funzione legge il contenuto in una struttura passata come parametro da un file binario, a partire
dalla posizione corrente del puntatore del file.
uint FileReadStruct(
int file_handle, // File handle
const void& struct_object, // struttura target per il quale il contenuto viene letto
int size=-1 // grandezza struttura in bytes
);
Parametri
file_handle
[ in] Descrittore di un file-bin aperto.
struct_object
[out] L 'oggetto di questa struttura. La struttura non deve contenere stringhe, array dinamici o
funzioni virtuali.
size=-1
[in] Numero di byte che devono essere letti. S e la grandezza non è specificata o il valore indicato è
maggiore della grandezza della struttura, viene utilizzata la grandezza esatta della struttura
specificata.
Valore restituito
In caso di successo la funzione restituisce il numero di byte letti. Il puntatore del file viene spostato
per lo stesso numero di byte.
Esempio (il file ottenuto dopo aver usato l'esempio per la funzione for FileW riteS truct è qui utilizzato)
//+--------------------------------------------------------------------------------+
//| Demo_FileReadStruct.mq5 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots 1
//---- plot Label1
#property indicator_label1 "Candele"
#property indicator_type1 DRAW_CANDLES
#property indicator_color1 clrOrange
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
#property indicator_separate_window
//--- parametri per la ricezione dei dati
input string InpFileName="EURUSD.txt"; // nome del file
{
open_buff[i]=cand_buff[j].open;
close_buff[i]=cand_buff[j].close;
high_buff[i]=cand_buff[j].high;
low_buff[i]=cand_buff[j].low;
//--- incrementa il contatore
ind=j+1;
break;
}
}
}
}
//--- restituisce il valore di prev_calculated per la prossima chiamata
return(rates_total);
}
Vedi anche
S trutture e Classi, FileW riteS truct
FileSeek
La funzione sposta la posizione del puntatore di file per un determinato numero di byte rispetto alla
posizione specificata.
bool FileSeek(
int file_handle, // File handle
long offset, // In byte
ENUM_FILE_POSITION origin // Posizione per riferimento
);
Parametri
file_handle
[ in] Il descrittore di file restituito da FileOpen().
offset
[ in] Lo slttamento in byte (può assumere un valore negativo).
origin
[ in] Il punto di partenza per lo spostamento. Può essere uno dei valori di ENUM _FILE_POS ITION.
Valore restituito
In caso di successo la funzione restituisce true, altrimenti false. Per ottenere informazioni sull'
errore chiamare la funzione GetLastError().
Nota
Se l'esecuzione della funzione FileS eek () risulta in uno slittamento negativo (va oltre il " livello di
confine" del file), il puntatore del file viene impostato all'inizio del file.
S e una posizione viene impostata al di là del " limite destro" del file (più grande della dimensione del
file), la scritta accanto al file non verrà effettuata a partire dalla fine del file, ma dalla posizione
impostata. In questo caso, valori indefiniti verranno scritti per la fine del file precedente e la
posizione impostata.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_FileSeek.mq5 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
//--- mostra la finestra dei parametri di input quando lancia lo script
#property script_show_inputs
//--- parametri di input
input string InpFileName="file.txt"; // nome del file
input string InpDirectoryName="Data"; // nome della directory
input int InpEncodingType=FILE_ANSI; // ANSI=32 or UNICODE=64
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- specifica il valore della variabile per generare numeri casuali
_RandomSeed=GetTickCount();
//--- variabili per le posizioni dei punti di inizio della stringa
ulong pos[];
int size;
//--- resetta il valore dell' errore
ResetLastError();
//--- apre il file
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_TXT|InpEncodingType);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("%s il file è disponibile per la lettura",InpFileName);
//--- riceve la posizione d'inizio per ogni stringa nel file
GetStringPositions(file_handle,pos);
//--- definisce il numero di stringhe nel file
size=ArraySize(pos);
if(!size)
{
//--- si ferma se il file non ha stringhe
PrintFormat("il file %s è vuoto!",InpFileName);
FileClose(file_handle);
return;
}
//--- fa una selezione casuale di un numero di stringa
int ind=MathRand()%size;
//--- slitta la posizione al punto iniziale della stringa
if(FileSeek(file_handle,pos[ind],SEEK_SET)==true)
{
//--- legge e fa il print della stringa con il numero ind
PrintFormat("Testo stringa con numero %d : \"%s\"",ind,FileReadString(file_handle));
}
//--- chiude il file
FileClose(file_handle);
PrintFormat("il file %s è stato chiuso",InpFileName);
}
else
PrintFormat("Fallimento nell'aprire il file %s, Codice errore = %d",InpFileName,GetLastError(
}
//+-------------------------------------------------------------------------------+
//| La funzione definisce i punti di inizio per ogni stringa nel file e |
//| li piazza nell'array arr |
//+-------------------------------------------------------------------------------+
void GetStringPositions(const int handle,ulong &arr[])
{
FileSize
La funzione restituisce la dimensione del file in byte.
ulong FileSize(
int file_handle // File handle
);
Parametri
file_handle
[ in] Il descrittore di file restituito da FileOpen().
Valore restituito
I l valore di tipo int.
Nota
Per ottenere informazioni sull' errore chiamare GetLastError().
Esempio:
//--- mostra la finestra dei parametri di input quando si lancia lo script
#property script_show_inputs
//--- parametri di input
input ulong InpThresholdSize=20; // soglia della grandezza del file in kilobytes
input string InpBigFolderName="big"; // cartella per file larghi
input string InpSmallFolderName="small"; // cartella per file piccoli
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
string file_name; // variabile per memorizzare i nomi dei file
string filter="*.csv"; // filtro per la ricerca dei file
ulong file_size=0; // grandezza del file in byte
int size=0; // numero di file
//--- fa il print del percorso del file con cui stiamo per lavorare
PrintFormat("Working in %s\\Files\\ folder",TerminalInfoString(TERMINAL_COMMONDATA_PATH));
//--- riceve l'handle di ricerca nella root della cartella comune a tutti i terminali
long search_handle=FileFindFirst(filter,file_name,FILE_COMMON);
//--- controlla se FileFindFirst() è stato eseguito con successo
if(search_handle!=INVALID_HANDLE)
{
//--- sposta i file nel ciclo secondo la loro grandezza
do
{
//--- apre il file
ResetLastError();
int file_handle=FileOpen(file_name,FILE_READ|FILE_CSV|FILE_COMMON);
if(file_handle!=INVALID_HANDLE)
{
//--- riceve la grandezza del file
file_size=FileSize(file_handle);
//--- chiude il file
FileClose(file_handle);
}
else
{
PrintFormat("Fallimento nell'aprire il file %s, Codice Errore = %d",file_name,GetLastEr
continue;
}
//--- fa il print della grandezza del file
PrintFormat("La grandezza del file %s è uguale a %d byte",file_name,file_size);
//--- definisce il percorso per spostare il file
string path;
if(file_size>InpThresholdSize*1024)
path=InpBigFolderName+"//"+file_name;
else
path=InpSmallFolderName+"//"+file_name;
//--- sposta il file
ResetLastError();
if(FileMove(file_name,FILE_COMMON,path,FILE_REWRITE|FILE_COMMON))
PrintFormat("il file %s è stato spostato",file_name);
else
PrintFormat("Error, code = %d",GetLastError());
}
while(FileFindNext(search_handle,file_name));
//--- chiude l'handle di ricerca
FileFindClose(search_handle);
}
else
Print("File non trovato!");
}
FileTell
I l file restituisce la posizione corrente del puntatore di un file aperto.
ulong FileTell(
int file_handle // File handle
);
Parametri
file_handle
[ in] Il descrittore di file restituito da FileOpen().
Valore restituito
Posizione attuale del descrittore del file in byte dall'inizio del file.
Nota
Per ottenere informazioni sull' errore chiamare GetLastError().
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_FileTell.mq5 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
//--- mostra la finestra dei parametri di input quando lancia lo script
#property script_show_inputs
//--- parametri di input
input string InpFileName="file.txt"; // nome del file
input string InpDirectoryName="Data"; // nome della directory
input int InpEncodingType=FILE_ANSI; // ANSI=32 or UNICODE=64
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- specifica il valore della variabile per generare numeri casuali
_RandomSeed=GetTickCount();
//--- variabili per le posizioni dei punti di inizio della stringa
ulong pos[];
int size;
//--- resetta il valore dell' errore
ResetLastError();
//--- apre il file
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_TXT|InpEncodingType);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("%s il file è disponibile per la lettura",InpFileName);
//--- riceve la posizione d'inizio per ogni stringa nel file
GetStringPositions(file_handle,pos);
//--- definisce il numero di stringhe nel file
size=ArraySize(pos);
if(!size)
{
//--- si ferma se il file non ha stringhe
PrintFormat("il file %s è vuoto!",InpFileName);
FileClose(file_handle);
return;
}
//--- fa una selezione casuale di un numero di stringa
int ind=MathRand()%size;
//--- slitta la posizione al punto iniziale della stringa
FileSeek(file_handle,pos[ind],SEEK_SET);
//--- legge e fa il print della stringa con il numero ind
PrintFormat("Testo della stringa con il numero %d: \"%s\"",ind,FileReadString(file_handle));
//--- chiude il file
FileClose(file_handle);
PrintFormat("il file %s è stato chiuso",InpFileName);
}
else
PrintFormat("Fallimento nell'aprire il file %s, Codice errore = %d",InpFileName,GetLastError(
}
//+-------------------------------------------------------------------------------+
//| La funzione definisce i punti di inizio per ogni stringa nel file e |
//| li piazza nell'array arr |
//+-------------------------------------------------------------------------------+
void GetStringPositions(const int handle,ulong &arr[])
{
//--- grandezza array di default
int def_size=127;
//--- alloca la memoria per l'array
ArrayResize(arr,def_size);
//--- contatore stringa
int i=0;
//--- se questa non è la fine del file, allora c'è ancora una stringa
if(!FileIsEnding(handle))
{
arr[i]=FileTell(handle);
i++;
}
else
return; // il file è vuoto, esce
//--- definisce lo slittamento in byte a seconda della codifica
int shift;
if(FileGetInteger(handle,FILE_IS_ANSI))
shift=1;
else
shift=2;
//--- va attraverso le stringhe nel loop
while(1)
{
//--- legge la stringa
FileReadString(handle);
//--- controlla la fine del file
if(!FileIsEnding(handle))
{
//--- memorizza la posizione della prossima stringa
arr[i]=FileTell(handle)+shift;
i++;
//--- incrementa la grandezza dell'array se è stato riempito
if(i==def_size)
{
def_size+=def_size+1;
ArrayResize(arr,def_size);
}
}
else
break; // fine del file, uscita
}
//--- definisce l'attuale grandezza dell'array
ArrayResize(arr,i);
}
FileW rite
La funzione è intesa per la scrittura di dati in un file CS V, il delimitatore viene inserito
automaticamente a meno che non è uguale a 0. Dopo aver scritto nel file, verrà aggiunto il carattere
di fine riga " \r\n" .
uint FileWrite(
int file_handle, // File handle
... // Elenco dei parametri registrati
);
Parametri
file_handle
[ in] Il descrittore di file restituito da FileOpen().
...
[in] L 'elenco dei parametri separati da virgole, per scrivere nel file. Il numero di parametri scritti
può essere fino a 63.
Valore restituito
N umero di byte scritti.
Nota
I numeri saranno convertiti in un testo in uscita (vedere la funzione Print() ). I dati di tipo double
vengono emessi con la precisione di 16 cifre dopo la virgola, ed i dati possono essere visualizzati sia
in formato tradizionale che in formato scientifico - in base a quale dei due formati, l'output sarà più
compatto. I dati di tipo float sono mostrati con 5 cifre dopo la virgola decimale. Per emettere in
output i numeri reali con precisione diversa o in un formato chiaramente specificato, utilizzare
DoubleT oS tring().
I numeri di tipo bool vengono visualizzati come le stringhe " true" o " false" . I numeri del tipo
datetime vengono visualizzati come " AAAA.MM.GG. HH:M I:S S " .
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_FileWrite.mq5 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
//--- mostra la finestra dei parametri di input quando si lancia lo script
#property script_show_inputs
//--- parametri per la ricezione dei dati dal terminale
input string InpSymbolName="EURUSD"; // coppia di valute
input ENUM_TIMEFRAMES InpSymbolPeriod=PERIOD_H1; // time frame
input int InpFastEMAPeriod=12; // periodo EMA veloce
input int InpSlowEMAPeriod=26; // periodo EMA lento
macd_size=ArraySize(macd_buff);
//--- analizza i dati e salva i segnali indicatore nell'array
ArrayResize(sign_buff,macd_size-1);
ArrayResize(time_buff,macd_size-1);
for(int i=1;i<macd_size;i++)
{
//--- segnale buy
if(macd_buff[i-1]<0 && macd_buff[i]>=0)
{
sign_buff[sign_size]=true;
time_buff[sign_size]=date_buff[i];
sign_size++;
}
//--- segnale sell
if(macd_buff[i-1]>0 && macd_buff[i]<=0)
{
sign_buff[sign_size]=false;
time_buff[sign_size]=date_buff[i];
sign_size++;
}
}
//--- apre il file per la scrittura dei valori indicatore (se il file è assente, verrà creato autom
ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_WRITE|FILE_CSV);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("il file %s è disponibile per la scrittura",InpFileName);
PrintFormat("Percorso file: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
//--- prima, scrive il numero di segnali
FileWrite(file_handle,sign_size);
//--- scrive l'orario ed i valori dei segnali al file
for(int i=0;i<sign_size;i++)
FileWrite(file_handle,time_buff[i],sign_buff[i]);
//--- chiude il file
FileClose(file_handle);
PrintFormat("I dati vengono scritti, il file %s è chiuso",InpFileName);
}
else
PrintFormat("Fallimento nell'aprire il file %s, Codice errore = %d",InpFileName,GetLastError(
}
Vedi anche
Commento, S tampa, S tring Format
FileW riteArray
La funzione scrive array di qualsiasi tipo ad eccezione di stringa ad un file BIN (può essere un array di
strutture che non contengono stringhe o array dinamici).
uint FileWriteArray(
int file_handle, // File handle
const void& array[], // Array
int start=0, // Indice start nell'array
int count=WHOLE_ARRAY // Numero di elementi
);
Parametri
file_handle
[ in] Il descrittore di file restituito da FileOpen().
array[]
[ out] Array per la registrazione.
start=0
[ in] Indice iniziale nell' array (numero del primo elemento registrato).
count=WHOLE_ARRAY
[in] Numero di elementi da scrivere (W H OLE_ARRAY significa che tutti gli elementi iniziano con il
numero start fino alla fine dell'array, verranno scritti).
Valore restituito
N umero di elementi registrati.
Nota
A rray di stringhe possono essere registrati in un file TXT . In questo caso, le stringhe vengono
automaticamente chiuse dai caratteri di fine riga " \r\n" . A seconda del tipo di file ANS I o UNICODE,
le stringhe sono o convertite in codifica-ansi o meno.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_FileWriteArray.mq5 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
//--- parametri di input
input string InpFileName="data.bin";
input string InpDirectoryName="SomeFolder";
//+--------------------------------------------------------------------------------+
//| Struttura per memorizzare i dati dei prezzi |
//+--------------------------------------------------------------------------------+
struct prices
{
datetime date; // date
double bid; // prezzo bid
double ask; // prezzo ask
};
//--- variabili globali
int count=0;
int size=20;
string path=InpDirectoryName+"//"+InpFileName;
prices arr[];
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione dell' Expert |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- alloca la memoria per l'array
ArrayResize(arr,size);
//---
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione Expert |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- scrive le stringhe di conteggio rimanenti se count<n
WriteData(count);
}
//+--------------------------------------------------------------------------------+
//| Funzione tick dell'Expert |
//+--------------------------------------------------------------------------------+
void OnTick()
{
//--- salva i dati nell'array
arr[count].date=TimeCurrent();
arr[count].bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);
arr[count].ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
//--- mostra i correnti dati
Print("Date = ",arr[count].date," Bid = ",arr[count].bid," Ask = ",arr[count].ask);
//--- incrementa il contatore
count++;
//--- se l'array è riempito, scrive i dati nel file e lo azzera
if(count==size)
{
WriteData(size);
count=0;
}
}
//+--------------------------------------------------------------------------------+
//| Scrive n elementi dell'array nel file |
//+--------------------------------------------------------------------------------+
void WriteData(const int n)
{
//--- apre il file
ResetLastError();
int handle=FileOpen(path,FILE_READ|FILE_WRITE|FILE_BIN);
if(handle!=INVALID_HANDLE)
{
//--- scrive i dati array alla fine del file
FileSeek(handle,0,SEEK_END);
FileWriteArray(handle,arr,0,n);
//--- chiude il file
FileClose(handle);
}
else
Print("Fallimento nell'aprire il file, errore",GetLastError());
}
Vedi anche
Variabili, FileS eek
FileW riteDouble
La funzione scrive il valore di un parametro double ad un file-bin, a partire dalla posizione corrente del
puntatore del file.
uint FileWriteDouble(
int file_handle, // File handle
double value // Valore da scrivere
);
Parametri
file_handle
[ in] Il descrittore di file restituito da FileOpen().
valore
[ in] I l valore di tipo double.
Valore restituito
I n caso di successo la funzione restituisce il numero di byte scritti (in questo caso sizeof(double)=8).
I l puntatore del file viene spostato dello stesso numero di byte.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_FileWriteDouble.mq5 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
//--- mostra la finestra dei parametri di input quando si lancia lo script
#property script_show_inputs
//--- parametri per la ricezione dei dati dal terminale
input string InpSymbolName="EURJPY"; // coppia di valute
input ENUM_TIMEFRAMES InpSymbolPeriod=PERIOD_M15; // time frame
input int InpMAPeriod=10; // periodo smoothing
input int InpMAShift=0; // slittamento indicatore
input ENUM_MA_METHOD InpMAMethod=MODE_SMA; // tipo di smoothing
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; // tipo di prezzo
input datetime InpDateStart=D'2013.01.01 00:00'; // data di inizio copiatura dati
//--- parameters for writing data to the file
input string InpFileName="MA.csv"; // nome del file
input string InpDirectoryName="Data"; // nome directory
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
datetime date_finish=TimeCurrent();
double ma_buff[];
datetime time_buff[];
int size;
//--- riceve l'handle dell'indicatore MA
ResetLastError();
int ma_handle=iMA(InpSymbolName,InpSymbolPeriod,InpMAPeriod,InpMAShift,InpMAMethod,InpAppliedPri
if(ma_handle==INVALID_HANDLE)
{
//--- fallimento nel ricevere l'handle dell'indicatore
PrintFormat("Errore quando si è ricevuto l'handle indicatore. Codice Errore = %d",GetLastErro
return;
}
//--- essendo nel ciclo finché l'indicatore calcola tutti i valori
while(BarsCalculated(ma_handle)==-1)
Sleep(20); // una pausa per consentire all'indicatore di calcolare tutti i suoi valori
PrintFormat("I valori dell'indicatore che iniziano da %s verranno scritti nel file",TimeToString
//--- copia i valori indicatore
ResetLastError();
if(CopyBuffer(ma_handle,0,InpDateStart,date_finish,ma_buff)==-1)
{
PrintFormat("Fallimento nel copiare i valori dell'indicatore. Codice Errore = %d",GetLastErro
return;
}
//--- copia l'orario di arrivo delle barre appropriate
ResetLastError();
if(CopyTime(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,time_buff)==-1)
{
PrintFormat("Fallimento nel copiare i valori temporali. Codice Errore = %d",GetLastError());
return;
}
//--- riceve la grandezza del buffer
size=ArraySize(ma_buff);
//--- libera la memoria occupata per l'indicatore
IndicatorRelease(ma_handle);
//--- apre il file per la scrittura dei valori indicatore (se il file è assente, verrà creato autom
ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_WRITE|FILE_BIN);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("il file %s è disponibile per la scrittura",InpFileName);
PrintFormat("Percorso file: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
//--- prima, scrive la grandezza del campione dati
FileWriteDouble(file_handle,(double)size);
//--- scrive l'orario ed il valore dell'indicatore nel file
for(int i=0;i<size;i++)
{
FileWriteDouble(file_handle,(double)time_buff[i]);
FileWriteDouble(file_handle,ma_buff[i]);
}
//--- chiude il file
FileClose(file_handle);
PrintFormat("I dati vengono scritti, il file %s è chiuso",InpFileName);
}
else
PrintFormat("Fallimento nell'aprire il file %s, Codice errore = %d",InpFileName,GetLastError(
}
Vedi anche
I tipi reali (double, float)
FileW riteFloat
La funzione scrive il valore di un parametro float ad un file-bin, a partire dalla posizione corrente del
puntatore del file.
uint FileWriteFloat(
int file_handle, // File handle
float value // Valore da scrivere
);
Parametri
file_handle
[ in] Il descrittore di file restituito da FileOpen().
valore
[ in] Il valore di tipo float.
Valore restituito
In caso di successo la funzione restituisce il numero di byte scritti (in questo caso sizeof(Float)=4). Il
puntatore del file viene spostato dello stesso numero di byte.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_FileWriteFloat.mq5 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
//--- mostra la finestra dei parametri di input quando si lancia lo script
#property script_show_inputs
//--- parametri per la ricezione dei dati dal terminale
input string InpSymbolName="EURUSD"; // coppia di valute
input ENUM_TIMEFRAMES InpSymbolPeriod=PERIOD_M15; // time frame
input datetime InpDateStart=D'2013.01.01 00:00'; // data di inzio copiatura dati
//--- parameters for writing data to the file
input string InpFileName="Close.bin"; // nome file
input string InpDirectoryName="Data"; // nome directory
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
datetime date_finish=TimeCurrent();
double close_buff[];
datetime time_buff[];
int size;
Vedi anche
I T ipi R eali (double, float), FileW riteDouble
FileW riteInteger
La funzione scrive il valore del parametro int ad un file-bin, a partire dalla posizione corrente del
puntatore del file.
uint FileWriteInteger(
int file_handle, // File handle
int value, // Valore da scrivere
int size=INT_VALUE // Grandezza in byte
);
Parametri
file_handle
[ in] Il descrittore di file restituito da FileOpen().
valore
[ in] Valore integer.
size=INT_VALUE
[in] Numero di byte (fino a 4 inclusivi), che devono essere scritti. Le costanti sono disponibili le
corrispondenti: CHAR_VAL UE=1, S H ORT_VAL UE=2 ed INT_VAL UE=4, per cui la funzione può
scrivere il valore integer di tipo char, uchar, short, ushort, int o uint.
Valore restituito
In caso di successo la funzione restituisce il numero di byte scritti. Il puntatore del file viene
spostato dello stesso numero di byte.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_FileWriteInteger.mq5 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
//--- mostra la finestra dei parametri di input quando si lancia lo script
#property script_show_inputs
//--- parametri per la ricezione dei dati dal terminale
input string InpSymbolName="EURUSD"; // coppia di valute
input ENUM_TIMEFRAMES InpSymbolPeriod=PERIOD_H1; // time frame
input datetime InpDateStart=D'2013.01.01 00:00'; // data di inizio copiatura dati
//--- parameters for writing data to the file
input string InpFileName="Trend.bin"; // nome file
input string InpDirectoryName="Data"; // nome directory
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
datetime date_finish=TimeCurrent();
double close_buff[];
datetime time_buff[];
int size;
//--- resetta il valore dell' errore
ResetLastError();
//--- copia i prezzi di chiusura per ogni barra
if(CopyClose(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,close_buff)==-1)
{
PrintFormat("Fallimento nel copiare i valori dei prezzi close. Codice Errore = %d",GetLastErr
return;
}
//--- copia l'orario per ogni barra
if(CopyTime(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,time_buff)==-1)
{
PrintFormat("Fallimento nel copiare i valori temporali. Codice Errore = %d",GetLastError());
return;
}
//--- riceve la grandezza del buffer
size=ArraySize(close_buff);
//--- apre il file per la scrittura dei valori (se il file è assente, verrà automaticamente creato)
ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_WRITE|FILE_BIN);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("il file %s è disponibile per la scrittura",InpFileName);
PrintFormat("Percorso file: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
//---
int up_down=0; // trend flag
int arr_size; // grandezza dell' array arr
uchar arr[]; // array di tipo uchar
//--- scrive i valori orari nel file
for(int i=0;i<size-1;i++)
{
//--- confronta i prezzi di chiusura della barra corrente e successiva
if(close_buff[i]<=close_buff[i+1])
{
if(up_down!=1)
{
//--- scrive i valori data nel file usando FileWriteInteger
StringToCharArray(TimeToString(time_buff[i]),arr);
arr_size=ArraySize(arr);
//--- prima, scrive il numero di simboli nell'array
FileWriteInteger(file_handle,arr_size,INT_VALUE);
//--- scrive i simboli
for(int j=0;j<arr_size;j++)
FileWriteInteger(file_handle,arr[j],CHAR_VALUE);
//--- cambia il trend flag
up_down=1;
}
}
else
{
if(up_down!=-1)
{
//--- scrive i valori data nel file usando FileWriteInteger
StringToCharArray(TimeToString(time_buff[i]),arr);
arr_size=ArraySize(arr);
//--- prima, scrive il numero di simboli nell'array
FileWriteInteger(file_handle,arr_size,INT_VALUE);
//--- scrive i simboli
for(int j=0;j<arr_size;j++)
FileWriteInteger(file_handle,arr[j],CHAR_VALUE);
//--- cambia il trend flag
up_down=-1;
}
}
}
//--- chiude il file
FileClose(file_handle);
PrintFormat("I dati vengono scritti, il file %s è chiuso",InpFileName);
}
else
PrintFormat("Fallimento nell'aprire il file %s, Codice errore = %d",InpFileName,GetLastError(
}
Vedi anche
I ntegerT oS tring, S tring T oInteger, Integer types
FileW riteLong
La funzione scrive il valore del parametro di tipo long ad un file-bin, a partire dalla posizione corrente
del puntatore del file.
uint FileWriteLong(
int file_handle, // File handle
long value // Valore da scrivere
);
Parametri
file_handle
[ in] Il descrittore di file restituito da FileOpen().
valore
[ in] Valore di tipo long.
Valore restituito
In caso di successo la funzione restituisce il numero di byte scritti (in questo caso sizeof(long)=8). Il
puntatore del file viene spostato dello stesso numero di byte.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_FileWriteLong.mq5 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
//--- mostra la finestra dei parametri di input quando si lancia lo script
#property script_show_inputs
//--- parametri per la ricezione dei dati dal terminale
input string InpSymbolName="EURUSD"; // coppia di valute
input ENUM_TIMEFRAMES InpSymbolPeriod=PERIOD_H1; // time frame
input datetime InpDateStart=D'2013.01.01 00:00'; // data di inzio copiatura dati
//--- parameters for writing data to the file
input string InpFileName="Volume.bin"; // nome file
input string InpDirectoryName="Data"; // nome directory
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
datetime date_finish=TimeCurrent();
long volume_buff[];
datetime time_buff[];
int size;
Vedi anche
T ipi Interi, FileW riteInteger
FileW riteString
La funzione scrive il valore di un parametro di tipo-stringa in un file BIN, CS V o TXT a partire dalla
posizione corrente del puntatore del file. Quando si scrive in un file CS V o TXT: se c'è un simbolo nella
stringa '\n' (L F) senza carattere precedente '\r' (CR ), allora prima di '\n' viene agginto il '\r' mancante.
uint FileWriteString(
int file_handle, // File handle
const string text_string, // Stringa da scrivere
int length=-1 // Numero di simboli
);
Parametri
file_handle
[ in] Il descrittore di file restituito da FileOpen().
text_string
[ in] S tring.
length=-1
[in] Il numero di caratteri che si desidera scrivere. Questa opzione è necessaria per scrivere una
stringa in un file BIN. S e la dimensione non è specificata, allora viene scritta l'intera stringa senza
il trailer 0. S e si specifica una dimensione inferiore alla lunghezza della stringa, allora viene scritta
una parte della stringa senza il trailer 0. S e si specifica una dimensione maggiore della lunghezza
della stringa, la stringa è riempita con il numero appropriato di zeri. Per i file di tipo CS V e TXT ,
questo parametro viene ignorato e la stringa viene scritta interamente.
Valore restituito
In caso di successo la funzione restituisce il numero di byte scritti. Il puntatore del file viene
spostato dello stesso numero di byte.
Nota
Si noti che quando si scrive in un file aperto dal flag FILE_UNICODE (o senza un flag FILE_ANS I),
allora il numero di byte scritti sarà due volte più grande del numero di caratteri stringa scritti.
Quando si registra su un file aperto con il flag FILE_ANS I, il numero di byte scritti coinciderà con il
numero di caratteri della stringa scritta.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_FileWriteString.mq5 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
//--- mostra la finestra dei parametri di input quando si lancia lo script
#property script_show_inputs
//--- parametri per la ricezione dei dati dal terminale
//--- apre il file per la scrittura dei valori indicatore (se il file è assente, verrà creato autom
ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_WRITE|FILE_CSV|FILE_AN
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("il file %s è disponibile per la scrittura",InpFileName);
PrintFormat("Percorso file: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
//--- prepara le variabili aggiuntive
string str="";
bool is_formed=false;
//--- scrive i dati per formare aree overbought ed oversold
for(int i=0;i<rsi_size;i++)
{
//--- controlla i valori indicatore
if(rsi_buff[i]>=70 || rsi_buff[i]<=30)
{
//--- se il valore è il primo in quest'area
if(!is_formed)
{
//--- aggiunge il valore e la data
str=(string)rsi_buff[i]+"\t"+(string)date_buff[i];
is_formed=true;
}
else
str+="\t"+(string)rsi_buff[i]+"\t"+(string)date_buff[i];
//--- sposta alla prossima iterazione del loop
continue;
}
//--- controlla il flag
if(is_formed)
{
//--- la stringa è formata, viene scritta nel file
FileWriteString(file_handle,str+"\r\n");
is_formed=false;
}
}
//--- chiude il file
FileClose(file_handle);
PrintFormat("I dati vengono scritti, il file %s è chiuso",InpFileName);
}
else
PrintFormat("Fallimento nell'aprire il file %s, Codice errore = %d",InpFileName,GetLastError(
}
Vedi anche
T ipo S tringa, S tring Format
FileW riteStruct
La funzione scrive nel contenuto di un file-bin una struttura passata come parametro, partendo dalla
posizione corrente del puntatore del file.
uint FileWriteStruct(
int file_handle, // File handle
const void& struct_object, // Link ad un oggetto
int size=-1 // Grandezza da scrivere in byte
);
Parametri
file_handle
[ in] Il descrittore di file restituito da FileOpen().
struct_object
[in] R iferimento all'oggetto di questa struttura. La struttura non deve contenere stringhe, array
dinamici o funzioni virtuali.
size=-1
[in] Numero di byte che si desidera registrare. S e la grandezza non è specificata o il numero
specificato di byte è maggiore della grandezza della struttura, viene scritta l'intera struttura.
Valore restituito
In caso di successo la funzione restituisce il numero di byte scritti. Il puntatore del file viene
spostato dello stesso numero di byte.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_FileWiteStruct.mq5 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
//--- mostra la finestra dei parametri di input quando si lancia lo script
#property script_show_inputs
//--- parametri per la ricezione dei dati dal terminale
input string InpSymbolName="EURUSD"; // coppia di valute
input ENUM_TIMEFRAMES InpSymbolPeriod=PERIOD_H1; // time frame
input datetime InpDateStart=D'2013.01.01 00:00'; // data di inzio copiatura dati
//--- parameters for writing data to the file
input string InpFileName="EURUSD.txt"; // nome del file
input string InpDirectoryName="Data"; // nome directory
//+--------------------------------------------------------------------------------+
//| Struttura per memorizzare i dati della candela |
//+--------------------------------------------------------------------------------+
struct candlesticks
{
double open; // prezzo apertura
double close; // prezzo chiusura
double high; // prezzo più alto
double low; // prezzo più basso
datetime date; // data
};
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
datetime date_finish=TimeCurrent();
int size;
datetime time_buff[];
double open_buff[];
double close_buff[];
double high_buff[];
double low_buff[];
candlesticks cand_buff[];
//--- resetta il valore dell' errore
ResetLastError();
//--- riceve l'orario di arrivo delle barre dal range
if(CopyTime(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,time_buff)==-1)
{
PrintFormat("Fallimento nel copiare i valori temporali. Codice Errore = %d",GetLastError());
return;
}
//--- riceve i prezzi high delle barre, dal range
if(CopyHigh(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,high_buff)==-1)
{
PrintFormat("Fallimento nel copiare i valori dei prezzi high. Codice Errore = %d",GetLastErro
return;
}
//--- riceve i valori low delle barre dal range
if(CopyLow(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,low_buff)==-1)
{
PrintFormat("Fallimento nel copiare i valori dei prezzi low. Codice Errore = %d",GetLastError
return;
}
//--- riceve i prezzi open delle barre, dal range
if(CopyOpen(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,open_buff)==-1)
{
PrintFormat("Fallimento nel copiare i valori dei prezzi open. Codice Errore = %d",GetLastErro
return;
}
//--- riceve i prezzi close delle barre dal range
if(CopyClose(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,close_buff)==-1)
{
PrintFormat("Fallimento nel copiare i valori dei prezzi close. Codice Errore = %d",GetLastErr
return;
}
//--- definisce la dimensione degli array
size=ArraySize(time_buff);
//--- salva i dati nella array struttura
ArrayResize(cand_buff,size);
for(int i=0;i<size;i++)
{
cand_buff[i].open=open_buff[i];
cand_buff[i].close=close_buff[i];
cand_buff[i].high=high_buff[i];
cand_buff[i].low=low_buff[i];
cand_buff[i].date=time_buff[i];
}
//--- apre il file per la scrittura della struttura array nel file (se il file è assente, verrà cre
ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_WRITE|FILE_BIN|FILE_CO
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("il file %s viene aperto per la lettura",InpFileName);
PrintFormat("Percorso file: %s\\Files\\",TerminalInfoString(TERMINAL_COMMONDATA_PATH));
//--- prepara il contatore del numero di byte
uint counter=0;
//--- scrive i valori array nel loop
for(int i=0;i<size;i++)
counter+=FileWriteStruct(file_handle,cand_buff[i]);
PrintFormat("%d byte di informazione vengono scritti nel file %s",InpFileName,counter);
PrintFormat("Numero totale di byte: %d * %d * %d = %d, %s",size,5,8,size*5*8,size*5*8==counte
//--- chiude il file
FileClose(file_handle);
PrintFormat("I dati vengono scritti, il file %s è chiuso",InpFileName);
}
else
PrintFormat("Fallimento nell'aprire il file %s, Codice errore = %d",InpFileName,GetLastError(
}
Vedi anche
Le strutture e le classi
FileLoad
Legge tutti i dati di un file binario specificato in un array passato, di tipo numerico o strutture
semplici. La funzione consente di leggere rapidamente i dati di tipo noto nell' array appropriato.
long FileLoad(
const string file_name, // Nome del File
void& buffer[], // Un array di tipo numerico o strutture semplici
int common_flag=0 // Un flag file, viene cercato in <data_folder>\MQL5\Files\ per
);
Parametri
file_name
[ in] Il nome del file da cui vengono letti i dati.
buffer
[ in] Un array di tipo numerico o strutture semplici.
common_flag=0
[in] Una flag file indicante la modalità di funzionamento. S e il parametro non viene specificato, il
file viene cercato nella sottocartella MQL5\Files (o in <testing _agent_directory>\MQL5\Files in caso
di testing).
Valore di ritorno
I l numero di elementi letti oppure -1 in caso di errore.
Nota
La funzione FileLoad() legge da un file il numero di byte multiplo della grandezza dell'array.
S upponiamo che la dimensione del file è di 10 byte, e la funzione legge i dati in un array di tipo
double (sizeof(Double)=8). In questo caso la funzione leggerà solo 8 byte, i restanti 2 byte alla fine
del file verranno scartati, e la funzione FileLoad() restituirà 1 (1 elemento letto).
Esempio:
//+------------------------------------------------------------------+
//| Demo_FileLoad.mq5 |
//| Copyright 2016, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property script_show_inputs
//--- parametri di input
input int bars_to_save=10; // Numero di barre
//+------------------------------------------------------------------+
Guarda anche
S trutture e Classi, FileR eadArray, FileR eadS truct, FileS ave
FileSave
Scrive in un file binario tutti gli elementi di un array passato come parametro. La funzione consente di
scrivere rapidamente array di tipo numerico o strutture semplici come una stringa.
bool FileSave(
const string file_name, // Nome del File
void& buffer[], // Un array di tipo numerico o strutture semplici
int common_flag=0 // Un flag file, per default i files vengono scritti in <data_f
);
Parametri
file_name
[ in] Il nome del file, in cui i dati dell'array verranno scritti.
buffer
[ in] Un array di tipo numerico o strutture semplici.
common_flag=0
[in] Una flag file indicante la modalità di funzionamento. S e il parametro non viene specificato, il
file verrà scritto nella sottocartella MQL5\Files (o per <testing _agent_directory>\MQL5\Files in
caso di testing).
Valore di ritorno
I n caso di fallimento restituisce false.
Esempio:
//+------------------------------------------------------------------+
//| Demo_FileSave.mq5 |
//| Copyright 2016, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property script_show_inputs
//--- parametri di input
input int ticks_to_save=1000; // Numero di ticks
//+------------------------------------------------------------------+
//| Script program funzione start |
//+------------------------------------------------------------------+
void OnStart()
{
string filename=_Symbol+"_ticks.bin";
MqlTick ticks[];
//---
int copied=CopyTicks(_Symbol,ticks,COPY_TICKS_ALL,0,ticks_to_save);
if(copied!=-1)
{
Guarda anche
S trutture e Classi, FileW riteArray, FileW riteS truct, FileLoad, FileW rite
FolderCreate
La funzione crea una cartella nella directory Files (a seconda del valore di common_flag).
bool FolderCreate(
string folder_name, // La stringa con il nome della nuova cartella
int common_flag=0 // Ambito
);
Parametri
folder_name
[ in] Il nome della directory che si desidera creare. Contains the relative path to the folder.
common_flag=0
[in]Flag determina la posizione della directory. S e common_flag =FILE_COMMON, la directory si
trova nella cartella condivisa per tutti i terminali client \T erminal\Common\Files. In caso contrario,
la directory si trova in una cartella locale (MQL5\files o MQL5\tester\file in caso di testing).
Valore restituito
R estituisce true se ha successo, altrimenti - false.
Nota
Per motivi di sicurezza, il lavoro con i file è strettamente controllato nel linguaggio MQL5. I file con
cui sono condotte le operazioni di file utilizzando i mezzi MQL5, non possono esservi al di fuori della
sandbox del file.
Esempio:
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
//--- description
#property description "The script shows FolderCreate() application sample."
#property description "The external parameter defines the directory for creating folders."
#property description "The folder structure is created after executing the script"
//--- display window of the input parameters during the script's launch
#property script_show_inputs
//--- the input parameter defines the folder, in which the script works
input bool common_folder=false; // common folder for all terminals
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- folder to be created in MQL5\Files
string root_folder="Folder_A";
if(CreateFolder(root_folder,common_folder))
{
return false;
}
Vedi anche
F ileOpen(), FolderClean(), FileCopy()
FolderDelete
La funzione rimuove la directory specificata. S e la cartella non è vuota, allora non può essere rimossa.
bool FolderDelete(
string folder_name, // Stringa con il nome della cartella da eliminare
int common_flag=0 // Ambito
);
Parametri
folder_name
[ in] Il nome della directory che si desidera eliminare. Contiene il percorso completo della cartella.
common_flag=0
[in]Flag determina la posizione della directory. S e common_flag =FILE_COMMON, la directory si
trova nella cartella condivisa per tutti i terminali client \T erminal\Common\Files. In caso contrario,
la directory si trova in una cartella locale (MQL5\file o MQL5\tester\file in caso di testing).
Valore restituito
R estituisce true se ha successo, altrimenti false.
Nota
Per motivi di sicurezza, il lavoro con i file è strettamente controllato nel linguaggio MQL5. I file con
cui sono condotte le operazioni di file utilizzando i mezzi MQL5, non possono esservi al di fuori della
sandbox del file.
Se la directory contiene almeno un file e/o sottodirectory, allora questa directory non può essere
eliminata, deve essere prima pulita. FolderClean() è usata per pulire una cartella di tutti i suoi file o
sottocartelle.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_FolderDelete.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
//--- Descrizione
#property description "Lo script mostra un esempio di uso di FolderDelete()."
#property description "Le prime due cartelle sono state create; una di esse è vuota, la seconda con
#property description "Quando si prova ed eliminare la cartella non vuota, un errore viene restitui
string filename="delete_me.txt"; // Il nome del file che verrà creato nella cartella secondFo
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- Scrive l'handle del file qui
int handle;
//--- Rileva in quale cartella stiamo lavorando
string working_folder=TerminalInfoString(TERMINAL_DATA_PATH)+"\\MQL5\\Files";
//--- Il messaggio di debug
PrintFormat("working_folder=%s",working_folder);
//--- Prova a creare una cartella vuota relativa al percorso MQL5\Files
if(FolderCreate(firstFolder,0)) // 0 significa che stiamo lavorando nella cartella locale del te
{
//--- Introduce il percorso completo per la cartella creata
PrintFormat("La cartella %s è stata creata",working_folder+"\\"+firstFolder);
//--- Resetta il codice errore
ResetLastError();
}
else
PrintFormat("Fallimento nel creare la cartella %s. Codice errore %d",working_folder+"\\"+firs
ResetLastError();
//--- Elimina la cartella che contiene il file
if(FolderDelete(secondFolder))
PrintFormat("La cartella %s è stata eliminata con successo", secondFolder);
else
//--- Il seguente messaggio dovrebbe apparire giacchè la cartella contiene un file
PrintFormat("Fallimento nell'eliminare la cartella %s. Codice Errore=%d", secondFolder, Ge
}
else
Print("Eliminazione annullata");
//---
}
Vedi anche
F ileOpen(), FolderClean(), FileMove()
FolderClean
La funzione cancella tutti i file in una cartella specificata.
bool FolderClean(
string folder_name, // La stringa con il nome della cartella eliminata
int common_flag=0 // Ambito
);
Parametri
folder_name
[in] Il nome della directory in cui si desidera eliminare tutti i file. Contiene il percorso completo
della cartella.
common_flag=0
[in]Flag determina la posizione della directory. S e common_flag = FILE_COMMON, la directory si
trova nella cartella condivisa per tutti i terminali client \T erminal\Common\Files. In caso contrario,
la directory si trova in una cartella locale (MQL5\files o MQL5\tester\files in caso di testing).
Valore restituito
R estituisce true se ha successo, altrimenti false.
Nota
Per motivi di sicurezza, il lavoro con i file è strettamente controllato nel linguaggio MQL5. I file con
cui sono condotte le operazioni di file utilizzando i mezzi MQL5, non possono esservi al di fuori della
sandbox del file.
Questa funzione deve essere usata con cautela, dal momento che tutti i file e tutte le sottodirectory
vengono eliminate irrimediabilmente.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_FolderClean.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
//--- Descrizione
#property description "Lo script mostra un esempio di uso di FolderClean()."
#property description "Prima, i file vengono creati nella cartella specificata usando la funzione F
#property description "Quindi, prima che i file vengano eliminati, un avviso viene mostrato usando
//--- Mostra la finestra di dialogo dei parametri di input quando inizia lo script
#property script_show_inputs
//--- parametri di Input
input string foldername="demo_folder"; // Crea una cartella in MQL5/Files/
input int files=5; // Il numero di file per creare ed eliminare
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
string name="testfile";
//--- Prima apre o crea i file nella cartella dati del terminale
for(int N=0;N<files;N++)
{
//--- Il nome del file in forma di 'demo_folder\testfileN.txt'
string filemane=StringFormat("%s\\%s%d.txt",foldername,name,N);
//--- Apre il file con il flag per la scrittura, in questo caso, la cartella 'demo_folder' ve
int handle=FileOpen(filemane,FILE_WRITE);
//--- Rileva se la funzione FileOpen() ha avuto successo
if(handle==INVALID_HANDLE)
{
PrintFormat("Fallimento nel creare il file %s. Error code",filemane,GetLastError());
ResetLastError();
}
else
{
PrintFormat("Il file %s è stato aperto con successo",filemane);
//--- Il file aperto non serve più, quindi viene chiuso
FileClose(handle);
}
}
PrintFormat("Eliminazione annullata");
//---
}
//+--------------------------------------------------------------------------------+
//| Restituisce il numero di file nella cartella specificata |
//+--------------------------------------------------------------------------------+
int FilesInFolder(string path,int flag)
{
int count=0;
long handle;
string filename;
//---
handle=FileFindFirst(path,filename,flag);
//--- Se almeno un file viene trovato, cerca per più file
if(handle!=INVALID_HANDLE)
{
//--- Mostra il nome del file
PrintFormat("Il file %s è stato trovato",filename);
//--- Incrementa il contatore dei file/cartelle trovati
count++;
//--- Inizia la ricerca in tutti i file/cartelle
while(FileFindNext(handle,filename))
{
PrintFormat("Il file %s è stato trovato",filename);
count++;
}
//--- Non dimenticare di chiudere l'handle di ricerca una volta completata
FileFindClose(handle);
}
else // Fallimento nell'ottenere l'handle
{
PrintFormat("Ricerca file nella cartella %s fallita",path);
}
//--- Restituisce il risultato
return count;
}
Vedi anche
F ileFindFirst, FileFindNex t, FileFindClose
Custom Indicators
Questo è il gruppo funziona utilizzati nella creazione di indicatori personalizzati. Queste funzioni non
possono essere utilizzate durante la scrittura di Ex pert Advisors e S cript.
Funzione Azione
S etIndexBuffer Associa il buffer indicatore specificato con l'
array dinamico uni-dimensionale di tipo double
La proprietà dell'indicatore può essere impostata utilizzando le direttive del compilatore o utilizzando
le funzioni. Per capire meglio ciò, si consiglia di studiare gli stili indicatore negli esempi.
Tutti i calcoli necessari di un indicatore personalizzato devono essere messi nella funzione
predeterminata OnCalculate(). S e si utilizza una forma breve della chiamata di funzione OnCalculate(),
come
int OnCalculate (const int rates_total, const int prev_calculated, const int begin, const double& p
allora la variabile rates_total contiene il valore del numero totale di elementi dell'array prezzo[]
passato come parametro di input per il calcolo dei valori degli indicatori.
Se le informazioni rigardo la grandezza dell'array di input prezzi sarebbe stato non-disponibile, allora
avrebbe portato alla necessità di fare calcoli per 1000 valori di ogni buffer indicatore. Alla prima
chiamata di OnCalculate() Valore prev _calculated = 0. S e l'array prezzo[] è cambiato in qualche modo,
allora in questo caso prev _calculated è anche uguale a 0.
Il parametro begin mostra il numero di valori iniziali dell'array prezzo, che non contengono dati per il
calcolo. Per esempio, se i valori di Oscillator Accelerator (per cui i primi 37 valori non vengono
calcolati) sono stati utilizzati come parametro di input, allora begin = 37 . A d esempio, consideriamo
un semplice indicatore:
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//---- plot Label1
#property indicator_label1 "Label1"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- buffers indicatore
double Label1Buffer[];
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
void OnInit()
{
//--- mappatura buffers indicatore
SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
//---
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const int begin,
const double &price[])
{
//---
Print("begin = ",begin," prev_calculated = ",prev_calculated," rates_total = ",rates_total);
//--- restituisce il valore di prev_calculated per la prossima chiamata
return(rates_total);
}
T rascinandolo dalla finestra " Navigatore" alla finestra dell'indicatore Accelerator Oscillator,
indicheremo che i calcoli saranno effettuati in base ai valori dell'indicatore precedente:
Come risultato, la prima chiamata di OnCalculate() avrà il valore di prev _calculated uguale a zero, e
con ulteriori chiamate sarà uguale al valore rates _total (finché il numero di barre sul grafico dei prezzi
aumenti).
Il valore del parametro begin sarà esattamente uguale al numero di barre iniziali, per cui i valori
dell'indicatore Accelerator non vengono calcolati secondo la logica di questo indicatore. S e guardiamo il
codice sorgente del indicatore personalizzato Accelerator.mq5, vedremo le seguenti linee nella
funzione OnInit():
1 . impostare il numero di valori iniziali di un indicatore, che non dovrebbe essere utilizzato per i
calcoli in un altro indicatore personalizzato;
2 . ottenere informazioni sul numero dei primi valori per essere ignorati quando si chiama un altro
indicatore personalizzato, senza entrare nella logica dei suoi calcoli.
L 'intero set di indicatori può essere derivata da vari stili di disegno base, conosciuti come plotting. Il
plotting denota un modo di visualizzazione i dati, che l'indicatore calcola, immagazzina e fornisce a
richiesta. Vi sono sette tali tipi di plotting fondamentali:
1 . U na linea
2 . U na sezione (segmento)
3 . Istogramma
4 . F reccia (simbolo)
5. U na zona verniciata (canale riempito)
6 . B ars
7 . Candele giapponesi
Ogni plotting richiede da uno a cinque array di tipo double, in cui sono memorizzati i valori degli
indicatori. Allo scopo di convenienza, questi array sono associati con i buffer indicatore. Il numero di
buffer in un indicatore deve essere dichiarato in anticipo utilizzando le direttive del compilatore, per
esempio:
Poiché ogni tipo plotting base può avere variazione di colore o specifiche di costuzione, il numero
effettivo di tipi di plotting in MQL5 è 18:
è possibile alternare i
colori su diverse barre
o cambiare il suo
momento
N DRAW _S ECTION, ma il
colore di ogni sezione
può essere impostato
singolarmente; il
colore può anche
essere impostato
dinamicamente
W DRAW _ARR O W , ma
ogni simbolo può avere
il suo colore. Il colore
può essere modificato
dinamicamente
con le opzioni di
colorazione individuale
di sezioni e
cambiamento dinamico
del colore
con le opzioni di
colorazione individuale
delle barre e
cambiamento dinamico
del colore
opzioni di colorazione
Un buffer indicatore deve essere dinamico e non richiede specificazione della grandezza - la grandezza
dell'array utilizzato come buffer indicatore, viene impostato dal sottosistema di esecuzione del
terminale, automaticamente
D opo che l'array è vincolato al buffer indicatore, la direzione di indicizzazione viene impostata di
default come negli array ordinari, ma è possibile utilizzare la funzione ArrayS etAs S eries() per cambiare
il modo di accesso agli elementi di un array. Per impostazione predefinita, il buffer indicatore viene
utilizzato per memorizzare i dati utilizzati per la stampa (INDICAT OR_DATA).
Se il calcolo dei valori degli indicatori richiede il possesso di calcoli intermedi e memorizza i valori
aggiuntivi per ogni barra, allora un tale array può essere dichiarato come un buffer di calcolo durante il
binding (INDICAT OR_CALCUL ATIONS ). Per i valori intermedi, è anche possibile utilizzare un array
regolare, ma in questo caso, il programmatore deve gestire la grandezza dell'array.
A lcuni plots permettono di impostare un colore per ogni barra. Per memorizzare le informazioni sul
colore, vengono utilizzati i buffers colore (INDICAT OR_COLOR_INDEX). Il colore è di tipo intero color,
ma tutti i buffer degli indicatori devono essere di tipo double. I valori di colore e buffers ausiliari
(INDICAT OR_CALCUL ATIONS ) non possono essere ottenuti usando CopyBuffer().
Il numero di buffers indicatore deve essere specificato utilizzando la direttiva del compilatore
#property indicator_buffers numero_di _buffers :
Per le candele disegnate, l'indicatore le utilizzerà solo i primi quattro buffer, perché il plotting delle
" candele" è stato annunciato con il primo numero.
Modifichiamo l'esempio, e aggiungiamo un plotting di una linea semplice - DRAW _L INE. S upponiamo
ora che la linea è numerata 1, e le candele sono numero 2. Il numero di buffer ed il numero di plots è
aumentato.
L 'ordine degli dei plots è cambiato, ed ora la linea viene prima, seguita dalle candele giapponesi.
Pertanto, l'ordine dei buffer è appropriato - prima segnaliamo un buffer per la linea con l'indice pari a
zero, e poi quattro buffer per le candele.
Il numero di buffers e plots può essere impostato solo utilizzando direttive del compilatore, è
impossibile modificare queste proprietà in modo dinamico utilizzando le funzioni.
· DRAW _ INL E
· DRAW _S ECTION
· DRAW _HIS T OGRAM
· DRAW _HIS T OGRAM 2
· DRAW _ARR OW
· DRAW _ZIGZAG
· DRAW _ CANDLES
N el secondo gruppo, i nomi di stile comprendono il termine COLOR, chiamiamole versioni colore:
Tutte le versioni di colore degli stili differiscono da quelli di base, in quanto permettono di specificare
un colore per ogni parte del plotting. La minima parte del plotting è una barra, cos ì possiamo dire dire
che le versioni colore permettono di impostare il colore su ogni barra.
Eccezioni sono stili ONE e DRAW _FILL ING, non hanno versioni di colore.
DRAW _N
Per impostare il colore tracciando su ciascuna barra, un buffer aggiuntivo per memorizzare l'indice del
colore è stato aggiunto alla versione colori. Questi indici indicano il numero di un colore in un array
speciale, che contiene un insieme predefinito di colori. La dimensione dell'array di colori è 64. Ciò
significa che ogni versione colore di uno stile permette di disegnare un plot in 64 colori diversi.
Il set e il numero di colori nell' array speciale di colori, possono essere impostati tramite una direttiva
del compilatore #proprietà indicator_color, dove è possibile specificati tutti i colori necessari separati
da virgole. Ad esempio, tale iscrizione in un indicatore:
//--- Definisce 8 colori per colorare le candele (sono memorizzati nell'array speciale)
#property indicator_color1 clrRed,clrBlue,clrGreen,clrYellow,clrMagenta,clrCyan,clrLime,clrOrange
Si afferma che per tracciarne 1, 8 colori sono impostati, che saranno collocati in un array speciale.
Ulteriormente nel programma non specificheremo il colore del tracciato, ma solo il suo indice. S e
vogliamo impostare il colore rosso per il numero di barra K, il valore di indice di colore da un array
deve essere impostato nel buffer colore dell'indicatore Il colore rosso è specificato prima della
direttiva, corrisponde al numero 0 dell' indice.
L 'insieme dei colori non è dato una volta per tutte, può essere variato dinamicamente utilizzando
PlotIndexS etInteger(). Esempio:
In tali casi, non esiste alcun modo per calcolare i valori degli indicatori per le prime N barre, o questi
valori non sono destinati ad essere visualizzati sul grafico e sono solo sussidiari al calcolo di ulteriori
valori. Per evitare il plotting dell'indicatore sulle prime N barre dello storico, impostare il valore di N
Qui:
· numero_di_plot- un valore da 2zero a indicator_plots-1 (la numerazione dei plots inizia con zero).
· N - il numero delle prime barre nello storico, in cui l'indicatore non deve essere visualizzato sul
grafico.
DRAW _NONE
Lo stile DRAW _NONE è progettato per l'utilizzo in casi in cui è necessario calcolare i valori di un buffer
e mostrarli nella Finestra Dati, ma il tracciamento sul grafico non è necessario. Per impostare la
precisione usare l'espressione IndicatorS etInteger (INDICAT OR_DIGITS , num_chars) nella funzione
OnInit():
int OnInit()
{
//--- mappatura buffers indicatore
SetIndexBuffer(0,InvisibleBuffer,INDICATOR_DATA);
//--- Imposta la precisione dei valori da visualizzare nella finestra dei dati
IndicatorSetInteger(INDICATOR_DIGITS,0);
//---
return(INIT_SUCCEEDED);
}
U n esempio di indicatore che mostra il numero della barra su cui il mouse attualmente si muove, nella
F inerstra Dati. La numerazione corrisponde alle timeseries, ovvero che l'attuale barra incompiuta ha
l'indice pari zero, e la barra più vecchia ha l'indice più grande.
Si noti che nonostante il fatto che per il colore rosso è impostato il plotting #1, l'indicatore non
disegna nulla sul grafico.
//+--------------------------------------------------------------------------------+
//| DRAW_NONE.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//--- plot Invisible
#property indicator_label1 "Bar Index"
#property indicator_type1 DRAW_NONE
#property indicator_style1 STYLE_SOLID
#property indicator_color1 clrRed
#property indicator_width1 1
//--- buffers indicatore
double InvisibleBuffer[];
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- Associa un array e un buffer indicatore
SetIndexBuffer(0,InvisibleBuffer,INDICATOR_DATA);
//--- Imposta la precisione dei valori da visualizzare nella finestra dei dati
IndicatorSetInteger(INDICATOR_DIGITS,0);
//---
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
static datetime lastbar=0;
//--- Se questo è il primo calcolo dell'indicatore
if(prev_calculated==0)
{
//--- Rinumera le barre per la prima volta
CalcValues(rates_total,close);
//--- Ricorda il tempo di apertura della barra corrente in lastbar
lastbar=(datetime)SeriesInfoInteger(_Symbol,_Period,SERIES_LASTBAR_DATE);
}
else
{
//--- Se una nuova barra è apparsa, il suo tempo di apertura differisce da lastbar
if(lastbar!=SeriesInfoInteger(_Symbol,_Period,SERIES_LASTBAR_DATE))
{
//--- Rinumera le barre ancora una volta
CalcValues(rates_total,close);
//--- Aggiornare l'orario di apertura della barra corrente in lastbar
lastbar=(datetime)SeriesInfoInteger(_Symbol,_Period,SERIES_LASTBAR_DATE);
}
}
//--- restituisce il valore di prev_calculated per la prossima chiamata
return(rates_total);
}
//+--------------------------------------------------------------------------------+
//| Numera le barre come in una timeseries |
//+--------------------------------------------------------------------------------+
void CalcValues(int total,double const &array[])
{
//--- Imposta l' indicizzazione del buffer indicatore come in una timeseries
ArraySetAsSeries(InvisibleBuffer,true);
//--- Riempie ogni barra con il suo numero
for(int i=0;i<total;i++) InvisibleBuffer[i]=i;
}
DRAW _LINE
L E traccia una linea del colore specificato dai valori del buffer dell'indicatore. La larghezza, lo
DRAW _ IN
stile e il colore della linea possono essere impostati utilizzando le direttive del compilatore e
dinamicamente utilizzando la funzione PlotIndexS etInteger(). Cambiamenti dinamici delle proprietà di
plotting permettono di " animare" gli indicatori, in modo che il loro aspetto cambia a seconda della
situazione attuale.
Un esempio di indicatore che disegna una linea utilizzando i prezzi Close delle barre. Il colore, spessore
e stile cambia casualmente ogni n=5 tick s.
Notare che inizialmente per Plot1 con DRAW _L INE le proprietà vengono impostate utilizzando la
direttiva del compilatore #property, e poi nella funzione OnCalculate() queste tre proprietà vengono
impostate in modo casuale. Il parametro N è impostato in parametri esterni dell'indicatore per la
possibilità di configurazione manuale (la scheda Parametri nella finestra Proprietà del indicatore).
//+--------------------------------------------------------------------------------+
//| DRAW_LINE.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//--- Le proprietà della linea vengono impostate utilizzando le direttive del compilatore
#property indicator_label1 "Line" // Nome del disegno per la Finestra Dati
#property indicator_type1 DRAW_LINE // Tipo di disegno della linea
#property indicator_color1 clrRed // Colore della linea
#property indicator_style1 STYLE_SOLID // Stile della linea
#property indicator_width1 1 // Spessore della linea
//--- parametri input
input int N=5; // Numero di ticks da cambiare
//--- Un buffer indicatore per il disegno
double LineBuffer[];
//--- Un array per salvare i colori
color colors[]={clrRed,clrBlue,clrGreen};
//--- Un array per memorizzare gli stili di linea
ENUM_LINE_STYLE styles[]={STYLE_SOLID,STYLE_DASH,STYLE_DOT,STYLE_DASHDOT,STYLE_DASHDOTDOT};
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- Associa un array e un buffer indicatore
SetIndexBuffer(0,LineBuffer,INDICATOR_DATA);
//--- Inizializzazione del generatore di numeri pseudo-casuali
MathSrand(GetTickCount());
//---
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
static int ticks=0;
//--- Calcola i ticks per cambiare lo stile, il colore e lo spessore della linea
ticks++;
//--- Se un numero critico di ticks è stato accumulato
if(ticks>=N)
{
//--- Cambia le proprietà della linea
ChangeLineAppearance();
//--- Resetta il contatore dei ticks a zero
ticks=0;
}
int style_index=number%size;
//--- Imposta il colore come la proprietà PLOT_LINE_COLOR
PlotIndexSetInteger(0,PLOT_LINE_STYLE,styles[style_index]);
//--- Scrive lo stile della linea
comm=EnumToString(styles[style_index])+", "+comm;
//--- Imposta le informazioni del grafico usando un commento
Comment(comm);
}
DRAW _SECTION
DRAW _S ECTION disegna sezioni del colore specificato dai valori del buffer dell'indicatore. La
larghezza, il colore e lo stile della linea possono essere specificati come per lo stile DRAW _L INE -
utilizzando le direttive del compilatore o in modo dinamico utilizzando la funzione
PlotIndexS etInteger(). Cambiamenti dinamici delle proprietà di plotting permettono di " animare" gli
indicatori, in modo che il loro aspetto cambi a seconda della situazione attuale.
Le sezioni vengono disegnate da un valore non vuoto di un altro valore non vuoto del buffer indicatore,
i valori vuoti vengono ignorati. Per specificare quale valore deve essere considerato come " vuoto" ,
impostare questo valore nella proprietà PLOT_EMPTY_VAL UE: ad esempio, se l'indicatore deve essere
disegnato come una sequenza di sezioni su valori diversi da zero, allora è necessario impostare il
valore zero come uno vuoto:
Riempire sempre esplicitamente i valori dei buffer indicatore, impostare un valore vuoto in un buffer
per gli elementi che non devono essere tracciati.
U n esempio di indicatore che disegna sezioni tra i prezzi H igh e Low. Il colore, la larghezza e lo stile di
tutte le sezioni cambiano in modo casuale ogni N ticks.
Notare che inizialmente per Plot1 con DRAW _S ECTION le proprietà vengono impostate utilizzando la
direttiva del compilatore #property, e poi nella funzione OnCalculate() queste tre proprietà vengono
impostate in modo casuale. Il parametro N è impostato in parametri esterni dell'indicatore per la
possibilità di configurazione manuale (la scheda Parametri nella finestra Proprietà del indicatore).
//+--------------------------------------------------------------------------------+
//| DRAW_SECTION.mq5 |
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//--- plot Section
#property indicator_label1 "Section"
#property indicator_type1 DRAW_SECTION
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- parametri input
input int bars=5; // La lunghezza della sezione in barre
input int N=5; // Il numero di ticks per cambiare lo stile delle sezioni
//--- Un buffer indicatore per il disegno
double SectionBuffer[];
//--- Una variabile ausiliaria per calcolare la fine delle sezioni
int divider;
//--- Un array per salvare i colori
color colors[]={clrRed,clrBlue,clrGreen};
//--- Un array per memorizzare gli stili di linea
ENUM_LINE_STYLE styles[]={STYLE_SOLID,STYLE_DASH,STYLE_DOT,STYLE_DASHDOT,STYLE_DASHDOTDOT};
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- Associa un array e un buffer indicatore
SetIndexBuffer(0,SectionBuffer,INDICATOR_DATA);
/ / --- Il valore 0 (vuoto) parteciperà al disegno
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//--- Controllare il parametro indicatore
if(bars<=0)
{
PrintFormat("Valore non valido del parametro barra=%d",bars);
return(INIT_PARAMETERS_INCORRECT);
}
else divider=2*bars;
//---+
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
static int ticks=0;
//--- Calcola i ticks per cambiare lo stile, il colore e lo spessore della linea
ticks++;
//--- Se un numero critico di ticks è stato accumulato
if(ticks>=N)
{
//--- Cambia le proprietà della linea
ChangeLineAppearance();
//--- Resetta il contatore dei ticks a zero
ticks=0;
}
//--- Il numero della barra da cui inizia il calcolo dei valori degli indicatori
int start=0;
//--- Se l'indicatore è stato calcolato prima, allora impostare l'inizio sulla barra precedente
if(prev_calculated>0) start=prev_calculated-1;
//--- Qui ci sono tutti i calcoli dei valori degli indicatori
for(int i=start;i<rates_total;i++)
{
/ / --- Ottiene il resto della divisione del numero di barre di 2*barre
int rest=i%divider;
//--- Se il numero di barre è divisibile per 2*barre
if(rest==0)
{
//--- Imposta la fine della sezione presso il prezzo elevato di questo bar
SectionBuffer[i]=high[i];
}
//--- Se il resto della divisione è pari a barre,
else
{
//--- Imposta la fine della sezione presso il prezzo elevato di questo bar
if(rest==bars) SectionBuffer[i]=low[i];
//--- Se non è successo niente, ignora bar - set 0
else SectionBuffer[i]=0;
}
}
//--- Restituisce il valore prev_calculated per la successiva chiamata della funzione
return(rates_total);
}
//+--------------------------------------------------------------------------------+
//| Modifica l'aspetto delle sezioni dell'indicatore |
//+--------------------------------------------------------------------------------+
void ChangeLineAppearance()
{
//--- Una stringa per la formazione di informazioni sulle proprietà di linea
string comm="";
//--- Un blocco del cambiamento del colore della linea
int number=MathRand(); // Ottiene un numero casuale
//--- Il divisore è uguale alla grandezza dell'array colors []
int size=ArraySize(colors);
//--- Ottiene l'indice per selezionare un nuovo colore, come il resto della divisione intera
int color_index=number%size;
//--- Imposta il colore come la proprietà PLOT_LINE_COLOR
PlotIndexSetInteger(0,PLOT_LINE_COLOR,colors[color_index]);
//--- Scrive il colore della linea
comm=comm+"\r\n"+(string)colors[color_index];
DRAW _HISTOGRAM
Lo stile DRAW _HIS T OGRAM disegna un istogramma come una sequenza di colonne di un colore
specificato da zero ad un valore specificato. I valori sono presi dal buffer indicatore. La larghezza, il
colore e lo stile della colonna possono essere specificati come per lo stile DRAW _L INE - utilizzando le
direttive del compilatore o in modo dinamico utilizzando la funzione PlotIndexS etInteger().
Cambiamenti dinamici delle proprietà di plotting permettono di cambiare l'aspetto dell'istogramma
sulla base della situazione attuale.
Dal momento che una colonna dal livello zero è disegnata su ogni barra, DRAW _HIS T OGRAM dovrebbe
meglio essere utilizzata in una finestra di grafico separata. Molto spesso questo tipo di tracciamento
viene utilizzato per creare indicatori del tipo oscillatore, per esempio, Bears Power oppure OS M A. Per i
valori vuoti non visualizzabili deve essere specificato il valore zero.
Un esempio di indicatore che disegna una sinusoide di un colore specificato basato sulla funzione
MathS in(). Il colore, la larghezza e lo stile di tutte le colonne dell'istogramma cambiano in modo
casuale ogni N tick s. Il parametro barre specifica il periodo della sinusoide, che è dopo il numero
specificato di barre per cui la sinusoide ripeterà il ciclo.
N otare che inizialmente per Plot1 con DRAW _HIS T OGRAM le proprietà vengono impostate utilizzando
la direttiva del compilatore #property, e poi nella funzione OnCalculate() queste tre proprietà vengono
impostate in modo casuale. Il parametro N è impostato in parametri esterni dell'indicatore per la
possibilità di configurazione manuale (la scheda Parametri nella finestra Proprietà del indicatore).
//+--------------------------------------------------------------------------------+
//| DRAW_HISTOGRAM.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- plot Histogram
#property indicator_label1 "Histogram"
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_color1 clrBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- parametri di input
input int bars=30; // Il periodo della sinusoide in barre
input int N=5; // Il numero di ticks che cambiano l'istogramma
//--- buffers indicatore
double HistogramBuffer[];
//--- Un fattore per ottenere l'angolo di 2Pi in radianti, moltiplicato per il parametro di barre
double multiplier;
//--- Un array per salvare i colori
color colors[]={clrRed,clrBlue,clrGreen};
//--- Un array per memorizzare gli stili di linea
ENUM_LINE_STYLE styles[]={STYLE_SOLID,STYLE_DASH,STYLE_DOT,STYLE_DASHDOT,STYLE_DASHDOTDOT};
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- mappatura buffers indicatore
SetIndexBuffer(0,HistogramBuffer,INDICATOR_DATA);
//--- Calcola il moltiplicatore
if(bars>1)multiplier=2.*M_PI/bars;
else
{
PrintFormat("Imposta il valore di bars=%d maggiore di 1",barre);
//--- Terminazione precoce dell'indicatore
return(INIT_PARAMETERS_INCORRECT);
}
//---
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
int color_index=number%size;
//--- Imposta il colore come la proprietà PLOT_LINE_COLOR
PlotIndexSetInteger(0,PLOT_LINE_COLOR,colors[color_index]);
//--- Scrive il colore della linea
comm=comm+"\r\n"+(string)colors[color_index];
DRAW _HISTOGRAM2
Lo stile DRAW _HIS T OGRAM 2 disegna un istogramma di un colore specificato - segmenti verticali
utilizzano i valori di due buffer indicatore. La larghezza, il colore e lo stile dei segmenti possono
essere specificati come per lo stile DRAW _L INE - utilizzando le direttive del compilatore o in modo
dinamico utilizzando la funzione PlotIndexS etInteger(). Cambiamenti dinamici delle proprietà di
plotting permettono di cambiare l'aspetto dell'istogramma sulla base della situazione attuale.
Lo stile DRAW _HIS T OGRAM 2 può essere utilizzato in una sottofinestra separata di un grafico e nella
sua finestra principale. Per i valori vuoti nulla viene tracciato, tutti i valori nei buffer indicatore
devono essere impostati in modo esplicito. I buffer non vengono inizializzati con un valore zero.
Un esempio di indicatore che traccia un segmento verticale del colore specificato e la larghezza tra i
prezzi Open e Close di ogni barra. Il colore, la larghezza e lo stile di tutte le colonne dell'istogramma
cambiano in modo casuale ogni N tick s. Durante l'inizio dell'indicatore, nella funzione OnInit(), il
numero del giorno della settimana per il quale non sarà disegnato l'istogramma - invisible_day - è
impostato in modo casuale. A questo scopo viene impostato un valore vuoto PLOT_EMPTY_VAL UE=0:
N otare che inizialmente per Plot1 con DRAW _HIS T OGRAM 2 le proprietà vengono impostate utilizzando
la direttiva del compilatore #property, e poi nella funzione OnCalculate() queste tre proprietà sono
impostate in modo casuale. Il parametro N è impostato in parametri esterni dell'indicatore per la
possibilità di configurazione manuale (la scheda Parametri nella finestra Proprietà del indicatore).
//+--------------------------------------------------------------------------------+
//| DRAW_HISTOGRAM2.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 1
//--- plot Histogram_2
#property indicator_label1 "Histogram_2"
#property indicator_type1 DRAW_HISTOGRAM2
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- parametri di input
input int N=5; // Il numero di ticks che cambiano l'istogramma
//--- buffers indicatore
double Histogram_2Buffer1[];
double Histogram_2Buffer2[];
//--- Il giorno della settimana per il quale l'indicatore non viene tracciato
int invisible_day;
//--- Un array per salvare i colori
color colors[]={clrRed,clrBlue,clrGreen};
//--- Un array per memorizzare gli stili di linea
ENUM_LINE_STYLE styles[]={STYLE_SOLID,STYLE_DASH,STYLE_DOT,STYLE_DASHDOT,STYLE_DASHDOTDOT};
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- mappatura buffers indicatore
SetIndexBuffer(0,Histogram_2Buffer1,INDICATOR_DATA);
SetIndexBuffer(1,Histogram_2Buffer2,INDICATOR_DATA);
//--- Imposta un valore vuoto
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//--- Ottiene un numero casuale da 0 a 5
invisible_day=MathRand()%6;
//---
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
void ChangeLineAppearance()
{
//--- Una stringa per la formazione di informazioni sulle proprietà di linea
string comm="";
//--- Un blocco del cambiamento del colore della linea
int number=MathRand(); // Ottiene un numero casuale
//--- Il divisore è uguale alla grandezza dell'array colors []
int size=ArraySize(colors);
//--- Ottiene l'indice per selezionare un nuovo colore, come il resto della divisione intera
int color_index=number%size;
//--- Imposta il colore come la proprietà PLOT_LINE_COLOR
PlotIndexSetInteger(0,PLOT_LINE_COLOR,colors[color_index]);
//--- Scrive il colore della linea
comm=comm+"\r\n"+(string)colors[color_index];
DRAW _ARROW
Lo stile DRAW _ARR OW disegna frecce del colore specificato (simboli del set W ingdings) in base al
valore del buffer dell'indicatore. La larghezza ed il colore dei simboli può essere specificata come per
lo stile DRAW _L INE - utilizzando le direttive del compilatore o in modo dinamico con la funzione
PlotIndexS etInteger(). I cambiamenti dinamici delle proprietà di plottaggio permettono di cambiare
l'aspetto di un indicatore sulla base della situazione attuale.
//--- Definisce il codice simbolo dal carattere Wingdings per disegnare in PLOT_ARROW
PlotIndexSetInteger(0,PLOT_ARROW,code);
Ogni freccia è in realtà un simbolo che ha l'altezza ed il punto di ancoraggio, e può coprire alcune
importanti informazioni su un grafico (per esempio, il prezzo di chiusura alla bar). Quindi, possiamo
anche specificare lo slittamento verticale in pix el, che non dipende dalla scala del grafico. Le frecce
saranno spostate verso il basso per il numero di pix el specificato, anche se i valori dell'indicatore
rimarranno gli stessi:
Un valore negativo di PLOT_ARR OW _S HIFT significa lo spostamento delle frecce verso l'alto, un valore
positivo slitta la freccia verso il basso.
Lo stile DRAW _ARR OW può essere utilizzato in una sottofinestra separata di un grafico e nella sua
finestra principale. Valori vuoti non vengono disegnati e non compaiono nella " Finestra Dati" ; tutti i
valori dei buffer indicatori devono essere impostati in modo esplicito. I buffer non vengono
inizializzati con un valore zero.
Un esempio di indicatore, che disegna frecce su ciascuna barra con il prezzo close superiore al prezzo
di chiusura della barra precedente. Il colore, spessore, slittamento e codice simbolo di tutte le frecce
vengono cambiati in modo casuale ogni N tick s.
Nell'esempio, per Plot1 con lo stile DRAW _ARR OW , la proprietà, il colore e la grandezza vengono
specificati utilizzando la direttiva del compilatore #property, e poi nella funzione OnCalculate() le
proprietà sono impostate in modo casuale. Il parametro N è impostato in parametri esterni
dell'indicatore per la possibilità di configurazione manuale (la scheda Parametri nella finestra Proprietà
del indicatore).
//+--------------------------------------------------------------------------------+
//| DRAW_ARROW.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//--- disegna Frecce
#property indicator_label1 "Arrows"
#property indicator_type1 DRAW_ARROW
#property indicator_color1 clrGreen
#property indicator_width1 1
//--- parametri di input
int start=1;
if(prev_calculated>0) start=prev_calculated-1;
//--- Ciclo del calcolo
for(int i=1;i<rates_total;i++)
{
//--- Se il prezzo Close corrente è maggiore di quello precedente, disegna una freccia
if(close[i]>close[i-1])
ArrowsBuffer[i]=close[i];
//--- Altrimenti specifica il valore zero
else
ArrowsBuffer[i]=0;
}
//--- restituisce il valore di prev_calculated per la prossima chiamata
return(rates_total);
}
//+--------------------------------------------------------------------------------+
//| Modifica l'aspetto dei simboli nell' indicatore |
//+--------------------------------------------------------------------------------+
void ChangeLineAppearance()
{
//--- Una stringa per la formazione di informazioni sulle proprietà degli indicatori
string comm="";
//--- Un blocco per il cambio del colore della freccia
int number=MathRand(); // Ottiene un numero casuale
//--- Il divisore è uguale alla grandezza dell'array colors []
int size=ArraySize(colors);
//--- Ottiene l'indice per selezionare un nuovo colore, come il resto della divisione intera
int color_index=number%size;
//--- Imposta il colore come la proprietà PLOT_LINE_COLOR
PlotIndexSetInteger(0,PLOT_LINE_COLOR,colors[color_index]);
//--- Scrive il colore della linea
comm=comm+"\r\n"+(string)colors[color_index];
comm="\r\n"+"PLOT_ARROW="+IntegerToString(code+code_add)+comm;
DRAW _ZIGZAG
Lo stile DRAW _ZIGZAG disegna segmenti di un colore specificato in base ai valori dei due buffer
indicatori. Questo stile è molto simile a DRAW _S ECTION, ma a differenza di quest'ultimo, permette di
disegnare segmenti verticali all'interno di una barra, se i valori di entrambi i buffer indicatori sono
impostati per questa barra. I segmenti vengono tracciati da un valore nel primo buffer di un valore nel
secondo buffer indicatore. Nessuno dei buffer può contenere solo valori vuoti, perché in questo caso
nulla è tracciato.
La larghezza, il colore e lo stile della linea possono essere specificati come per lo stile DRAW _S ECTION
- con le direttive del compilatore o dinamicamente utilizzando la funzione PlotIndexS etInteger().
Cambiamenti dinamici delle proprietà di plotting permettono di " animare" gli indicatori, in modo che il
loro aspetto cambi a seconda della situazione attuale.
Le sezioni vengono disegnate da un valore non vuoto di un buffer ad un valore non vuoto di un altro
buffer indicatore. Per specificare quale valore deve essere considerato come " vuoto" , impostare
questo valore nella proprietà PLO T_EMPTY_VA L UE:
R iempie esplicitamente i valori dei buffer indicatori, imposta un valore vuoto in un buffer per saltare
le barre.
U n esempio di indicatore che traccia una sega sulla base dei prezzi H igh e Low. Il colore, la larghezza e
lo stile delle linee a zig-zag cambiano in modo casuale ogni N tick s.
Notare che inizialmente per Plot1 con DRAW _ZIGZAG le proprietà vengono impostate utilizzando la
direttiva del compilatore #property, e poi nella funzione OnCalculate() queste proprietà vengono
//+--------------------------------------------------------------------------------+
//| DRAW_ZIGZAG.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots 1
//--- plot ZigZag
#property indicator_label1 "ZigZag"
#property indicator_type1 DRAW_ZIGZAG
#property indicator_color1 clrBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- parametri di input
input int N=5; // Numero di ticks da cambiare
//--- buffers indicatore
double ZigZagBuffer1[];
double ZigZagBuffer2[];
//--- Il giorno della settimana per il quale l'indicatore non viene tracciato
int invisible_day;
//--- Un array per salvare i colori
color colors[]={clrRed,clrBlue,clrGreen};
//--- Un array per memorizzare gli stili di linea
ENUM_LINE_STYLE styles[]={STYLE_SOLID,STYLE_DASH,STYLE_DOT,STYLE_DASHDOT,STYLE_DASHDOTDOT};
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- Legatura Array e buffer indicatore
SetIndexBuffer(0,ZigZagBuffer1,INDICATOR_DATA);
SetIndexBuffer(1,ZigZagBuffer2,INDICATOR_DATA);
//--- Ottiene un valore casuale da 0 a 6, per questo giorno l'indicatore non è tracciato
invisible_day=MathRand()%6;
/ / --- Il valore 0 (vuoto) parteciperà al disegno
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
/ / --- Il valore 0 (vuoto) parteciperà al disegno
PlotIndexSetString(0,PLOT_LABEL,"ZigZag1;ZigZag2");
//---
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
static int ticks=0;
//--- Calcola i ticks per cambiare lo stile, il colore e lo spessore della linea
ticks++;
//--- Se un numero sufficiente di ticks è stato accumulato
if(ticks>=N)
{
//--- Cambia le proprietà della linea
ChangeLineAppearance();
//--- Resetta il contatore dei ticks a zero
ticks=0;
}
//--- La struttura del tempo è richiesta per ottenere il giorno della settimana di ogni barra
MqlDateTime dt;
ZigZagBuffer2[i]=0;
}
//--- Se il giorno della settimana è ok, riempire i buffer
else
{
//--- Se il numero di barre è pari
if(i%2==0)
{
//--- Write High in the 1st buffer and Low in the 2nd one
ZigZagBuffer1[i]=high[i];
ZigZagBuffer2[i]=low[i];
}
//--- Il numero di barre è dispari
else
{
//--- Compila le barre in un ordine inverso
ZigZagBuffer1[i]=low[i];
ZigZagBuffer2[i]=high[i];
}
}
}
//--- restituisce il valore di prev_calculated per la prossima chiamata
return(rates_total);
}
//+--------------------------------------------------------------------------------+
//| Modifica l'aspetto dei segmenti a zig-zag |
//+--------------------------------------------------------------------------------+
void ChangeLineAppearance()
{
//--- Una stringa per la formazione di informazioni sulle proprietà ZigZag
string comm="";
//--- Un blocco per cambiare il colore del ZigZag
int number=MathRand(); // Ottiene un numero casuale
//--- Il divisore è uguale alla grandezza dell'array colors []
int size=ArraySize(colors);
//--- Ottiene l'indice per selezionare un nuovo colore, come il resto della divisione intera
int color_index=number%size;
//--- Imposta il colore come la proprietà PLOT_LINE_COLOR
PlotIndexSetInteger(0,PLOT_LINE_COLOR,colors[color_index]);
//--- Scrive il colore della linea
comm=comm+"\r\n"+(string)colors[color_index];
comm=comm+"\r\nWidth="+IntegerToString(width);
DRAW _FILLING
Lo stile DRAW _FILL ING disegna un'area colorata tra i valori dei due buffer indicatore. In realtà, questo
stile disegna due linee e riempie lo spazio tra di loro con uno dei due colori specificati. E' usato per la
creazione di indicatori che disegnano canali. Nessuno dei buffer può contenere solo valori vuoti,
perché in questo caso nulla è tracciato.
· il primo colore è usato per le zone in cui i valori del primo buffer sono maggiori dei valori nel
secondo buffer indicatore;
· il secondo colore è usato per le aree in cui valori nel secondo buffer sono maggiori dei valori nel
primo buffer indicatore.
Il colore di riempimento può essere impostato utilizzando le direttive del compilatore o in modo
dinamico utilizzando la funzione PlotIndexS etInteger(). Cambiamenti dinamici delle proprietà di
plotting permettono di " animare" gli indicatori, in modo che il loro aspetto cambia a seconda della
situazione attuale.
L 'indicatore è calcolato per tutte le barre, per cui i valori dei due buffer indicatore sono uguali né 0 né
al valore vuoto. Per specificare quale valore deve essere considerato come " vuoto" , impostare questo
valore nelle proprietà PLOT_EMPTY_VAL UE:
Il disegno delle barre che non partecipano al calcolo dell'indicatore dipende dai valori nei buffer
indicatori:
· Le barre, per le quali i valori di entrambi i buffer indicatori sono uguali a 0, non partecipano a
disegnare l'indicatore. Ciò significa che l'area con valori zero non viene compilata.
· B arre, per le quali i valori dei buffers indicatori sono pari al " valore vuoto" , partecipano a disegnare
l'indicatore. La zona con valori vuoti sarà compilata in modo da collegare le aree con valori
significativi.
Va notato che se il " valore vuoto" è uguale a zero, le barre che non partecipano nel calcolo
dell'indicatore vengono inoltre compilate.
Un esempio di indicatore che disegna un canale tra due M As con differenti periodi di mediazione in
una finestra separata. Il cambiamento dei colori all'incrocio delle medie mobili mostra visivamente il
cambiamento delle tendenze al rialzo e al ribasso. I colori cambiano in modo casuale ogni N tick s. Il
parametro N è impostato nei parametri esterni dell'indicatore per la possibilità di configurazione
manuale (la scheda Parametri nella finestra Proprietà dell' indicatore).
N otare che inizialmente per Plot1 con DRAW _FILL ING le proprietà vengono impostate utilizzando la
direttiva del compilatore #property, e poi nella funzione OnCalculate() nuovi colori vengono impostati
in modo casuale.
//+--------------------------------------------------------------------------------+
//| DRAW_FILLING.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots 1
//--- plot Intersection
#property indicator_label1 "Intersezione"
#property indicator_type1 DRAW_FILLING
#property indicator_color1 clrRed,clrBlue
#property indicator_width1 1
//--- parametri di input
input int Fast=13; // Il periodo di fast MA
input int Slow=21; // Il periodo di slow MA
input int shift=1; // Lo slittamento dei MA verso il futuro(positivo)
input int N=5; // Numero di ticks da cambiare
//--- Buffer Indicatore
double IntersectionBuffer1[];
double IntersectionBuffer2[];
int fast_handle;
int slow_handle;
//--- Un array per salvare i colori
color colors[]={clrRed,clrBlue,clrGreen,clrAquamarine,clrBlanchedAlmond,clrBrown,clrCoral,clrDarkSl
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- mappatura buffers indicatore
SetIndexBuffer(0,IntersectionBuffer1,INDICATOR_DATA);
SetIndexBuffer(1,IntersectionBuffer2,INDICATOR_DATA);
//---
PlotIndexSetInteger(0,PLOT_SHIFT,shift);
//---
fast_handle=iMA(_Symbol,_Period,Fast,0,MODE_SMA,PRICE_CLOSE);
slow_handle=iMA(_Symbol,_Period,Slow,0,MODE_SMA,PRICE_CLOSE);
//---
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
//--- Ottiene l'indice per selezionare un nuovo colore, come il resto della divisione intera
int color_index1=number%size;
//--- Imposta il primo colore come proprietà PLOT_LINE_COLOR
PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,colors[color_index1]);
//--- Scrive il primo colore
comm=comm+"\r\nColor1 "+(string)colors[color_index1];
//--- Ottiene l'indice per selezionare un nuovo colore, come il resto della divisione intera
number=MathRand(); // Ottiene un numero casuale
int color_index2=number%size;
//--- Imposta il secondo colore come proprietà PLOT_LINE_COLOR
PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,colors[color_index2]);
//--- Scrive il secondo colore
comm=comm+"\r\nColor2 "+(string)colors[color_index2];
//--- Imposta le informazioni del grafico usando un commento
Comment(comm);
}
DRAW _BARS
Lo stile DRAW _BARS disegna barre sui valori dei quattro buffer indicatori, che contengono i prezzi
Open, H igh, Low e Close. E' utilizzato per la creazione di indicatori personalizzati come barre, incluse
quelli in una sottofinestra separata di un grafico e su altri strumenti finanziari.
Il colore delle barre può essere impostato utilizzando le direttive del compilatore o in modo dinamico
utilizzando la funzione PlotIndexS etInteger(). Cambiamenti dinamici delle proprietà di plotting
permettono di " animare" gli indicatori, in modo che il loro aspetto cambia a seconda della situazione
attuale.
L 'indicatore è disegnato solo per queste barre, per cui i valori non vuoti di tutti e quattro i buffer
indicatore sono impostati. Per specificare quale valore deve essere considerato come " vuoto" ,
impostare questo valore nelle proprietà PLOT_EMPTY_VAL UE:
R iempie esplicitamente i valori dei buffer indicatori, imposta un valore vuoto in un buffer per saltare
le barre.
Il numero di buffer richiesti per il plotting di DRAW _BARS è 4. T utti i buffer per il plotting dovrebbero
andare uno dopo l'altro, nell'ordine: Open, H igh, Low e Close. Nessuno dei buffer può contenere solo
valori vuoti, perché in questo caso nulla è tracciato.
U n esempio di indicatore che disegna barre su uno strumento finanziario selezionato in una finestra
separata. Il colore delle barre varia casualmente ogni N tick s. Il parametro N è impostato nei
parametri esterni dell'indicatore per la possibilità di configurazione manuale (la scheda Parametri nella
finestra Proprietà dell' indicatore).
Si prega di notare che, per Plot1 con lo stile DRAW _BARS , il colore viene impostato utilizzando la
direttiva del compilatore #property, e poi nella funzione OnCalculate() il colore è impostato in modo
casuale da una lista preparata in precedenza.
//+--------------------------------------------------------------------------------+
//| DRAW_BARS.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots 1
//--- plot Bars
#property indicator_label1 "Bars"
#property indicator_type1 DRAW_BARS
#property indicator_color1 clrGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- parametri di input
input int N=5; // Il numero di ticks per cambiare il tipo
input int bars=500; // Il numero di barre da mostrare
input bool messages=false; // Mostra i messaggi nel log degli "Expert Advisors"
//--- Buffer Indicatore
double BarsBuffer1[];
double BarsBuffer2[];
double BarsBuffer3[];
double BarsBuffer4[];
//--- Nome simbolo
string symbol;
//--- Un array per salvare i colori
color colors[]={clrRed,clrBlue,clrGreen,clrPurple,clrBrown,clrIndianRed};
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
/ / --- Se bars è molto piccolo - completa il lavoro prima del tempo
if(bars<50)
{
Comment("Prego specificare un gran numero di barre! L'operazione dell'indicatore è stata term
return(INIT_PARAMETERS_INCORRECT);
}
//--- mappatura buffers indicatore
SetIndexBuffer(0,BarsBuffer1,INDICATOR_DATA);
SetIndexBuffer(1,BarsBuffer2,INDICATOR_DATA);
SetIndexBuffer(2,BarsBuffer3,INDICATOR_DATA);
SetIndexBuffer(3,BarsBuffer4,INDICATOR_DATA);
//--- Il nome del simbolo, per cui le barre vengono disegnate
symbol=_Symbol;
//--- Imposta il display del simbolo
PlotIndexSetString(0,PLOT_LABEL,symbol+" Open;"+symbol+" High;"+symbol+" Low;"+symbol+" Close");
IndicatorSetString(INDICATOR_SHORTNAME,"DRAW_BARS("+symbol+")");
//--- Un valore vuoto
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
//---
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
static int ticks=0;
//--- Calcola i ticks per cambiare lo stile, il colore e lo spessore della linea
ticks++;
//--- Se un numero sufficiente di ticks è stato accumulato
if(ticks>=N)
{
//--- Imposta un nuovo simbolo dalla finestra Market Watch
symbol=GetRandomSymbolName();
//--- Cambia le proprietà della linea
ChangeLineAppearance();
int tries=0;
//--- Fa 5 tentativi per riempire il buffer con i prezzi dal simbolo
while(!CopyFromSymbolToBuffers(symbol,rates_total) && tries<5)
{
//--- Un contatore delle chiamate della funzione CopyFromSymbolToBuffers()
tries++;
}
ArrayInitialize(BarsBuffer4,0.0);
//--- Copia prezzi nei buffers
for(int i=0;i<copied;i++)
{
//--- Calcola l'indice appropriato per i buffers
int buffer_index=total-copied+i;
//--- Scrive i prezzi nei buffers
BarsBuffer1[buffer_index]=rates[i].open;
BarsBuffer2[buffer_index]=rates[i].high;
BarsBuffer3[buffer_index]=rates[i].low;
BarsBuffer4[buffer_index]=rates[i].close;
}
return(true);
}
//+--------------------------------------------------------------------------------+
//| Restituisce in modo casuale il simoblo dal Market Watch |
//+--------------------------------------------------------------------------------+
string GetRandomSymbolName()
{
//--- Il numero dei simboli mostrati nella finestra Market Watch
int symbols=SymbolsTotal(true);
//--- La posizione di un simbolo nella lista - un numero casuale da 0 a simboli
int number=MathRand()%symbols;
//--- Restituisce il nome di un simbolo nella posizione specificata
return SymbolName(number,true);
}
//+--------------------------------------------------------------------------------+
//| Cambia l'apparenza delle barre |
//+--------------------------------------------------------------------------------+
void ChangeLineAppearance()
{
//--- Una stringa per la formazione delle informazioni riguardo le proprietà della barra
string comm="";
//--- Un blocco per il cambio di colore delle barre
int number=MathRand(); // Ottiene un numero casuale
//--- Il divisore è uguale alla grandezza dell'array colors []
int size=ArraySize(colors);
//--- Ottiene l'indice per selezionare un nuovo colore, come il resto della divisione intera
int color_index=number%size;
//--- Imposta il colore come la proprietà PLOT_LINE_COLOR
PlotIndexSetInteger(0,PLOT_LINE_COLOR,colors[color_index]);
//--- Scrive il colore della linea
comm=comm+"\r\n"+(string)colors[color_index];
PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
//--- Scrive lo spessore della linea
comm=comm+"\r\nWidth="+IntegerToString(width);
DRAW _CANDLES
Lo stile DRAW _CANDLES disegna candele sui valori di quattro buffer di indicatori, che contengono i
prezzi Open, H igh, Low and Close prices. E' utilizzato per la creazione di indicatori personalizzati come
una sequenza di candele, comprese quelle in una sottofinestra separata di un grafico e su altri
strumenti finanziari.
Il colore delle candele può essere impostato tramite le direttive del compilatore o in modo dinamico
utilizzando la funzione PlotIndexS etInteger(). Cambiamenti dinamici delle proprietà di plotting
permettono di " animare" gli indicatori, in modo che il loro aspetto cambia a seconda della situazione
attuale.
L 'indicatore è disegnato solo per queste barre, per cui i valori non vuoti di tutti e quattro i buffer
indicatore sono impostati. Per specificare quale valore deve essere considerato come " vuoto" ,
impostare questo valore nelle proprietà PLOT_EMPTY_VAL UE:
R iempie esplicitamente i valori dei buffer indicatori, imposta un valore vuoto in un buffer per saltare
le barre.
Il numero di buffer richiesti per il plotting di DRAW _CANDLES è 4. T utti i buffer per il plotting
dovrebbero andare uno dopo l'altro, nell'ordine: Open, H igh, Low e Close. Nessuno dei buffer può
contenere solo valori vuoti, perché in questo caso nulla è tracciato.
È possibile impostare fino a tre colori per lo stile DRAW _CANDLES che influisce sull'aspetto della
candela. S e un solo colore è impostato, viene applicata a tutte le candele sul chart.
Se vengono specificati due colori separati da virgola, il primo viene applicato al bordo della candela,
mentre il secondo è applicato al corpo.
Specificare tre colori separati da virgola in modo che le candele che salgono e scendono vengono
visualizzate in modo diverso. In tal caso, il primo colore viene applicato ai contorni candela, mentre il
secondo e il terzo - a candele rialzista e ribassista.
Quindi, lo stile DRAW _CANDLES permette di creare opzioni di colorazione personalizzata della candela.
I noltre, tutti i colori possono essere modificati dinamicamente durante il funzionamento dell'indicatore
U n esempio di indicatore che disegna candele per uno strumento finanziario selezionato in una finestra
separata. Il colore delle candele cambia dinamicamente ogni N tick s. Il parametro N è impostato nei
parametri esterni dell'indicatore per la possibilità di configurazione manuale (la scheda Parametri nella
finestra Proprietà dell' indicatore).
Si prega di notare che per plot1, il colore è impostato usando la direttiva del compilatore #property, e
poi nella funzione OnCalculate() il colore è impostato in modo casuale da una lista precedentemente
preparata.
//+--------------------------------------------------------------------------------+
//| DRAW_CANDLES.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots 1
//--- plot Bars
#property indicator_label1 "DRAW_CANDLES1"
#property indicator_type1 DRAW_CANDLES
#property indicator_color1 clrGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//--- Il nome del simbolo, per cui le barre vengono disegnate
symbol=_Symbol;
//--- Imposta il display del simbolo
PlotIndexSetString(0,PLOT_LABEL,symbol+" Open;"+symbol+" High;"+symbol+" Low;"+symbol+" Close");
IndicatorSetString(INDICATOR_SHORTNAME,"DRAW_CANDLES("+symbol+")");
//---
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
static int ticks=INT_MAX-100;
//--- Calcola i ticks per cambiare lo stile, il colore e lo spessore della linea
ticks++;
//--- Se un numero sufficiente di ticks è stato accumulato
if(ticks>=N)
{
//--- Imposta un nuovo simbolo dalla finestra Market Watch
symbol=GetRandomSymbolName();
//--- Cambia la forma
ChangeLineAppearance();
//--- Imposta un nuovo simbolo dalla finestra Market Watch
int tries=0;
//--- Fa 5 tentativi per riempire i buffers di plot1 con i prezzi dal simbolo
while(!CopyFromSymbolToBuffers(symbol,rates_total,0,
Candle1Buffer1,Candle1Buffer2,Candle1Buffer3,Candle1Buffer4)
&& tries<5)
{
//--- Un contatore delle chiamate della funzione CopyFromSymbolToBuffers()
tries++;
}
//--- Resetta il contatore dei ticks a zero
ticks=0;
}
//--- restituisce il valore di prev_calculated per la prossima chiamata
return(rates_total);
}
//+--------------------------------------------------------------------------------+
//| Riempie le candele specificate |
//+--------------------------------------------------------------------------------+
bool CopyFromSymbolToBuffers(string name,
int total,
int plot_index,
double &buff1[],
double &buff2[],
double &buff3[],
double &buff4[]
)
{
//--- Nell'array rates[], copieremo Open, High, Low e Close
MqlRates rates[];
//--- Il contatore dei tentativi
int attempts=0;
//--- Quanto è stato copiato
int copied=0;
//--- Fa 25 tentativi per ottenere una timeseries sul simbolo desiderato
while(attempts<25 && (copied=CopyRates(name,_Period,0,bars,rates))<0)
{
Sleep(100);
attempts++;
if(messages) PrintFormat("%s CopyRates(%s) attempts=%d",__FUNCTION__,name,attempts);
}
//--- Se non è riuscito a copiare un numero sufficiente di barre
if(copied!=bars)
{
//--- Forma un messaggio stringa
string comm=StringFormat("Per il simbolo %s, è riuscito a ricevere solo %d barre delle %d ric
name,
copied,
bars
);
//--- Mostra un messaggio in un commento nella finestra del grafico principale
Comment(comm);
//--- Mostra il messaggio
if(messages) Print(comm);
return(false);
}
else
{
//--- Imposta il display del simbolo
PlotIndexSetString(plot_index,PLOT_LABEL,name+" Open;"+name+" High;"+name+" Low;"+name+" Clos
}
//--- Inizializza i buffers con valori vuoti
ArrayInitialize(buff1,0.0);
ArrayInitialize(buff2,0.0);
ArrayInitialize(buff3,0.0);
ArrayInitialize(buff4,0.0);
//--- Su ogni tick, copia i prezzi dei buffers
for(int i=0;i<copied;i++)
{
//--- Calcola l'indice appropriato per i buffers
int buffer_index=total-copied+i;
//--- Scrive i prezzi nei buffers
buff1[buffer_index]=rates[i].open;
buff2[buffer_index]=rates[i].high;
buff3[buffer_index]=rates[i].low;
buff4[buffer_index]=rates[i].close;
}
return(true);
}
//+--------------------------------------------------------------------------------+
//| Restituisce in modo casuale il simoblo dal Market Watch |
//+--------------------------------------------------------------------------------+
string GetRandomSymbolName()
{
//--- Il numero dei simboli mostrati nella finestra Market Watch
int symbols=SymbolsTotal(true);
//--- La posizione di un simbolo nella lista - un numero casuale da 0 a simboli
int number=MathRand()%symbols;
//--- Restituisce il nome di un simbolo nella posizione specificata
return SymbolName(number,true);
}
//+--------------------------------------------------------------------------------+
//| Cambia l'apparenza delle barre |
//+--------------------------------------------------------------------------------+
void ChangeLineAppearance()
{
//--- Una stringa per la formazione delle informazioni riguardo le proprietà della barra
string comm="";
//--- Un blocco per il cambio di colore delle barre
int number=MathRand(); // Ottiene un numero casuale
//--- Il divisore è uguale alla grandezza dell'array colors []
int size=ArraySize(colors);
//--- Ottiene l'indice per selezionare un nuovo colore, come il resto della divisione intera
int color_index=number%size;
//--- Imposta il colore come la proprietà PLOT_LINE_COLOR
PlotIndexSetInteger(0,PLOT_LINE_COLOR,colors[color_index]);
//--- Scrive il colore
comm=comm+"\r\n"+(string)colors[color_index];
//--- Scrive il nome del simbolo
comm="\r\n"+symbol+comm;
//--- Imposta le informazioni del grafico usando un commento
Comment(comm);
}
DRAW _COLOR_LINE
Il valore DRAW _COLOR_L INE è una variante colorata dello stile DRAW _L INE e disegna una linea con i
valori del buffer di indicatore. Ma questo stile, come tutti gli stili di colore con la parola COLOR nel
loro titolo ha un buffer indicatore aggiuntivo speciale che memorizza l'indice di colore (numero) da un
array di di colori impostato in modo speciale. Cos ì, il colore di ogni segmento della linea può essere
definito specificando l'indice di colore dell'indice per disegnare la linea in questa barra.
La larghezza, stile e colori delle linee possono essere impostati utilizzando le direttive del compilatore
e dinamicamente utilizzando la funzione PlotIndexS etInteger(). Cambiamenti dinamici delle proprietà
di plotting permettono di " animare" gli indicatori, in modo che il loro aspetto cambia a seconda della
situazione attuale.
· un buffer per memorizzare i valori degli indicatori utilizzati per il disegno di una linea;
· un buffer per memorizzare l'indice del colore della linea su ciascuna barra.
Icolori possono essere specificati con la direttiva del compilatore #property indicator_color1 separati
da una virgola. Il numero di colori non può superare 64.
//--- Definire 5 colori per colorare ogni barra (sono memorizzati nell' array speciale)
#property indicator_color1 clrRed,clrBlue,clrGreen,clrOrange,clrDeepPink // (Up to 64 colors can b
U n esempio di indicatore che disegna una linea utilizzando i prezzi Close delle barre. La larghezza della
linea e lo stile cambiano in modo casuale ogni N=5 tick s.
Icolori dei segmenti di linea anche cambiano anche in modo casuale nella funzione personalizzata
ChangeColors().
//+--------------------------------------------------------------------------------+
//| Cambia il colore dei segmenti della linea |
//+--------------------------------------------------------------------------------+
void ChangeColors(color &cols[],int plot_colors)
{
//--- Il numero dei colori
int size=ArraySize(cols);
//---
string comm=ChartGetString(0,CHART_COMMENT)+"\r\n\r\n";
L 'esempio mostra la caratteristica delle versioni " colore" degli indicatori - per modificare il colore di un
segmento di una linea, non è necessario modificare i valori nel buffer ColorLineColors [] (che contiene
gli indici del colore). T utto quello che dovete fare è impostare nuovi colori in un'array speciale. Questo
permette di cambiare rapidamente il colore una volta per l'intero plotting, cambiando solo una piccola
gamma di colori utilizzando la funzione PlotIndexS etInteger().
N otare che inizialmente per Plot1 con DRAW _COLOR_L INE le proprietà vengono impostate utilizzando
la direttiva del compilatore #property, e poi nella funzione OnCalculate() queste tre proprietà sono
impostate in modo casuale.
I parametri N e lunghezza (la lunghezza dei segmenti di colore nei bar) i parametri sono impostati nei
parametri esterni dell'indicatore per la possibilità di configurazione manuale (la scheda Parametri nella
finestra Proprietà del indicatore).
//+--------------------------------------------------------------------------------+
//| DRAW_COLOR_LINE.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 1
//--- plot ColorLine
#property indicator_label1 "ColorLine"
#property indicator_type1 DRAW_COLOR_LINE
//--- Definire 5 colori per colorare ogni barra (sono memorizzati nell' array speciale)
#property indicator_color1 clrRed,clrBlue,clrGreen,clrOrange,clrDeepPink // (Up to 64 colors can b
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- parametri di input
input int N=5; //Numero di ticks da cambiare
input int Length=20; // La lunghezza di ciascuna parte di colore in barre
int line_colors=5; // Il numero di colori impostati è 5 - vedi #property indicator_color
//--- Un buffer per il plotting
double ColorLineBuffer[];
//--- Un buffer per memorizzare il colore linea su ciascuna barra
double ColorLineColors[];
int number=MathRand();
//--- Ottiene un indice nell'array col[] come resto della divisione intera
int i=number%size;
//--- Imposta il colore per ogni indice che ha proprietà PLOT_LINE_COLOR
PlotIndexSetInteger(0, // Il numero di stili grafici
PLOT_LINE_COLOR, // Identificatore proprietà
plot_color_ind, // Lìindice del colore, dove scriviamo il colore
cols[i]); // Un nuovo colore
//--- Scrivi i colori
comm=comm+StringFormat("LineColorIndex[%d]=%s \r\n",plot_color_ind,ColorToString(cols[i],true
ChartSetString(0,CHART_COMMENT,comm);
}
//---
}
//+--------------------------------------------------------------------------------+
//| Cambia l'apparenza di una linea visualizzata nell'indicatore |
//+--------------------------------------------------------------------------------+
void ChangeLineAppearance()
{
//--- Una stringa per la formazione di informazioni sulle proprietà di linea
string comm="";
//--- Un blocco per modificare la larghezza della linea
int number=MathRand();
//--- Ottiene la larghezza del resto della divisione intera
int width=number%5; // Lo spessore è impostato da 0 a 4
//--- Imposta il colore come proprietà PLOT_LINE_WIDTH
PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
//--- Scrive lo spessore della linea
comm=comm+" Width="+IntegerToString(width);
DRAW _COLOR_SECTION
T he DRAW _COLOR_S ECTION style is a color version of DRAW _S ECTION, but unlik e the latter, it allows
drawing sections of different colors. Lo stile DRAW _COLOR_S ECTION, come tutti gli stili di colore con
la parola COLOR nel titolo, contiene un buffer indicatore aggiuntivo speciale che memorizza l'indice del
colore (numero) da un array di di colori impostato in modo speciale. Cos ì, il colore di ogni sezione può
essere definito specificando l'indice di colore dell'indice della barra che corrisponde alla fine sezione.
The width, color and style of the sections can be specified lik e for the DRAW _S ECTION style - using
compiler directives or dynamically using the PlotIndexS etInteger() function. Cambiamenti dinamici
delle proprietà di plotting permettono di " animare" gli indicatori, in modo che il loro aspetto cambi a
seconda della situazione attuale.
Le sezioni vengono disegnate da un valore non vuoto di un altro valore non vuoto del buffer indicatore,
i valori vuoti vengono ignorati. Per specificare quale valore deve essere considerato come " vuoto" ,
impostare questo valore nella proprietà PLOT_EMPTY_VAL UE: ad esempio, se l'indicatore deve essere
disegnato come una sequenza di sezioni su valori diversi da zero, allora è necessario impostare il
valore zero come uno vuoto:
Riempire sempre esplicitamente i valori dei buffer indicatore, impostare un valore vuoto in un buffer
per gli elementi che non devono essere tracciati.
· un buffer per memorizzare i valori degli indicatori utilizzati per il disegno di una linea;
· un buffer per memorizzare l'indice del colore, che viene utilizzato per elaborare la sezione (ha senso
impostare solo valori non vuoti).
Icolori possono essere specificati con la direttiva del compilatore #property indicator_color1 separati
da una virgola. Il numero di colori non può superare 64.
Un esempio di indicatore che trae sezioni colorate ciascuna lunga 5 barre, utilizzando i valori del
prezzo H igh. Il colore, la larghezza e lo stile delle sezioni cambiano in modo casuale ogni N tick s.
N otare che inizialmente per Plot1 con DRAW _COLOR_S ECTION 8 colori vengono impostati utilizzando
la direttiva del compilatore #property. Poi nella funzioneOnCalculate(), i colori vengono impostati in
modo casuale dalla gamma di colori colori[].
//+--------------------------------------------------------------------------------+
//| DRAW_COLOR_SECTION.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 1
//--- plot ColorSection
#property indicator_label1 "ColorSection"
#property indicator_type1 DRAW_COLOR_SECTION
//--- Definisce 8 colori per la colorazione delle sezioni selezione (vengono conservate in uno spec
#property indicator_color1 clrRed,clrGold,clrMediumBlue,clrLime,clrMagenta,clrBrown,clrTan,clrMedi
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- parametri di input
input int N=5; // Numero di ticks da cambiare
input int bars_in_section=5; // La lunghezza delle sezioni espressa in barre
//--- Una variabile ausiliaria per calcolare la fine delle sezioni
int divider;
int color_sections;
//--- Un buffer per il plotting
double ColorSectionBuffer[];
//--- Un buffer per memorizzare il colore linea su ciascuna barra
double ColorSectionColors[];
//--- Un array per memorizzare i colori contiene 14 elementi
color colors[]=
{
clrRed,clrBlue,clrGreen,clrChocolate,clrMagenta,clrDodgerBlue,clrGoldenrod,
clrIndigo,clrLightBlue,clrAliceBlue,clrMoccasin,clrWhiteSmoke,clrCyan,clrMediumPurple
};
//--- Un array per memorizzare gli stili di linea
ENUM_LINE_STYLE styles[]={STYLE_SOLID,STYLE_DASH,STYLE_DOT,STYLE_DASHDOT,STYLE_DASHDOTDOT};
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- mappatura buffers indicatore
SetIndexBuffer(0,ColorSectionBuffer,INDICATOR_DATA);
SetIndexBuffer(1,ColorSectionColors,INDICATOR_COLOR_INDEX);
/ / --- Il valore 0 (vuoto) parteciperà al disegno
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//---- Il numero di colori ai colori delle sezioni
int color_sections=8; // mostra un commento a #property indicator_color1
//--- Controllare il parametro indicatore
if(bars_in_section<=0)
{
PrintFormat("Invalid section length=%d",bars_in_section);
return(INIT_PARAMETERS_INCORRECT);
}
else divider=color_sections*bars_in_section;
//---
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
//--- Il numero della barra da cui inizia il calcolo dei valori degli indicatori
int start=0;
//--- Se l'indicatore è stato calcolato prima, allora impostare l'inizio sulla barra precedente
if(prev_calculated>0) start=prev_calculated-1;
//--- Qui ci sono tutti i calcoli dei valori degli indicatori
for(int i=start;i<rates_total;i++)
{
//--- Se il numero della barra è divisibile per il section_length, significa che questa è la
if(i%bars_in_section==0)
{
//--- Imposta la fine della sezione presso il prezzo elevato di questo bar
ColorSectionBuffer[i]=high[i];
//--- Un resto della divisione del numero di barra per number_of_colors*scetion_length
int rest=i%divider;
//Ottiene il numero dei colori = da 0 a number_of_colors-1
int color_indext=rest/bars_in_section;
ColorSectionColors[i]=color_indext;
}
//--- Se il resto della divisione è pari a barre,
else
{
//--- Se non è successo niente, ignora bar - set 0
else ColorSectionBuffer[i]=0;
}
}
//--- Restituisce il valore prev_calculated per la successiva chiamata della funzione
return(rates_total);
}
//+--------------------------------------------------------------------------------+
DRAW _COLOR_HISTOGRAM
Lo stile DRAW _COLOR_HIS T OGRAM disegna un istogramma come una sequenza di colonne colorate da
zero ad un valore specificato. I valori sono presi dal buffer indicatore. Ogni colonna può avere il
proprio colore da un insieme predefinito di colori.
La larghezza, il colore e lo stile dell'istogramma possono essere specificati come per lo stile
DRAW _HIS T O GRA M - utilizzando le direttive del compilatore o in modo dinamico utilizzando la
Dal momento che una colonna dal livello zero è disegnata su ogni barra, DRAW _COLOR_HIS T OGRAM
dovrebbe meglio essere utilizzata in una finestra di grafico separata. Molto spesso questo tipo di
plotting viene utilizzato per creare indicatori del tipo oscillatore, per esempio, Awesome Oscillator
oppure Mark et Facilitation Index . Per i valori vuoti non visualizzabili deve essere specificato il valore
zero.
· un buffer per memorizzare un valore non-zero del segmento verticale su ciascuna barra, la seconda
estremità del segmento è sempre sulla linea zero dell'indicatore;
· un buffer per memorizzare l'indice del colore, che viene utilizzato per elaborare la sezione (ha senso
impostare solo valori non vuoti).
Icolori possono essere specificati utilizzando la direttiva del compilatore #property indicator_color1
separata da una virgola. Il numero di colori non può superare 64.
Un esempio di indicatore che disegna una sinusoide di un colore specificato basato sulla funzione
MathS in(). Il colore, la larghezza e lo stile di tutte le colonne dell'istogramma cambiano in modo
casuale ogni N tick s. Il parametro barre specifica il periodo della sinusoide, che è dopo il numero
specificato di barre per cui la sinusoide ripeterà il ciclo.
Si prega di notare che per Plot1 con lo stile DRAW _COLOR_HIS T OGRAM, 5 colori vengono impostati
utilizzando la direttiva del compilatore #property, e poi nella funzione OnCalculate() i colori sono scelti
a caso dai 14 colori memorizzati nell' array colors [] . Il parametro N è impostato in parametri esterni
dell'indicatore per la possibilità di configurazione manuale (la scheda Parametri nella finestra Proprietà
del indicatore).
//+--------------------------------------------------------------------------------+
//| DRAW_COLOR_HISTOGRAM.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots 1
//--- parametri di input
input int bars=30; // Il periodo della sinusoide in barre
input int N=5; // Il numero di ticks che cambiano l'istogramma
//--- plot Color_Histogram
#property indicator_label1 "Color_Histogram"
#property indicator_type1 DRAW_COLOR_HISTOGRAM
//--- Definisce 8 colori per la colorazione delle sezioni selezione (vengono conservate in uno spec
#property indicator_color1 clrRed,clrGreen,clrBlue,clrYellow,clrMagenta,clrCyan,clrMediumSeaGreen,
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- Un buffer di valori
double Color_HistogramBuffer[];
//--- Un buffer di indici di colore
double Color_HistogramColors[];
//--- Un fattore per ottenere l'angolo di 2Pi in radianti, moltiplicato per il parametro di barre
double multiplier;
int color_sections;
//--- Un array per memorizzare i colori contiene 14 elementi
color colors[]=
{
clrRed,clrBlue,clrGreen,clrChocolate,clrMagenta,clrDodgerBlue,clrGoldenrod,
clrIndigo,clrLightBlue,clrAliceBlue,clrMoccasin,clrWhiteSmoke,clrCyan,clrMediumPurple
};
//--- Un array per memorizzare gli stili di linea
ENUM_LINE_STYLE styles[]={STYLE_SOLID,STYLE_DASH,STYLE_DOT,STYLE_DASHDOT,STYLE_DASHDOTDOT};
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- mappatura buffers indicatore
SetIndexBuffer(0,Color_HistogramBuffer,INDICATOR_DATA);
SetIndexBuffer(1,Color_HistogramColors,INDICATOR_COLOR_INDEX);
//---- Il numero di colori per colorare la sinusoide
color_sections=8; // vedi un commento a #property indicator_color1
//--- Calcola il moltiplicatore
if(bars>1)multiplier=2.*M_PI/bars;
else
{
PrintFormat("Imposta il valore di bars=%d maggiore di 1",barre);
//--- Terminazione precoce dell'indicatore
return(INIT_PARAMETERS_INCORRECT);
}
//---
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
static int ticks=0;
//--- Calcola i ticks per cambiare lo stile, il colore e lo spessore della linea
ticks++;
//--- Se un numero critico di ticks è stato accumulato
if(ticks>=N)
{
//--- Cambia le proprietà della linea
ChangeLineAppearance();
//--- Cambia i colori usati nell'istogramma
ChangeColors(colors,color_sections);
//--- Resetta il contatore dei ticks a zero
ticks=0;
}
{
//--- Una stringa per la formazione di informazioni sulle proprietà di linea
string comm="";
//--- Un blocco per modificare la larghezza della linea
int number=MathRand();
//--- Ottiene la larghezza del resto della divisione intera
int width=number%5; // Lo spessore è impostato da 0 a 4
//--- Imposta il colore come proprietà PLOT_LINE_WIDTH
PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
//--- Scrive lo spessore della linea
comm=comm+" Width="+IntegerToString(width);
DRAW _COLOR_HISTOGRAM2
Lo stile DRAW _COLOR_HIS T OGRAM 2 disegna un istogramma di un colore specificato - segmenti
verticali utilizzando i valori di due buffer indicatore. Ma a differenza del mono-colore
DRAW _HIS T O GRA M 2, in questo stile ogni colonna dell'istogramma può avere il suo colore da un
insieme predefinito. I valori di tutti i segmenti vengono presi dal buffer indicatore.
La larghezza, stile e colore dell'istogramma possono essere specificati come per lo stile
DRAW _HIS T O GRA M 2 - utilizzando le direttive del compilatore o in modo dinamico utilizzando la
Lo stile DRAW _COLOR_HIS T OGRAM 2 può essere utilizzato in una sottofinestra separata di un grafico e
nella sua finestra principale. Per i valori vuoti nulla viene tracciato, tutti i valori nei buffer indicatore
devono essere impostati in modo esplicito. I buffer non vengono inizializzati con i valori vuoti.
· due buffer per memorizzare l'estremità superiore e inferiore del segmento verticale su ciascuna
barra;
· un buffer per memorizzare l'indice del colore, che viene utilizzato per disegnare il segmento (ha
senso impostare solo valori non vuoti).
U n esempio di indicatore che disegna un istogramma di colore specificato tra i prezzi Alti e Bassi. Per
ogni giorno della settimana, le linee dell'istogramma hanno un colore differente. Il colore del giorno, la
larghezza e lo stile dell'istogramma cambiano in modo casuale ogni N tick s.
Si prega di notare che per Plot1 con lo stile DRAW _COLOR_HIS T OGRAM 2, 5 colori vengono impostati
utilizzando la direttiva del compilatore #property, e poi nella funzione OnCalculate() i colori sono scelti
a caso dai 14 colori memorizzati nell' array colors [] .
//+--------------------------------------------------------------------------------+
//| DRAW_COLOR_HISTOGRAM2.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots 1
//--- plot ColorHistogram_2
#property indicator_label1 "ColorHistogram_2"
#property indicator_type1 DRAW_COLOR_HISTOGRAM2
//--- Definisce 5 colori per colorare l'istogramma in base ai giorni della settimana (che sono memo
#property indicator_color1 clrRed,clrBlue,clrGreen,clrYellow,clrMagenta
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- valore
ColorHistogram_2Buffer1[i]=high[i];
ColorHistogram_2Buffer2[i]=low[i];
//--- Imposta l'indice del colore secondo il giorno della settimana
int day=dt.day_of_week;
ColorHistogram_2Colors[i]=day;
}
//--- Restituisce il valore prev_calculated per la successiva chiamata della funzione
return(rates_total);
}
//+--------------------------------------------------------------------------------+
//| Cambia il colore dei segmenti della linea |
//+--------------------------------------------------------------------------------+
void ChangeColors(color &cols[],int plot_colors)
{
//--- Il numero dei colori
int size=ArraySize(cols);
//---
string comm=ChartGetString(0,CHART_COMMENT)+"\r\n\r\n";
DRAW _COLOR_ARROW
Lo stile DRAW _COLOR_ARR OW disegna frecce colorate (simboli del set W ingdings) basati sui valori del
buffer indicatore. In contrasto a DRAW _ARR OW , in questo stile è possibile impostare un colore da un
insieme predefinito di colori specificato dalle proprietà di indicator_color1 per ogni simbolo.
La larghezza ed il colore dei simboli possono essere specificati come per lo stile DRAW _ARR OW -
utilizzando le direttive del compilatore o in modo dinamico utilizzando la funzione
PlotIndexS etInteger(). Cambiamenti dinamici delle proprietà di plotting permettono di cambiare
l'aspetto di un indicatore sulla base della situazione attuale.
//--- Definisce il codice simbolo dal carattere Wingdings per disegnare in PLOT_ARROW
PlotIndexSetInteger(0,PLOT_ARROW,code);
Ogni freccia è in realtà un simbolo che ha l'altezza ed il punto di ancoraggio, e può coprire alcune
importanti informazioni su un grafico (per esempio, il prezzo di chiusura alla bar). Quindi, possiamo
anche specificare lo slittamento verticale in pix el, che non dipende dalla scala del grafico. Le frecce
saranno spostate verso il basso per il numero di pix el specificato, anche se i valori dell'indicatore
rimarranno gli stessi:
Un valore negativo di PLOT_ARR OW _S HIFT significa lo spostamento delle frecce verso l'alto, un valore
positivo slitta la freccia verso il basso.
Lo stile DRAW _COLOR_ARR OW può essere utilizzato in una sottofinestra separata di un grafico e nella
sua finestra principale. Valori vuoti non vengono disegnati e non compaiono nella " Finestra Dati" ; tutti
i valori dei buffer indicatori devono essere impostati in modo esplicito. I buffer non vengono
inizializzati con un valore zero.
· un buffer per memorizzare il valore del prezzo che viene utilizzato per disegnare il simbolo (più uno
slittamento in pix el, dato nella proprietà PLOT_ARR OW _S HIFT );
· un buffer per memorizzare l'indice di colore, che viene utilizzato per disegnare una freccia (ha senso
impostare solo valori non vuoti).
Un esempio di indicatore, che disegna frecce su ciascuna barra con il prezzo close superiore al prezzo
di chiusura della barra precedente. La larghezza, slittamento e codice simbolo di tutte le frecce
vengono cambiate in modo casuale ogni N tick s. Il colore del simbolo dipende dal numero della barra su
cui è disegnato.
Nell'esempio, per plot1 con lo stile DRAW _COLOR_ARR OW , la proprietà, il colore e le dimensioni
vengono specificate utilizzando la direttiva del compilatore #property, e poi nella funzione
OnCalculate() le proprietà sono impostate in modo casuale. Il parametro N è impostato in parametri
esterni dell'indicatore per la possibilità di configurazione manuale (la scheda Parametri nella finestra
Proprietà del indicatore).
Si prega di notare che inizialmente vengono impostati 8 colori utilizzando la direttiva del compilatore
#property, e poi nella funzione OnCalculate(), il colore viene impostato in modo casuale da 14 colori
//+--------------------------------------------------------------------------------+
//| DRAW_COLOR_ARROW.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 1
//--- plot ColorArrow
#property indicator_label1 "ColorArrow"
{
//--- Ottiene un valore casuale
int number=MathRand();
//--- Ottiene un indice nell'array col[] come resto della divisione dell'intero
int i=number%size;
//--- Imposta il colore per ogni indice che ha proprietà PLOT_LINE_COLOR
PlotIndexSetInteger(0, // Il numero di stili grafici
PLOT_LINE_COLOR, // Identificatore proprietà
plot_color_ind, // Lìindice del colore, dove scriviamo il colore
cols[i]); // Un nuovo colore
//--- Scrivi i colori
comm=comm+StringFormat("ArrowColorIndex[%d]=%s \r\n",plot_color_ind,ColorToString(cols[i],tru
ChartSetString(0,CHART_COMMENT,comm);
}
//---
}
//+--------------------------------------------------------------------------------+
//| Cambia l'apparenza di una linea visualizzata nell'indicatore |
//+--------------------------------------------------------------------------------+
void ChangeLineAppearance()
{
//--- Una stringa per la formazione di informazioni sulle proprietà di linea
string comm="";
//--- Un blocco per modificare la larghezza della linea
int number=MathRand();
//--- Ottiene la larghezza del resto della divisione intera
int width=number%5; // Lo spessore è impostato da 0 a 4
//--- Imposta il colore come proprietà PLOT_LINE_WIDTH
PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
//--- Scrive lo spessore della linea
comm=comm+" Width="+IntegerToString(width);
DRAW _COLOR_ZIGZAG
Lo stile DRAW _COLOR_ZIGZAG disegna segmenti di colori diversi, utilizzando i valori di due buffer
indicatori. Questo stile è una versione colorata di DRAW _ZIGZAG, cioè permette di specificare per
ogni segmento un singolo colore dal set predefinito di colori. I segmenti vengono tracciati da un valore
nel primo buffer di un valore nel secondo buffer indicatore. Nessuno dei buffer può contenere solo
valori vuoti, perché in questo caso nulla è tracciato.
La larghezza, il colore e lo stile della linea possono essere specificati come per lo stile DRAW _ZIGZAG -
utilizzando le direttive del compilatore o in modo dinamico utilizzando la funzione
PlotIndexS etInteger(). Cambiamenti dinamici delle proprietà di plotting permettono di " animare" gli
indicatori, in modo che il loro aspetto cambi a seconda della situazione attuale.
Le sezioni vengono disegnate da un valore non vuoto di un buffer ad un valore non vuoto di un altro
buffer indicatore. Per specificare quale valore deve essere considerato come " vuoto" , impostare
questo valore nella proprietà PLO T_EMPTY_VA L UE:
Sempre riempire esplicitamente i valori dei buffer indicatori, impostando un valore vuoto in un buffer
per saltare le sbarre.
· due buffer per memorizzare i valori delle estremità delle sezioni zigzag ;
· un buffer per memorizzare l'indice del colore, che viene utilizzato per elaborare la sezione (ha senso
impostare solo valori non vuoti).
U n esempio di indicatore che traccia una sega sulla base dei prezzi H igh e Low. Il colore, la larghezza e
lo stile delle linee a zig-zag cambiano in modo casuale ogni N tick s.
Si prega di notare che per Plot1 con lo stile DRAW _COLOR_ZIGZAG, 8 colori vengono impostati
utilizzando la direttiva del compilatore #property, e poi nella funzione OnCalculate() il colore è scelto a
caso dai 14 colori memorizzati nell'array colors [].
//+--------------------------------------------------------------------------------+
//| DRAW_COLOR_ZIGZAG.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots 1
//--- plot Color_Zigzag
#property indicator_label1 "Color_Zigzag"
#property indicator_type1 DRAW_COLOR_ZIGZAG
//--- Definisce 8 colori per la colorazione delle sezioni selezione (vengono conservate in uno spec
#property indicator_color1 clrRed,clrBlue,clrGreen,clrYellow,clrMagenta,clrCyan,clrLime,clrOrange
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- parametri input
input int N=5; // Numero di ticks da cambiare
int color_sections;
//--- Buffer dei valori delle fini del segmento
double Color_ZigzagBuffer1[];
double Color_ZigzagBuffer2[];
//--- Buffer degli indici dei colori delle fini del segmento
double Color_ZigzagColors[];
//--- Un array per memorizzare i colori contiene 14 elementi
color colors[]=
{
clrRed,clrBlue,clrGreen,clrChocolate,clrMagenta,clrDodgerBlue,clrGoldenrod,
clrIndigo,clrLightBlue,clrAliceBlue,clrMoccasin,clrWhiteSmoke,clrCyan,clrMediumPurple
};
//--- Un array per memorizzare gli stili di linea
ENUM_LINE_STYLE styles[]={STYLE_SOLID,STYLE_DASH,STYLE_DOT,STYLE_DASHDOT,STYLE_DASHDOTDOT};
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- mappatura buffers indicatore
SetIndexBuffer(0,Color_ZigzagBuffer1,INDICATOR_DATA);
SetIndexBuffer(1,Color_ZigzagBuffer2,INDICATOR_DATA);
SetIndexBuffer(2,Color_ZigzagColors,INDICATOR_COLOR_INDEX);
//---- Numero di colori per colorare il zigzag
color_sections=8; // mostra un commento in #property indicator_color1 property
//---
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
static int ticks=0;
//--- Calcola i ticks per cambiare lo stile, il colore e lo spessore della linea
ticks++;
//--- Se un numero sufficiente di ticks è stato accumulato
if(ticks>=N)
{
//--- Cambia le proprietà della linea
ChangeLineAppearance();
//--- Cambia colori usati per tracciare le sezioni
ChangeColors(colors,color_sections);
//--- Resetta il contatore dei ticks a zero
ticks=0;
}
//--- La struttura del tempo è richiesta per ottenere il giorno della settimana di ogni barra
MqlDateTime dt;
{
//--- Scrive il tempo di apertura della barra nella struttura
TimeToStruct(time[i],dt);
comm=comm+StringFormat("ZigzagColorIndex[%d]=%s \r\n",plot_color_ind,ColorToString(cols[i],tr
ChartSetString(0,CHART_COMMENT,comm);
}
//---
}
//+--------------------------------------------------------------------------------+
//| Modifica l'aspetto dei segmenti a zig-zag |
//+--------------------------------------------------------------------------------+
void ChangeLineAppearance()
{
//--- Una stringa per la formazione di informazioni sulle proprietà di Color_ZigZag
string comm="";
//--- Un blocco per modificare la larghezza della linea
int number=MathRand();
//--- Ottiene la larghezza del resto della divisione intera
int width=number%5; // La larghezza è impostata da 0 a 4
//--- Imposta il colore come proprietà PLOT_LINE_WIDTH
PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
//--- Scrive lo spessore della linea
comm=comm+"\r\nWidth="+IntegerToString(width);
DRAW _COLOR_BARS
Lo stile DRAW _COLOR_BARS disegna barre sui valori delle quattro buffer di indicatori, che contengono
i prezzi Open, H igh, Low e Close. Questo stile è una versione avanzata di DRAW _BARS e permette di
specificare per ogni barra un singolo colore dal set predefinito di colori. E' utilizzato per la creazione di
indicatori personalizzati come barre, incluse quelli in una sottofinestra separata di un grafico e su altri
strumenti finanziari.
Il colore delle barre può essere impostato utilizzando le direttive del compilatore o in modo dinamico
utilizzando la funzione PlotIndexS etInteger(). Cambiamenti dinamici delle proprietà di plotting
permettono di " animare" gli indicatori, in modo che il loro aspetto cambia a seconda della situazione
attuale.
L 'indicatore è disegnato solo per queste barre, per cui i valori non vuoti di tutti e quattro i buffer
indicatore sono impostati. Per specificare quale valore deve essere considerato come " vuoto" ,
impostare questo valore nelle proprietà PLOT_EMPTY_VAL UE:
R iempie esplicitamente i valori dei buffer indicatori, imposta un valore vuoto in un buffer per saltare
le barre.
Tutti i buffer per il tracciamento dovrebbero andare uno dopo l'altro, nell'ordine: Open, H igh, Low,
Close e il buffer del colore. Nessuno dei buffer di prezzo possono contenere solo valori nulli, poiché in
questo caso nulla è tracciato.
U n esempio di indicatore che disegna barre su uno strumento finanziario selezionato in una finestra
separata. Il colore delle barre varia casualmente ogni N tick s. Il parametro N è impostato nei
parametri esterni dell'indicatore per la possibilità di configurazione manuale (la scheda Parametri nella
finestra Proprietà dell' indicatore).
Si prega di notare che per Plot1 con lo stile DRAW _COLOR_BARS , 8 colori vengono impostati
utilizzando la direttiva del compilatore #property, e poi nella funzione OnCalculate() il colore è scelto a
caso dai 14 colori memorizzati nell'array colori[].
//+--------------------------------------------------------------------------------+
//| DRAW_COLOR_BARS.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_separate_window
#property indicator_buffers 5
#property indicator_plots 1
//--- plot ColorBars
#property indicator_label1 "ColorBars"
#property indicator_type1 DRAW_COLOR_BARS
//--- Definisce 8 colori per la colorazione delle barre (che sono memorizzate nella matrice special
#property indicator_color1 clrRed,clrBlue,clrGreen,clrYellow,clrMagenta,clrCyan,clrLime,clrOrange
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- parametri di input
input int N=5; // Il numero di ticks per cambiare il tipo
ticks++;
//--- Se un numero sufficiente di ticks è stato accumulato
if(ticks>=N)
{
//--- Imposta un nuovo simbolo dalla finestra Market Watch
symbol=GetRandomSymbolName();
//--- Cambia le proprietà della linea
ChangeLineAppearance();
//--- Cambia i colori usati per disegnare le candele
ChangeColors(colors,bars_colors);
int tries=0;
//--- Fa 5 tentativi per riempire il buffer con i prezzi dal simbolo
while(!CopyFromSymbolToBuffers(symbol,rates_total,bars_colors) && tries<5)
{
//--- Un contatore delle chiamate della funzione CopyFromSymbolToBuffers()
tries++;
}
//--- Resetta il contatore dei ticks a zero
ticks=0;
}
//--- restituisce il valore di prev_calculated per la prossima chiamata
return(rates_total);
}
//+--------------------------------------------------------------------------------+
//| Riempie i buffer indicatore con i prezzi |
//+--------------------------------------------------------------------------------+
bool CopyFromSymbolToBuffers(string name,int total,int bar_colors)
{
//--- Nell'array rates[], copieremo Open, High, Low e Close
MqlRates rates[];
//--- Il contatore dei tentativi
int attempts=0;
//--- Quanto è stato copiato
int copied=0;
//--- Fa 25 tentativi per ottenere una timeseries sul simbolo desiderato
while(attempts<25 && (copied=CopyRates(name,_Period,0,bars,rates))<0)
{
Sleep(100);
attempts++;
if(messages) PrintFormat("%s CopyRates(%s) attempts=%d",__FUNCTION__,name,attempts);
}
//--- Se non è riuscito a copiare un numero sufficiente di barre
if(copied!=bars)
{
//--- Forma un messaggio stringa
string comm=StringFormat("Per il simbolo %s, è riuscito a ricevere solo %d barre delle %d ric
name,
copied,
bars
);
//--- Mostra un messaggio in un commento nella finestra del grafico principale
Comment(comm);
//--- Mostra il messaggio
if(messages) Print(comm);
return(false);
}
else
{
//--- Imposta il display del simbolo
PlotIndexSetString(0,PLOT_LABEL,name+" Open;"+name+" High;"+name+" Low;"+name+" Close");
IndicatorSetString(INDICATOR_SHORTNAME,"DRAW_COLOR_BARS("+name+")");
}
//--- Inizializza i buffers con valori vuoti
ArrayInitialize(ColorBarsBuffer1,0.0);
ArrayInitialize(ColorBarsBuffer2,0.0);
ArrayInitialize(ColorBarsBuffer3,0.0);
ArrayInitialize(ColorBarsBuffer4,0.0);
DRAW _COLOR_CANDLES
Lo stile DRAW _COLOR_CANDLES , come DRAW _CANDLES , disegna candele utilizzando i valori dei
quattro buffer di indicatori, che contengono i prezzi Open, H igh, Low e Close. I noltre, esso permette
di specificare un colore per ogni candela da un dato insieme. A questo scopo, lo stile ha un colore
speciale buffer che memorizza indici di colore per ogni barra. E' utilizzato per la creazione di indicatori
personalizzati come una sequenza di candele, comprese quelle in una sottofinestra separata di un
grafico e su altri strumenti finanziari.
Il numero di colori delle candele può essere impostato utilizzando le direttive del compilatore o in
modo dinamico utilizzando la funzione PlotIndexS etInteger(). Cambiamenti dinamici delle proprietà di
plotting permettono di " animare" gli indicatori, in modo che il loro aspetto cambia a seconda della
situazione attuale.
L 'indicatore è disegnato solo per quelle barre per cui sono impostati valori non vuoti di quattro buffer
di prezzi dell'indicatore. Per specificare quale valore deve essere considerato come " vuoto" , impostare
questo valore nella proprietà PLO T_EMPTY_VA L UE:
R iempie esplicitamente i valori dei buffer indicatori, imposta un valore vuoto in un buffer per saltare
le barre.
Tutti i buffer per il tracciamento dovrebbero andare uno dopo l'altro, nell'ordine: Open, H igh, Low,
Close e il buffer del colore. Nessuno dei buffer di prezzo possono contenere solo valori vuoti, poiché in
questo caso nulla è disegnato.
U n esempio di indicatore che disegna candele per uno strumento finanziario selezionato in una finestra
separata. Il colore delle candele cambia dinamicamente ogni N tick s. Il parametro N è impostato nei
parametri esterni dell'indicatore per la possibilità di configurazione manuale (la scheda Parametri nella
finestra Proprietà dell' indicatore).
Si prega di notare che per plot1, il colore è impostato usando la direttiva del compilatore #property, e
poi nella funzione OnCalculate() il colore è impostato in modo casuale da una lista precedentemente
preparata.
//+--------------------------------------------------------------------------------+
//| DRAW_COLOR_CANDLES.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_separate_window
#property indicator_buffers 5
#property indicator_plots 1
//--- plot ColorCandles
#property indicator_label1 "ColorCandles"
#property indicator_type1 DRAW_COLOR_CANDLES
//--- Definisce 8 colori per colorare le candele (sono memorizzati nell'array speciale)
#property indicator_color1 clrRed,clrBlue,clrGreen,clrYellow,clrMagenta,clrCyan,clrLime,clrOrange
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
int tries=0;
//--- Fa 5 tentativi per riempire i buffers di plot1 con i prezzi dal simbolo
while(!CopyFromSymbolToBuffers(symbol,rates_total,0,
ColorCandlesBuffer1,ColorCandlesBuffer2,ColorCandlesBuffer3,
ColorCandlesBuffer4,ColorCandlesColors,candles_colors)
&& tries<5)
{
//--- Un contatore delle chiamate della funzione CopyFromSymbolToBuffers()
tries++;
}
//--- Resetta il contatore dei ticks a zero
ticks=0;
}
//--- restituisce il valore di prev_calculated per la prossima chiamata
return(rates_total);
}
//+--------------------------------------------------------------------------------+
//| Riempie le candele specificate |
//+--------------------------------------------------------------------------------+
bool CopyFromSymbolToBuffers(string name,
int total,
int plot_index,
double &buff1[],
double &buff2[],
double &buff3[],
double &buff4[],
double &col_buffer[],
int cndl_colors
)
{
//--- Nell'array rates[], copieremo Open, High, Low e Close
MqlRates rates[];
//--- Il contatore dei tentativi
int attempts=0;
//--- Quanto è stato copiato
int copied=0;
//--- Fa 25 tentativi per ottenere una timeseries sul simbolo desiderato
while(attempts<25 && (copied=CopyRates(name,_Period,0,bars,rates))<0)
{
Sleep(100);
attempts++;
if(messages) PrintFormat("%s CopyRates(%s) attempts=%d",__FUNCTION__,name,attempts);
}
//--- Se non è riuscito a copiare un numero sufficiente di barre
if(copied!=bars)
{
//--- Forma un messaggio stringa
string comm=StringFormat("Per il simbolo %s, è riuscito a ricevere solo %d barre delle %d ric
name,
copied,
bars
);
//--- Mostra un messaggio in un commento nella finestra del grafico principale
Comment(comm);
//--- Mostra il messaggio
if(messages) Print(comm);
return(false);
}
else
{
//--- Imposta il display del simbolo
PlotIndexSetString(plot_index,PLOT_LABEL,name+" Open;"+name+" High;"+name+" Low;"+name+" Clos
IndicatorSetString(INDICATOR_SHORTNAME,"DRAW_COLOR_CANDLES("+symbol+")");
}
//--- Inizializza i buffers con valori vuoti
ArrayInitialize(buff1,0.0);
ArrayInitialize(buff2,0.0);
ArrayInitialize(buff3,0.0);
ArrayInitialize(buff4,0.0);
//--- Su ogni tick, copia i prezzi dei buffers
for(int i=0;i<copied;i++)
{
ChartSetString(0,CHART_COMMENT,comm);
}
//---
}
//+--------------------------------------------------------------------------------+
//| Cambia l'apparenza delle candele |
//+--------------------------------------------------------------------------------+
void ChangeLineAppearance()
{
//--- Una stringa per la formazione di informazioni sulle proprietà delle candele
string comm="";
//--- Scrive il nome del simbolo
comm="\r\n"+symbol+comm;
//--- Imposta le informazioni del grafico usando un commento
Comment(comm);
}
Inoltre ci sono altre proprietà che possono essere impostate sia attraverso le direttive del
preprocessore che attraverso funzioni intese per la creazione di indicatore personalizzato. Queste
proprietà e funzioni corrispondenti vengono descritte nella seguente tabella.
sLevelName)
Va notato che la numerazione dei livelli e plots in termini preprocessore inizia con uno, mentre la
numerazione delle stesse proprietà utilizzando le funzioni inizia con zero, cioè il valore indicato deve
essere di 1 minore di quello indicato per #property.
Direttiva Descrizione
indicator_chart_window L ' indicatore viene visualizzato nella finestra
principale
SetIndexBuffer
La funzione associa un buffer indicatore specificato con l'array dinamico unidimensionale di tipo
double.
bool SetIndexBuffer(
int index, // indice buffer
double buffer[], // array
ENUM_INDEXBUFFER_TYPE data_type // ciò che verrà memorizzato
);
Parametri
index
[in] Numero del buffer dell'indicatore. La numerazione inizia da 0. Il numero deve essere inferiore
al valore dichiarato in #property indicator_buffers.
buffer[]
[ in] Un array dichiarato nel programma indicatore personalizzato.
data_type
[in] tipo di dati memorizzati nell' array indicatore. Per impostazione predefinita è
INDI CAT OR_DATA (valori dell'indicatore calcolato). S i può anche prendere il valore di
INDI C AT O R_COLO R_INDEX; in questo caso tale buffer è usato per memorizzare indici di colore per
Valore restituito
I n caso di successo, restituisce true, altrimenti - false.
Nota
D opo il legame, il buffer[] dell'array dinamico verrà indicizzato come nei comuni array, anche se
l'indicizzazione delle timeseries è pre-installata per l'array legato. S e si desidera modificare l'ordine
di accesso agli elementi dell'array indicatore, utilizzare la funzione ArrayS etAs S eries() dopo aver
legato l'array utilizzando la funzione SetIndexBuffer(). Tenere presente che non è possibile
modificare la dimensione di array dinamici impostati come buffer indicatore dalla funzione
S etI ndexBuffer(). Per i buffer indicatore, tutte le operazioni di cambio grandezza vengono svolti dal
Esempio:
//+--------------------------------------------------------------------------------+
//| TestCopyBuffer1.mq5 |
//| Copyright 2009, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//---- plot MA
#property indicator_label1 "MA"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- parametri di input
input bool AsSeries=true;
input int period=15;
input ENUM_MA_METHOD smootMode=MODE_EMA;
input ENUM_APPLIED_PRICE price=PRICE_CLOSE;
input int shift=0;
//--- buffers indicatore
double MABuffer[];
int ma_handle;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- mappatura buffers indicatore
if(AsSeries) ArraySetAsSeries(MABuffer,true);
Print("Il buffer indicatore è una timeseries = ",ArrayGetAsSeries(MABuffer));
SetIndexBuffer(0,MABuffer,INDICATOR_DATA);
Print("Il buffer indicatore dopo SetIndexBuffer() è una timeseries = ",
ArrayGetAsSeries(MABuffer));
IndicatorSetString(INDICATOR_SHORTNAME,"MA("+period+")"+AsSeries);
//---
ma_handle=iMA(Symbol(),0,period,shift,smootMode,price);
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
Vedi anche
Proprietà Indicatori Personalizzati, Accesso alle timeseries ed indicatori
IndicatorSetDouble
La funzione imposta il valore della proprietà indicatore corrispondente. Le proprietà dell'indicatore
deve essere di tipo double. Ci sono due varianti della funzione.
Parametri
prop_id
[in] Identificatore della proprietà dell'indicatore. Il valore può essere uno dei valori
dell'enumerazione ENUM _CUS T OM IND_PR OPERTY_DOUBLE.
prop_modifier
[in] Modificatore della proprietà specificata. S olo le proprietà livello richiedono un modificatore.
La numerazione dei livelli parte da 0. Ciò significa che, al fine di impostare proprietà per il
secondo livello è necessario specificare 1 (1 in meno rispetto a quando si utilizza la direttiva del
compilatore).
prop_value
[ in] alore della proprietà.
V
Valore restituito
I n caso di esecuzione avvenuta con successo, restituisce true, altrimenti - false
Nota
La numerazione delle proprietà (modificatori) comincia da 1 (uno) quando si utilizza la direttiva
#property, mentre la funzione utilizza la numerazione da 0 (zero). Nel caso in cui il numero di livello
è impostato in modo errato, la visualizzazione dell' indicatore può differire da quanto previsto.
Ad esempio, il primo valore del livello per l'indicatore in una sottofinestra separata può essere
impostato in due modi:
· property indicator_level1 50 - il valore è utilizzato per specificare il numero del livello,
1
· I ndicatorS etDouble(INDI CAT OR_LEVEL VAL UE, 0 , 50) - 0 è usato per specificare il primo livello.
Esempio: indicatore che capovolge i valori massimi e minimi della finestra indicatore e valori dei
livelli su cui sono posizionate le linee orizzontali.
#property indicator_separate_window
//--- Imposta i valori massimi e minimi per la finestra dell'indicatore
#property indicator_minimum 0
#property indicator_maximum 100
//--- visualizza tre livelli orizzontali in una finestra indicatore separata
#property indicator_level1 25
#property indicator_level2 50
#property indicator_level3 75
//--- imposta lo spessore dei livelli orizzontali
#property indicator_levelwidth 1
//--- imposta lo stile dei livelli orizzontali
#property indicator_levelstyle STYLE_DOT
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- imposta le descrizioni dei livelli orizzontali
IndicatorSetString(INDICATOR_LEVELTEXT,0,"Primo livello (indice 0)");
IndicatorSetString(INDICATOR_LEVELTEXT,1,"Secondo livello (indice 1)");
IndicatorSetString(INDICATOR_LEVELTEXT,2,"Terzo livello (indice 2)");
//--- imposta il nome corto per l'indicatore
IndicatorSetString(INDICATOR_SHORTNAME,"IndicatorSetDouble() Demo");
//--- imposta il colore per ogni livello
IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,clrBlue);
IndicatorSetInteger(INDICATOR_LEVELCOLOR,1,clrGreen);
IndicatorSetInteger(INDICATOR_LEVELCOLOR,2,clrRed);
//---
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
static int tick_counter=0;
static double level1=25,level2=50,level3=75;
static double max=100,min=0, shift=100;
//--- calcola i ticks
tick_counter++;
//--- capovolge i livelli sottosopra ogni 10imo tick
if(tick_counter%10==0)
{
//--- inverte il segno per i valori dei livelli
level1=-level1;
level2=-level2;
level3=-level3;
//--- inverte il segno per i valori massimo e minimo
max-=shift;
min-=shift;
//--- inverte il valore di shift
shift=-shift;
//--- imposta i valori dei nuovi livelli
IndicatorSetDouble(INDICATOR_LEVELVALUE,0,level1);
IndicatorSetDouble(INDICATOR_LEVELVALUE,1,level2);
IndicatorSetDouble(INDICATOR_LEVELVALUE,2,level3);
//--- imposta i nuovi valori di massimo e minimo nella finestra indicatore
Print("Set up max = ",max,", min = ",min);
IndicatorSetDouble(INDICATOR_MAXIMUM,max);
IndicatorSetDouble(INDICATOR_MINIMUM,min);
}
//--- restituisce il valore di prev_calculated per la prossima chiamata
return(rates_total);
}
Vedi anche
S tili Indicatore negli Esempi, Correlazione tra Proprietà Indicatore e Funzioni, S tili di Disegno
IndicatorSetInteger
La funzione imposta il valore della proprietà indicatore corrispondente. La proprietà indicatore deve
essere di int o di tipo color. Ci sono due varianti della funzione.
Parametri
prop_id
[in] Identificatore della proprietà dell'indicatore. Il valore può essere uno dei valori
dell'enumerazione ENUM _CUS T OM IND_PR OPERTY_INT EGER .
prop_modifier
[ in] Modificatore della proprietà specificata. S olo le proprietà livello richiedono un modificatore.
prop_value
[ in] alore della proprietà.
V
Valore restituito
I n caso di esecuzione avvenuta con successo, restituisce true, altrimenti - false
Nota
La numerazione delle proprietà (modificatori) comincia da 1 (uno) quando si utilizza la direttiva
#property, mentre la funzione utilizza la numerazione da 0 (zero). Nel caso in cui il numero di livello
è impostato in modo errato, la visualizzazione dell' indicatore può differire da quanto previsto.
A d esempio, al fine di impostare lo spessore della prima linea orizzontale, usa l'indice zero:
· I ndicatorS etI nteger(INDI CAT OR_LEVEL W IDTH , 0, 5) - l'indice 0 viene usato per impostare lo
spessore del primo livello.
Esempio: Indicatore che imposta il colore, lo stile e lo spessore delle linee orizzontali dell'indicatore.
#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 100
//--- visualizza tre livelli orizzontali in una finestra indicatore separata
#property indicator_level1 20
#property indicator_level2 50
#property indicator_level3 80
//--- imposta lo spessore dei livelli orizzontali
#property indicator_levelwidth 5
//--- imposta il colore dei livelli orizzontali
#property indicator_levelcolor clrAliceBlue
//--- imposta lo stile dei livelli orizzontali
#property indicator_levelstyle STYLE_DOT
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- imposta le descrizioni dei livelli orizzontali
IndicatorSetString(INDICATOR_LEVELTEXT,0,"Primo livello (indice 0)");
IndicatorSetString(INDICATOR_LEVELTEXT,1,"Secondo livello (indice 1)");
IndicatorSetString(INDICATOR_LEVELTEXT,2,"Terzo livello (indice 2)");
//--- imposta il nome corto per l'indicatore
IndicatorSetString(INDICATOR_SHORTNAME,"IndicatorSetInteger() Demo");
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
if(tick_number%t_trigger==0)
index=2; // se tick_number è diviso per t_trigger senza dare resto
//--- se il colore è definito, impostarlo
if(index!=-1)
IndicatorSetInteger(INDICATOR_LEVELCOLOR,level,colors[index]);
//---
}
//+--------------------------------------------------------------------------------+
//| Imposta lo stile della linea orizzontale nella finestra indicatore separata |
//+--------------------------------------------------------------------------------+
void ChangeLevelStyle(int level, // numero della linea orizzontale
int tick_number// numer per ottenere il resto della divisione
)
{
//--- array per memorizzare gli stili
static ENUM_LINE_STYLE styles[5]=
{STYLE_SOLID,STYLE_DASH,STYLE_DOT,STYLE_DASHDOT,STYLE_DASHDOTDOT};
//--- indice degli stili dall'array styles[]
int index=-1;
//--- calcola il numero dall'array styles[] per impostare lo stile della linea orizzontale
if(tick_number%50==0)
index=5; // se tick_number diviso per 50 è senza resto, allora lo stile è STYLE_DASHDOTDOT
if(tick_number%40==0)
index=4; // ... lo stile è STYLE_DASHDOT
if(tick_number%30==0)
index=3; // ... STYLE_DOT
if(tick_number%20==0)
index=2; // ... STYLE_DASH
if(tick_number%10==0)
index=1; // ... STYLE_SOLID
//--- se lo stile è definito, impostarlo
if(index!=-1)
IndicatorSetInteger(INDICATOR_LEVELSTYLE,level,styles[index]);
}
Vedi anche
Proprietà Indicatori Personalizzati, Proprietà Programmi (#property), S tili di disegno
IndicatorSetString
La funzione imposta il valore della proprietà indicatore corrispondente. La proprietà indicatore deve
essere di tipo string. Ci sono due varianti della funzione.
Parametri
prop_id
[in] Identificatore della proprietà dell'indicatore. Il valore può essere uno dei valori
dell'enumerazione ENUM _CUS T OM IND_PR OPERTY_S TRING.
prop_modifier
[ in] Modificatore della proprietà specificata. S olo le proprietà livello richiedono un modificatore.
prop_value
[ in] alore della proprietà.
V
Valore restituito
I n caso di esecuzione avvenuta con successo, restituisce true, altrimenti - false
Nota
La numerazione delle proprietà (modificatori) comincia da 1 (uno) quando si utilizza la direttiva
#property, mentre la funzione utilizza la numerazione da 0 (zero). Nel caso in cui il numero di livello
è impostato in modo errato, la visualizzazione dell' indicatore può differire da quanto previsto.
A d esempio, per impostare la descrizione della prima linea orizzontale, usa l'indice zero:
· I ndicatorS etS tring(INDI CAT OR_LEVEL T EXT , 0, "F irst Level" ) - l'indice 0 viene usato per impostare
la descrizione del testo del primo livello.
Esempio: indicatore che imposta l'etichetta del testo sulla linea orizzontale dell'indicatore.
#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 100
//--- visualizza tre livelli orizzontali in una finestra indicatore separata
#property indicator_level1 30
#property indicator_level2 50
#property indicator_level3 70
//--- imposta il colore dei livelli orizzontali
#property indicator_levelcolor clrRed
//--- imposta lo stile dei livelli orizzontali
#property indicator_levelstyle STYLE_SOLID
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- imposta le descrizioni dei livelli orizzontali
IndicatorSetString(INDICATOR_LEVELTEXT,0,"Primo livello (indice 0)");
IndicatorSetString(INDICATOR_LEVELTEXT,1,"Secondo livello (indice 1)");
IndicatorSetString(INDICATOR_LEVELTEXT,2,"Terzo livello (indice 2)");
//--- imposta il nome corto per l'indicatore
IndicatorSetString(INDICATOR_SHORTNAME,"IndicatorSetString() Demo");
//---
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
Vedi anche
Proprietà Indicatori Personalizzati, Proprietà Programmi (#property)
PlotIndexSetDouble
La funzione imposta il valore della proprietà corrispondente della corrispondente linea dell'indicatore.
La proprietà indicatore deve essere di tipo double.
bool PlotIndexSetDouble(
int plot_index, // indice di stile di plotting
int prop_id, // identificatore proprietà
double prop_value // valore da impostare
);
Parametri
plot_index
[ in] Index of the graphical plotting
prop_id
[ in] Il valore può essere uno dei valori dell'enumerazione ENUM _PLOT_PR OPERTY_DOUBLE.
prop_value
[ in] Il valore della proprietà.
Valore restituito
I n caso di successo, restituisce true, altrimenti false.
PlotIndexSetInteger
La funzione imposta il valore della proprietà corrispondente della corrispondente linea dell'indicatore.
La proprietà indicatore deve essere di tipo int, char, bool o color,. Ci sono due varianti della funzione.
Parametri
plot_index
[ in] Index of the graphical plotting
prop_id
[ in] Il valore può essere uno dei valori dell'enumerazione ENUM _PLOT_PR OPERTY_INT EGER .
prop_modifier
in] Modificatore della proprietà specificata.
[ S olo proprietà di indice di colore richiedono un
modificatore.
prop_value
[ in] Il valore della proprietà.
Valore restituito
I n caso di successo, restituisce true, altrimenti false.
Esempio: un indicatore che disegna una linea a tre colori. Lo schema dei colori cambia ogni 5 ticks.
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 1
//---- plot ColorLine
#property indicator_label1 "ColorLine"
#property indicator_type1 DRAW_COLOR_LINE
#property indicator_color1 clrRed,clrGreen,clrBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 3
//--- buffers indicatore
double ColorLineBuffer[];
double ColorBuffer[];
int MA_handle;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
void OnInit()
{
//--- mappatura buffers indicatore
SetIndexBuffer(0,ColorLineBuffer,INDICATOR_DATA);
SetIndexBuffer(1,ColorBuffer,INDICATOR_COLOR_INDEX);
//--- get MA handle
MA_handle=iMA(Symbol(),0,10,0,MODE_EMA,PRICE_CLOSE);
//---
}
//+--------------------------------------------------------------------------------+
//| ottieni l'indice del colore |
//+--------------------------------------------------------------------------------+
int getIndexOfColor(int i)
{
int j=i%300;
if(j<100) return(0);// primo indice
if(j<200) return(1);// secondo indice
return(2); // terzo indice
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
static int ticks=0,modified=0;
int limit;
//--- il primo calcolo o il numero delle barre è stato cambiato
if(prev_calculated==0)
{
//--- copia valori di MA nel buffer indicatore ColorLineBuffer
int copied=CopyBuffer(MA_handle,0,0,rates_total,ColorLineBuffer);
if(copied<=0) return(0);// copying failed - throw away
//--- ora imposta il colore della linea per ogni barra
for(int i=0;i<rates_total;i++)
ColorBuffer[i]=getIndexOfColor(i);
}
else
{
//--- copia valori di MA nel buffer indicatore ColorLineBuffer
int copied=CopyBuffer(MA_handle,0,0,rates_total,ColorLineBuffer);
if(copied<=0) return(0);
PlotIndexSetString
La funzione imposta il valore della proprietà corrispondente della corrispondente linea dell'indicatore.
La proprietà indicatore deve essere di tipo string.
bool PlotIndexSetString(
int plot_index, // indice di stile di plotting
int prop_id, // identificatore proprietà
string prop_value // valore da impostare
);
Parametri
plot_index
[ in] Indice del graphical plot
prop_id
[ in] Il valore può essere uno dei valori dell' enumerazione ENUM _PLOT_PR OPERTY_S TRING.
prop_value
[ in] Il valore della proprietà.
Valore restituito
I n caso di successo, restituisce true, altrimenti false.
PlotIndexGetInteger
La funzione imposta il valore della proprietà corrispondente della corrispondente linea dell'indicatore.
La proprietà indicatore deve essere del tipo int, color, bool o char. Ci sono due varianti della funzione.
Parametri
plot_index
[ in] Index of the graphical plotting
prop_id
[ in] Il valore può essere uno dei valori dell'enumerazione ENUM _PLOT_PR OPERTY_INT EGER .
prop_modifier
in] Modificatore della proprietà specificata.
[ S olo proprietà di indice di colore richiedono un
modificatore.
Nota
La funzione è progettata per estrarre le impostazioni del disegno della linea indicatore appropriata.
La funzione lavora in tandem con la funzione PlotIndexS etInteger per copiare le proprietà del
disegno di una linea all'altra.
Esempio: un indicatore che colora le candele a seconda del giorno della settimana. I colori per ogni
giorno vengono impostati in modo programma.
#property indicator_separate_window
#property indicator_buffers 5
#property indicator_plots 1
//---- plot ColorCandles
#property indicator_label1 "ColorCandles"
#property indicator_type1 DRAW_COLOR_CANDLES
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- buffers indicatore
double OpenBuffer[];
double HighBuffer[];
double LowBuffer[];
double CloseBuffer[];
double ColorCandlesColors[];
color ColorOfDay[6]={CLR_NONE,clrMediumSlateBlue,
clrDarkGoldenrod,clrForestGreen,clrBlueViolet,clrRed};
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
void OnInit()
{
//--- mappatura buffers indicatore
SetIndexBuffer(0,OpenBuffer,INDICATOR_DATA);
SetIndexBuffer(1,HighBuffer,INDICATOR_DATA);
SetIndexBuffer(2,LowBuffer,INDICATOR_DATA);
SetIndexBuffer(3,CloseBuffer,INDICATOR_DATA);
SetIndexBuffer(4,ColorCandlesColors,INDICATOR_COLOR_INDEX);
//--- imposta il numero di colori nel buffer color
PlotIndexSetInteger(0,PLOT_COLOR_INDEXES,6);
//--- imposta i colori nel buffer color
for(int i=1;i<6;i++)
PlotIndexSetInteger(0,PLOT_LINE_COLOR,i,ColorOfDay[i]);
//--- imposta precisione
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
printf("We have %u colors of days",PlotIndexGetInteger(0,PLOT_COLOR_INDEXES));
//---
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
int i;
MqlDateTime t;
//----
if(prev_calculated==0) i=0;
else i=prev_calculated-1;
//----
while(i<rates_total)
{
OpenBuffer[i]=open[i];
HighBuffer[i]=high[i];
LowBuffer[i]=low[i];
CloseBuffer[i]=close[i];
//--- imposta il colore per ogni candela
TimeToStruct(time[i],t);
ColorCandlesColors[i]=t.day_of_week;
//---
i++;
}
//--- restituisce il valore di prev_calculated per la prossima chiamata
return(rates_total);
}
//+--------------------------------------------------------------------------------+
Oggetti Grafici
Questo è il gruppo di funzioni destinate a lavorare con oggetti grafici relativi a qualsiasi grafico
specificato.
Le funzioni che definiscono le proprietà degli oggetti grafici, nonché le operazioni ObjectCreate() e
ObjectMove() per creare e spostare gli oggetti lungo il chart vengono effettivamente utilizzate per
l'invio di comandi al chart. S e queste funzioni vengono eseguite correttamente, il comando viene
incluso nella coda comune degli eventi chart. Alterazioni visive nelle proprietà degli oggetti grafici
vengono implementate quando si maneggia la coda degli eventi del grafico.
Quindi, non aspettatevi un aggiornamento visivo immediato di oggetti grafici dopo la chiamata di
queste funzioni. I n generale, gli oggetti grafici sul chart vengono aggiornati automaticamente dal
Funzione Azione
ObjectCreate Crea un oggetto del tipo specificato in una
tabella specificata
Funzione Azione
ObjectGetS tring Restituisce il valore stringa della proprietà
dell'oggetto corrispondente
Ogni oggetto grafico deve avere un nome univoco all'interno di un grafico, comprese le suoe
sottofinestre. La modifica di un nome di un oggetto grafico genera due eventi: evento di eliminazione
di un oggetto con il vecchio nome, ed eventi di creazione di un oggetto con un nuovo nome.
Dopo che un oggetto viene creato o una proprietà di un oggetto viene modificata, si consiglia di
chiamare la funzione ChartR edraw(), che comanda il terminale client per disegnare forzatamente un
grafico (e tutti gli oggetti visibili in esso contenuti).
ObjectCreate
La funzione crea un oggetto con il nome, il tipo e le coordinate iniziale specificati, nella sottofinestra
grafico specificata. Durante la creazione, fino a 30 coordinate possono essere specificate.
bool ObjectCreate(
long chart_id, // identificatore del grafico
string name, // nome dell'oggetto
ENUM_OBJECT type, // tipo dell'oggetto
sub_window nwin, // indice della finestra
datetime time1, // tempo per il primo punto di ancoraggio
double price1, // prezzo per il primo punto di ancoraggio
...
datetime timeN=0, // tempo dell' N-simo punto di ancoraggio
double priceN=0, // prezzo tempo dell' N-simo punto di ancoraggio
...
datetime time30=0, // tempo del 30esimo punto di ancoraggio
double price30=0 // prezzo del 30esimo punto di ancoraggio
);
Parametri
chart_id
[ in] Identificatore del Grafico. 0 significa il grafico corrente.
name
[in] Nome dell'oggetto. Il nome deve essere univoco all'interno di un grafico, incluse le sue
sottofinestre.
type
[ in] T ipo dell' Oggetto. Il valore può essere uno dei valori dell'enumerazione ENUM _OBJECT .
sub_window
[in] Numero di sottofinestra grafico. 0 significa la finestra principale del grafico. La sottofinestra
specificata deve esistere, altrimenti la funzione restituisce false.
time1
[ in] La coordinata temporale del primo ancoraggio.
price1
[ in] La coordinata prezzo del primo punto di ancoraggio.
timeN=0
[ in] La coordinata temporale dell' N-esimo punto di ancoraggio.
priceN=0
[ in] La coordinata prezzo dell' N-esimo punto di ancoraggio.
time30=0
[ in] coordinata temporale del trentesimo punto di ancoraggio.
price30=0
Valore restituito
La funzione restituisce true se il comando è stato aggiunto con successo alla coda del chart
specificato, altrimenti false. S e un oggetto è già stato creato, si tenta di modificare le coordinate.
Nota
U na chiamata asincrona viene sempre utilizzata per ObjectCreate(), che è ciò per cui la funzione
restituisce solo i risultati di aggiunta comando ad una coda(queue) chart. In questo caso, true
significa solo che il comando è stato accodato correttamente, ma il risultato della sua esecuzione
non è noto.
Per verificare il risultato di esecuzione del comando, è possibile utilizzare la funzione ObjectFind() o
qualsiasi altra funzione che richiede proprietà dell'oggetto, come Obj ectGetXXX. T uttavia, dovresti
tenere presente che tali funzioni vengono aggiunte alla fine della coda di quel grafico ed aspettano il
risultato dell'esecuzione (dovuto alla chiamata sincrona) e quindi possono richiedere molto tempo.
Questa funzione deve essere presa in considerazione quando si lavora con un gran numero di oggetti
su un chart.
La numerazione delle sottofinestre grafico (se ci sono sotto-finestre con indicatori nella tabella)
inizia con 1. La finestra grafico principale del grafico è, e sempre ha, indice 0.
Il gran numero di punti di ancoraggio (fino a 30) è implementato per uso futuro. At stesso tempo, il
limite di 30 punti di ancoraggio possibili per gli oggetti grafici è determinato dal limite al numero di
parametri (non più di 64) che può essere utilizzato quando si chiama una funzione.
Quando un oggetto viene rinominato, due eventi si formano simultaneamente. Questi eventi
possono essere gestiti in un Ex pert Advisor o indicatore della funzione OnChartEvent():
· un evento di eliminazione di un oggetto con il vecchio nome;
· un evento di creazione di un oggetto con un nuovo nome.
Vi è un certo numero di punti di ancoraggio che devono essere specificati al momento della
creazione di ogni T ipo di oggetto:
OBJ_R ECTANGLE_L ABEL L' oggetto " Etichetta La posizione viene impostata
R ettangolo" per la creazione e utilizzando la proprietà
la progettazione OBJPR OP_XDIS TANCE e
dell'interfaccia grafica OBJPR OP_YDIS TANCE.
personalizzata.
ObjectName
La funzione restituisce il nome dell'oggetto corrispondente nel grafico specificato, nella sottofinestra
specificata, del tipo specificato.
string ObjectName(
long chart_id, // identificatore del grafico
int pos, // numero in lista, degli oggetti
int sub_window=-1, // indice finestra
int type=-1 // tipo di oggetto
);
Parametri
chart_id
[ in] Identificatore del Grafico. 0 significa il grafico corrente.
pos
[in] numero ordinale dell'oggetto in base al filtro specificato dal numero e dal tipo della finestra
secondaria.
sub_window=-1
[in] Numero di sottofinestra grafico. 0 significa la finestra grafico principale, -1 significa tutte le
sotto-finestre del grafico, compresa la finestra principale.
type=-1
in] T ipo dell' oggetto. Il valore può essere uno dei valori dell'enumerazione ENUM _OBJECT . -1
[
Valore restituito
I l nome dell'oggetto viene restituito in caso di successo.
Nota
La funzione utilizza una chiamata sincrona, il che significa che la funzione attende l'esecuzione di
tutti i comandi che sono stati accodati per questo chart prima della sua chiamata, per cui questa
funzione può richiedere molto tempo. Questa funzione deve essere presa in considerazione quando
si lavora con un gran numero di oggetti su un chart.
Quando un oggetto viene rinominato, due eventi si formano simultaneamente. Questi eventi
possono essere gestiti in un Ex pert Advisor o indicatore della funzione OnChartEvent():
· un evento di eliminazione di un oggetto con il vecchio nome;
· un evento di creazione di un oggetto con un nuovo nome.
ObjectDelete
La funzione rimuove l'oggetto con il nome specificato dalla tabella specificata.
bool ObjectDelete(
long chart_id, // identificatore del grafico
string name // nome dell'oggetto
);
Parametri
chart_id
[ in] Identificatore del Grafico. 0 significa il grafico corrente.
name
[ un] Nome dell' oggetto da eliminare.
Valore restituito
La funzione restituisce true se il comando è stato aggiunto con successo alla coda del chart
specificato, altrimenti false.
Nota
U na chiamata asincrona viene sempre utilizzata per ObjectDelete(), che è ciò per cui la funzione
restituisce solo i risultati di aggiunta comando ad una coda(queue) chart. In questo caso, true
significa solo che il comando è stato accodato correttamente, ma il risultato della sua esecuzione
non è noto.
Per verificare il risultato di esecuzione del comando, è possibile utilizzare la funzione ObjectFind() o
qualsiasi altra funzione che richiede proprietà dell'oggetto, come Obj ectGetXXX. T uttavia, dovresti
tenere presente che tali funzioni vengono aggiunte alla fine della coda di quel grafico ed aspettano il
risultato dell'esecuzione (dovuto alla chiamata sincrona) e quindi possono richiedere molto tempo.
Questa funzione deve essere presa in considerazione quando si lavora con un gran numero di oggetti
su un chart.
Quando un oggetto viene rinominato, due eventi si formano simultaneamente. Questi eventi
possono essere gestiti in un Ex pert Advisor o indicatore della funzione OnChartEvent():
· un evento di eliminazione di un oggetto con il vecchio nome;
· un evento di creazione di un oggetto con un nuovo nome.
ObjectsDeleteAll
Rimuove tutti gli oggetti dalla tabella specificata, sottofinestra grafico specificata, del tipo
specificato.
int ObjectsDeleteAll(
long chart_id, // identificatore grafico
int sub_window=-1, // indice finestra
int type=-1 // tipo di oggetto
);
R imuove tutti gli oggetti del tipo specificato utilizzando il prefisso nei nomi degli oggetti.
int ObjectsDeleteAll(
long chart_id, // chart ID
const string prefix, // prefisso nel nome dell'oggetto
int sub_window=-1, // indice finestra
int object_type=-1 // tipo d'oggetto
);
Parametri
chart_id
[ in] Identificatore del Grafico. 0 significa il grafico corrente.
prefix
[in] Prefisso nei nomi degli oggetti. T utti gli oggetti i cui nomi iniziano con questo insieme di
caratteri verranno rimossi dal chart. Puoi specificare il prefisso come 'nome' o 'nome *' - entrambe
le varianti funzioneranno lo stesso. S e viene specificata una stringa vuota come prefisso, gli
oggetti con tutti i nomi possibili verranno rimossi.
sub_window=-1
[in] Numero di sottofinestra grafico. 0 significa la finestra grafico principale, -1 significa tutte le
sotto-finestre del grafico, compresa la finestra principale.
type=-1
in] T ipo dell' oggetto. Il valore può essere uno dei valori dell'enumerazione ENUM _OBJECT . -1
[
Valore restituito
R estituisce il numero di oggetti eliminati. Per saperne di più sull' errore chiamare GetLastError().
Note
La funzione utilizza una chiamata sincrona, il che significa che la funzione attende l'esecuzione di
tutti i comandi che sono stati accodati per questo chart prima della sua chiamata, per cui questa
funzione può richiedere molto tempo. Questa funzione deve essere presa in considerazione quando
si lavora con un gran numero di oggetti su un chart.
ObjectFind
La funzione cerca un oggetto con il nome specificato nella tabella con l'ID specificato.
int ObjectFind(
longchart_id,// Identificatore del chart
string name // nome dell'oggetto
);
Parametri
chart_id
[ in] Identificatore del Grafico. 0 significa il grafico corrente.
name
[ in] Il nome dell'oggetto ricercato.
Valore restituito
In caso di successo la funzione restituisce il numero della finestra secondaria (0 significa la finestra
principale del grafico), in cui l'oggetto si trova. S e l'oggetto non viene trovato, la funzione
restituisce un numero negativo. Per saperne di più sull' errore chiamare GetLastError().
Nota
La funzione utilizza una chiamata sincrona, il che significa che la funzione attende l'esecuzione di
tutti i comandi che sono stati accodati per questo chart prima della sua chiamata, per cui questa
funzione può richiedere molto tempo. Questa funzione deve essere presa in considerazione quando
si lavora con un gran numero di oggetti su un chart.
Quando un oggetto viene rinominato, due eventi si formano simultaneamente. Questi eventi
possono essere gestiti in un Ex pert Advisor o indicatore della funzione OnChartEvent():
· un evento di eliminazione di un oggetto con il vecchio nome;
· un evento di creazione di un oggetto con un nuovo nome.
ObjectGetTimeByValue
La funzione restituisce il valore di tempo per il valore del prezzo specificato dell'oggetto specificato.
datetime ObjectGetTimeByValue(
longchart_id,// Identificatore del chart
string name, // nome dell'oggetto
double value, // Prezzo
int line_id // numero di riga
);
Parametri
chart_id
[ in] Identificatore del Grafico. 0 significa il grafico corrente.
name
[ in] Nome dell'oggetto.
valore
[ in] Valore prezzo.
line_id
[ in] Identificatore linea.
Valore restituito
I l valore di tempo per il valore del prezzo specificato dell'oggetto specificato.
Nota
La funzione utilizza una chiamata sincrona, il che significa che la funzione attende l'esecuzione di
tutti i comandi che sono stati accodati per questo chart prima della sua chiamata, per cui questa
funzione può richiedere molto tempo. Questa funzione deve essere presa in considerazione quando
si lavora con un gran numero di oggetti su un chart.
Un oggetto può avere valori diversi in una coordinata prezzo, pertanto è necessario specificare il
numero di riga. Questa funzione si applica solo per i seguenti oggetti:
· T rendline (OBJ_TR END)
· T rendline per angolo (O BJ_TR ENDBYANGLE)
Vedi anche
T ipi di oggetti
ObjectGetValueByTime
La funzione restituisce il valore del prezzo per il valore di tempo specificato dell'oggetto specificato.
double ObjectGetValueByTime(
long chart_id, // identificatore del grafico
string name, // nome dell'oggetto
datetime time, // Tempo
int line_id // numero di riga
);
Parametri
chart_id
[ in] Identificatore del Grafico. 0 significa il grafico corrente.
name
[ in] Nome dell'oggetto.
time
[ in] Valore temporale.
line_id
[ in] ID Linea.
Valore restituito
I l valore del prezzo per il valore di tempo specificato dell'oggetto specificato.
Nota
La funzione utilizza una chiamata sincrona, il che significa che la funzione attende l'esecuzione di
tutti i comandi che sono stati accodati per questo chart prima della sua chiamata, per cui questa
funzione può richiedere molto tempo. Questa funzione deve essere presa in considerazione quando
si lavora con un gran numero di oggetti su un chart.
Un oggetto può avere valori diversi in una coordinata prezzo, pertanto è necessario specificare il
numero di riga. Questa funzione si applica solo per i seguenti oggetti:
· T rendline (OBJ_TR END)
· T rendline per angolo (O BJ_TR ENDBYANGLE)
Vedi anche
T ipi di oggetti
ObjectMove
La funzione cambia le coordinate del punto di ancoraggio specificato dell'oggetto.
bool ObjectMove(
long chart_id, // identificatore del grafico
string name, // nome dell'oggetto
int point_index, // numero del punto di ancoraggio
datetime time, // Tempo
double price // Prezzo
);
Parametri
chart_id
[ in] Identificatore del Grafico. 0 significa il grafico corrente.
name
[ in] Nome dell'oggetto.
point_index
[ in] Indice del punto di ancoraggio. Il numero di punti di ancoraggio dipende dal tipo di oggetto.
time
[ in] Coordinate temporali del punto di ancoraggio selezionato.
price
[ in] Prezzo coordinate del punto di ancoraggio selezionato.
Valore restituito
La funzione restituisce true se il comando è stato aggiunto con successo alla coda del chart
specificato, altrimenti false.
Note
U na chiamata asincrona viene sempre utilizzata per ObjectMove(), che è ciò per cui la funzione
restituisce solo i risultati di aggiunta comando ad una coda(queue) chart. In questo caso, true
significa solo che il comando è stato accodato correttamente, ma il risultato della sua esecuzione
non è noto.
Per verificare il risultato di esecuzione del comando, è possibile utilizzare una funzione che richiede
le proprietà dell'oggetto, ad esempio ObjectGetXXX. T uttavia, dovresti tenere presente che tali
funzioni vengono aggiunte alla fine della coda di quel grafico ed aspettano il risultato dell'esecuzione
(dovuto alla chiamata sincrona) e quindi possono richiedere molto tempo. Questa funzione deve
essere presa in considerazione quando si lavora con un gran numero di oggetti su un chart.
ObjectsTotal
La funzione restituisce il numero di oggetti nel grafico specificato, sottofinestra specificata, del tipo
specificato.
int ObjectsTotal(
long chart_id, // identificatore del grafico
int sub_window=-1, // indice finestra
int type=-1 // tipo di oggetto
);
Parametri
chart_id
[ in] Identificatore del Grafico. 0 significa il grafico corrente.
sub_window=-1
[in] Numero di sottofinestra grafico. 0 significa la finestra grafico principale, -1 significa tutte le
sotto-finestre del grafico, compresa la finestra principale.
type=-1
in] T ipo dell' oggetto. Il valore può essere uno dei valori dell'enumerazione ENUM _OBJECT . -1
[
Valore restituito
I l numero di oggetti.
Note
La funzione utilizza una chiamata sincrona, il che significa che la funzione attende l'esecuzione di
tutti i comandi che sono stati accodati per questo chart prima della sua chiamata, per cui questa
funzione può richiedere molto tempo. Questa funzione deve essere presa in considerazione quando
si lavora con un gran numero di oggetti su un chart.
ObjectSetDouble
La funzione imposta il valore della proprietà dell'oggetto corrispondente. La proprietà dell' oggetto
deve essere di tipo double. Ci sono due varianti della funzione.
Parametri
chart_id
[ in] Identificatore del Grafico. 0 significa il grafico corrente.
name
[ in] Nome dell'oggetto.
prop_id
[in] ID della proprietà dell'oggetto. I l valore può essere uno dei valori dell'enumerazione
ENUM _OBJECT_PR OPERTY_DOUBLE.
prop_modifier
[in] Modificatore della proprietà specificata. Denota il numero del livello negli S trumenti di
Fibonacci e nell'oggetto grafico Forche di A ndrew's. La numerazione dei livelli parte da zero.
prop_value
[ in] Il valore della proprietà.
Valore restituito
La funzione restituisce true solo se il comando per modificare le proprietà di un oggetto grafico sono
state inviate con successo ad un grafico. In caso contrario, restituisce false. Per saperne di più sull'
errore chiamare GetLastError().
Note
La funzione utilizza una chiamata asincrona, il che significa che la funzione non attende l'esecuzione
del comando che è stato aggiunto alla coda del grafico specificato. Invece, restituisce
immediatamente il controllo.
Per verificare il risultato di esecuzione del comando, è possibile utilizzare una funzione che richiede
la proprietà dell'oggetto specificato. T uttavia, è necessario tenere presente che tali funzioni
vengono aggiunte alla fine della coda di quel chart, ed aspettano il risultato dell'esecuzione, e quindi
possono richiedere molto tempo. Questa funzione deve essere presa in considerazione quando si
lavora con un gran numero di oggetti su un chart.
price2=low[50];
time2=time[50];
Vedi anche
Object Types, Proprietà Oggetto
ObjectSetInteger
La funzione imposta il valore della proprietà dell'oggetto corrispondente. La proprietà oggetto deve
essere di tipo datetime, int, colore, bool o char. Ci sono due varianti della funzione.
Parametri
chart_id
[ in] Identificatore del Grafico. 0 significa il grafico corrente.
name
[ in] Nome dell'oggetto.
prop_id
[in] ID della proprietà dell'oggetto. Il valore può essere uno dei valori dell' enumerazione
ENUM _OBJECT_PR OPERTY_INT EGER .
prop_modifier
[in] Modificatore della proprietà specificata. Esso denota il numero del livello negli strumenti di
Fibonacci e nell'oggetto grafico Forche di A ndrew's. La numerazione dei livelli parte da zero.
prop_value
[ in] Il valore della proprietà.
Valore restituito
La funzione restituisce true solo se il comando per modificare le proprietà di un oggetto grafico sono
state inviate con successo ad un grafico. In caso contrario, restituisce false. Per saperne di più sull'
errore chiamare GetLastError().
Note
La funzione utilizza una chiamata asincrona, il che significa che la funzione non attende l'esecuzione
del comando che è stato aggiunto alla coda del grafico specificato. Invece, restituisce
immediatamente il controllo.
Per verificare il risultato di esecuzione del comando, è possibile utilizzare una funzione che richiede
la proprietà dell'oggetto specificato. T uttavia, è necessario tenere presente che tali funzioni
vengono aggiunte alla fine della coda di quel chart, ed aspettano il risultato dell'esecuzione, e quindi
possono richiedere molto tempo. Questa funzione deve essere presa in considerazione quando si
lavora con un gran numero di oggetti su un chart.
if(!ObjectCreate(0,name,OBJ_EDIT,0,0,0))
{
Print("Non posso creare: '",name,"'");
return;
}
//--- imposta le coordinate, spessore ed altezza
ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x*X_SIZE);
ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y*Y_SIZE);
ObjectSetInteger(0,name,OBJPROP_XSIZE,X_SIZE);
ObjectSetInteger(0,name,OBJPROP_YSIZE,Y_SIZE);
//--- set text color
if(clrBlack==c) ObjectSetInteger(0,name,OBJPROP_COLOR,clrWhite);
else ObjectSetInteger(0,name,OBJPROP_COLOR,clrBlack);
//--- imposta colore di background
ObjectSetInteger(0,name,OBJPROP_BGCOLOR,c);
//--- imposta il testo
ObjectSetString(0,name,OBJPROP_TEXT,(string)c);
}
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- crea la tabella 7x20 degli oggetti di modifica colorati
for(uint i=0;i<140;i++)
CreateColorBox(i%7,i/7,ExtClr[i]);
}
Vedi anche
Object Types, Proprietà Oggetto
ObjectSetString
La funzione imposta il valore della proprietà dell'oggetto corrispondente. La proprietà dell'oggetto deve
essere di tipo string tipo. Ci sono due varianti della funzione.
Parametri
chart_id
[ in] Identificatore del Grafico. 0 significa il grafico corrente.
name
[ in] Nome dell'oggetto.
prop_id
[in] ID della proprietà dell'oggetto. Il valore può essere uno dei valori dell' enumerazione
ENUM _OBJECT_PR OPERTY_S TRING.
prop_modifier
[in] Modificatore della proprietà specificata. Esso denota il numero del livello negli strumenti di
Fibonacci e nell'oggetto grafico Forche di A ndrew's. La numerazione dei livelli parte da zero.
prop_value
[ in] Il valore della proprietà.
Valore restituito
La funzione restituisce true solo se il comando per modificare le proprietà di un oggetto grafico sono
state inviate con successo ad un grafico. In caso contrario, restituisce false. Per saperne di più sull'
errore chiamare GetLastError().
Nota
La funzione utilizza una chiamata asincrona, il che significa che la funzione non attende l'esecuzione
del comando che è stato aggiunto alla coda del grafico specificato. Invece, restituisce
immediatamente il controllo.
Per verificare il risultato di esecuzione del comando, è possibile utilizzare una funzione che richiede
la proprietà dell'oggetto specificato. T uttavia, è necessario tenere presente che tali funzioni
vengono aggiunte alla fine della coda di quel chart, ed aspettano il risultato dell'esecuzione, e quindi
possono richiedere molto tempo. Questa funzione deve essere presa in considerazione quando si
lavora con un gran numero di oggetti su un chart.
Quando un oggetto viene rinominato, due eventi si formano simultaneamente. Questi eventi
possono essere gestiti in un Ex pert Advisor o indicatore della funzione OnChartEvent():
· un evento di eliminazione di un oggetto con il vecchio nome;
· un evento di creazione di un oggetto con un nuovo nome.
ObjectGetDouble
La funzione restituisce il valore della proprietà dell'oggetto corrispondente. La proprietà dell' oggetto
deve essere di tipo double. Ci sono due varianti della funzione.
2. Restituisce true o false, a seconda del successo della funzione. In caso di successo, il valore
della proprietà è posto in una variabile passata per riferimento, dall'ultimo parametro.
bool ObjectGetDouble(
long chart_id, // identificatore del grafico
string name, // nome dell'oggetto
ENUM_OBJECT_PROPERTY_DOUBLE prop_id, // identificatore proprietà
int prop_modifier, // modificatore proprietà
double& double_var // qui si accetta il valore della proprietà
);
Parametri
chart_id
[ in] Identificatore del Grafico. 0 significa il grafico corrente.
name
[ in] Nome dell'oggetto.
prop_id
[in] ID della proprietà dell'oggetto. I l valore può essere uno dei valori dell'enumerazione
ENUM _OBJECT_PR OPERTY_DOUBLE.
prop_modifier
[in] Modificatore della proprietà specificata. Per la prima variante, il valore del modificatore di
default è uguale a 0. La maggior parte delle proprietà non richiedono un modificatore. Esso denota
il numero del livello negli strumenti di Fibonacci e nell'oggetto grafico Forche di Andrew's. La
numerazione dei livelli parte da zero.
double_var
[ Out] Variabile del tipo double, che ha ricevuto il valore della proprietà richiesta.
Valore restituito
Valore del tipo double per la prima variante convocata.
Per la seconda variante la funzione restituisce true, se la proprietà è mantenuta ed il valore è stato
inserito nella variabile double_var, altrimenti restituisce false. Per saperne di più sull' errore
chiamare GetLastError().
Note
La funzione utilizza una chiamata sincrona, il che significa che la funzione attende l'esecuzione di
tutti i comandi che sono stati accodati per questo chart prima della sua chiamata, per cui questa
funzione può richiedere molto tempo. Questa funzione deve essere presa in considerazione quando
si lavora con un gran numero di oggetti su un chart.
ObjectGetInteger
La funzione restituisce il valore della proprietà dell'oggetto corrispondente. La proprietà oggetto deve
essere di tipo datetime, int, colore, bool o char. Ci sono due varianti della funzione.
2. Restituisce true o false, a seconda del successo della funzione. In caso di successo, il valore
della proprietà è posto in una variabile passata per riferimento, dall'ultimo parametro.
bool ObjectGetInteger(
long chart_id, // identificatore del grafico
string name, // nome dell'oggetto
ENUM_OBJECT_PROPERTY_INTEGER prop_id, // identificatore proprietà
int prop_modifier, // modificatore proprietà
long& long_var // qui si accetta il valore della proprietà
);
Parametri
chart_id
[ in] Identificatore del Grafico. 0 significa il grafico corrente.
name
[ in] Nome dell'oggetto.
prop_id
[in] ID della proprietà dell'oggetto. Il valore può essere uno dei valori dell' enumerazione
ENUM _OBJECT_PR OPERTY_INT EGER .
prop_modifier
[in] Modificatore della proprietà specificata. Per la prima variante, il valore del modificatore di
default è uguale a 0. La maggior parte delle proprietà non richiedono un modificatore. Esso denota
il numero del livello negli strumenti di Fibonacci e nell'oggetto grafico Forche di Andrew's. La
numerazione dei livelli parte da zero.
long_var
[ out] Variabile di tipo long che riceve il valore della proprietà richiesta.
Valore restituito
I l valore long per la prima variante di chiamata.
Per la seconda variante la funzione restituisce true, se la proprietà è mantenuta e il valore è stato
inserito nella variabile long _var, altrimenti restituisce false. Per saperne di più sull' errore chiamare
GetLastError().
Note
La funzione utilizza una chiamata sincrona, il che significa che la funzione attende l'esecuzione di
tutti i comandi che sono stati accodati per questo chart prima della sua chiamata, per cui questa
funzione può richiedere molto tempo. Questa funzione deve essere presa in considerazione quando
si lavora con un gran numero di oggetti su un chart.
ObjectGetString
La funzione restituisce il valore della proprietà dell'oggetto corrispondente. La proprietà dell'oggetto
deve essere di tipo string tipo. Ci sono due varianti della funzione.
2. Restituisce true o false, a seconda del successo della funzione. In caso di successo, il valore
della proprietà è posto in una variabile passata per riferimento, dall'ultimo parametro.
bool ObjectGetString(
long chart_id, // identificatore del grafico
string name, // nome dell'oggetto
ENUM_OBJECT_PROPERTY_STRING prop_id, // identificatore proprietà
int prop_modifier, // modificatore proprietà
string& string_var // qui si accetta il valore della proprietà
);
Parametri
chart_id
[ in] Identificatore del Grafico. 0 significa il grafico corrente.
name
[ in] Nome dell'oggetto.
prop_id
[in] ID della proprietà dell'oggetto. Il valore può essere uno dei valori dell' enumerazione
ENUM _OBJECT_PR OPERTY_S TRING.
prop_modifier
[in] Modificatore della proprietà specificata. Per la prima variante, il valore del modificatore di
default è uguale a 0. La maggior parte delle proprietà non richiedono un modificatore. Esso denota
il numero del livello negli strumenti di Fibonacci e nell'oggetto grafico Forche di Andrew's. La
numerazione dei livelli parte da zero.
string_var
[ out] Variabile di tipo stringa che riceve il valore delle caratteristiche richieste.
Valore restituito
Valore di stringa per la prima versione della chiamata.
Per la seconda versione della chiamata restituisce true, se la proprietà è mantenuta e il valore è
stato inserito nella variabile string _var, altrimenti restituisce false. Per saperne di più sull' errore
chiamare GetLastError().
Nota
La funzione utilizza una chiamata sincrona, il che significa che la funzione attende l'esecuzione di
tutti i comandi che sono stati accodati per questo chart prima della sua chiamata, per cui questa
funzione può richiedere molto tempo. Questa funzione deve essere presa in considerazione quando
si lavora con un gran numero di oggetti su un chart.
Quando un oggetto viene rinominato, due eventi si formano simultaneamente. Questi eventi
possono essere gestiti in un Ex pert Advisor o indicatore della funzione OnChartEvent():
· un evento di eliminazione di un oggetto con il vecchio nome;
· un evento di creazione di un oggetto con un nuovo nome.
TextSetFont
La funzione imposta il tipo di carattere per la visualizzazione del testo utilizzando metodi di disegno, e
restituisce il risultato di tale operazione. Il carattere Arial con la dimensione -120 (12 pt) viene
utilizzato per impostazione predefinita.
bool TextSetFont(
const string name, // nome del font o percorso al file di font sul disco
int size, // grandeza del carattere
uint flags, // combinazione di flags
int orientation=0 // angolo di inclinazione del testo
);
Parametri
name
[in] Nome font nel sistema o il nome della risorsa che contiene il tipo di carattere o il percorso del
file del font sul disco.
grandezza
[ in] La dimensione del carattere che può essere impostata utilizzando i valori positivi e negativi.
I n caso di valori positivi, la dimensione di un testo visualizzato non dipende dalla impostazioni di
grandezza caratteri del sistema operativo. In caso di valori negativi, il valore è impostato in
decimi di punto e la grandezza del testo dipende dalle impostazioni del sistema operativo (" scala
standard" o " su larga scala" ). Vedere la nota di seguito per ulteriori informazioni sulle differenze
tra le modalità.
flags
[ in] Combinazione di flags che descrive lo stile del carattere.
orientamento
[ in] L 'inclinazione orizzontale di testo per l'asse X, l'unità di misura è di 0,1 gradi. Ciò significa che
orientation=450 sta per un'inclinazione pari a 45 gradi.
Valore restituito
Restituisce true se il carattere corrente è stato installato correttamente, in caso contrario false.
Possibili errori di codice:
· ERR_INVAL ID_PARAMET ER (4003) - name presenta NU LL o " " (empty string),
· ERR_INT ERNAL _ERR OR (4001) - errore sistema operativo (per esempio, un tentativo di creare un
font non-esistente).
Nota
Se " ::" è usato nel nome del carattere, il tipo di carattere viene scaricato dalla risorsa EX5. S e il
nome del font viene specificato con un' estensione, il tipo di carattere viene scaricato dal file, se il
percorso inizia da " \" o " /" , il file viene cercato relativamente alla MQL5 directory. In caso contrario,
viene cercato relativamente al percorso del file che EX5 chiamato dalla funzione T ex tS etFont().
La grandezza del carattere viene impostata con valori positivi o negativi. Questo fatto definisce la
dipendenza della dimensione del testo dalle impostazioni del sistema operativo (scala grandezza).
· Se la grandezza è specificata da un numero positivo, questa grandezza si trasforma in unità di
misura fisica di un dispositivo (pix el) quando si cambia il tipo di carattere logico in uno fisico, e
uesta grandezza corrisponde all'altezza dei glifi simbolo scelto tra i font disponibili . Questo caso
q
non è raccomandato quando il testo visualizzato dalla funzione T ex tOut() e quelli visualizzati
dall'oggetto grafico OBJ_L ABEL (" Label" ) devono essere usati insieme sul chart.
· S e la grandezza è specificata da un numero negativo, questo numero dovrebbe essere impostato
in decimi di punto logico (-350 è pari a 35 punti logici) ed è divisa per 10. Un valore ottenuto
viene poi trasformato in unità di misura fisiche di un dispositivo (pix el) e corrisponde al valore
assoluto dell'altezza di un simbolo scelto tra i font disponibili. Moltiplica la grandezza del carattere
specificata nelle proprietà dell'oggetto da -10 per rendere la dimensione di un testo sullo schermo
simile a quella nrll'oggetto OBJ_L ABEL.
I flag possono essere usati come combinazione di flag di stile con uno dei flag che specificano la
larghezza del carattere. I nomi dei flags sono di seguito.
Flag Descrizione
F ONT_ITAL IC I talic
FW _THIN
FW _ XTRA E L IGHT
FW _U TRA L L IGHT
FW _ IGHT L
FW _N OR M A L
FW _R EGUL AR
FW _ MEDIUM
FW _S EM IBOL D
FW _D EM IBOL D
FW _B OL D
FW _ XTRABE OL D
FW _U TRAB L OL D
FW _H EAVY
FW _B A L CK
Vedi anche
TextOut
La funzione consente di visualizzare un testo in un array personalizzato (buffer) e restituisce il
risultato di tale operazione. L 'array è stato designato per creare la risorsa grafica.
bool TextOut(
const string text, // testo visualizzato
int x, // coordinata X
int y, // coordinata Y
uint anchor, // tipo di ancora
uint &data[], // output buffer
uint width, // larghezza buffer in pixels
uint height, // altezza buffer in pixels
uint color, // colore testo
ENUM_COLOR_FORMAT color_format // formato del colore per l'output
);
Parametri
text
[ in] T esto visualizzato che verrà scritto nel buffer. S olo un testo su una-riga viene visualizzato.
x
[ in] Coordinata X del punto di ancoraggio del testo visualizzato.
y
[ in] Coordinata Y del punto di ancoraggio del testo visualizzato.
ancora
[in] Il valore dei 9 predefiniti metodi di visualizzazione del luogo del punto di ancoramento del
testo. Il valore viene impostato da una combinazione di due flags - flags di allineamento testo
orizzontale e verticale. I nomi dei flags sono elencati nella Nota seguente.
data[]
[in] buffer, in cui il testo viene visualizzato. Il buffer viene utilizzato per creare la risorsa del
grafico.
width
[ in] Larghezza Buffer in pix el.
height
[ in] Altezza Buffer in pix el.
color
[ in] Colore testo.
color_format
[ in] Il formato del colore viene impostato dal valore dell'enumerazione ENUM _COLOR_FOR M AT .
Valore restituito
R estituisce true se ha successo, altrimenti false.
Nota
Il punto di ancoraggio specificato da anchor è una combinazione di due flag di allineamento testo
orizzontale e verticale. Flags allineamento testo orizzontale:
· LEFT - punto di ancoraggio sul lato sinistro del riquadro di delimitazione
TA_
Esempio:
//--- spessore ed altezza della tela (usata per il disegno)
#define IMG_WIDTH 200
#define IMG_HEIGHT 200
//--- mostra la finestra parametri prima di lanciare lo script
#property script_show_inputs
//--- abilitare per impostare il formato del colore
input ENUM_COLOR_FORMAT clr_format=COLOR_FORMAT_XRGB_NOALPHA;
//--- disegno array (buffer)
uint ExtImg[IMG_WIDTH*IMG_HEIGHT];
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- crea l'oggetto OBJ_BITMAP_LABEL per il disegno
ObjectCreate(0,"CLOCK",OBJ_BITMAP_LABEL,0,0,0);
//--- specifica il nome delle risorse grafiche per scrivere l'oggetto CLOCK
ObjectSetString(0,"CLOCK",OBJPROP_BMPFILE,"::IMG");
//--- ruota le "lancette" dell'orologio in un loop infinito, finchè lo script viene interrotto
while(!IsStopped())
{
//--- ripulisce il buffer array del disegno dell'orologio
ArrayFill(ExtImg,0,IMG_WIDTH*IMG_HEIGHT,0);
//--- imposta il carattere per il disegno delle cifre per la facciata dell'orologio
TextSetFont("Arial",-200,FW_EXTRABOLD,0);
//--- disegna la facciata dell'orologio
for(int i=1;i<=12;i++)
{
//--- riceve la grandezza dell'ora corrente sulla facciata dell'orologio
TextGetSize(string(i),w,h);
//--- calcola le coordinate dell'ora corrente sulla facciata dell'orologio
a=-((i*300)%3600*M_PI)/1800.0;
x=IMG_WIDTH/2-int(sin(a)*80+0.5+w/2);
y=IMG_HEIGHT/2-int(cos(a)*80+0.5+h/2);
//--- da in output l'ora sulla facciata dell'orologio per il buffer ExtImg[]
TextOut(string(i),x,y,TA_LEFT|TA_TOP,ExtImg,IMG_WIDTH,IMG_HEIGHT,0xFFFFFFFF,clr_format);
}
//--- ora, specifica il carattere per il disegno della parte dei minuti
TextSetFont("Arial",-200,FW_EXTRABOLD,-int(nm%3600));
//--- riceve la grandezza della parte dei minuti
TextGetSize("----->",w,h);
//--- calcola le coordinate della parte dei minuti sulla facciata dell'orologio
a=-(nm%3600*M_PI)/1800.0;
x=IMG_WIDTH/2-int(sin(a)*h/2+0.5);
y=IMG_HEIGHT/2-int(cos(a)*h/2+0.5);
//--- da in output la parte dei minuti sulla facciata dell'orologio nel buffer ExtImg[]
TextOut("----->",x,y,TA_LEFT|TA_TOP,ExtImg,IMG_WIDTH,IMG_HEIGHT,0xFFFFFFFF,clr_format);
//--- ora, imposta il font per il disegno della parte dei minuti
TextSetFont("Arial",-200,FW_EXTRABOLD,-int(nh/12%3600));
TextGetSize("==>",w,h);
//--- calcola le coordinata della parte dell'ora sulla facciata dell'orologio
a=-(nh/12%3600*M_PI)/1800.0;
x=IMG_WIDTH/2-int(sin(a)*h/2+0.5);
y=IMG_HEIGHT/2-int(cos(a)*h/2+0.5);
//--- da in output la parte dell'ora sulla facciata dell'orologio nel buffer ExtImg[]
TextOut("==>",x,y,TA_LEFT|TA_TOP,ExtImg,IMG_WIDTH,IMG_HEIGHT,0xFFFFFFFF,clr_format);
nh+=60;
//--- mantiene una breve pausa tra i frames
Sleep(10);
}
//--- elimina l'oggetto CLOCK quando si completa l'operazione dello script
ObjectDelete(0,"CLOCK");
//---
}
Vedi anche
R isorse, R esourceCreate(), R esourceS ave(), T ex tGetS ize(), T ex tS etFont()
TextGetSize
La funzione restituisce la larghezza della linea e l'altezza alle correnti impostazioni dei caratteri.
bool TextGetSize(
const string text, // stringa di testo
uint& width, // larghezza del buffer in pixels
uint& height // altezza del buffer in pixels
);
Parametri
text
[ in] S tringa, per cui lunghezza e larghezza devono essere ottenute.
width
[ out] Parametro d'ingresso per la ricezione della larghezza.
height
[ out] Parametro d'input per la ricezione di altezza.
Valore restituito
R estituisce true se ha successo, altrimenti false. Possibili errori di codice:
· ERR_INT ERNAL _ERR OR (4001) - errore sistema operativo.
Vedi anche
R isorse, R esourceCreate(), R esourceS ave(), T ex tS etFont(), T ex tOut()
Queste funzioni restituiscono l'handle della copia appropriata dell'indicatore. Inoltre, con questo
handle, è possibile ricevere i dati calcolati dall' indicatore corrispondente. I corrispondenti dati del
buffer (gli indicatori tecnici contengono dati calcolati nel loro buffer interni, che possono variare da 1
a 5, a seconda dell'indicatore) possono essere copiati su un programma-MQL5 utilizzando la funzione
CopyBuffer().
N on si può fare riferimento ai dati indicatore giusto dopo che questo è stato creato, in quanto il
calcolo dei valori degli indicatori richiede un po' di tempo, quindi è meglio creare gli handles in
OnInit(). La funzione iCustom() crea l'indicatore personalizzato corrispondente, e restituisce il suo
handle in caso venga creato con successo. Indicatori personalizzati possono contenere fino a 512
buffer indicatore, il cui contenuto può anche essere ottenuto con la funzione CopyBuffer(), utilizzando
l' handle ottenuto.
Vi è un metodo universale per creare qualsiasi indicatore tecnico usando la funzione IndicatorCreate().
Questa funzione accetta i seguenti dati come parametri di input:
· timeframe;
La memoria del computer può essere liberata da un indicatore che non è più utilizzato, usando la
funzione IndicatorR elease(), per cui l'handle indicatore viene passato.
Note. Chiamate ripetuta della funzione dell'indicatore con gli stessi parametri in un programma-MQL5
non portano ad un aumento multiplo del contatore di riferimento; il contatore verrà aumentato solo
una volta di 1. T uttavia, si consiglia di ottenere gli handles degli indicatori nella funzione OnInit() o
nel costruttore della classe, ed utilizzare ulteriormente tali handles in altre funzioni. Il contatore di
riferimento diminuisce quando un programma-MQL5 viene deinizializzato.
T utte le funzioni dell' indicatore hanno almeno 2 parametri - simbolo e periodo. Il valore NU LL del
simbolo significa il corrente simbolo, il valore 0 del periodo significa il corrente timeframe.
iAD A ccumulation/Distribution
iAlligator A lligator
iDeMark er D eMark er
iEnvelopes Envelopes
iFractals F ractals
iMomentum Momentum
iM A Moving Average
iVolumes V olumes
iAC
La funzione crea l' Accelerator Oscillator in una cache globale del terminale client e restituisce il suo
handle. H a un solo buffer.
int iAC(
string symbol, // nome simbolo
ENUM_TIMEFRAMES period // periodo
);
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori dell' enumerazione ENUM _TIMEFRAMES , 0 indica
il corrente timeframe.
Valore restituito
R estituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è pi ù
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_iAC.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "L'indicatore dimostra come ottenere i dati"
#property description "del buffer indicatore per l'indicatore tecnico iAC."
#property description "Il simbolo e timeframe usati per i calcoli dell'indicatore,"
#property description "vengono impostati dai parametri simbolo e periodo."
#property description "Il metodo per la creazione dell'handle è impostato attraverso il parametro '
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots 1
//--- disegnare iAC
#property indicator_label1 "iAC"
#property indicator_type1 DRAW_COLOR_HISTOGRAM
#property indicator_color1 clrGreen, clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//+--------------------------------------------------------------------------------+
//| Enumerazione dei metodi della creazione dell'handle |
//+--------------------------------------------------------------------------------+
enum Creation
{
Call_iAC, // usa iAC
Call_IndicatorCreate // usa IndicatorCreate
};
//--- parametri di input
input Creation type=Call_iAC; // tipo della funzione
input string symbol=" "; // simbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffers indicatore
double iACBuffer[];
double iACColors[];
//--- variabile per memorizzare l'handle dell'indicatore iAC
int handle;
//--- variabile per memorizzare
string name=symbol;
//--- nome dell'indicatore sul grafico
string short_name;
//--- manterremo il numero di valori nell'indicatore Accelerator Oscillator
int bars_calculated=0;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- assegnazione di array di buffer indicatori
SetIndexBuffer(0,iACBuffer,INDICATOR_DATA);
SetIndexBuffer(1,iACColors,INDICATOR_COLOR_INDEX);
//--- determinare il simbolo per cui viene disegnato l'indicatore
name=symbol;
//--- eliminare gli spazi a destra e a sinistra
StringTrimRight(name);
StringTrimLeft(name);
//--- se il risultato è zero nella lunghezza della stringa 'name'
if(StringLen(name)==0)
{
//--- prende il simbolo del grafico indicatore a cui è attaccato
name=_Symbol;
}
//--- crea l'handle dell'indicatore
if(type==Call_iAC)
handle=iAC(name,period);
else
handle=IndicatorCreate(name,period,IND_AC);
//--- se l'handle non viene creato
if(handle==INVALID_HANDLE)
{
//--- dice riguardo il fallimento e l'output del codice di errore
PrintFormat("Fallimento nel creare l'handle dell'indicatore iAC per il simbolo %s/%s, codice
name,
EnumToString(period),
GetLastError());
//--- l'indicatore si ferma precocemente
return(INIT_FAILED);
}
//--- Mostra il simbolo/timeframe per cui è calcolato l'indicatore Accelerator Oscillator
short_name=StringFormat("iAC(%s/%s)",name,EnumToString(period));
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inizializzazione normale dell'indicatore
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//--- numero di valori copiati dall' indicatore iAC
int values_to_copy;
//--- determina il numero di valori calcolati in dell'indicatore
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() returned %d, error code %d",calculated,GetLastError());
return(0);
}
//--- se è il primo inizio del calcolo dell'indicatore o se il numero di valori dell'indicatore iAC
//--- o se è necessario calcolare l'indicatore per due o più barre (significa che qualcosa è cambia
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se l' array iACBuffer è maggiore del numero di valori dell'indicatore iAC per il simbol
//--- altrimenti, copiamo meno della grandezza del buffer indicatore
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- vuol dire che non è la prima volta del calcolo dell'indicatore, e dopo l'ultima chiamat
//--- per il calcolo non viene aggiunta più di una barra
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- riempire gli array iACBuffer e iACColors con i valori dall'indicatore Accelerator Oscillator
//--- se FillArraysFromBuffer restituisce false, significa che l'informazione non è ancora pronta,
if(!FillArraysFromBuffer(iACBuffer,iACColors,handle,values_to_copy)) return(0);
//--- forma il messaggio
string comm=StringFormat("%s ==> Valore aggiornato nell'indicatore %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- visualizza il messaggio di servizio sul grafico
Comment(comm);
//--- memorizzare il numero di valori dell'indicatore Oscillator Accelerator
bars_calculated=calculated;
//--- restituisce il valore prev_calculated per la chiamata successiva
return(rates_total);
}
//+--------------------------------------------------------------------------------+
//| Riempimento del buffer indicatore dall'indicatore iAC |
//+--------------------------------------------------------------------------------+
bool FillArraysFromBuffer(double &values[], // buffer indicatore dei valori di Accelerator O
double &color_indexes[], // il color buffer (per memorizzare gli indici d
int ind_handle, // handle dell'indicatore iAC
int amount // numero di valori copiati
)
{
//--- resetta codice errore
ResetLastError();
//--- riempie una parte dell' array iACBuffer con valori dal buffer indicatore che ha indice 0
if(CopyBuffer(ind_handle,0,0,amount,values)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nella copia dei dati dall'indicatore iAC, codice errore %d",GetLastEr
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- ora copia gli indici dei colori
if(CopyBuffer(ind_handle,1,0,amount,color_indexes)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i valori dall'indicatore iAC, codice errore %d",GetLastEr
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- tutto è ok
return(true);
}
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione indicatore |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- cancella il grafico dopo aver eliminato l'indicatore
Comment("");
}
iAD
La funzione restituisce l'handle dell'indicatore Accumulation/Distribution. H a un solo buffer.
int iAD(
string symbol, // nome del simbolo
ENUM_TIMEFRAMES period, // periodo
ENUM_APPLIED_VOLUME applied_volume // tipo di volume per il calcolo
);
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori dell' enumerazione ENUM _TIMEFRAMES , 0 indica
il corrente timeframe.
applied_volume
[ in] I l volume usato. Può essere uno dei valori ENUM _APPL IED_VOL UME.
Valore restituito
R estituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è pi ù
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_iAD.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "L'indicatore dimostra come ottenere i dati"
#property description "del buffer indicatore per l'indicatore tecnico iAD."
#property description "Il simbolo e timeframe usati per i calcoli dell'indicatore,"
#property description "vengono impostati dai parametri simbolo e periodo."
#property description "Il metodo per la creazione dell'handle è impostato attraverso il parametro '
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- traccio iAD
#property indicator_label1 "iAD"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrLightSeaGreen
MqlParam pars[1];
pars[0].type=TYPE_INT;
pars[0].integer_value=volumes;
handle=IndicatorCreate(name,period,IND_AD,1,pars);
}
//--- se l'handle non viene creato
if(handle==INVALID_HANDLE)
{
//--- dice riguardo il fallimento e l'output del codice di errore
PrintFormat("Fallimento nel creare l'handle dell'indicatore iAD per il simbolo %s/%s, codice
name,
EnumToString(period),
GetLastError());
//--- l'indicatore si ferma precocemente
return(INIT_FAILED);
}
//--- mostra il simbolo/timeframe cui è calcolato l'indicatore Accumulation/Distribution
short_name=StringFormat("iAD(%s/%s)",name,EnumToString(period));
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inizializzazione normale dell'indicatore
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//--- numero di valori copiati dall'indicatore iAD
int values_to_copy;
//--- determina il numero di valori calcolati in dell'indicatore
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() returned %d, error code %d",calculated,GetLastError());
return(0);
}
//--- se è il primo inizio del calcolo dell'indicatore o se il numero di valori dell'indicatore iAD
//--- o se è necessario calcolare l'indicatore per due o più barre (significa che qualcosa è cambia
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se l' array iADBuffer è maggiore del numero di valori dell'indicatore iAD per il simbol
//--- altrimenti, copiamo meno della grandezza del buffer indicatore
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- vuol dire che non è la prima volta del calcolo dell'indicatore, e dopo l'ultima chiamat
//--- per il calcolo non viene aggiunta più di una barra
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- riempie l'array iADBuffer con valori dell'indicatore Accumulation/Distribution
//--- se FillArraysFromBuffer restituisce false, significa che l'informazione non è ancora pronta,
if(!FillArrayFromBuffer(iADBuffer,handle,values_to_copy)) return(0);
//--- forma il messaggio
string comm=StringFormat("%s ==> Valore aggiornato nell'indicatore %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- visualizza il messaggio di servizio sul grafico
Comment(comm);
//--- memorizzare il numero di valori nell' indicatore Accumulation/Distribution
bars_calculated=calculated;
//--- restituisce il valore prev_calculated per la chiamata successiva
return(rates_total);
}
//+--------------------------------------------------------------------------------+
//| Riempie il buffer indicatore dall'indicatore iAD |
//+--------------------------------------------------------------------------------+
bool FillArrayFromBuffer(double &values[], // buffer indicatore della linea Accumulation/Distribu
int ind_handle, // handle dell'indicatore iAD
int amount // numero di valori copiati
)
{
//--- resetta codice errore
ResetLastError();
//--- riempie una parte di iADBuffer con valori dal buffer indicatore che ha indice 0
if(CopyBuffer(ind_handle,0,0,amount,values)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iAD, codice errore %d",GetLastErro
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- tutto è ok
return(true);
}
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione indicatore |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- cancella il grafico dopo aver eliminato l'indicatore
Comment("");
}
iADX
La funzione restituisce l'handle dell'indicatore Average Directional Movement Index .
int iADX(
string symbol, // nome simbolo
ENUM_TIMEFRAMES period, // periodo
int adx_period // periodo medio
);
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori ENUM _TIMEFRAMES , 0 significa il corrente
timefreame.
adx_period
[ in] Periodo per calcolare l'indice.
Valore restituito
R estituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è pi ù
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Nota
I numeri buffer sono i seguenti: 0 - M AIN_L INE, 1 - PL US DI_L INE, 2 - M INUS DI_L INE.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_iADX.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "L'indicatore dimostra come ottenere i dati"
#property description "del buffer indicatore per l'indicatore tecnico iADX.
#property description "Il simbolo e timeframe usati per i calcoli dell'indicatore,"
#property description "vengono impostati dai parametri simbolo e periodo."
#property description "Il metodo per la creazione dell'handle è impostato attraverso il parametro '
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_plots 3
SetIndexBuffer(0,ADXBuffer,INDICATOR_DATA);
SetIndexBuffer(1,DI_plusBuffer,INDICATOR_DATA);
SetIndexBuffer(2,DI_minusBuffer,INDICATOR_DATA);
//--- determinare il simbolo per cui viene disegnato l'indicatore
name=symbol;
//--- eliminare gli spazi a destra e a sinistra
StringTrimRight(name);
StringTrimLeft(name);
//--- se il risultato è zero nella lunghezza della stringa 'name'
if(StringLen(name)==0)
{
//--- prende il simbolo del grafico indicatore a cui è attaccato
name=_Symbol;
}
//--- crea l'handle dell'indicatore
if(type==Call_iADX)
handle=iADX(name,period,adx_period);
else
{
//--- riempie la struttura con i parametri dell'indicatore
MqlParam pars[1];
pars[0].type=TYPE_INT;
pars[0].integer_value=adx_period;
handle=IndicatorCreate(name,period,IND_ADX,1,pars);
}
//--- se l'handle non viene creato
if(handle==INVALID_HANDLE)
{
//--- dice riguardo il fallimento e l'output del codice di errore
PrintFormat("Fallimento nel creare l'handle dell'indicatore iADX per il simbolo %s/%s, codice
name,
EnumToString(period),
GetLastError());
//--- l'indicatore si ferma precocemente
return(INIT_FAILED);
}
//--- mostra il simbolo/timeframe per cui è calcolato l'indicatore tecnico Average Directional Move
short_name=StringFormat("iADX(%s/%s period=%d)",name,EnumToString(period),adx_period);
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inizializzazione normale dell'indicatore
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
//--- riempie una parte dell'array DI_plusBuffer con valori dal buffer indicatore che ha indice 1
if(CopyBuffer(ind_handle,1,0,amount,DIplus_values)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iADX, codice errore %d",GetLastErr
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- riempie una parte dell'array DI_plusBuffer con valori dal buffer indicatore che ha indice 2
if(CopyBuffer(ind_handle,2,0,amount,DIminus_values)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iADX, codice errore %d",GetLastErr
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- tutto è ok
return(true);
}
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione indicatore |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- cancella il grafico dopo aver eliminato l'indicatore
Comment("");
}
iADXW ilder
La funzione restituisce l'handle di Index Average Directional Movement di W elles W ilder.
int iADXWilder(
string symbol, // nome simbolo
ENUM_TIMEFRAMES period, // periodo
int adx_period // periodo medio
);
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori ENUM _TIMEFRAMES , 0 significa il corrente
timefreame.
adx_period
[ in] Periodo per calcolare l'indice.
Valore restituito
R estituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è pi ù
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Nota
I numeri buffer sono i seguenti: 0 - M AIN_L INE, 1 - PL US DI_L INE, 2 - M INUS DI_L INE.
Esempio:
//+--------------------------------------------------------------------------------+
//| iADXWilder.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "L'indicatore dimostra come ottenere i dati"
#property description "del buffer indicatore per l'indicatore tecnico iADXWilder.
#property description "Il simbolo e timeframe usati per i calcoli dell'indicatore,"
#property description "vengono impostati dai parametri simbolo e periodo."
#property description "Il metodo per la creazione dell'handle è impostato attraverso il parametro '
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_plots 3
SetIndexBuffer(0,ADXBuffer,INDICATOR_DATA);
SetIndexBuffer(1,DI_plusBuffer,INDICATOR_DATA);
SetIndexBuffer(2,DI_minusBuffer,INDICATOR_DATA);
//--- determinare il simbolo per cui viene disegnato l'indicatore
name=symbol;
//--- eliminare gli spazi a destra e a sinistra
StringTrimRight(name);
StringTrimLeft(name);
//--- se il risultato è zero nella lunghezza della stringa 'name'
if(StringLen(name)==0)
{
//--- prende il simbolo del grafico indicatore a cui è attaccato
name=_Symbol;
}
//--- crea l'handle dell'indicatore
if(type==Call_iADXWilder)
handle=iADXWilder(name,period,adx_period);
else
{
//--- riempie la struttura con i parametri dell'indicatore
MqlParam pars[1];
pars[0].type=TYPE_INT;
pars[0].integer_value=adx_period;
handle=IndicatorCreate(name,period,IND_ADXW,1,pars);
}
//--- se l'handle non viene creato
if(handle==INVALID_HANDLE)
{
//--- dice riguardo il fallimento e l'output del codice di errore
PrintFormat("Fallimento nel creare l'handle dell'indicatore iADXWilder per il simbolo %s/%s,
name,
EnumToString(period),
GetLastError());
//--- l'indicatore si ferma precocemente
return(INIT_FAILED);
}
//--- mostra il simbolo/timeframe per cui è calcolato l'indicatore tecnico Average Directional Move
short_name=StringFormat("iADXWilder(%s/%s period=%d)",name,EnumToString(period),adx_period);
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inizializzazione normale dell'indicatore
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
//--- riempie una parte dell'array DI_plusBuffer con valori dal buffer indicatore che ha indice 1
if(CopyBuffer(ind_handle,1,0,amount,DIplus_values)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iADXWilder, codice errore %d",GetL
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- riempie una parte dell'array DI_plusBuffer con valori dal buffer indicatore che ha indice 2
if(CopyBuffer(ind_handle,2,0,amount,DIminus_values)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iADXWilder, codice errore %d",GetL
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- tutto è ok
return(true);
}
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione indicatore |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- cancella il grafico dopo aver eliminato l'indicatore
Comment("");
}
iAlligator
La funzione restituisce l'handle dell'indicatore Alligator.
int iAlligator(
string symbol, // nome del simbolo
ENUM_TIMEFRAMES period, // periodo
int jaw_period, // periodo per il calcolo di jaws
int jaw_shift, // slittamento orizzontale di jaws(_*mascella)
int teeth_period, // periodo per il calcolo di teeth
int teeth_shift, // slittamento orizzontale di teeth(_*denti)
int lips_period, // periodo per il calcolo di lips
int lips_shift, // slittamento orizzontale di lips(_* labbra)
ENUM_MA_METHOD ma_method, // tipo di smussamento
ENUM_APPLIED_PRICE applied_price // tipo di prezzo o handle
);
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori ENUM _TIMEFRAMES , 0 significa il corrente
timefreame.
jaw_period
[ in] Periodo medio per la linea blu (Alligator's Jaw, _* mascella dell'Alligatore)
jaw_shift
[ in] Lo shift per la linea blu relativa al grafico dei prezzi.
teeth_period
[ in] Periodo medio per la linea rossa (Alligator's T eeth, _* denti dell'alligatore).
teeth_shift
[ in] T he shift of the red line relative to the price chart.
lips_period
[ in] Periodo medio per la linea verde (labbra dell'Alligatore, _*A lligator's lips).
lips_shift
[ in] Lo slittamento della linea verde rispetto al grafico dei prezzi.
ma_method
[ in] Il metodo di calcolo della media. Può essere uno qualsiasi dei valori ENUM _M A_METH OD.
applied_price
[in] Il prezzo utilizzato. Può essere una qualsiasi delle costanti ENUM _APPL IED_PRICE o un handle
di un altro indicatore.
Valore restituito
R estituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è pi ù
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Nota
I numeri del buffer sono i seguenti: 0 - GAT OR JAW _L INE, 1 - GAT ORT EETH_L INE, 2 -
GAT OR L IPS _L INE.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_iAlligator.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "L'indicatore dimostra come ottenere i dati"
#property description "dei buffers indicatore per l'indicatore tecnico iAlligator."
#property description "Il simbolo e timeframe usati per i calcoli dell'indicatore,"
#property description "vengono impostati dai parametri simbolo e periodo."
#property description "Il metodo per la creazione dell'handle è impostato attraverso il parametro '
#property description "Tutti gli altri parametri sono simili all' Alligator standard."
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots 3
//--- traccio Jaws
#property indicator_label1 "Jaws"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- traccio Teeth
#property indicator_label2 "Teeth"
#property indicator_type2 DRAW_LINE
#property indicator_color2 clrRed
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//--- traccio Lips
#property indicator_label3 "Lips"
#property indicator_type3 DRAW_LINE
#property indicator_color3 clrLime
#property indicator_style3 STYLE_SOLID
#property indicator_width3 1
//+--------------------------------------------------------------------------------+
jaw_period,jaw_shift,teeth_period,teeth_shift,lips_period,lips_shift);
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inizializzazione normale dell'indicatore
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//--- numero di valori copiati dall' indicatore iAlligator
int values_to_copy;
//--- determina il numero di valori calcolati in dell'indicatore
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() returned %d, error code %d",calculated,GetLastError());
return(0);
}
//--- se è il primo inizio del calcolo dell'indicatore o se il numero di valori dell'indicatore iAl
//--- o se è necessario calcolare l'indicatore per due o più barre (significa che qualcosa è cambia
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se l' array JawsBuffer è maggiore del numero di valori dell'indicatore iAlligator per i
//--- altrimenti, copiamo meno della grandezza del buffer indicatore
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- vuol dire che non è la prima volta del calcolo dell'indicatore, e dopo l'ultima chiamat
//--- per il calcolo non viene aggiunta più di una barra
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- riempie gli array con valori dell'indicatore Alligator
//--- se FillArraysFromBuffer restituisce false, significa che l'informazione non è ancora pronta,
if(!FillArraysFromBuffers(JawsBuffer,jaw_shift,TeethBuffer,teeth_shift,LipsBuffer,lips_shift,han
//--- forma il messaggio
string comm=StringFormat("%s ==> Valore aggiornato nell'indicatore %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- visualizza il messaggio di servizio sul grafico
Comment(comm);
//--- memorizza il numero dei valori nell'indicatore Alligator
bars_calculated=calculated;
//--- restituisce il valore prev_calculated per la chiamata successiva
return(rates_total);
}
//+--------------------------------------------------------------------------------+
//| Riempie i buffer dell' indicatore dall'indicatore iAlligator |
//+--------------------------------------------------------------------------------+
bool FillArraysFromBuffers(double &jaws_buffer[], // buffer indicatore per la linea Jaw
int j_shift, // slittamento per la linea Jaw
double &teeth_buffer[], // buffer per la linea Teeth
int t_shift, // slittamento per la linea di Teeth
double &lips_buffer[], // buffer indicatore per la linea Lips
int l_shift, // slittamento per la linea di Lips
int ind_handle, // handle dell'indicatore iAlligator
int amount // numero di valori copiati
)
{
//--- resetta codice errore
ResetLastError();
//--- riempie una parte dell'array JawsBuffer con valori dal buffer indicatore che ha indice 0
if(CopyBuffer(ind_handle,0,-j_shift,amount,jaws_buffer)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iAlligator, codice errore %d",GetL
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- riempie una parte dell'array TeethBuffer con valori dal buffer indicatore che ha indice 1
if(CopyBuffer(ind_handle,1,-t_shift,amount,teeth_buffer)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iAlligator, codice errore %d",GetL
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- riempie una parte dell'array LipsBuffer con valori dal buffer indicatore che ha indice 1
if(CopyBuffer(ind_handle,2,-l_shift,amount,lips_buffer)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iAlligator, codice errore %d",GetL
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- tutto è ok
return(true);
}
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione indicatore |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- cancella il grafico dopo aver eliminato l'indicatore
Comment("");
}
iAMA
La funzione restituisce l'handle dell'indicatore Adaptive Moving Average. H a un solo buffer.
int iAMA(
string symbol, // nome simbolo
ENUM_TIMEFRAMES period, // periodo
int ama_period, // periodo medio per AMA
int fast_ma_period, // periodo veloce MA
int slow_ma_period, // periodo lento MA
int ama_shift, // slittamento orizzontale dell'indicatore
ENUM_APPLIED_PRICE applied_price // tipo di prezzo o handle
);
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori ENUM _TIMEFRAMES , 0 significa il corrente
timefreame.
ama_period
[ in] Il periodo di calcolo, in cui il coefficiente di efficienza viene calcolato.
fast_ma_period
[ in] Il periodo veloce per il calcolo coefficiente di smussamento per un mercato rapido.
slow_ma_period
[ in] Il periodo lento per il calcolo coefficiente di smussamento per un mercato rapido.
ama_shift
[ in] S littamento dell'indicatore rispetto al grafico dei prezzi.
applied_price
[in] Il prezzo utilizzato. Può essere una qualsiasi delle costanti ENUM _APPL IED_PRICE o un handle
di un altro indicatore.
Valore restituito
Restituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è più
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_iAMA.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//--- traccio iAMA
#property indicator_label1 "iAMA"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//+--------------------------------------------------------------------------------+
//| Enumerazione dei metodi della creazione dell'handle |
//+--------------------------------------------------------------------------------+
enum Creation
{
Call_iAMA, // uso iAMA
Call_IndicatorCreate // usa IndicatorCreate
};
//--- parametri di input
input Creation type=Call_iAMA; // tipo di funzione
input string symbol=" "; // simbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
input int ama_period=15; // periodo per il calcolo
input int fast_ma_period=2; // periodo di MA veloce
input int slow_ma_period=30; // periodo di MA lento
input int ama_shift=0; // slittamento orizzontale
input ENUM_APPLIED_PRICE applied_price; // tipo di prezzo
//--- buffer indicatore
double iAMABuffer[];
//--- variabile per memorizzare l'handle dell'indicatore iAMA
int handle;
//--- variabile per memorizzare
string name=symbol;
//--- nome dell'indicatore sul grafico
string short_name;
//--- manterremo il numero di valori nell' indicatore Adaptive Moving Average
int bars_calculated=0;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- mappatura buffers indicatore
SetIndexBuffer(0,iAMABuffer,INDICATOR_DATA);
//--- imposta lo slittamento
PlotIndexSetInteger(0,PLOT_SHIFT,ama_shift);
//--- determinare il simbolo per cui viene disegnato l'indicatore
name=symbol;
//--- eliminare gli spazi a destra e a sinistra
StringTrimRight(name);
StringTrimLeft(name);
//--- se il risultato è zero nella lunghezza della stringa 'name'
if(StringLen(name)==0)
{
//--- prende il simbolo del grafico indicatore a cui è attaccato
name=_Symbol;
}
//--- crea l'handle dell'indicatore
if(type==Call_iAMA)
handle=iAMA(name,period,ama_period,fast_ma_period,slow_ma_period,ama_shift,applied_price);
else
{
//--- riempie la struttura con i parametri dell'indicatore
MqlParam pars[5];
pars[0].type=TYPE_INT;
pars[0].integer_value=ama_period;
pars[1].type=TYPE_INT;
pars[1].integer_value=fast_ma_period;
pars[2].type=TYPE_INT;
pars[2].integer_value=slow_ma_period;
pars[3].type=TYPE_INT;
pars[3].integer_value=ama_shift;
//--- tipo di prezzo
pars[4].type=TYPE_INT;
pars[4].integer_value=applied_price;
handle=IndicatorCreate(name,period,IND_AMA,5,pars);
}
//--- se l'handle non viene creato
if(handle==INVALID_HANDLE)
{
//--- dice riguardo il fallimento e l'output del codice di errore
PrintFormat("Fallimento nel creare l'handle dell'indicatore iAMA per il simbolo %s/%s, codice
name,
EnumToString(period),
GetLastError());
//--- l'indicatore si ferma precocemente
return(INIT_FAILED);
}
//--- Mostra il simbolo/timeframe per cui è calcolato l'indicatore Adaptive Moving Average
short_name=StringFormat("iAMA(%s/%s,%d,%d,%d,d)",name,EnumToString(period),ama_period,fast_ma_pe
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inizializzazione normale dell'indicatore
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//--- numero di valori copiati dall' indicatore iAMA
int values_to_copy;
//--- determina il numero di valori calcolati in dell'indicatore
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() returned %d, error code %d",calculated,GetLastError());
return(0);
}
//--- se è il primo inizio del calcolo dell'indicatore o se il numero di valori dell'indicatore iAM
//--- o se è necessario calcolare l'indicatore per due o più barre (significa che qualcosa è cambia
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se l' array iAMABuffer è maggiore del numero di valori dell'indicatore iAMA per il simb
//--- altrimenti, copiamo meno della grandezza del buffer indicatore
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- vuol dire che non è la prima volta del calcolo dell'indicatore, e dopo l'ultima chiamat
//--- per il calcolo non viene aggiunta più di una barra
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- riempie gli array con valori dell'indicatore Adaptive Moving Average
//--- se FillArraysFromBuffer restituisce false, significa che l'informazione non è ancora pronta,
if(!FillArrayFromBuffer(iAMABuffer,ama_shift,handle,values_to_copy)) return(0);
//--- forma il messaggio
string comm=StringFormat("%s ==> Valore aggiornato nell'indicatore %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- visualizza il messaggio di servizio sul grafico
Comment(comm);
//--- memorizza il numero di valori nell'indicatore Adaptive Moving Average
bars_calculated=calculated;
//--- restituisce il valore prev_calculated per la chiamata successiva
return(rates_total);
}
//+--------------------------------------------------------------------------------+
//| Riempie il buffer indicatore dall'indicatore iAMA |
//+--------------------------------------------------------------------------------+
bool FillArrayFromBuffer(double &ama_buffer[], // buffer indicatore per la linea di AMA
int a_shift, // slittamento per la linea di AMA
int ind_handle, // handle per la linea dell'indicatore iAMA
int amount // numero di valori copiati
)
{
//--- resetta codice errore
ResetLastError();
//--- riempie una parte dell'array iAMABuffer con valori dal buffer indicatore che ha indice 0
if(CopyBuffer(ind_handle,0,-a_shift,amount,ama_buffer)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iAMA, codice errore %d",GetLastErr
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- tutto è ok
return(true);
}
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione indicatore |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- cancella il grafico dopo aver eliminato l'indicatore
Comment("");
}
iAO
La funzione restituisce l'handle dell'indicatore Awesome oscillator. H a un solo buffer.
int iAO(
string symbol, // nome simbolo
ENUM_TIMEFRAMES period // periodo
);
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori ENUM _TIMEFRAMES , 0 significa il corrente
timefreame.
Valore restituito
Restituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è più
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_iAO.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "L'indicatore dimostra come ottenere i dati"
#property description "dei buffers indicatore per l'indicatore tecnico iAO."
#property description "Il simbolo e timeframe usati per i calcoli dell'indicatore,"
#property description "vengono impostati dai parametri simbolo e periodo."
#property description "Il metodo per la creazione dell'handle è impostato attraverso il parametro '
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots 1
//--- il tracciamento di iAO
#property indicator_label1 "iAO"
#property indicator_type1 DRAW_COLOR_HISTOGRAM
#property indicator_color1 clrGreen,clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//+--------------------------------------------------------------------------------+
iATR
La funzione restituisce l'handle della indicatore Average T rue R ange. H a un solo buffer.
int iATR(
string symbol, // nome simbolo
ENUM_TIMEFRAMES period, // periodo
int ma_period // periodo medio
);
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori ENUM _TIMEFRAMES , 0 significa il corrente
timefreame.
ma_period
[ in] Il valore del periodo medio per il calcolo dell'indicatore.
Valore restituito
R estituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è pi ù
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_iATR.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "L'indicatore dimostra come ottenere i dati"
#property description "dei buffers indicatore per l'indicatore tecnico iATR."
#property description "Il simbolo e timeframe usati per i calcoli dell'indicatore,"
#property description "vengono impostati dai parametri simbolo e periodo."
#property description "Il metodo per la creazione dell'handle è impostato attraverso il parametro '
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- traccio iATR
#property indicator_label1 "iATR"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrLightSeaGreen
MqlParam pars[1];
pars[0].type=TYPE_INT;
pars[0].integer_value=atr_period;
handle=IndicatorCreate(name,period,IND_ATR,1,pars);
}
//--- se l'handle non viene creato
if(handle==INVALID_HANDLE)
{
//--- dice riguardo il fallimento e l'output del codice di errore
PrintFormat("Fallimento nel creare l'handle dell'indicatore iATR per il simbolo %s/%s, codice
name,
EnumToString(period),
GetLastError());
//--- l'indicatore si ferma precocemente
return(INIT_FAILED);
}
//--- mostra il simbolo/timeframe per cui è calcolato l'indicatore tecnico Average True Range
short_name=StringFormat("iATR(%s/%s, period=%d)",name,EnumToString(period),atr_period);
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inizializzazione normale dell'indicatore
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//--- numero di valori copiati dall' indicatore iATR
int values_to_copy;
//--- determina il numero di valori calcolati in dell'indicatore
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() returned %d, error code %d",calculated,GetLastError());
return(0);
}
//--- se è il primo inizio del calcolo dell'indicatore o se il numero di valori dell'indicatore iAT
//--- o se è necessario calcolare l'indicatore per due o più barre (significa che qualcosa è cambia
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se l' array iATRBuffer è maggiore del numero di valori dell'indicatore iATR per il simb
//--- altrimenti, copiamo meno della grandezza del buffer indicatore
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- vuol dire che non è la prima volta del calcolo dell'indicatore, e dopo l'ultima chiamat
//--- per il calcolo non viene aggiunta più di una barra
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- riempie l'array con i valori dell'indicatore Average True Range
//--- se FillArrayFromBuffer restituisce false, significa che l'informazione non è ancora pronta, c
if(!FillArrayFromBuffer(iATRBuffer,handle,values_to_copy)) return(0);
//--- forma il messaggio
string comm=StringFormat("%s ==> Valore aggiornato nell'indicatore %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- visualizza il messaggio di servizio sul grafico
Comment(comm);
//--- memorizzare il numero di valori dell'indicatore Oscillator Accelerator
bars_calculated=calculated;
//--- restituisce il valore prev_calculated per la chiamata successiva
return(rates_total);
}
//+--------------------------------------------------------------------------------+
//| Riempie il buffer indicatore dall'indicatore iATR |
//+--------------------------------------------------------------------------------+
bool FillArrayFromBuffer(double &values[], // buffer indicatore dei valori di ATR
int ind_handle, // handle dell'indicatore iATR
int amount // numero di valori copiati
)
{
//--- resetta codice errore
ResetLastError();
//--- riempie una parte dell'array iATRBuffer con valori dal buffer indicatore che ha indice 0
if(CopyBuffer(ind_handle,0,0,amount,values)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iATR, codice errore %d",GetLastErr
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- tutto è ok
return(true);
}
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione indicatore |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- cancella il grafico dopo aver eliminato l'indicatore
Comment("");
}
iBearsPower
La funzione restituisce l'handle dell'indicatore Bears Power. H a un solo buffer.
int iBearsPower(
string symbol, // nome del simbolo
ENUM_TIMEFRAMES period, // periodo
int ma_period, // periodo medio
);
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori ENUM _TIMEFRAMES , 0 significa il corrente
timefreame.
ma_period
[ in] Il valore del periodo medio per il calcolo dell'indicatore.
Valore restituito
R estituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è pi ù
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_iBearsPower.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "L'indicatore dimostra come ottenere i dati"
#property description "dei buffers indicatore per l'indicatore tecnico iBearsPower."
#property description "Il simbolo e timeframe usati per i calcoli dell'indicatore,"
#property description "vengono impostati dai parametri simbolo e periodo."
#property description "Il metodo per la creazione dell'handle è impostato attraverso il parametro '
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- il tracciamento di iBearsPower
#property indicator_label1 "iBearsPower"
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_color1 clrSilver
MqlParam pars[1];
//--- period of ma
pars[0].type=TYPE_INT;
pars[0].integer_value=ma_period;
handle=IndicatorCreate(name,period,IND_BEARS,1,pars);
}
//--- se l'handle non viene creato
if(handle==INVALID_HANDLE)
{
//--- dice riguardo il fallimento e l'output del codice di errore
PrintFormat("Fallimento nel creare l'handle dell'indicatore iBearsPower per il simbolo %s/%s,
name,
EnumToString(period),
GetLastError());
//--- l'indicatore si ferma precocemente
return(INIT_FAILED);
}
//--- Mostra il simbolo/timeframe per cui è calcolato l'indicatore Bears Power
short_name=StringFormat("iBearsPower(%s/%s, period=%d)",name,EnumToString(period),ma_period);
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inizializzazione normale dell'indicatore
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//--- numero di valori copiati dall' indicatore iBearsPower
int values_to_copy;
//--- determina il numero di valori calcolati in dell'indicatore
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() returned %d, error code %d",calculated,GetLastError());
return(0);
}
//--- se è il primo inizio del calcolo dell'indicatore o se il numero di valori dell'indicatore iBe
//--- o se è necessario calcolare l'indicatore per due o più barre (significa che qualcosa è cambia
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se l' array iBearsPowerBuffer è maggiore del numero di valori dell'indicatore iBearsPow
//--- altrimenti, copiamo meno della grandezza del buffer indicatore
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- vuol dire che non è la prima volta del calcolo dell'indicatore, e dopo l'ultima chiamat
//--- per il calcolo non viene aggiunta più di una barra
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- riempie gli array iBearsPowerBuffer con valori dell'indicatore Bears Power
//--- se FillArrayFromBuffer restituisce false, significa che l'informazione non è ancora pronta, c
if(!FillArrayFromBuffer(iBearsPowerBuffer,handle,values_to_copy)) return(0);
//--- forma il messaggio
string comm=StringFormat("%s ==> Valore aggiornato nell'indicatore %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- visualizza il messaggio di servizio sul grafico
Comment(comm);
//--- memorizzare il numero di valori dell'indicatore Bears Power
bars_calculated=calculated;
//--- restituisce il valore prev_calculated per la chiamata successiva
return(rates_total);
}
//+--------------------------------------------------------------------------------+
//| Riempie il buffer indicatore dall'indicatore iBearsPower |
//+--------------------------------------------------------------------------------+
bool FillArrayFromBuffer(double &values[], // buffer indicatore dei valori di Bears Power
int ind_handle, // handle dell'indicatore iBearsPower
int amount // numero di valori copiati
)
{
//--- resetta codice errore
ResetLastError();
//--- riempie una parte dell'array iBearsPowerBuffer con valori dal buffer indicatore che ha indice
if(CopyBuffer(ind_handle,0,0,amount,values)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iBearsPower, codice errore %d",Get
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- tutto è ok
return(true);
}
//+--------------------------------------------------------------------------------+
iBands
La funzione restituisce l'handle dell'indicatore Bollinger Bands ®.
int iBands(
string symbol, // nome del simbolo
ENUM_TIMEFRAMES period, // periodo
int bands_period, // periodo per il calcolo medio della linea
int bands_shift, // slittamento orizzontale dell'indicatore
double deviation, // numero di deviazioni standard
ENUM_APPLIED_PRICE applied_price // tipo di prezzo o handle
);
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori ENUM _TIMEFRAMES , 0 significa il corrente
timefreame.
bands_period
[ in] Il periodo medio della linea principale dell'indicatore.
bands_shift
[ in] Lo slittamento dell'indicatore relativo al grafico dei prezzi.
deviazione
[ in] Deviazione dalla linea principale.
applied_price
[in] Il prezzo utilizzato. Può essere una qualsiasi delle costanti ENUM _APPL IED_PRICE o un handle
di un altro indicatore.
Valore restituito
Restituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è più
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Nota
I numeri del buffer sono i seguenti: 0 - BAS E_L INE, 1 - UPPER_BAND, 2 - LOW ER_BAND
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_iBands.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots 3
//--- il tracciamento di Upper
#property indicator_label1 "Upper"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrMediumSeaGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- il tracciamento Lower
#property indicator_label2 "Lower"
#property indicator_type2 DRAW_LINE
#property indicator_color2 clrMediumSeaGreen
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//--- il tracciamento Middle
#property indicator_label3 "Middle"
#property indicator_type3 DRAW_LINE
#property indicator_color3 clrMediumSeaGreen
#property indicator_style3 STYLE_SOLID
#property indicator_width3 1
//+--------------------------------------------------------------------------------+
//| Enumerazione dei metodi della creazione dell'handle |
//+--------------------------------------------------------------------------------+
enum Creation
{
Call_iBands, // uso iBands
Call_IndicatorCreate // usa IndicatorCreate
};
//--- parametri di input
input Creation type=Call_iBands; // tipo di funzione
input int bands_period=20; // periodo della media mobile (_*moving avera
input int bands_shift=0; // slittamento
input double deviation=2.0; // numero di deviazioni standard
input ENUM_APPLIED_PRICE applied_price=PRICE_CLOSE; // tipo di prezzo
input string symbol=" "; // simbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffers indicatore
double UpperBuffer[];
double LowerBuffer[];
double MiddleBuffer[];
//--- variabile per memorizzare l'handle dell'indicatore iBands
int handle;
//--- variabile per memorizzare
string name=symbol;
//--- nome dell'indicatore sul grafico
string short_name;
//--- manterremo il numero di valori nell'indicatore Bollinger Bands
int bars_calculated=0;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- assegnazione di array di buffer indicatori
SetIndexBuffer(0,UpperBuffer,INDICATOR_DATA);
SetIndexBuffer(1,LowerBuffer,INDICATOR_DATA);
SetIndexBuffer(2,MiddleBuffer,INDICATOR_DATA);
//--- impostiamo lo slittamento per ogni linea
PlotIndexSetInteger(0,PLOT_SHIFT,bands_shift);
PlotIndexSetInteger(1,PLOT_SHIFT,bands_shift);
PlotIndexSetInteger(2,PLOT_SHIFT,bands_shift);
//--- determinare il simbolo per cui viene disegnato l'indicatore
name=symbol;
//--- eliminare gli spazi a destra e a sinistra
StringTrimRight(name);
StringTrimLeft(name);
//--- se il risultato è zero nella lunghezza della stringa 'name'
if(StringLen(name)==0)
{
//--- prende il simbolo del grafico indicatore a cui è attaccato
name=_Symbol;
}
//--- crea l'handle dell'indicatore
if(type==Call_iBands)
handle=iBands(name,period,bands_period,bands_shift,deviation,applied_price);
else
{
//--- riempie la struttura con i parametri dell'indicatore
MqlParam pars[4];
//--- periodo di ma
pars[0].type=TYPE_INT;
pars[0].integer_value=bands_period;
//--- slittamento
pars[1].type=TYPE_INT;
pars[1].integer_value=bands_shift;
//--- numero di deviazione standard
pars[2].type=TYPE_DOUBLE;
pars[2].double_value=deviation;
{
//--- se la grandezza dei buffer indicatore è maggiore del numero di valori dell'indicatore i
//--- altrimenti, copiamo meno della grandezza del buffer indicatore
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- vuol dire che non è la prima volta del calcolo dell'indicatore, e dopo l'ultima chiamat
//--- per il calcolo non viene aggiunta più di una barra
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- riempie gli array con valori dell'indicatore Bollinger Bands
//--- se FillArraysFromBuffer restituisce false, significa che l'informazione non è ancora pronta,
if(!FillArraysFromBuffers(MiddleBuffer,UpperBuffer,LowerBuffer,bands_shift,handle,values_to_copy
//--- forma il messaggio
string comm=StringFormat("%s ==> Valore aggiornato nell'indicatore %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- visualizza il messaggio di servizio sul grafico
Comment(comm);
//--- memorizzare il numero di valori dell'indicatore Bollinger Bands
bars_calculated=calculated;
//--- restituisce il valore prev_calculated per la chiamata successiva
return(rates_total);
}
//+--------------------------------------------------------------------------------+
//| Riempie il buffer indicatore dall'indicatore iBands |
//+--------------------------------------------------------------------------------+
bool FillArraysFromBuffers(double &base_values[], // buffer indicatore della linea media di Bol
double &upper_values[], // buffer indicatore del bordo superiore
double &lower_values[], // buffer indicatore del bordo inferiore
int shift, // slittamento
int ind_handle, // handle dell'indicatore iBands
int amount // numero di valori copiati
)
{
//--- resetta codice errore
ResetLastError();
//--- riempie una parte dell'array MiddleBuffer con valori dal buffer indicatore che ha indice 0
if(CopyBuffer(ind_handle,0,-shift,amount,base_values)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iBands, codice errore %d",GetLastE
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- riempie una parte dell'array UpperBuffer con valori dal buffer indicatore che ha indice 1
if(CopyBuffer(ind_handle,1,-shift,amount,upper_values)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iBands, codice errore %d",GetLastE
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- riempie una parte dell'array LowerBuffer con valori dal buffer indicatore che ha indice 1
if(CopyBuffer(ind_handle,2,-shift,amount,lower_values)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iBands, codice errore %d",GetLastE
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- tutto è ok
return(true);
}
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione indicatore |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- cancella il grafico dopo aver eliminato l'indicatore
Comment("");
}
iBullsPower
La funzione restituisce l'handle dell' indicatore Bulls Power. H a un solo buffer.
int iBullsPower(
string symbol, // nome del simbolo
ENUM_TIMEFRAMES period, // periodo
int ma_period, // periodo medio
);
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori ENUM _TIMEFRAMES , 0 significa il corrente
timefreame.
ma_period
[ in] Il periodo medio per il calcolo dell'indicatore.
Valore restituito
R estituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è pi ù
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_iBullsPower.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "L'indicatore dimostra come ottenere i dati"
#property description "dei buffers indicatore per l'indicatore tecnico iBullsPower."
#property description "Il simbolo e timeframe usati per i calcoli dell'indicatore,"
#property description "vengono impostati dai parametri simbolo e periodo."
#property description "Il metodo per la creazione dell'handle è impostato attraverso il parametro '
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- il tracciamento di iBullsPower
#property indicator_label1 "iBullsPower"
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_color1 clrSilver
MqlParam pars[1];
//--- periodo di ma
pars[0].type=TYPE_INT;
pars[0].integer_value=ma_period;
handle=IndicatorCreate(name,period,IND_BULLS,1,pars);
}
//--- se l'handle non viene creato
if(handle==INVALID_HANDLE)
{
//--- dice riguardo il fallimento e l'output del codice di errore
PrintFormat("Fallimento nel creare l'handle dell'indicatore iBullsPower per il simbolo %s/%s,
name,
EnumToString(period),
GetLastError());
//--- l'indicatore si ferma precocemente
return(INIT_FAILED);
}
//--- Mostra il simbolo/timeframe per cui è calcolato l'indicatore Bulls Power
short_name=StringFormat("iBearsPower(%s/%s, period=%d)",name,EnumToString(period),ma_period);
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inizializzazione normale dell'indicatore
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//--- numero di valori copiati dall' indicatore iBullsPower
int values_to_copy;
//--- determina il numero di valori calcolati in dell'indicatore
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() returned %d, error code %d",calculated,GetLastError());
return(0);
}
//--- se è il primo inizio del calcolo dell'indicatore o se il numero di valori dell'indicatore iBu
//--- o se è necessario calcolare l'indicatore per due o più barre (significa che qualcosa è cambia
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se l' array iBullsPowerBuffer è maggiore del numero di valori dell'indicatore iBullsPow
//--- altrimenti, copiamo meno della grandezza del buffer indicatore
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- vuol dire che non è la prima volta del calcolo dell'indicatore, e dopo l'ultima chiamat
//--- per il calcolo non viene aggiunta più di una barra
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- riempie gli array iBullsPowerBuffer con valori dell'indicatore Bulls Power
//--- se FillArrayFromBuffer restituisce false, significa che l'informazione non è ancora pronta, c
if(!FillArrayFromBuffer(iBullsPowerBuffer,handle,values_to_copy)) return(0);
//--- forma il messaggio
string comm=StringFormat("%s ==> Valore aggiornato nell'indicatore %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- visualizza il messaggio di servizio sul grafico
Comment(comm);
//--- memorizzare il numero di valori dell'indicatore Bulls Power
bars_calculated=calculated;
//--- restituisce il valore prev_calculated per la chiamata successiva
return(rates_total);
}
//+--------------------------------------------------------------------------------+
//| Riempie il buffer indicatore dall'indicatore iBullsPower |
//+--------------------------------------------------------------------------------+
bool FillArrayFromBuffer(double &values[], // buffer indicatore dei valori di Bulls Power
int ind_handle, // handle dell'indicatore iBullsPower
int amount // numero di valori copiati
)
{
//--- resetta codice errore
ResetLastError();
//--- riempie una parte dell'array iBullsPowerBuffer con valori dal buffer indicatore che ha indice
if(CopyBuffer(ind_handle,0,0,amount,values)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iBullsPowerBuffer, codice errore %
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- tutto è ok
return(true);
}
//+--------------------------------------------------------------------------------+
iCCI
La funzione restituisce l'handle dell'indicatore Commodity Index Channel. H a un solo buffer.
int iCCI(
string symbol, // nome del simbolo
ENUM_TIMEFRAMES period, // periodo
int ma_period, // periodo medio
ENUM_APPLIED_PRICE applied_price // tipo di prezzo o handle
);
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori ENUM _TIMEFRAMES , 0 significa il corrente
timefreame.
ma_period
[ in] Il periodo medio per il calcolo dell'indicatore.
applied_price
[in] Il prezzo utilizzato. Può essere una qualsiasi delle costanti ENUM _APPL IED_PRICE o un handle
di un altro indicatore.
Valore restituito
Restituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è più
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_iCCI.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "L'indicatore dimostra come ottenere i dati"
#property description "dei buffers indicatore per l'indicatore tecnico iCCI."
#property description "Il simbolo e timeframe usati per i calcoli dell'indicatore,"
#property description "vengono impostati dai parametri simbolo e periodo."
#property description "Il metodo per la creazione dell'handle è impostato attraverso il parametro '
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- il tracciamento di iCCI
#property indicator_label1 "iCCI"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrLightSeaGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- livelli orizzontali nella finestra dell'indicatore
#property indicator_level1 -100.0
#property indicator_level2 100.0
//+--------------------------------------------------------------------------------+
//| Enumerazione dei metodi della creazione dell'handle |
//+--------------------------------------------------------------------------------+
enum Creation
{
Call_iCCI, // usa iCCI
Call_IndicatorCreate // usa IndicatorCreate
};
//--- parametri di input
input Creation type=Call_iCCI; // tipo della funzione
input int ma_period=14; // periodo di media mobile
input ENUM_APPLIED_PRICE applied_price=PRICE_TYPICAL; // tipo di prezzo
input string symbol=" "; // simbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffer indicatore
double iCCIBuffer[];
//--- variabile per memorizzare l'handle dell'indicatore iCCI
int handle;
//--- variabile per memorizzare
string name=symbol;
//--- nome dell'indicatore sul grafico
string short_name;
//--- manterremo il numero di valori dell'indicatore Commodity Channel Index
int bars_calculated=0;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- assegnazione di array al buffer indicatore
SetIndexBuffer(0,iCCIBuffer,INDICATOR_DATA);
//--- determinare il simbolo per cui viene disegnato l'indicatore
name=symbol;
//--- eliminare gli spazi a destra e a sinistra
StringTrimRight(name);
StringTrimLeft(name);
//--- se il risultato è zero nella lunghezza della stringa 'name'
if(StringLen(name)==0)
{
{
//--- numero di valori copiati dall' indicatore iCCI
int values_to_copy;
//--- determina il numero di valori calcolati in dell'indicatore
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() returned %d, error code %d",calculated,GetLastError());
return(0);
}
//--- se è il primo inizio del calcolo dell'indicatore o se il numero di valori dell'indicatore iCC
//--- o se è necessario calcolare l'indicatore per due o più barre (significa che qualcosa è cambia
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se l' array iCCIBuffer è maggiore del numero di valori dell'indicatore iCCI per il simb
//--- altrimenti, copiamo meno della grandezza del buffer indicatore
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- vuol dire che non è la prima volta del calcolo dell'indicatore, e dopo l'ultima chiamat
//--- per il calcolo non viene aggiunta più di una barra
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- riempie l'array iCCIBuffer con i valori dell'indicatore Commodity Channel Index
//--- se FillArrayFromBuffer restituisce false, significa che l'informazione non è ancora pronta, c
if(!FillArrayFromBuffer(iCCIBuffer,handle,values_to_copy)) return(0);
//--- forma il messaggio
string comm=StringFormat("%s ==> Valore aggiornato nell'indicatore %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- visualizza il messaggio di servizio sul grafico
Comment(comm);
//--- memorizziamo il numero di valori dell'indicatore Commodity Channel Index
bars_calculated=calculated;
//--- restituisce il valore prev_calculated per la chiamata successiva
return(rates_total);
}
//+--------------------------------------------------------------------------------+
//| Riempie il buffer indicatore dall'indicatore iCCI |
//+--------------------------------------------------------------------------------+
bool FillArrayFromBuffer(double &values[], // buffer indicatore dei valori di Commodity Channel In
int ind_handle, // handle dell'indicatore iCCI
int amount // numero di valori copiati
)
{
//--- resetta codice errore
ResetLastError();
//--- riempie una parte dell'array iCCIBuffer con valori dal buffer indicatore che ha indice 0
if(CopyBuffer(ind_handle,0,0,amount,values)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iCCI, codice errore %d",GetLastErr
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- tutto è ok
return(true);
}
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione indicatore |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- cancella il grafico dopo aver eliminato l'indicatore
Comment("");
}
iChaikin
La funzione restituisce l'handle dell'indicatore Chaik in Oscillator. H a un solo buffer.
int iChaikin(
string symbol, // nome del simbolo
ENUM_TIMEFRAMES period, // periodo
int fast_ma_period, // periodo fast
int slow_ma_period, // periodo slow
ENUM_MA_METHOD ma_method, // tipo di smussamento
ENUM_APPLIED_VOLUME applied_volume // tipo di volume
);
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori ENUM _TIMEFRAMES , 0 significa il corrente
timefreame.
fast_ma_period
[ in] Periodo medio di Fast per i calcoli.
slow_ma_period
[ in] Periodo medio di S low per i calcoli.
ma_method
[ in] T ipo di smussamento. Può essere una delle costanti di media ENUM _M A_METH OD.
applied_volume
[ in] Il volume utilizzato. Può essere una delle costanti di ENUM _APPL IED_VOL UME.
Valore restituito
R estituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è pi ù
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_iChaikin.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "L'indicatore dimostra come ottenere i dati"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- the iChaikin plot
#property indicator_label1 "iChaikin"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrLightSeaGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//+--------------------------------------------------------------------------------+
//| Enumerazione dei metodi della creazione dell'handle |
//+--------------------------------------------------------------------------------+
enum Creation
{
Call_iChaikin, // uso iChaikin
Call_IndicatorCreate // usa IndicatorCreate
};
//--- parametri di input
input Creation type=Call_iChaikin; // tipo di funzione
input int fast_ma_period=3; // periodo di fast ma
input int slow_ma_period=10; // periodo di slow ma
input ENUM_MA_METHOD ma_method=MODE_EMA; // tipo di smussamento
input ENUM_APPLIED_VOLUME applied_volume=VOLUME_TICK; // tipo di volume
input string symbol=" "; // simbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffer indicatore
double iChaikinBuffer[];
//--- variabile per memorizzare l'handle dell'indicatore iChaikin
int handle;
//--- variabile per memorizzare
string name=symbol;
//--- nome dell'indicatore sul grafico
string short_name;
//--- manterremo il numero di valori dell'indicatore Chaikin Oscillator
int bars_calculated=0;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- assegnazione di array al buffer indicatore
SetIndexBuffer(0,iChaikinBuffer,INDICATOR_DATA);
//--- determinare il simbolo per cui viene disegnato l'indicatore
name=symbol;
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//--- numero di valori copiati dall' indicatore iChaikin
int values_to_copy;
//--- determina il numero di valori calcolati in dell'indicatore
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() returned %d, error code %d",calculated,GetLastError());
return(0);
}
//--- se è il primo inizio del calcolo dell'indicatore o se il numero di valori dell'indicatore iCh
//--- o se è necessario calcolare l'indicatore per due o più barre (significa che qualcosa è cambia
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se l' array iChaikinBuffer è maggiore del numero di valori dell'indicatore iChaikin per
//--- altrimenti, copiamo meno della grandezza del buffer indicatore
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- vuol dire che non è la prima volta del calcolo dell'indicatore, e dopo l'ultima chiamat
//--- per il calcolo non viene aggiunta più di una barra
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- riempie gli array iChaikinBuffer con valori dell'indicatore Chaikin Oscillator
//--- se FillArrayFromBuffer restituisce false, significa che l'informazione non è ancora pronta, c
if(!FillArrayFromBuffer(iChaikinBuffer,handle,values_to_copy)) return(0);
//--- forma il messaggio
string comm=StringFormat("%s ==> Valore aggiornato nell'indicatore %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- visualizza il messaggio di servizio sul grafico
Comment(comm);
//--- memorizza il numero di valori dell'indicatore Chaikin Oscillator
bars_calculated=calculated;
//--- restituisce il valore prev_calculated per la chiamata successiva
return(rates_total);
}
//+--------------------------------------------------------------------------------+
//| Riempie il buffer indicatore dall'indicatore iChaikin |
//+--------------------------------------------------------------------------------+
bool FillArrayFromBuffer(double &values[], // buffer indicatore dei valori di Chaikin Oscillator
int ind_handle, // handle dell'indicatore iChaikin
int amount // numero di valori copiati
)
{
//--- resetta codice errore
ResetLastError();
//--- riempie una parte dell'array iChaikinBuffer con valori dal buffer indicatore che ha indice 0
if(CopyBuffer(ind_handle,0,0,amount,values)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iChaikin, codice errore %d",GetLas
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- tutto è ok
return(true);
}
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione indicatore |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- cancella il grafico dopo aver eliminato l'indicatore
Comment("");
}
iCustom
La funzione restituisce l'handle di un indicatore personalizzato specificato.
int iCustom(
string symbol, // nome simbolo
ENUM_TIMEFRAMES period, // periodo
string name // cartella/nome_indicatore_personalizzato
... // elenco dei parametri di unput dell'indicatore
);
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori ENUM _TIMEFRAMES , 0 significa il corrente
timefreame.
name
[ in] Nome dell'indicatore personalizzato (custom indicator). S e il nome inizia con la barra inversa
'\', il file dell'indicatore EX5 viene ricercato rispetto alla directory principale dell'indicatore
MQL5\Indicators. Pertanto, quando si chiama iCustom(S imbol(), Period(), " \FirstIndicator " ...),
l'indicatore viene scaricato come MQL5\Indicators \FirstIndicator.ex 5. S e il percorso non contiene
file, si verifica l'errore 4802 (ERR_INDICAT OR_CANNOT_CR EAT E).
S e il percorso non inizia con '\', l'indicatore viene cercato e scaricato come segue:
· I nnanzitutto, il file indicatore EX5 viene cercato nella cartella in cui si trova il file EX5 del
programma chiamante. Ad esempio, CrossM A.EX5 EA si trova in MQL5\Ex perts \M yEx perts e
contiene la chiamata iCustom (S ymbol(), Period(), " S econdIndicator" ...). In questo caso,
l'indicatore viene cercato in MQL5\Ex perts \M yEx perts \S econdIndicator.ex 5.
· S e l'indicatore non viene trovato nella stessa directory, la ricerca viene eseguita in relazione alla
directory principale dell'indicatore MQL5\Indicators. In altre parole, viene eseguita la ricerca del
file MQL5\Indicators \S econdIndicator.ex 5. S e l'indicatore non viene trovato ancora, la funzione
restituisce INVAL ID_HANDLE e viene generato l'errore 4802 (ERR_INDICAT OR_CANNOT_CR EAT E).
...
[in]parametri-di-input- di un indicatore personalizzato, separati da virgole. T ipo ed ordine con cui
i parametri devono corrispondere. S e non ci sono i parametri specificati, allora verranno utilizzati
valori predefiniti.
Valore restituito
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Nota
Un indicatore personalizzato deve essere compilato (con estensione EX5) e si trova nella directory
MQL5/Indicators del terminale client o la sua sottodirectory.
Indicatori che richiedono il testing vengono definiti automaticamente dalla chiamata della funzione
iCustom(), se il parametro corrispondente è impostato attraverso la costante stringa. Per tutti gli
altri casi (utilizzo della funzione IndicatorCreate() o uso di una stringa non-costante nel parametro
che imposta il nome indicatore) la proprietà #property tester_indicator è necessaria:
#property tester_indicator "indicator_name.ex5"
S e la prima forma di chiamata viene utilizzata nell'indicatore, allora all'avvio dell' indicatore
personalizzato è possibile inoltre indicare i dati per il calcolo nella sua scheda " Parametri" . S e il
parametro " Applica a" non è selezionato in modo esplicito, il calcolo predefinito è basato sui valori
dei prezzi " Close" .
Vedi anche
Proprietà del programma, T imeS eries ed Accesso Indicatori,IndicatorCreate(), IndicatorR elease()
Esempio:
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//---- plot Label1
#property indicator_label1 "Label1"
#property indicator_type1 DRAW_LINE
iDEMA
La funzione restituisce l'handle dell'indicatore Double Ex ponential Moving Average. H a un solo buffer.
int iDEMA(
string symbol, // nome del simbolo
ENUM_TIMEFRAMES period, // periodo
int ma_period, // periodo medio
int ma_shift, // slittamento orizzontale
ENUM_APPLIED_PRICE applied_price // tipo di prezzo o handle
);
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori ENUM _TIMEFRAMES , 0 significa il corrente
timefreame.
ma_period
[ in] Periodo medio (conteggio barre) per i calcoli.
ma_shift
[ in] S littamento dell'indicatore rispetto al grafico dei prezzi.
applied_price
[in] Il prezzo utilizzato. Può essere una qualsiasi delle costanti ENUM _APPL IED_PRICE o un handle
di un altro indicatore.
Valore restituito
R estituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è pi ù
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_iDEMA.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "L'indicatore dimostra come ottenere i dati"
#property description "dei buffers indicatore per l'indicatore tecnico iDEMA."
#property description "Il simbolo e timeframe usati per i calcoli dell'indicatore,"
#property description "vengono impostati dai parametri simbolo e periodo."
#property description "Il metodo per la creazione dell'handle è impostato attraverso il parametro '
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//--- il tracciamento di iDEMA
#property indicator_label1 "iDEMA"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//+--------------------------------------------------------------------------------+
//| Enumerazione dei metodi della creazione dell'handle |
//+--------------------------------------------------------------------------------+
enum Creation
{
Call_iDEMA, // uso iDEMA
Call_IndicatorCreate // usa IndicatorCreate
};
//--- parametri di input
input Creation type=Call_iDEMA; // tipo della funzione
input int ma_period=14; // periodo della media mobile
input int ma_shift=0; // slittamento
input ENUM_APPLIED_PRICE applied_price=PRICE_CLOSE; // tipo di prezzo
input string symbol=" "; // simbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffer indicatore
double iDEMABuffer[];
//--- variabile per memorizzare l'handle dell'indicatore iDEMA
int handle;
//--- variabile per memorizzare
string name=symbol;
//--- nome dell'indicatore sul grafico
string short_name;
//--- manterremo il numero di valori nell' indicatore Double Exponential Moving Average
int bars_calculated=0;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- assegnazione di array al buffer indicatore
SetIndexBuffer(0,iDEMABuffer,INDICATOR_DATA);
//--- set shift
PlotIndexSetInteger(0,PLOT_SHIFT,ma_shift);
//--- determinare il simbolo per cui viene disegnato l'indicatore
name=symbol;
//--- eliminare gli spazi a destra e a sinistra
StringTrimRight(name);
StringTrimLeft(name);
//--- se il risultato è zero nella lunghezza della stringa 'name'
if(StringLen(name)==0)
{
//--- prende il simbolo del grafico indicatore a cui è attaccato
name=_Symbol;
}
//--- crea l'handle dell'indicatore
if(type==Call_iDEMA)
handle=iDEMA(name,period,ma_period,ma_shift,applied_price);
else
{
//--- riempie la struttura con i parametri dell'indicatore
MqlParam pars[3];
//--- periodo della media mobile
pars[0].type=TYPE_INT;
pars[0].integer_value=ma_period;
//--- slittamento
pars[1].type=TYPE_INT;
pars[1].integer_value=ma_shift;
//--- tipo di prezzo
pars[2].type=TYPE_INT;
pars[2].integer_value=applied_price;
handle=IndicatorCreate(name,period,IND_DEMA,3,pars);
}
//--- se l'handle non viene creato
if(handle==INVALID_HANDLE)
{
//--- dice riguardo il fallimento e l'output del codice di errore
PrintFormat("Fallimento nel creare l'handle dell'indicatore iDEMA per il simbolo %s/%s, codic
name,
EnumToString(period),
GetLastError());
//--- l'indicatore si ferma precocemente
return(INIT_FAILED);
}
//--- Mostra il simbolo/timeframe per cui è calcolato l'indicatore Double Exponential Moving Averag
short_name=StringFormat("iDEMA(%s/%s, %d, %d, %s)",name,EnumToString(period),
ma_period,ma_shift,EnumToString(applied_price));
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inizializzazione normale dell'indicatore
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
//+--------------------------------------------------------------------------------+
bool FillArrayFromBuffer(double &values[], // buffer indicatore dei valori di Double Exponential M
int shift, // slittamento
int ind_handle, // handle dell'indicatore iDEMA
int amount // numero di valori copiati
)
{
//--- resetta codice errore
ResetLastError();
//--- riempie una parte dell'array iDEMABuffer con valori dal buffer indicatore che ha indice 0
if(CopyBuffer(ind_handle,0,-shift,amount,values)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iDEMA, codice errore %d",GetLastEr
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- tutto è ok
return(true);
}
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione indicatore |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- cancella il grafico dopo aver eliminato l'indicatore
Comment("");
}
iDeMarker
La funzione restituisce l'handle dell'indicatore DeMark er. H a un solo buffer.
int iDeMarker(
string symbol, // nome simbolo
ENUM_TIMEFRAMES period, // periodo
int ma_period // periodo medio
);
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori ENUM _TIMEFRAMES , 0 significa il corrente
timefreame.
ma_period
[ in] Periodo medio (conteggio barre) per i calcoli.
Valore restituito
R estituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è pi ù
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_iDeMarker.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "L'indicatore dimostra come ottenere i dati"
#property description "dei buffers indicatore per l'indicatore tecnico iDeMarker."
#property description "Il simbolo e timeframe usati per i calcoli dell'indicatore,"
#property description "vengono impostati dai parametri simbolo e periodo."
#property description "Il metodo per la creazione dell'handle è impostato attraverso il parametro '
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- il tracciamento di iDeMarker
#property indicator_label1 "iDeMarker"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrLightSeaGreen
else
{
//--- riempie la struttura con i parametri dell'indicatore
MqlParam pars[1];
//--- periodo della media mobile
pars[0].type=TYPE_INT;
pars[0].integer_value=ma_period;
handle=IndicatorCreate(name,period,IND_DEMARKER,1,pars);
}
//--- se l'handle non viene creato
if(handle==INVALID_HANDLE)
{
//--- dice riguardo il fallimento e l'output del codice di errore
PrintFormat("Fallimento nel creare l'handle dell'indicatore iDeMarker per il simbolo %s/%s, c
name,
EnumToString(period),
GetLastError());
//--- l'indicatore si ferma precocemente
return(INIT_FAILED);
}
//--- mostra il simbolo/timeframe per cui è calcolato l'indicatore DeMarker
short_name=StringFormat("iDeMarker(%s/%s, period=%d)",name,EnumToString(period),ma_period);
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inizializzazione normale dell'indicatore
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//--- numero di valori copiati dall' indicatore iDeMarker
int values_to_copy;
//--- determina il numero di valori calcolati in dell'indicatore
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() returned %d, error code %d",calculated,GetLastError());
return(0);
}
//--- se è il primo inizio del calcolo dell'indicatore o se il numero di valori dell'indicatore iDe
//--- o se è necessario calcolare l'indicatore per due o più barre (significa che qualcosa è cambia
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se l' array v è maggiore del numero di valori dell'indicatore iDeMarker per il simbolo/
//--- altrimenti, copiamo meno della grandezza del buffer indicatore
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- vuol dire che non è la prima volta del calcolo dell'indicatore, e dopo l'ultima chiamat
//--- per il calcolo non viene aggiunta più di una barra
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- riempie l' array iDeMarkerBuffer con valori dell'indicatore DeMarker
//--- se FillArrayFromBuffer restituisce false, significa che l'informazione non è ancora pronta, c
if(!FillArrayFromBuffer(iDeMarkerBuffer,handle,values_to_copy)) return(0);
//--- forma il messaggio
string comm=StringFormat("%s ==> Valore aggiornato nell'indicatore %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- visualizza il messaggio di servizio sul grafico
Comment(comm);
//--- memorizza il numero dei valori nell'indicatore DeMarker
bars_calculated=calculated;
//--- restituisce il valore prev_calculated per la chiamata successiva
return(rates_total);
}
//+--------------------------------------------------------------------------------+
//| Riempie il buffer indicatore dall'indicatore iDeMarker |
//+--------------------------------------------------------------------------------+
bool FillArrayFromBuffer(double &values[], // buffer indicatore dei valori di DeMarker
int ind_handle, // handle dell'indicatore iDeMarker
int amount // numero di valori copiati
)
{
//--- resetta codice errore
ResetLastError();
//--- riempie una parte dell'array iDeMarkerBuffer con valori dal buffer indicatore che ha indice 0
if(CopyBuffer(ind_handle,0,0,amount,values)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iDeMarker, codice errore %d",GetLa
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- tutto è ok
return(true);
}
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione indicatore |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- cancella il grafico dopo aver eliminato l'indicatore
Comment("");
}
iEnvelopes
La funzione restituisce l'handle dell'indicatore Envelopes.
int iEnvelopes(
string symbol, // nome del simbolo
ENUM_TIMEFRAMES period, // periodo
int ma_period, // periodo per il calcolo della linea media
int ma_shift, // slittamento orizzontale dell'indicatore
ENUM_MA_METHOD ma_method, // tipo di smussamento
ENUM_APPLIED_PRICE applied_price, // tipo di prezzo o handle
double deviation // deviazione dei confini dalla linea media (in percentua
);
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori ENUM _TIMEFRAMES , 0 significa il corrente
timefreame.
ma_period
[ in] Periodo medio per la linea principale.
ma_shift
[ in] Lo slittamento del relativo indicatore al grafico dei prezzi.
ma_method
[ in] T ipo di smussamento. Può essere uno dei valori di ENUM _M A_METH OD.
applied_price
[in] Il prezzo utilizzato. Può essere una qualsiasi delle costanti ENUM _APPL IED_PRICE o un handle
di un altro indicatore.
deviazione
[ in] La deviazione dalla linea principale (in percentuale).
Valore restituito
Restituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è più
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Nota
I numeri di buffer: 0 - UPPER_L INE, 1 - LOW ER_L INE.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_iEnvelopes.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "L'indicatore dimostra come ottenere i dati"
#property description "dei buffers indicatore per l'indicatore tecnico iEnvelopes."
#property description "Il simbolo e timeframe usati per i calcoli dell'indicatore,"
#property description "vengono impostati dai parametri simbolo e periodo."
#property description "Il metodo per la creazione dell'handle è impostato attraverso il parametro '
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 2
//--- il tracciamento di Upper
#property indicator_label1 "Upper"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- il tracciamento Lower
#property indicator_label2 "Lower"
#property indicator_type2 DRAW_LINE
#property indicator_color2 clrRed
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//+--------------------------------------------------------------------------------+
//| Enumerazione dei metodi della creazione dell'handle |
//+--------------------------------------------------------------------------------+
enum Creation
{
Call_iEnvelopes, // uso iEnvelopes
Call_IndicatorCreate // usa IndicatorCreate
};
//--- parametri di input
input Creation type=Call_iEnvelopes; // tipo della funzione
input int ma_period=14; // periodo della media mobile
input int ma_shift=0; // slittamento
input ENUM_MA_METHOD ma_method=MODE_SMA; // tipo di smussamento
input ENUM_APPLIED_PRICE applied_price=PRICE_CLOSE; // tipo di prezzo
input double deviation=0.1; // deviazione dei bordi dalla media mobile
input string symbol=" "; // simbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffer indicatore
double UpperBuffer[];
double LowerBuffer[];
//--- variabile per memorizzare l'handle dell'indicatore iEnvelopes
int handle;
//--- variabile per memorizzare
string name=symbol;
//--- nome dell'indicatore sul grafico
string short_name;
//--- manterremo il numero di valori dell'indicatore Envelopes
int bars_calculated=0;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- assegnazione di array di buffer indicatori
SetIndexBuffer(0,UpperBuffer,INDICATOR_DATA);
SetIndexBuffer(1,LowerBuffer,INDICATOR_DATA);
//--- impostiamo lo slittamento per ogni linea
PlotIndexSetInteger(0,PLOT_SHIFT,ma_shift);
PlotIndexSetInteger(1,PLOT_SHIFT,ma_shift);
//--- determinare il simbolo per cui viene disegnato l'indicatore
name=symbol;
//--- eliminare gli spazi a destra e a sinistra
StringTrimRight(name);
StringTrimLeft(name);
//--- se il risultato è zero nella lunghezza della stringa 'name'
if(StringLen(name)==0)
{
//--- prende il simbolo del grafico indicatore a cui è attaccato
name=_Symbol;
}
//--- crea l'handle dell'indicatore
if(type==Call_iEnvelopes)
handle=iEnvelopes(name,period,ma_period,ma_shift,ma_method,applied_price,deviation);
else
{
//--- riempie la struttura con i parametri dell'indicatore
MqlParam pars[5];
//--- periodo della media mobile
pars[0].type=TYPE_INT;
pars[0].integer_value=ma_period;
//--- slittamento
pars[1].type=TYPE_INT;
pars[1].integer_value=ma_shift;
//--- tipo di smussamento
pars[2].type=TYPE_INT;
pars[2].integer_value=ma_method;
//--- tipo di prezzo
pars[3].type=TYPE_INT;
pars[3].integer_value=applied_price;
//--- tipo di prezzo
pars[4].type=TYPE_DOUBLE;
pars[4].double_value=deviation;
handle=IndicatorCreate(name,period,IND_ENVELOPES,5,pars);
}
//--- se l'handle non viene creato
if(handle==INVALID_HANDLE)
{
//--- dice riguardo il fallimento e l'output del codice di errore
PrintFormat("Fallimento nel creare l'handle dell'indicatore iEnvelopes per il simbolo %s/%s,
name,
EnumToString(period),
GetLastError());
//--- l'indicatore si ferma precocemente
return(INIT_FAILED);
}
//--- mostra il simbolo/timeframe per cui è calcolato l'indicatore Envelopes
short_name=StringFormat("iEnvelopes(%s/%s, %d, %d, %s,%s, %G)",name,EnumToString(period),
ma_period,ma_shift,EnumToString(ma_method),EnumToString(applied_price),deviation);
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inizializzazione normale dell'indicatore
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//--- numero di valori copiati dall' indicatore iEnvelopes
int values_to_copy;
//--- determina il numero di valori calcolati in dell'indicatore
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() returned %d, error code %d",calculated,GetLastError());
return(0);
}
//--- se è il primo inizio del calcolo dell'indicatore o se il numero di valori dell'indicatore iEn
//--- o se è necessario calcolare l'indicatore per due o più barre (significa che qualcosa è cambia
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se l' array UpperBuffer è maggiore del numero di valori dell'indicatore iEnvelopes per
//--- altrimenti, copiamo meno della grandezza del buffer indicatore
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- vuol dire che non è la prima volta del calcolo dell'indicatore, e dopo l'ultima chiamat
//--- per il calcolo non viene aggiunta più di una barra
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- riempire gli array UpperBuffer e LowerBuffer con i valori dall'indicatore Envelopes
//--- se FillArrayFromBuffer restituisce false, significa che l'informazione non è ancora pronta, c
if(!FillArraysFromBuffers(UpperBuffer,LowerBuffer,ma_shift,handle,values_to_copy)) return(0);
//--- forma il messaggio
string comm=StringFormat("%s ==> Valore aggiornato nell'indicatore %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- visualizza il messaggio di servizio sul grafico
Comment(comm);
//--- memorizza il numero dei valori nell'indicatore Envelopes
bars_calculated=calculated;
//--- restituisce il valore prev_calculated per la chiamata successiva
return(rates_total);
}
//+--------------------------------------------------------------------------------+
//| Riempie il buffer indicatore dall'indicatore iEnvelopes |
//+--------------------------------------------------------------------------------+
bool FillArraysFromBuffers(double &upper_values[], // buffer indicatore per il bordo superiore
double &lower_values[], // indicatore del bordo inferiore
int shift, // slittamento
int ind_handle, // handle dell'indicatore iEnvelopes
int amount // numero di valori copiati
)
{
//--- resetta codice errore
ResetLastError();
//--- riempie una parte dell'array UpperBuffer con valori dal buffer indicatore che ha indice 0
if(CopyBuffer(ind_handle,1,-shift,amount,upper_values)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iEnvelopes, codice errore %d",GetL
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- riempie una parte dell'array LowerBuffer con valori dal buffer indicatore che ha indice 1
if(CopyBuffer(ind_handle,1,-shift,amount,lower_values)<0)
{
iForce
La funzione restituisce l'handle dell'indicatore Force Index . H a un solo buffer.
int iForce(
string symbol, // nome del simbolo
ENUM_TIMEFRAMES period, // periodo
int ma_period, // periodo medio
ENUM_MA_METHOD ma_method, // tipo di smussamento
ENUM_APPLIED_VOLUME applied_volume // tipo di volume per il calcolo
);
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori ENUM _TIMEFRAMES , 0 significa il corrente
timefreame.
ma_period
[ in] Periodo medio per il calcolo degli indicatori.
ma_method
[ in] T ipo di smussamento. Può essere uno dei valori di ENUM _M A_METH OD.
applied_volume
[ in] Il volume utilizzato. Può essere uno dei valori di ENUM _APPL IED_VOL UME.
Valore restituito
Restituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è più
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_iForce.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "L'indicatore dimostra come ottenere i dati"
#property description "dei buffers indicatore per l'indicatore tecnico iForce."
#property description "Il simbolo e timeframe usati per i calcoli dell'indicatore,"
#property description "vengono impostati dai parametri simbolo e periodo."
#property description "Il metodo per la creazione dell'handle è impostato attraverso il parametro '
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- tracciamento iForce
#property indicator_label1 "iForce"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrLightSeaGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//+--------------------------------------------------------------------------------+
//| Enumerazione dei metodi della creazione dell'handle |
//+--------------------------------------------------------------------------------+
enum Creation
{
Call_iForce, // uso iForce
Call_IndicatorCreate // usa IndicatorCreate
};
//--- parametri di input
input Creation type=Call_iForce; // tipo della funzione
input int ma_period=13; // periodo di media
input ENUM_MA_METHOD ma_method=MODE_SMA; // tipo di smussamento
input ENUM_APPLIED_VOLUME applied_volume=VOLUME_TICK; // tipo di volume
input string symbol=" "; // simbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffer indicatore
double iForceBuffer[];
//--- variabile per memorizzare l'handle dell'indicatore iForce
int handle;
//--- variabile per memorizzare
string name=symbol;
//--- nome dell'indicatore sul grafico
string short_name;
//--- manterremo il numero di valori dell'indicatore Force
int bars_calculated=0;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- assegnazione di array al buffer indicatore
SetIndexBuffer(0,iForceBuffer,INDICATOR_DATA);
//--- determinare il simbolo per cui viene disegnato l'indicatore
name=symbol;
//--- eliminare gli spazi a destra e a sinistra
StringTrimRight(name);
StringTrimLeft(name);
//--- se il risultato è zero nella lunghezza della stringa 'name'
if(StringLen(name)==0)
{
//--- prende il simbolo del grafico indicatore a cui è attaccato
name=_Symbol;
}
//--- crea l'handle dell'indicatore
if(type==Call_iForce)
handle=iForce(name,period,ma_period,ma_method,applied_volume);
else
{
//--- riempie la struttura con i parametri dell'indicatore
MqlParam pars[3];
//--- periodo della media mobile
pars[0].type=TYPE_INT;
pars[0].integer_value=ma_period;
//--- tipo di smussamento
pars[1].type=TYPE_INT;
pars[1].integer_value=ma_method;
//--- tipo di volume
pars[2].type=TYPE_INT;
pars[2].integer_value=applied_volume;
//--- tipo di prezzo
handle=IndicatorCreate(name,period,IND_FORCE,3,pars);
}
//--- se l'handle non viene creato
if(handle==INVALID_HANDLE)
{
//--- dice riguardo il fallimento e l'output del codice di errore
PrintFormat("Fallimento nel creare l'handle dell'indicatore iForce per il simbolo %s/%s, codi
name,
EnumToString(period),
GetLastError());
//--- l'indicatore si ferma precocemente
return(INIT_FAILED);
}
//--- mostra il simbolo/timeframe per cui è calcolato l'indicatore Force
short_name=StringFormat("iForce(%s/%s, %d, %s, %s)",name,EnumToString(period),
ma_period,EnumToString(ma_method),EnumToString(applied_volume));
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inizializzazione normale dell'indicatore
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
iFractals
La funzione restituisce l'handle dell'indicatore Fractals.
int iFractals(
string symbol, // nome simbolo
ENUM_TIMEFRAMES period // periodo
);
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori ENUM _TIMEFRAMES , 0 significa il corrente
timefreame.
Valore restituito
Restituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è più
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Nota
I numeri del buffer sono i seguenti: 0 - UPPER_L INE, 1 - LOW ER_L INE.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_iFractals.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "L'indicatore dimostra come ottenere i dati"
#property description "dei buffers indicatore per l'indicatore tecnico iFractals."
#property description "Il simbolo e timeframe usati per i calcoli dell'indicatore,"
#property description "vengono impostati dai parametri simbolo e periodo."
#property description "Il metodo per la creazione dell'handle è impostato attraverso il parametro '
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 2
//--- il tracciamento di FractalUp
//--- o se è necessario calcolare l'indicatore per due o più barre (significa che qualcosa è cambia
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se l' array FractalUpBuffer è maggiore del numero di valori dell'indicatore iFractals p
//--- altrimenti, copiamo meno della grandezza del buffer indicatore
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- vuol dire che non è la prima volta del calcolo dell'indicatore, e dopo l'ultima chiamat
//--- per il calcolo non viene aggiunta più di una barra
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- riempire gli array FractalUpBuffer e FractalDownBuffer con i valori dall'indicatore Fractals
//--- se FillArrayFromBuffer restituisce false, significa che l'informazione non è ancora pronta, c
if(!FillArraysFromBuffers(FractalUpBuffer,FractalDownBuffer,handle,values_to_copy)) return(0);
//--- forma il messaggio
string comm=StringFormat("%s ==> Valore aggiornato nell'indicatore %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- visualizza il messaggio di servizio sul grafico
Comment(comm);
//--- memorizza il numero dei valori nell'indicatore Fractals
bars_calculated=calculated;
//--- restituisce il valore prev_calculated per la chiamata successiva
return(rates_total);
}
//+--------------------------------------------------------------------------------+
//| Riempie il buffer indicatore dall'indicatore iFractals |
//+--------------------------------------------------------------------------------+
bool FillArraysFromBuffers(double &up_arrows[], // buffer indicatore per la freccia su
double &down_arrows[], // buffer indicatore per la freccia giu
int ind_handle, // handle dell'indicatore iFractals
int amount // numero di valori copiati
)
{
//--- resetta codice errore
ResetLastError();
//--- riempie una parte dell'array iBullsPowerBuffer con valori dal buffer indicatore che ha indice
if(CopyBuffer(ind_handle,0,0,amount,up_arrows)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iFractals nell'array FractalUpBuff
GetLastError());
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- riempie una parte dell'array FractalDownBuffer con valori dal buffer indicatore che ha indice
if(CopyBuffer(ind_handle,1,0,amount,down_arrows)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iFractals nell'array FractalDownBu
GetLastError());
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- tutto è ok
return(true);
}
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione indicatore |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- cancella il grafico dopo aver eliminato l'indicatore
Comment("");
}
iFrAMA
La funzione restituisce l'handle dell'indicatore Fractal Adaptive Moving Average. H a un solo buffer.
int iFrAMA(
string symbol, // nome del simbolo
ENUM_TIMEFRAMES period, // periodo
int ma_period, // periodo medio
int ma_shift, // slittamento orizzontale del grafico
ENUM_APPLIED_PRICE applied_price // tipo di prezzo o handle
);
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori ENUM _TIMEFRAMES , 0 significa il corrente
timefreame.
ma_period
[ in] Periodo (conteggio barre) per i calcoli dell'indicatore.
ma_shift
[ in] S litamento dell'indicatore nel grafico prezzi.
applied_price
[in] Il prezzo utilizzato. Può essere una qualsiasi delle costanti ENUM _APPL IED_PRICE o un handle
di un altro indicatore.
Valore restituito
R estituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è pi ù
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_iFrAMA.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "L'indicatore dimostra come ottenere i dati"
#property description "dei buffers indicatore per l'indicatore tecnico iFrAMA."
#property description "Il simbolo e timeframe usati per i calcoli dell'indicatore,"
#property description "vengono impostati dai parametri simbolo e periodo."
#property description "Il metodo per la creazione dell'handle è impostato attraverso il parametro '
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//--- tracciamento iFrAMA
#property indicator_label1 "iFrAMA"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//+--------------------------------------------------------------------------------+
//| Enumerazione dei metodi della creazione dell'handle |
//+--------------------------------------------------------------------------------+
enum Creation
{
Call_iFrAMA, // uso iFrAMA
Call_IndicatorCreate // usa IndicatorCreate
};
//--- parametri di input
input Creation type=Call_iFrAMA; // tipo della funzione
input int ma_period=14; // periodo di media
input int ma_shift=0; // slittamento
input ENUM_APPLIED_PRICE applied_price=PRICE_CLOSE; // tipo del prezzo
input string symbol=" "; // simbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffer indicatore
double iFrAMABuffer[];
//--- variabile per memorizzare l'handle dell'indicatore iFrAMA
int handle;
//--- variabile per memorizzare
string name=symbol;
//--- nome dell'indicatore sul grafico
string short_name;
//--- manterremo il numero di valori nell' indicatore Fractal Adaptive Moving Average
int bars_calculated=0;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- assegnazione di array al buffer indicatore
SetIndexBuffer(0,iFrAMABuffer,INDICATOR_DATA);
//--- imposta lo slittamento
PlotIndexSetInteger(0,PLOT_SHIFT,ma_shift);
//--- determinare il simbolo per cui viene disegnato l'indicatore
name=symbol;
//--- eliminare gli spazi a destra e a sinistra
StringTrimRight(name);
StringTrimLeft(name);
//--- se il risultato è zero nella lunghezza della stringa 'name'
if(StringLen(name)==0)
{
//--- prende il simbolo del grafico indicatore a cui è attaccato
name=_Symbol;
}
//--- crea l'handle dell'indicatore
if(type==Call_iFrAMA)
handle=iFrAMA(name,period,ma_period,ma_shift,applied_price);
else
{
//--- riempie la struttura con i parametri dell'indicatore
MqlParam pars[3];
//--- periodo della media mobile
pars[0].type=TYPE_INT;
pars[0].integer_value=ma_period;
//--- slittamento
pars[1].type=TYPE_INT;
pars[1].integer_value=ma_shift;
//--- tipo di prezzo
pars[2].type=TYPE_INT;
pars[2].integer_value=applied_price;
//--- tipo di prezzo
handle=IndicatorCreate(name,period,IND_FRAMA,3,pars);
}
//--- se l'handle non viene creato
if(handle==INVALID_HANDLE)
{
//--- dice riguardo il fallimento e l'output del codice di errore
PrintFormat("Fallimento nel creare l'handle dell'indicatore iFrAMA per il simbolo %s/%s, codi
name,
EnumToString(period),
GetLastError());
//--- l'indicatore si ferma precocemente
return(INIT_FAILED);
}
//--- mostra il simbolo/timeframe per cui è calcolato l'indicatore iFrAMA
short_name=StringFormat("iFrAMA(%s/%s, %d, %d, %s)",name,EnumToString(period),
ma_period,ma_shift,EnumToString(applied_price));
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inizializzazione normale dell'indicatore
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
iGator
La funzione restituisce l'handle dell'indicatore Gator. L 'oscillatore mostra la differenza tra le linee blu e
rossa di Alligator (istogramma superiore) e la differenza tra le linee rossa e verde (istogramma
inferiore).
int iGator(
string symbol, // nome del simbolo
ENUM_TIMEFRAMES period, // periodo
int jaw_period, // periodo per il calcolo di jaws
int jaw_shift, // slittamento orizzontale jaws
int teeth_period, // periodo per il calcolo di teeth
int teeth_shift, // slittamento orizzontale teeth
int lips_period, // periodo per il calcolo di lips
int lips_shift, // slittamento orizzontale lips
ENUM_MA_METHOD ma_method, // tipo di smussamento
ENUM_APPLIED_PRICE applied_price // tipo di prezzo o handle
);
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori ENUM _TIMEFRAMES , 0 significa il corrente
timefreame.
jaw_period
[ in] Periodo di mediazione per la linea blu (mascella dell'Alligatore, _* A lligator's Jaw).
jaw_shift
[in] Lo shift per la linea blu relativa al grafico dei prezzi. N on è direttamente collegato con lo
slittamento visivo dell'istogramma dell'indicatore.
teeth_period
[ in] Periodo medio per la linea rossa (Alligator's T eeth, _* denti dell'alligatore).
teeth_shift
[in] T he shift of the red line relative to the price chart. Non è direttamente collegato con lo
slittamento visivo dell'istogramma dell'indicatore.
lips_period
[ in] Periodo medio per la linea verde (labbra dell'Alligatore, _*A lligator's lips).
lips_shift
[in] Lo slittamento della linea verde rispetto al grafico prezzi. Non è direttamente collegato con lo
slittamento visivo dell'istogramma dell'indicatore.
ma_method
[ in] T ipo di smussamento. Può essere uno dei valori di ENUM _M A_METH OD.
applied_price
[in] Il prezzo utilizzato. Può essere una qualsiasi delle costanti ENUM _APPL IED_PRICE o un handle
di un altro indicatore.
Valore restituito
R estituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è pi ù
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Nota
Numeri di buffer: 0 -, UPPER_HIS T OGRAM 1 - buffer colore dell'istogramma superiore, 2 -
LOW ER_HIS T OGRAM, 3 - buffer colore dell'istogramma inferiore.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_iGator.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "L'indicatore dimostra come ottenere i dati"
#property description "dei buffers indicatore per l'indicatore tecnico iGator."
#property description "Il simbolo e timeframe usati per i calcoli dell'indicatore,"
#property description "vengono impostati dai parametri simbolo e periodo."
#property description "Il metodo per la creazione dell'handle è impostato attraverso il parametro '
#property description "Tutti gli altri parametri sono simili al Gator Oscillator standard."
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots 2
//--- tracciamento GatorUp
#property indicator_label1 "GatorUp"
#property indicator_type1 DRAW_COLOR_HISTOGRAM
#property indicator_color1 clrGreen, clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- tracciamento GatorDown
#property indicator_label2 "GatorDown"
#property indicator_type2 DRAW_COLOR_HISTOGRAM
#property indicator_color2 clrGreen, clrRed
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//+--------------------------------------------------------------------------------+
//| Enumerazione dei metodi della creazione dell'handle |
//+--------------------------------------------------------------------------------+
enum Creation
{
Call_iGator, // usa iGator
Call_IndicatorCreate // usa IndicatorCreate
};
//--- parametri di input
input Creation type=Call_iGator; // tipo della funzione
input string symbol=" "; // simbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
input int jaw_period=13; // periodo della linea Jaw
input int jaw_shift=8; // slittamento della linea Jaw
input int teeth_period=8; // periodo della linea Teeth
input int teeth_shift=5; // slittamento della linea Teeth
input int lips_period=5; // periodo della linea Lips
input int lips_shift=3; // slittamento della linea Lips
input ENUM_MA_METHOD MA_method=MODE_SMMA; // medoto di media delle linee di Alligator
input ENUM_APPLIED_PRICE applied_price=PRICE_MEDIAN;// tipo di prezzo utilizzato per il calcolo d
//--- buffers indicatore
double GatorUpBuffer[];
double GatorUpColors[];
double GatorDownBuffer[];
double GatorDownColors[];
//--- variabile per memorizzare l'handle dell'indicatore iGator
int handle;
//--- variabile per memorizzare
string name=symbol;
//--- nome dell'indicatore sul grafico
string short_name;
//--- valori di slittamento per gli istogrammi superiore ed inferiore
int shift;
//--- manterremo il numero di valori nell'indicatore Gator Oscillator
int bars_calculated=0;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- assegnazione di array di buffer indicatori
SetIndexBuffer(0,GatorUpBuffer,INDICATOR_DATA);
SetIndexBuffer(1,GatorUpColors,INDICATOR_COLOR_INDEX);
SetIndexBuffer(2,GatorDownBuffer,INDICATOR_DATA);
SetIndexBuffer(3,GatorDownColors,INDICATOR_COLOR_INDEX);
/*
Tutti gli slittamenti specificati nei parametri si riferiscono all'indicatore Alligator sulla bas
E' per questo che non spostano l'indicatore Gator in sé, ma spostano le linee Alligator,
i cui valori sono utilizzati per il calcolo del Gator Oscillator!
*/
//--- Calcoliamo lo slittamento per gli istogrammi superiore ed inferiore, che è pari alla differen
shift=MathMin(jaw_shift,teeth_shift);
PlotIndexSetInteger(0,PLOT_SHIFT,shift);
//--- nonostante l'indicatore contiene due istogrammi, viene utilzzato lo stesso lo slittamento - q
PlotIndexSetInteger(1,PLOT_SHIFT,shift);
name,
EnumToString(period),
GetLastError());
//--- l'indicatore si ferma precocemente
return(INIT_FAILED);
}
//--- Mostra il simbolo/timeframe per cui è calcolato l'indicatore Gator Oscillator
short_name=StringFormat("iGator(%s/%s, %d, %d ,%d, %d, %d, %d)",name,EnumToString(period),
jaw_period,jaw_shift,teeth_period,teeth_shift,lips_period,lips_shift);
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inizializzazione normale dell'indicatore
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//--- numero di valori copiati dall' indicatore iGator
int values_to_copy;
//--- determina il numero di valori calcolati in dell'indicatore
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() returned %d, error code %d",calculated,GetLastError());
return(0);
}
//--- se è il primo inizio del calcolo dell'indicatore o se il numero di valori dell'indicatore iGa
//--- o se è necessario calcolare l'indicatore per due o più barre (significa che qualcosa è cambia
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se l' array GatorUpBuffer è maggiore del numero di valori dell'indicatore iGator per il
//--- altrimenti, copiamo meno della grandezza del buffer indicatore
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- vuol dire che non è la prima volta del calcolo dell'indicatore, e dopo l'ultima chiamat
//--- per il calcolo non viene aggiunta più di una barra
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- riempie gli array con valori dell'indicatore Gator Oscillator
//--- se FillArraysFromBuffer restituisce false, significa che l'informazione non è ancora pronta,
if(!FillArraysFromBuffers(GatorUpBuffer,GatorUpColors,GatorDownBuffer,GatorDownColors,
shift,handle,values_to_copy)) return(0);
//--- forma il messaggio
string comm=StringFormat("%s ==> Valore aggiornato nell'indicatore %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- visualizza il messaggio di servizio sul grafico
Comment(comm);
//--- memorizzare il numero di valori dell'indicatore Gator Oscillator
bars_calculated=calculated;
//--- restituisce il valore prev_calculated per la chiamata successiva
return(rates_total);
}
//+--------------------------------------------------------------------------------+
//| Riempie il buffer indicatore dall'indicatore iGator |
//+--------------------------------------------------------------------------------+
bool FillArraysFromBuffers(double &ups_buffer[], // buffer indicatore per l'istogramma supe
double &up_color_buffer[], // buffer indicatore per gli indici dei pr
double &downs_buffer[], // buffer indicatore per l'istogramma infe
double &downs_color_buffer[], // buffer indicatore per i prezzi dell'ist
int u_shift, // slittamento per l'istogramma superiore
int ind_handle, // handle dell'indicatore iGator
int amount // numero di valori copiati
)
{
//--- resetta codice errore
ResetLastError();
//--- riempie una parte dell'array GatorUpBuffer con valori dal buffer indicatore che ha indice 0
if(CopyBuffer(ind_handle,0,-u_shift,amount,ups_buffer)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iGator, codice errore %d",GetLastE
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- riempie una parte dell'array GatorUpColors con valori dal buffer indicatore che ha indice 1
if(CopyBuffer(ind_handle,1,-u_shift,amount,up_color_buffer)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iGator, codice errore %d",GetLastE
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- riempie una parte dell'array GatorDownBuffer con valori dal buffer indicatore che ha indice 2
if(CopyBuffer(ind_handle,2,-u_shift,amount,downs_buffer)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iGator, codice errore %d",GetLastE
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- riempie una parte dell'array GatorDownColors con valori dal buffer indicatore che ha indice 3
if(CopyBuffer(ind_handle,3,-u_shift,amount,downs_color_buffer)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iGator, codice errore %d",GetLastE
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- tutto è ok
return(true);
}
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione indicatore |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- cancella il grafico dopo aver eliminato l'indicatore
Comment("");
}
iIchimoku
La funzione restituisce l'handle dell'indicatore Ichimok u Kink o Hyo.
int iIchimoku(
string symbol, // nome simbolo
ENUM_TIMEFRAMES period, // periodo
int tenkan_sen, // periodo di Tenkan-sen
int kijun_sen, // periodo di Kijun-sen
int senkou_span_b // periodo di Senkou Span B
);
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori ENUM _TIMEFRAMES , 0 significa il corrente
timefreame.
tenkan_sen
[ in] Periodo medio per T enk an S en.
kijun_sen
[ in] Periodo medio per Kijun S en.
senkou_span_b
[ in] Periodo medio per S enk ou S pan B.
Valore restituito
Restituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è più
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Nota
I numeri di buffer: 0 - T ENKANS EN_L INE, 1 - J
KI UNS EN_L INE, 2 - S ENKOUS PANA_L INE, 3 -
S ENKO US PANB_L INE, 4 - C HIKO US PAN_L INE.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_iIchimoku.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "L'indicatore dimostra come ottenere i dati"
#property indicator_chart_window
#property indicator_buffers 5
#property indicator_plots 4
//--- il tracciamento di Tenkan_sen
#property indicator_label1 "Tenkan_sen"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- il tracciamento di Kijun_sen
#property indicator_label2 "Kijun_sen"
#property indicator_type2 DRAW_LINE
#property indicator_color2 clrBlue
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//--- il tracciamento di Senkou_Span
#property indicator_label3 "Senkou Span A;Senkou Span B" // due campi verranno mostrati nella Fine
#property indicator_type3 DRAW_FILLING
#property indicator_color3 clrSandyBrown, clrThistle
#property indicator_style3 STYLE_SOLID
#property indicator_width3 1
//--- il tracciamento di Chikou_Span
#property indicator_label4 "Chinkou_Span"
#property indicator_type4 DRAW_LINE
#property indicator_color4 clrLime
#property indicator_style4 STYLE_SOLID
#property indicator_width4 1
//+--------------------------------------------------------------------------------+
//| Enumerazione dei metodi della creazione dell'handle |
//+--------------------------------------------------------------------------------+
enum Creation
{
Call_iIchimoku, // uso iIchimoku
Call_IndicatorCreate // usa IndicatorCreate
};
//--- parametri di input
input Creation type=Call_iIchimoku; // tipo della funzione
input int tenkan_sen=9; // periodo di Tenkan-sen
input int kijun_sen=26; // periodo di Kijun-sen
input int senkou_span_b=52; // periodo di Senkou Span B
input string symbol=" "; // simbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffer indicatore
double Tenkan_sen_Buffer[];
double Kijun_sen_Buffer[];
double Senkou_Span_A_Buffer[];
double Senkou_Span_B_Buffer[];
double Chinkou_Span_Buffer[];
//--- variabile per memorizzare l'handle dell'indicatore iIchimoku
int handle;
//--- variabile per memorizzare
string name=symbol;
//--- nome dell'indicatore sul grafico
string short_name;
//--- manterremo il numero di valori dell'indicatore Ichimoku Kinko Hyo
int bars_calculated=0;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- assegnazione di array di buffer indicatori
SetIndexBuffer(0,Tenkan_sen_Buffer,INDICATOR_DATA);
SetIndexBuffer(1,Kijun_sen_Buffer,INDICATOR_DATA);
SetIndexBuffer(2,Senkou_Span_A_Buffer,INDICATOR_DATA);
SetIndexBuffer(3,Senkou_Span_B_Buffer,INDICATOR_DATA);
SetIndexBuffer(4,Chinkou_Span_Buffer,INDICATOR_DATA);
//--- Imposta lo spostamento del canale Senkou Span delle barre kijun_sen in direzione futura
PlotIndexSetInteger(2,PLOT_SHIFT,kijun_sen);
//--- impostare uno slittamento per la linea Chikou Span non è necessario, in quanto i dati Chinkou
//--- sono già memorizzati con uno slittamento in iIchimoku
//--- determinare il simbolo per cui viene disegnato l'indicatore
name=symbol;
//--- eliminare gli spazi a destra e a sinistra
StringTrimRight(name);
StringTrimLeft(name);
//--- se il risultato è zero nella lunghezza della stringa 'name'
if(StringLen(name)==0)
{
//--- prende il simbolo del grafico indicatore a cui è attaccato
name=_Symbol;
}
//--- crea l'handle dell'indicatore
if(type==Call_iIchimoku)
handle=iIchimoku(name,period,tenkan_sen,kijun_sen,senkou_span_b);
else
{
//--- riempie la struttura con i parametri dell'indicatore
MqlParam pars[3];
//--- pediodi e slittamenti delle linee dell' Alligator
pars[0].type=TYPE_INT;
pars[0].integer_value=tenkan_sen;
pars[1].type=TYPE_INT;
pars[1].integer_value=kijun_sen;
pars[2].type=TYPE_INT;
pars[2].integer_value=senkou_span_b;
//--- crea l'handle
handle=IndicatorCreate(name,period,IND_ICHIMOKU,3,pars);
}
//--- se l'handle non viene creato
if(handle==INVALID_HANDLE)
{
//--- dice riguardo il fallimento e l'output del codice di errore
PrintFormat("Fallimento nel creare l'handle dell'indicatore iIchimoku per il simbolo %s/%s, c
name,
EnumToString(period),
GetLastError());
//--- l'indicatore si ferma precocemente
return(INIT_FAILED);
}
//--- Mostra il simbolo/timeframe per cui è calcolato l'indicatore Ichimoku Kinko Hyo
short_name=StringFormat("iIchimoku(%s/%s, %d, %d ,%d)",name,EnumToString(period),
tenkan_sen,kijun_sen,senkou_span_b);
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inizializzazione normale dell'indicatore
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//--- numero di valori copiati dall' indicatore iIchimoku
int values_to_copy;
//--- determina il numero di valori calcolati in dell'indicatore
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() returned %d, error code %d",calculated,GetLastError());
return(0);
}
//--- se è il primo inizio del calcolo dell'indicatore o se il numero di valori dell'indicatore iIc
//--- o se è necessario calcolare l'indicatore per due o più barre (significa che qualcosa è cambia
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se l' array Tenkan_sen_Buffer è maggiore del numero di valori dell'indicatore iIchimoku
//--- altrimenti, copiamo meno della grandezza del buffer indicatore
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- vuol dire che non è la prima volta del calcolo dell'indicatore, e dopo l'ultima chiamat
//--- per il calcolo non viene aggiunta più di una barra
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- riempie gli array con valori dell'indicatore Ichimoku Kinko Hyo
//--- se FillArraysFromBuffer restituisce false, significa che l'informazione non è ancora pronta,
if(!FillArraysFromBuffers(Tenkan_sen_Buffer,Kijun_sen_Buffer,Senkou_Span_A_Buffer,Senkou_Span_B_
kijun_sen,handle,values_to_copy)) return(0);
//--- forma il messaggio
string comm=StringFormat("%s ==> Valore aggiornato nell'indicatore %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- visualizza il messaggio di servizio sul grafico
Comment(comm);
//--- manterremo il numero di valori dell'indicatore Ichimoku Kinko Hyo
bars_calculated=calculated;
//--- restituisce il valore prev_calculated per la chiamata successiva
return(rates_total);
}
//+--------------------------------------------------------------------------------+
//| Riempie il buffer indicatore dall'indicatore iIchimoku |
//+--------------------------------------------------------------------------------+
bool FillArraysFromBuffers(double &tenkan_sen_buffer[], // buffer indicatore per la linea Tenka
double &kijun_sen_buffer[], // buffer indicatore per la linea di th
double &senkou_span_A_buffer[], // buffer indicatore della linea Senkou
double &senkou_span_B_buffer[], // buffer indicatore della linea Senkou
double &chinkou_span_buffer[], // buffer indicatore della linea Chinko
int senkou_span_shift, // slittamento della linea Senkou Span
int ind_handle, // handle dell'indicatore iIchimoku
int amount // numero di valori copiati
)
{
//--- resetta codice errore
ResetLastError();
//--- riempie una parte dell'array Tenkan_sen_Buffer con valori dal buffer indicatore che ha indice
if(CopyBuffer(ind_handle,0,0,amount,tenkan_sen_buffer)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
//--- riempie una parte dell'array Kijun_sen_Buffer con valori dal buffer indicatore che ha indice
if(CopyBuffer(ind_handle,1,0,amount,kijun_sen_buffer)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iIchimoku, codice errore %d",GetLa
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- riempie una parte dell'array Chinkou_Span_Buffer con valori dal buffer indicatore che ha indi
//--- se senkou_span_shift>0, la linea viene slittata in direzione futura di senkou_span_shift barr
if(CopyBuffer(ind_handle,2,-senkou_span_shift,amount,senkou_span_A_buffer)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("3.Fallimento nel copiare i dati dall'indicatore iIchimoku, codice errore %d",Get
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- riempie una parte dell'array Senkou_Span_A_Buffer con valori dal buffer indicatore che ha ind
//--- se senkou_span_shift>0, la linea viene slittata in direzione futura di senkou_span_shift barr
if(CopyBuffer(ind_handle,3,-senkou_span_shift,amount,senkou_span_B_buffer)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("4.Fallimento nel copiare i dati dall'indicatore iIchimoku, codice errore %d",Get
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- riempie una parte dell'array Senkou_Span_B_Buffer con valori dal buffer indicatore che ha ind
//--- quando copiamo Span Chinkou, non abbiamo bisogno di prendere in considerazione lo shifti, in
//--- sono già memorizzati con uno slittamento in iIchimoku
if(CopyBuffer(ind_handle,4,0,amount,chinkou_span_buffer)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("5.Fallimento nel copiare i dati dall'indicatore iIchimoku, codice errore %d",Get
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- tutto è ok
return(true);
}
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione indicatore |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- cancella il grafico dopo aver eliminato l'indicatore
Comment("");
}
iBW MFI
La funzione restituisce l'handle dell'indicatore Mark et Facilitation Index . H a un solo buffer.
int iBWMFI(
string symbol, // nome del simbolo
ENUM_TIMEFRAMES period, // periodo
ENUM_APPLIED_VOLUME applied_volume // tipo di volume per il calcolo
);
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori ENUM _TIMEFRAMES , 0 significa il corrente
timefreame.
applied_volume
[ in] Il volume utilizzato. Può essere una delle costanti di ENUM _APPL IED_VOL UME.
Valore restituito
R estituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è pi ù
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_iBWMFI.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "L'indicatore dimostra come ottenere i dati"
#property description "dei buffers indicatore per l'indicatore tecnico iBWMFI."
#property description "Il simbolo e timeframe usati per i calcoli dell'indicatore,"
#property description "vengono impostati dai parametri simbolo e periodo."
#property description "Il metodo per la creazione dell'handle è impostato attraverso il parametro '
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots 1
//--- il tracciamento di iBWMFI
#property indicator_label1 "iBWMFI"
#property indicator_type1 DRAW_COLOR_HISTOGRAM
#property indicator_color1 clrLime,clrSaddleBrown,clrBlue,clrPink
{
//--- riempie la struttura con i parametri dell'indicatore
MqlParam pars[1];
//--- tipo di volume
pars[0].type=TYPE_INT;
pars[0].integer_value=applied_volume;
handle=IndicatorCreate(name,period,IND_BWMFI,1,pars);
}
//--- se l'handle non viene creato
if(handle==INVALID_HANDLE)
{
//--- dice riguardo il fallimento e l'output del codice di errore
PrintFormat("Fallimento nel creare l'handle dell'indicatore iBWMFI per il simbolo %s/%s, codi
name,
EnumToString(period),
GetLastError());
//--- l'indicatore si ferma precocemente
return(INIT_FAILED);
}
//--- mostra il simbolo/timeframe per cui è calcolato l'indicatore tecnico Market Facilitation Inde
short_name=StringFormat("iBWMFI(%s/%s, %s)",name,EnumToString(period),
EnumToString(applied_volume));
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inizializzazione normale dell'indicatore
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//--- numero di valori copiati dall' indicatore iBWMFI
int values_to_copy;
//--- determina il numero di valori calcolati in dell'indicatore
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() returned %d, error code %d",calculated,GetLastError());
return(0);
}
//--- se è il primo inizio del calcolo dell'indicatore o se il numero di valori dell'indicatore iBW
//--- o se è necessario calcolare l'indicatore per due o più barre (significa che qualcosa è cambia
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se l' array iBWMFIBuffer è maggiore del numero di valori dell'indicatore iBWMFI per il
//--- altrimenti, copiamo meno della grandezza del buffer indicatore
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- vuol dire che non è la prima volta del calcolo dell'indicatore, e dopo l'ultima chiamat
//--- per il calcolo non viene aggiunta più di una barra
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- riempie l'array con i valori dell'indicatore Market Facilitation Index by Bill Williams
//--- se FillArraysFromBuffer restituisce false, significa che l'informazione non è ancora pronta,
if(!FillArraysFromBuffers(iBWMFIBuffer,iBWMFIColors,handle,values_to_copy)) return(0);
//--- forma il messaggio
string comm=StringFormat("%s ==> Valore aggiornato nell'indicatore %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- visualizza il messaggio di servizio sul grafico
Comment(comm);
//--- manterremo il numero di valori dell'indicatore Market Facilitation Index by Bill Williams
bars_calculated=calculated;
//--- restituisce il valore prev_calculated per la chiamata successiva
return(rates_total);
}
//+--------------------------------------------------------------------------------+
//| Riempie il buffer indicatore dall'indicatore iBWMFI |
//+--------------------------------------------------------------------------------+
bool FillArraysFromBuffers(double &values[], // buffer indicatore dei valori dell'istogramma
double &colors[], // buffer indicatore dei colori dell'istogramma
int ind_handle, // handle dell'indicatore iBWMFI
int amount // numero di valori copiati
)
{
//--- resetta codice errore
ResetLastError();
//--- riempie una parte dell'indicatore iBWMFIBuffer con valori dal buffer indicatore che ha indice
if(CopyBuffer(ind_handle,0,0,amount,values)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iBWMFI, codice errore %d",GetLastE
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- riempie una parte dell'array iBWMFIColors con valori dal buffer indicatore che ha indice 1
if(CopyBuffer(ind_handle,1,0,amount,colors)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iBWMFI, codice errore %d",GetLastE
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- tutto è ok
return(true);
}
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione indicatore |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- cancella il grafico dopo aver eliminato l'indicatore
Comment("");
}
iMomentum
La funzione restituisce l'handle del Momentum. H a un solo buffer.
int iMomentum(
string symbol, // nome simbolo
ENUM_TIMEFRAMES period, // periodo
int mom_period, // periodo medio
ENUM_APPLIED_PRICE applied_price // tipo di prezzo o handle
);
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori ENUM _TIMEFRAMES , 0 significa il corrente
timefreame.
mom_period
[ in] Periodo medio (conteggio barre) per il calcolo della variazione di prezzo.
applied_price
[in] Il prezzo utilizzato. Può essere una qualsiasi delle costanti ENUM _APPL IED_PRICE o un handle
di un altro indicatore.
Valore restituito
Restituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è più
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_iMomentum.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "L'indicatore dimostra come ottenere i dati"
#property description "dei buffers indicatore per l'indicatore tecnico iMomentum."
#property description "Il simbolo e timeframe usati per i calcoli dell'indicatore,"
#property description "vengono impostati dai parametri simbolo e periodo."
#property description "Il metodo per la creazione dell'handle è impostato attraverso il parametro '
#property description "Tutti gli altri parametri sono simili al Momentum standard."
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- tracciamento iMomentum
#property indicator_label1 "iMomentum"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrDodgerBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//+--------------------------------------------------------------------------------+
//| Enumerazione dei metodi della creazione dell'handle |
//+--------------------------------------------------------------------------------+
enum Creation
{
Call_iMomentum, // usa iMomentum
Call_IndicatorCreate // usa IndicatorCreate
};
//--- parametri di input
input Creation type=Call_iMomentum; // tipo della funzione
input int mom_period=14; // periodo di Momentum
input ENUM_APPLIED_PRICE applied_price=PRICE_CLOSE; // tipo di prezzo
input string symbol=" "; // simbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffer indicatore
double iMomentumBuffer[];
//--- variabile per memorizzare l'handle dell'indicatore iMomentum
int handle;
//--- variabile per memorizzare
string name=symbol;
//--- nome dell'indicatore sul grafico
string short_name;
//--- manterremo il numero di valori dell'indicatore Momentum
int bars_calculated=0;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- assegnazione di array al buffer indicatore
SetIndexBuffer(0,iMomentumBuffer,INDICATOR_DATA);
//--- determinare il simbolo per cui viene disegnato l'indicatore
name=symbol;
//--- eliminare gli spazi a destra e a sinistra
StringTrimRight(name);
StringTrimLeft(name);
//--- se il risultato è zero nella lunghezza della stringa 'name'
if(StringLen(name)==0)
{
//--- prende il simbolo del grafico indicatore a cui è attaccato
name=_Symbol;
}
//--- crea l'handle dell'indicatore
if(type==Call_iMomentum)
handle=iMomentum(name,period,mom_period,applied_price);
else
{
//--- riempie la struttura con i parametri dell'indicatore
MqlParam pars[2];
//--- periodo
pars[0].type=TYPE_INT;
pars[0].integer_value=mom_period;
//--- tipo di prezzo
pars[1].type=TYPE_INT;
pars[1].integer_value=applied_price;
handle=IndicatorCreate(name,period,IND_MOMENTUM,2,pars);
}
//--- se l'handle non viene creato
if(handle==INVALID_HANDLE)
{
//--- dice riguardo il fallimento e l'output del codice di errore
PrintFormat("Fallimento nel creare l'handle dell'indicatore iMomentum per il simbolo %s/%s, c
name,
EnumToString(period),
GetLastError());
//--- l'indicatore si ferma precocemente
return(INIT_FAILED);
}
//--- mostra il simbolo/timeframe per cui è calcolato l'indicatore Momentum
short_name=StringFormat("iMomentum(%s/%s, %d, %s)",name,EnumToString(period),
mom_period, EnumToString(applied_price));
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inizializzazione normale dell'indicatore
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//--- numero di valori copiati dall' indicatore iMomentum
int values_to_copy;
//--- determina il numero di valori calcolati in dell'indicatore
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() returned %d, error code %d",calculated,GetLastError());
return(0);
}
//--- se è il primo inizio del calcolo dell'indicatore o se il numero di valori dell'indicatore iMo
//--- o se è necessario calcolare l'indicatore per due o più barre (significa che qualcosa è cambia
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se l' array iMomentumBuffer è maggiore del numero di valori dell'indicatore iMomentum p
//--- altrimenti, copiamo meno della grandezza del buffer indicatore
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- vuol dire che non è la prima volta del calcolo dell'indicatore, e dopo l'ultima chiamat
//--- per il calcolo non viene aggiunta più di una barra
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- riempie l' array iMomentumBuffer con valori dell'indicatore Momentum
//--- se FillArrayFromBuffer restituisce false, significa che l'informazione non è ancora pronta, c
if(!FillArrayFromBuffer(iMomentumBuffer,handle,values_to_copy)) return(0);
//--- forma il messaggio
string comm=StringFormat("%s ==> Valore aggiornato nell'indicatore %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- visualizza il messaggio di servizio sul grafico
Comment(comm);
//--- memorizza il numero dei valori nell'indicatore Momentum
bars_calculated=calculated;
//--- restituisce il valore prev_calculated per la chiamata successiva
return(rates_total);
}
//+--------------------------------------------------------------------------------+
//| Riempie il buffer indicatore dall'indicatore iMomentum |
//+--------------------------------------------------------------------------------+
bool FillArrayFromBuffer(double &values[], // buffer indicatore dei valori Momentum
int ind_handle, // handle dell'indicatore iMomentum
int amount // numero di valori copiati
)
{
//--- resetta codice errore
ResetLastError();
//--- riempie una parte dell'array iMomentumBuffer con valori dal buffer indicatore che ha indice 0
if(CopyBuffer(ind_handle,0,0,amount,values)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iMomentum, codice errore %d",GetLa
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- tutto è ok
return(true);
}
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione indicatore |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- cancella il grafico dopo aver eliminato l'indicatore
Comment("");
}
iMFI
La funzione restituisce l'handle dell'indicatore Money Flow Index .
int iMFI(
string symbol, // nome del simbolo
ENUM_TIMEFRAMES period, // periodo
int ma_period, // periodo medio
ENUM_APPLIED_VOLUME applied_volume // tipo di volume per il calcolo
);
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori ENUM _TIMEFRAMES , 0 significa il corrente
timefreame.
ma_period
[ in] Periodo medio (conteggio barre) per i calcoli.
applied_volume
[ in] Il volume utilizzato. Può essere uno qualsiasi dei valori ENUM _APPL IED_VOL UME.
Valore restituito
Restituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è più
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_iMFI.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "L'indicatore dimostra come ottenere i dati"
#property description "dei buffers indicatore per l'indicatore tecnico iMFI."
#property description "Il simbolo e timeframe usati per i calcoli dell'indicatore,"
#property description "vengono impostati dai parametri simbolo e periodo."
#property description "Il metodo per la creazione dell'handle è impostato attraverso il parametro '
#property description "Tutti gli altri parametri sono simili al Money Flow Index standard."
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- il tracciamento di iMFI
#property indicator_label1 "iMFI"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrDodgerBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- livelli orizzontali nella finestra dell'indicatore
#property indicator_level1 20
#property indicator_level2 80
//+--------------------------------------------------------------------------------+
//| Enumerazione dei metodi della creazione dell'handle |
//+--------------------------------------------------------------------------------+
enum Creation
{
Call_iMFI, // usa iMFI
Call_IndicatorCreate // usa IndicatorCreate
};
//--- parametri di input
input Creation type=Call_iMFI; // tipo della funzione
input int ma_period=14; // periodo
input ENUM_APPLIED_VOLUME applied_volume=VOLUME_TICK; // tipo di volume
input string symbol=" "; // simbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffer indicatore
double iMFIBuffer[];
//--- variabile per memorizzare l'handle dell'indicatore iBWMFI
int handle;
//--- variabile per memorizzare
string name=symbol;
//--- nome dell'indicatore sul grafico
string short_name;
//--- manterremo il numero di valori dell'indicatore Money Flow Index
int bars_calculated=0;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- assegnazione di array al buffer indicatore
SetIndexBuffer(0,iMFIBuffer,INDICATOR_DATA);
//--- determinare il simbolo per cui viene disegnato l'indicatore
name=symbol;
//--- eliminare gli spazi a destra e a sinistra
StringTrimRight(name);
StringTrimLeft(name);
//--- se il risultato è zero nella lunghezza della stringa 'name'
if(StringLen(name)==0)
{
{
//--- numero di valori copiati dall' indicatore iMFI
int values_to_copy;
//--- determina il numero di valori calcolati in dell'indicatore
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() returned %d, error code %d",calculated,GetLastError());
return(0);
}
//--- se è il primo inizio del calcolo dell'indicatore o se il numero di valori dell'indicatore iMF
//--- o se è necessario calcolare l'indicatore per due o più barre (significa che qualcosa è cambia
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se l' array iMFIBuffer è maggiore del numero di valori dell'indicatore iMFI per il simb
//--- altrimenti, copiamo meno della grandezza del buffer indicatore
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- vuol dire che non è la prima volta del calcolo dell'indicatore, e dopo l'ultima chiamat
//--- per il calcolo non viene aggiunta più di una barra
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- riempie l'array iMFIBuffer con i valori dell'indicatore Money Flow Index
//--- se FillArrayFromBuffer restituisce false, significa che l'informazione non è ancora pronta, c
if(!FillArrayFromBuffer(iMFIBuffer,handle,values_to_copy)) return(0);
//--- forma il messaggio
string comm=StringFormat("%s ==> Valore aggiornato nell'indicatore %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- visualizza il messaggio di servizio sul grafico
Comment(comm);
//--- memorizziamo il numero di valori dell'indicatore Money Flow Indexx
bars_calculated=calculated;
//--- restituisce il valore prev_calculated per la chiamata successiva
return(rates_total);
}
//+--------------------------------------------------------------------------------+
//| Riempie il buffer indicatore dall'indicatore iMFI |
//+--------------------------------------------------------------------------------+
bool FillArrayFromBuffer(double &values[], // buffer indicatore dei valori di Money Flow Index
int ind_handle, // handle dell'indicatore iMFI
int amount // numero di valori copiati
)
{
//--- resetta codice errore
ResetLastError();
//--- riempie una parte dell'array iMFIBuffer con valori dal buffer indicatore che ha indice 0
if(CopyBuffer(ind_handle,0,0,amount,values)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iMFI, codice errore %d",GetLastErr
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- tutto è ok
return(true);
}
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione indicatore |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- cancella il grafico dopo aver eliminato l'indicatore
Comment("");
}
iMA
La funzione restituisce l'handle dell'indicatore Moving Average. H a un solo buffer.
int iMA(
string symbol, // nome simbolo
ENUM_TIMEFRAMES period, // periodo
int ma_period, // periodo medio
int ma_shift, // slittamento orizzontale
ENUM_MA_METHOD ma_method, // tipo di slittamento
ENUM_APPLIED_PRICE applied_price // tipo di prezzo o handle
);
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori ENUM _TIMEFRAMES , 0 significa il corrente
timefreame.
ma_period
[ in] Periodo medio per il calcolo della media mobile.
ma_shift
[ in] S littamento dell'indicatore rispetto al grafico dei prezzi.
ma_method
[ in] T ipo di smussamento. Può essere uno dei valori ENUM _M A_METH OD.
applied_price
[in] Il prezzo utilizzato. Può essere una qualsiasi delle costanti ENUM _APPL IED_PRICE o un handle
di un altro indicatore.
Valore restituito
Restituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è più
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_iMA.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//--- il tracciamento di iMA
#property indicator_label1 "iMA"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//+--------------------------------------------------------------------------------+
//| Enumerazione dei metodi della creazione dell'handle |
//+--------------------------------------------------------------------------------+
enum Creation
{
Call_iMA, // usa iMA
Call_IndicatorCreate // usa IndicatorCreate
};
//--- parametri di input
input Creation type=Call_iMA; // tipo della funzione
input int ma_period=10; // periodo di ma
input int ma_shift=0; // slittamento
input ENUM_MA_METHOD ma_method=MODE_SMA; // tipo di smussamento
input ENUM_APPLIED_PRICE applied_price=PRICE_CLOSE; // tipo del prezzo
input string symbol=" "; // simbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffer indicatore
double iMABuffer[];
//--- variabile per memorizzare l'handle dell'indicatore iMA
int handle;
//--- variabile per memorizzare
string name=symbol;
//--- nome dell'indicatore sul grafico
string short_name;
//--- manterremo il numero di valori nell' indicatore Moving Average
int bars_calculated=0;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- assegnazione di array al buffer indicatore
SetIndexBuffer(0,iMABuffer,INDICATOR_DATA);
iOsMA
La funzione restituisce l'handle dell'indicatore Moving Average of Oscillator. L 'oscillatore OsM A mostra
la differenza tra i valori di M ACD e la sua linea di segnale. H a un solo buffer.
int iOsMA(
string symbol, // nome simbolo
ENUM_TIMEFRAMES period, // periodo
int fast_ema_period, // periodo per Fast Moving Average
int slow_ema_period, // periodo per Slow Moving Average
int signal_period, // periodo per la loro differenza
ENUM_APPLIED_PRICE applied_price // tipo di prezzo o handle
);
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori ENUM _TIMEFRAMES , 0 significa il corrente
timefreame.
fast_ema_period
[ in] Periodo per il calcolo di Fast Moving Average.
slow_ema_period
[ in] Periodo per il calcolo di S low Moving Average.
signal_period
[ in] Periodo per il calcolo della linea S ignal.
applied_price
[in] Il prezzo utilizzato. Può essere una qualsiasi delle costanti ENUM _APPL IED_PRICE o un handle
di un altro indicatore.
Valore restituito
Restituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è più
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Nota
I n alcuni sistemi questo oscillatore è anche conosciuto come istogramma M ACD.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_iOsMA.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "L'indicatore dimostra come ottenere i dati"
#property description "dei buffers indicatore per l'indicatore tecnico iOsMA."
#property description "Il simbolo e timeframe usati per i calcoli dell'indicatore,"
#property description "vengono impostati dai parametri simbolo e periodo."
#property description "Il metodo per la creazione dell'handle è impostato attraverso il parametro '
#property description "Tutti gli altri parametri sono simili al Moving Average of Oscillator."
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- il tracciamento di iOsMA
#property indicator_label1 "iOsMA"
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_color1 clrSilver
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//+--------------------------------------------------------------------------------+
//| Enumerazione dei metodi della creazione dell'handle |
//+--------------------------------------------------------------------------------+
enum Creation
{
Call_iOsMA, // uso iOsMA
Call_IndicatorCreate // usa IndicatorCreate
};
//--- parametri di input
input Creation type=Call_iOsMA; // tipo della funzione
input int fast_ema_period=12; // periodo di fast ma
input int slow_ema_period=26; // periodo di slow ma
input int signal_period=9; // periodo medio della differenza
input ENUM_APPLIED_PRICE applied_price=PRICE_CLOSE; // tipo di prezzo
input string symbol=" "; // simbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffer indicatore
double iOsMABuffer[];
//--- variabile per memorizzare l'handle dell'indicatore iAMA
int handle;
//--- variabile per memorizzare
string name=symbol;
//--- nome dell'indicatore sul grafico
string short_name;
//--- manterremo il numero di valori nell' indicatore Moving Average
int bars_calculated=0;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- assegnazione di array al buffer indicatore
SetIndexBuffer(0,iOsMABuffer,INDICATOR_DATA);
//--- determinare il simbolo per cui viene disegnato l'indicatore
name=symbol;
//--- eliminare gli spazi a destra e a sinistra
StringTrimRight(name);
StringTrimLeft(name);
//--- se il risultato è zero nella lunghezza della stringa 'name'
if(StringLen(name)==0)
{
//--- prende il simbolo del grafico indicatore a cui è attaccato
name=_Symbol;
}
//--- crea l'handle dell'indicatore
if(type==Call_iOsMA)
handle=iOsMA(name,period,fast_ema_period,slow_ema_period,signal_period,applied_price);
else
{
//--- riempie la struttura con i parametri dell'indicatore
MqlParam pars[4];
//--- periodo di fast ma
pars[0].type=TYPE_INT;
pars[0].integer_value=fast_ema_period;
//--- periodo di slow ma
pars[1].type=TYPE_INT;
pars[1].integer_value=slow_ema_period;
//--- periodo di media di differenza tra media mobile veloce e lenta
pars[2].type=TYPE_INT;
pars[2].integer_value=signal_period;
//--- tipo di prezzo
pars[3].type=TYPE_INT;
pars[3].integer_value=applied_price;
handle=IndicatorCreate(name,period,IND_OSMA,4,pars);
}
//--- se l'handle non viene creato
if(handle==INVALID_HANDLE)
{
//--- dice riguardo il fallimento e l'output del codice di errore
PrintFormat("Fallimento nel creare l'handle dell'indicatore iOsMA per il simbolo %s/%s, codic
name,
EnumToString(period),
GetLastError());
//--- l'indicatore si ferma precocemente
return(INIT_FAILED);
}
//--- Mostra il simbolo/timeframe per cui è calcolato l'indicatore Moving Average of Oscillator
short_name=StringFormat("iOsMA(%s/%s,%d,%d,%d,%s)",name,EnumToString(period),
fast_ema_period,slow_ema_period,signal_period,EnumToString(applied_price
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inizializzazione normale dell'indicatore
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//--- numero di valori copiati dall' indicatore iOsMA
int values_to_copy;
//--- determina il numero di valori calcolati in dell'indicatore
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() returned %d, error code %d",calculated,GetLastError());
return(0);
}
//--- se è il primo inizio del calcolo dell'indicatore o se il numero di valori dell'indicatore iOs
//--- o se è necessario calcolare l'indicatore per due o più barre (significa che qualcosa è cambia
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se l' array iOsMABuffer è maggiore del numero di valori dell'indicatore iOsMA per il si
//--- altrimenti, copiamo meno della grandezza del buffer indicatore
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- vuol dire che non è la prima volta del calcolo dell'indicatore, e dopo l'ultima chiamat
//--- per il calcolo non viene aggiunta più di una barra
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- riempie gli array con valori dell'indicatore iOsMA
//--- se FillArrayFromBuffer restituisce false, significa che l'informazione non è ancora pronta, c
if(!FillArrayFromBuffer(iOsMABuffer,handle,values_to_copy)) return(0);
//--- forma il messaggio
string comm=StringFormat("%s ==> Valore aggiornato nell'indicatore %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- visualizza il messaggio di servizio sul grafico
Comment(comm);
//--- memorizza il numero di valori nell'indicatore Moving Average of Oscillator
bars_calculated=calculated;
//--- restituisce il valore prev_calculated per la chiamata successiva
return(rates_total);
}
//+--------------------------------------------------------------------------------+
//| Riempie il buffer indicatore dall'indicatore iOsMA |
//+--------------------------------------------------------------------------------+
bool FillArrayFromBuffer(double &ama_buffer[], // buffer indicatore dei valori OsMA
int ind_handle, // handle dell'indicator iOsMA
int amount // numero di valori copiati
)
{
//--- resetta codice errore
ResetLastError();
//--- riempie una parte dell'array iOsMABuffer con valori dal buffer indicatore che ha indice 0
if(CopyBuffer(ind_handle,0,0,amount,ama_buffer)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iOsMA, codice errore %d",GetLastEr
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- tutto è ok
return(true);
}
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione indicatore |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- cancella il grafico dopo aver eliminato l'indicatore
Comment("");
}
iMACD
La funzione restituisce l'handle dell' indicatore Moving Averages Convergence/Divergence. Nei sistemi
in cui Оs МА v iene chiamato istog ramma MACD, questo indicatore v iene v isualizzato come due linee.
Nel terminale client le Medie Mobili di Convergenza/Divergenza si mostrano come un istogramma.
int iMACD(
string symbol, // nome simbolo
ENUM_TIMEFRAMES period, // periodo
int fast_ema_period, // periodo per il calcolo di media Fast
int slow_ema_period, // periodo per il calcolo di media Slow
int signal_period, // periodo per la loro differenza media
ENUM_APPLIED_PRICE applied_price // tipo di prezzo o handle
);
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori ENUM _TIMEFRAMES , 0 significa il corrente
timefreame.
fast_ema_period
[ in] Periodo per il calcolo di Fast Moving Average.
slow_ema_period
[ in] Periodo per il calcolo di S low Moving Average.
signal_period
[ in] Periodo per il calcolo della linea S ignal.
applied_price
[in] Il prezzo utilizzato. Può essere una qualsiasi delle costanti ENUM _APPL IED_PRICE o un handle
di un altro indicatore.
Valore restituito
R estituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è pi ù
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Nota
I numeri del buffer sono i seguenti: 0 - M AIN_L INE, 1 - S IGNA L _L INE.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_iMACD.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "L'indicatore dimostra come ottenere i dati"
#property description "dei buffers indicatore per l'indicatore tecnico iMACD."
#property description "Il simbolo e timeframe usati per i calcoli dell'indicatore,"
#property description "vengono impostati dai parametri simbolo e periodo."
#property description "Il metodo per la creazione dell'handle è impostato attraverso il parametro '
#property description "Tutti gli altri parametri sono simili a MACD standard."
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots 2
//--- il tracciamento di MACD
#property indicator_label1 "MACD"
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_color1 clrSilver
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- il tracciamento di Signal
#property indicator_label2 "Signal"
#property indicator_type2 DRAW_LINE
#property indicator_color2 clrRed
#property indicator_style2 STYLE_DOT
#property indicator_width2 1
//+--------------------------------------------------------------------------------+
//| Enumerazione dei metodi della creazione dell'handle |
//+--------------------------------------------------------------------------------+
enum Creation
{
Call_iMACD, // uso iMACD
Call_IndicatorCreate // usa IndicatorCreate
};
//--- parametri di input
input Creation type=Call_iMACD; // tipo della funzione
input int fast_ema_period=12; // periodo di fast ma
input int slow_ema_period=26; // periodo di slow ma
input int signal_period=9; // periodo medio della differenza
input ENUM_APPLIED_PRICE applied_price=PRICE_CLOSE; // tipo di prezzo
input string symbol=" "; // simbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffers indicatore
double MACDBuffer[];
double SignalBuffer[];
//--- variabile per memorizzare l'handle dell'indicatore iMACD
int handle;
//--- variabile per memorizzare
string name=symbol;
//--- nome dell'indicatore sul grafico
string short_name;
//--- manterremo il numero di valori nell' indicatore Moving Averages Convergence/Divergence
int bars_calculated=0;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- assegnazione di array di buffer indicatori
SetIndexBuffer(0,MACDBuffer,INDICATOR_DATA);
SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);
//--- determinare il simbolo per cui viene disegnato l'indicatore
name=symbol;
//--- eliminare gli spazi a destra e a sinistra
StringTrimRight(name);
StringTrimLeft(name);
//--- se il risultato è zero nella lunghezza della stringa 'name'
if(StringLen(name)==0)
{
//--- prende il simbolo del grafico indicatore a cui è attaccato
name=_Symbol;
}
//--- crea l'handle dell'indicatore
if(type==Call_iMACD)
handle=iMACD(name,period,fast_ema_period,slow_ema_period,signal_period,applied_price);
else
{
//--- riempie la struttura con i parametri dell'indicatore
MqlParam pars[4];
//--- periodo di fast ma
pars[0].type=TYPE_INT;
pars[0].integer_value=fast_ema_period;
//--- periodo di slow ma
pars[1].type=TYPE_INT;
pars[1].integer_value=slow_ema_period;
//--- periodo di media di differenza tra media mobile veloce e lenta
pars[2].type=TYPE_INT;
pars[2].integer_value=signal_period;
//--- tipo di prezzo
pars[3].type=TYPE_INT;
pars[3].integer_value=applied_price;
handle=IndicatorCreate(name,period,IND_MACD,4,pars);
}
//--- se l'handle non viene creato
if(handle==INVALID_HANDLE)
{
//--- dice riguardo il fallimento e l'output del codice di errore
PrintFormat("Fallimento nel creare l'handle dell'indicatore iMACD per il simbolo %s/%s, codic
name,
EnumToString(period),
GetLastError());
//--- l'indicatore si ferma precocemente
return(INIT_FAILED);
}
//--- Mostra il simbolo/timeframe per cui è calcolato l'indicatore Moving Average Convergence/Diver
short_name=StringFormat("iMACD(%s/%s,%d,%d,%d,%s)",name,EnumToString(period),
fast_ema_period,slow_ema_period,signal_period,EnumToString(applied_price
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inizializzazione normale dell'indicatore
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//--- numero di valori copiati dall' indicatore iMACD
int values_to_copy;
//--- determina il numero di valori calcolati in dell'indicatore
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() returned %d, error code %d",calculated,GetLastError());
return(0);
}
//--- se è il primo inizio del calcolo dell'indicatore o se il numero di valori dell'indicatore iMA
//--- o se è necessario calcolare l'indicatore per due o più barre (significa che qualcosa è cambia
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se l' array MACDBuffer è maggiore del numero di valori dell'indicatore iMACD per il sim
//--- altrimenti, copiamo meno della grandezza del buffer indicatore
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- vuol dire che non è la prima volta del calcolo dell'indicatore, e dopo l'ultima chiamat
//--- riempie una parte dell'array SignalBuffer con valori dal buffer indicatore che ha indice 1
if(CopyBuffer(ind_handle,1,0,amount,signal_buffer)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iMACD, codice errore %d",GetLastEr
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- tutto è ok
return(true);
}
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione indicatore |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- cancella il grafico dopo aver eliminato l'indicatore
Comment("");
}
iOBV
La funzione restituisce l'handle dell' indicatore On Balance Volume. H a un solo buffer.
int iOBV(
string symbol, // nome simbolo
ENUM_TIMEFRAMES period, // periodo
ENUM_APPLIED_VOLUME applied_volume // tipo di volume per il calcolo
);
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori ENUM _TIMEFRAMES , 0 significa il corrente
timefreame.
applied_volume
[ in] Il volume utilizzato. Può essere uno qualsiasi dei valori ENUM _APPL IED_VOL UME.
Valore restituito
R estituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è pi ù
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_iOBV.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "L'indicatore dimostra come ottenere i dati"
#property description "dei buffers indicatore per l'indicatore tecnico iOBV."
#property description "Il simbolo e timeframe usati per i calcoli dell'indicatore,"
#property description "vengono impostati dai parametri simbolo e periodo."
#property description "Il metodo per la creazione dell'handle è impostato attraverso il parametro '
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- tracciamento di iOBV
#property indicator_label1 "iOBV"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrLightSeaGreen
MqlParam pars[1];
//--- tipo di volume
pars[0].type=TYPE_INT;
pars[0].integer_value=applied_volume;
handle=IndicatorCreate(name,period,IND_OBV,1,pars);
}
//--- se l'handle non viene creato
if(handle==INVALID_HANDLE)
{
//--- dice riguardo il fallimento e l'output del codice di errore
PrintFormat("Fallimento nel creare l'handle dell'indicatore iOBV per il simbolo %s/%s, codice
name,
EnumToString(period),
GetLastError());
//--- l'indicatore si ferma precocemente
return(INIT_FAILED);
}
//--- Mostra il simbolo/timeframe per cui è calcolato l'indicatore On Balance Volume
short_name=StringFormat("iOBV(%s/%s, %s)",name,EnumToString(period),
EnumToString(applied_volume));
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inizializzazione normale dell'indicatore
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//--- numero di valori copiati dall' indicatore iOBV
int values_to_copy;
//--- determina il numero di valori calcolati in dell'indicatore
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() returned %d, error code %d",calculated,GetLastError());
return(0);
}
//--- se è il primo inizio del calcolo dell'indicatore o se il numero di valori dell'indicatore iOB
//--- o se è necessario calcolare l'indicatore per due o più barre (significa che qualcosa è cambia
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione indicatore |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- cancella il grafico dopo aver eliminato l'indicatore
Comment("");
}
iSAR
La funzione restituisce l'handle dell'indicatore Parabolic S top and R everse s ystem. H a un solo buffer.
int iSAR(
string symbol, // nome simbolo
ENUM_TIMEFRAMES period, // periodo
double step, // step di incremento
double maximum // livello massimo di stop
);
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori ENUM _TIMEFRAMES , 0 significa il corrente
timefreame.
step
[ in] L 'incremento di livello di step, solitamente 0.02.
maximum
[ in] Il livello di stop massimo, di solito 0.2.
Valore restituito
Restituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è più
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_iSAR.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "L'indicatore dimostra come ottenere i dati"
#property description "dei buffers indicatore per l'indicatore tecnico iSAR."
#property description "Il simbolo e timeframe usati per i calcoli dell'indicatore,"
#property description "vengono impostati dai parametri simbolo e periodo."
#property description "Il metodo per la creazione dell'handle è impostato attraverso il parametro '
#property description "Tutti gli altri parametri sono simili al Parabolic Stop and Reverse."
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//--- tracciamento di iSAR
#property indicator_label1 "iSAR"
#property indicator_type1 DRAW_ARROW
#property indicator_color1 clrBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//+--------------------------------------------------------------------------------+
//| Enumerazione dei metodi della creazione dell'handle |
//+--------------------------------------------------------------------------------+
enum Creation
{
Call_iSAR, // usa iSAR
Call_IndicatorCreate // usa IndicatorCreate
};
//--- parametri di input
input Creation type=Call_iSAR; // tipo della funzione
input double step=0.02; // step - il fattore di accelerazione per
input double maximum=0.2; // valore massimo degli step
input string symbol=" "; // simbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffers indicatore
double iSARBuffer[];
//--- variabile per memorizzare l'handle dell'indicatore iSAR
int handle;
//--- variabile per memorizzare
string name=symbol;
//--- nome dell'indicatore sul grafico
string short_name;
//--- manterremo il numero di valori nell' indicatore Parabolic SAR
int bars_calculated=0;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- assegnazione di array al buffer indicatore
SetIndexBuffer(0,iSARBuffer,INDICATOR_DATA);
//--- imposta un codice simbolo dal set di caratteri Wingdings per la proprietà PLOT_ARROW per la v
PlotIndexSetInteger(0,PLOT_ARROW,159);
//--- determinare il simbolo per cui viene disegnato l'indicatore
name=symbol;
//--- eliminare gli spazi a destra e a sinistra
StringTrimRight(name);
StringTrimLeft(name);
//--- se il risultato è zero nella lunghezza della stringa 'name'
if(StringLen(name)==0)
{
//--- prende il simbolo del grafico indicatore a cui è attaccato
name=_Symbol;
}
//--- crea l'handle dell'indicatore
if(type==Call_iSAR)
handle=iSAR(name,period,step,maximum);
else
{
//--- riempie la struttura con i parametri dell'indicatore
MqlParam pars[2];
//--- valore step
pars[0].type=TYPE_DOUBLE;
pars[0].double_value=step;
//--- limite del valore di step che può essere utilizzato per i calcoli
pars[1].type=TYPE_DOUBLE;
pars[1].double_value=maximum;
handle=IndicatorCreate(name,period,IND_SAR,2,pars);
}
//--- se l'handle non viene creato
if(handle==INVALID_HANDLE)
{
//--- dice riguardo il fallimento e l'output del codice di errore
PrintFormat("Fallimento nel creare l'handle dell'indicatore iSAR per il simbolo %s/%s, codice
name,
EnumToString(period),
GetLastError());
//--- l'indicatore si ferma precocemente
return(INIT_FAILED);
}
//--- mostra il simbolo/timeframe per cui è calcolato l'indicatore Parabolic SAR
short_name=StringFormat("iSAR(%s/%s, %G, %G)",name,EnumToString(period),
step,maximum);
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inizializzazione normale dell'indicatore
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//--- riempie una parte dell'array iSARBuffer con valori dal buffer indicatore che ha indice 0
if(CopyBuffer(ind_handle,0,0,amount,sar_buffer)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iSAR, codice errore %d",GetLastErr
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- tutto è ok
return(true);
}
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione indicatore |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- cancella il grafico dopo aver eliminato l'indicatore
Comment("");
}
iRSI
La funzione restituisce l'handle dell'indicatore R elative S trength Index . H a un solo buffer.
int iRSI(
string symbol, // nome del simbolo
ENUM_TIMEFRAMES period, // periodo
int ma_period, // periodo medio
ENUM_APPLIED_PRICE applied_price // tipo di prezzo o handle
);
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori ENUM _TIMEFRAMES , 0 significa il corrente
timefreame.
ma_period
[ in] Il periodo medio per il calcolo dell'indicatore.
applied_price
[in] Il prezzo utilizzato. Può essere una qualsiasi delle costanti ENUM _APPL IED_PRICE o un handle
di un altro indicatore.
Valore restituito
Restituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è più
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_iRSI.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "L'indicatore dimostra come ottenere i dati"
#property description "dei buffers indicatore per l'indicatore tecnico iRSI."
#property description "Il simbolo e timeframe usati per i calcoli dell'indicatore,"
#property description "vengono impostati dai parametri simbolo e periodo."
#property description "Il metodo per la creazione dell'handle è impostato attraverso il parametro '
#property description "Tutti gli altri parametri sono simili al Relative Strength Index standard."
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- tracciamento di iRSI
#property indicator_label1 "iRSI"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrDodgerBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- limiti per la visualizzazione dei valori nella finestra dell'indicatore
#property indicator_maximum 100
#property indicator_minimum 0
//--- livelli orizzontali nella finestra dell'indicatore
#property indicator_level1 70.0
#property indicator_level2 30.0
//+--------------------------------------------------------------------------------+
//| Enumerazione dei metodi della creazione dell'handle |
//+--------------------------------------------------------------------------------+
enum Creation
{
Call_iRSI, // usa iRSI
Call_IndicatorCreate // usa IndicatorCreate
};
//--- parametri di input
input Creation type=Call_iRSI; // tipo della funzione
input int ma_period=14; // periodo di media
input ENUM_APPLIED_PRICE applied_price=PRICE_CLOSE; // tipo del prezzo
input string symbol=" "; // simbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffer indicatore
double iRSIBuffer[];
//--- variabile per memorizzare l'handle dell'indicatore iRSI
int handle;
//--- variabile per memorizzare
string name=symbol;
//--- nome dell'indicatore sul grafico
string short_name;
//--- manterremo il numero di valori dell'indicatore Relative Strength Index
int bars_calculated=0;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- assegnazione di array al buffer indicatore
SetIndexBuffer(0,iRSIBuffer,INDICATOR_DATA);
//--- determinare il simbolo per cui viene disegnato l'indicatore
name=symbol;
//--- eliminare gli spazi a destra e a sinistra
StringTrimRight(name);
StringTrimLeft(name);
//--- se il risultato è zero nella lunghezza della stringa 'name'
if(StringLen(name)==0)
{
//--- prende il simbolo del grafico indicatore a cui è attaccato
name=_Symbol;
}
//--- crea l'handle dell'indicatore
if(type==Call_iRSI)
handle=iRSI(name,period,ma_period,applied_price);
else
{
//--- riempie la struttura con i parametri dell'indicatore
MqlParam pars[2];
//--- periodo della media mobile
pars[0].type=TYPE_INT;
pars[0].integer_value=ma_period;
//--- limite del valore di step che può essere utilizzato per i calcoli
pars[1].type=TYPE_INT;
pars[1].integer_value=applied_price;
handle=IndicatorCreate(name,period,IND_RSI,2,pars);
}
//--- se l'handle non viene creato
if(handle==INVALID_HANDLE)
{
//--- dice riguardo il fallimento e l'output del codice di errore
PrintFormat("Fallimento nel creare l'handle dell'indicatore iRSI per il simbolo %s/%s, codice
name,
EnumToString(period),
GetLastError());
//--- l'indicatore si ferma precocemente
return(INIT_FAILED);
}
//--- mostra il simbolo/timeframe per cui è calcolato l'indicatore tecnico Relative Strength Index
short_name=StringFormat("iRSI(%s/%s, %d, %d)",name,EnumToString(period),
ma_period,applied_price);
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inizializzazione normale dell'indicatore
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
iRVI
La funzione restituisce l'handle dell'indicatore R elative Vigor Index .
int iRVI(
string symbol, // nome simbolo
ENUM_TIMEFRAMES period, // periodo
int ma_period // periodo medio
);
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori ENUM _TIMEFRAMES , 0 significa il corrente
timefreame.
ma_period
[ in] Il periodo medio per il calcolo dell'indicatore RVI.
Valore restituito
R estituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è pi ù
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Nota
I numeri del buffer sono i seguenti: 0 - M AIN_L INE, 1 - S IGNA L _L INE.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_iRVI.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "L'indicatore dimostra come ottenere i dati"
#property description "dei buffers indicatore per l'indicatore tecnico iRVI."
#property description "Il simbolo e timeframe usati per i calcoli dell'indicatore,"
#property description "vengono impostati dai parametri simbolo e periodo."
#property description "Il metodo per la creazione dell'handle è impostato attraverso il parametro '
#property description "Tutti gli altri parametri sono simili al Relative Vigor Index standard."
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots 2
//--- il tracciamento di RVI
#property indicator_label1 "RVI"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- il tracciamento di Signal
#property indicator_label2 "Signal"
#property indicator_type2 DRAW_LINE
#property indicator_color2 clrRed
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//+--------------------------------------------------------------------------------+
//| Enumerazione dei metodi della creazione dell'handle |
//+--------------------------------------------------------------------------------+
enum Creation
{
Call_iRVI, // uso iRVI
Call_IndicatorCreate // usa IndicatorCreate
};
//--- parametri di input
input Creation type=Call_iRVI; // tipo della funzione
input int ma_period=10; // periodo per i calcoli
input string symbol=" "; // simbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffers indicatore
double RVIBuffer[];
double SignalBuffer[];
//--- variabile per memorizzare l'handle dell'indicatore iRVI
int handle;
//--- variabile per memorizzare
string name=symbol;
//--- nome dell'indicatore sul grafico
string short_name;
//--- manterremo il numero di valori dell'indicatore Relative Vigor Index
int bars_calculated=0;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- assegnazione di array di buffer indicatori
SetIndexBuffer(0,RVIBuffer,INDICATOR_DATA);
SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);
//--- determinare il simbolo per cui viene disegnato l'indicatore
name=symbol;
//--- eliminare gli spazi a destra e a sinistra
StringTrimRight(name);
StringTrimLeft(name);
//--- se il risultato è zero nella lunghezza della stringa 'name'
if(StringLen(name)==0)
{
//--- prende il simbolo del grafico indicatore a cui è attaccato
name=_Symbol;
}
//--- crea l'handle dell'indicatore
if(type==Call_iRVI)
handle=iRVI(name,period,ma_period);
else
{
//--- riempie la struttura con i parametri dell'indicatore
MqlParam pars[1];
//--- periodo per i calcoli
pars[0].type=TYPE_INT;
pars[0].integer_value=ma_period;
handle=IndicatorCreate(name,period,IND_RVI,1,pars);
}
//--- se l'handle non viene creato
if(handle==INVALID_HANDLE)
{
//--- dice riguardo il fallimento e l'output del codice di errore
PrintFormat("Fallimento nel creare l'handle dell'indicatore iRVI per il simbolo %s/%s, codice
name,
EnumToString(period),
GetLastError());
//--- l'indicatore si ferma precocemente
return(INIT_FAILED);
}
//--- mostra il simbolo/timeframe per cui è calcolato l'indicatore tecnico Relative Vigor Index
short_name=StringFormat("iRVI(%s/%s, %d, %d)",name,EnumToString(period),ma_period);
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inizializzazione normale dell'indicatore
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//--- numero di valori copiati dall' indicatore RVI
int values_to_copy;
//--- determina il numero di valori calcolati in dell'indicatore
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() returned %d, error code %d",calculated,GetLastError());
return(0);
}
//--- se è il primo inizio del calcolo dell'indicatore o se il numero di valori dell'indicatore iRV
//--- o se è necessario calcolare l'indicatore per due o più barre (significa che qualcosa è cambia
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se l' array RVIBuffer è maggiore del numero di valori dell'indicatore iRVI per il simbo
//--- altrimenti, copiamo meno della grandezza del buffer indicatore
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- vuol dire che non è la prima volta del calcolo dell'indicatore, e dopo l'ultima chiamat
//--- per il calcolo non viene aggiunta più di una barra
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- riempie gli array con valori dell'indicatore iRVI
//--- se FillArrayFromBuffer restituisce false, significa che l'informazione non è ancora pronta, c
if(!FillArrayFromBuffer(RVIBuffer,SignalBuffer,handle,values_to_copy)) return(0);
//--- forma il messaggio
string comm=StringFormat("%s ==> Valore aggiornato nell'indicatore %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- visualizza il messaggio di servizio sul grafico
Comment(comm);
//--- memorizziamo il numero di valori dell'indicatore Relative Vigor Index
bars_calculated=calculated;
//--- restituisce il valore prev_calculated per la chiamata successiva
return(rates_total);
}
//+--------------------------------------------------------------------------------+
//| Riempie il buffer indicatore dall'indicatore iRVI |
//+--------------------------------------------------------------------------------+
bool FillArrayFromBuffer(double &rvi_buffer[], // buffer indicatore dei valori Relative Vigor I
double &signal_buffer[], // buffer indicatore della linea di segnale
int ind_handle, // handle dell'indicatore iRVI
int amount // numero dei valori copiati
)
{
iStdDev
La funzione restituisce l'handle dell'indicatore S tandard Deviation. H a un solo buffer.
int iStdDev(
string symbol, // nome del simbolo
ENUM_TIMEFRAMES period, // periodo
int ma_period, // periodo medio
int ma_shift, // slittamento orizzontale
ENUM_MA_METHOD ma_method, // tipo di smussamento
ENUM_APPLIED_PRICE applied_price // tipo di prezzo o handle
);
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori ENUM _TIMEFRAMES , 0 significa il corrente
timefreame.
ma_period
[ in] Periodo medio per il calcolo degli indicatori.
ma_shift
[ in] S littamento dell'indicatore rispetto al grafico dei prezzi.
ma_method
[ in] T ipo della media. Può essere uno qualsiasi dei valori ENUM _M A_METH OD.
applied_price
[in] Il prezzo utilizzato. Può essere una qualsiasi delle costanti ENUM _APPL IED_PRICE o un handle
di un altro indicatore.
Valore restituito
Restituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è più
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_iStdDev.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- il tracciamento di iStdDev
#property indicator_label1 "iStdDev"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrMediumSeaGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//+--------------------------------------------------------------------------------+
//| Enumerazione dei metodi della creazione dell'handle |
//+--------------------------------------------------------------------------------+
enum Creation
{
Call_iStdDev, // usa iStdDev
Call_IndicatorCreate // usa IndicatorCreate
};
//--- parametri di input
input Creation type=Call_iStdDev; // tipo della funzione
input int ma_period=20; // periodo di media
input int ma_shift=0; // slittamento
input ENUM_MA_METHOD ma_method=MODE_SMA; // tipo di smussamento
input ENUM_APPLIED_PRICE applied_price=PRICE_CLOSE; // tipo di prezzo
input string symbol=" "; // simbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffer indicatore
double iStdDevBuffer[];
//--- variabile per memorizzare l'handle dell'indicatore iStdDev
int handle;
//--- variabile per memorizzare
string name=symbol;
//--- nome dell'indicatore sul grafico
string short_name;
//--- manterremo il numero di valori nell' indicatore Standard Deviation
int bars_calculated=0;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- assegnazione di array al buffer indicatore
SetIndexBuffer(0,iStdDevBuffer,INDICATOR_DATA);
iStochastic
La funzione restituisce l'handle dell'indicatore S tochastic Oscillator.
int iStochastic(
string symbol, // nome simbolo
ENUM_TIMEFRAMES period, // periodo
int Kperiod, // K-period (numero di barre per il calcolo)
int Dperiod, // D-period (periodo del primo slittamento)
int slowing, // slittamento finale
ENUM_MA_METHOD ma_method, // tipo di slittamento
ENUM_STO_PRICE price_field // metodo di calcolo stocastico
);
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori ENUM _TIMEFRAMES , 0 significa il corrente
timefreame.
Kperiod
[ in] Periodo medio (conteggio barre) per il calcolo linea .
%K
Dperiod
[ in] Periodo medio (conteggio barre) per il calcolo linea %D .
slowing
[ in] Valore S lowing.
ma_method
[ in] T ipo della media. Può essere uno qualsiasi dei valori ENUM _M A_METH OD.
price_field
[ in] Parametro di selezione prezzo per i calcoli. Può essere uno dei valori ENUM _S T O_PRICE.
Valore restituito
Restituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è più
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Nota
I numeri di buffer: 0 - M AIN_L INE, 1 - S IGNA L _L INE.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_iStochastic.mq5 |
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots 2
//--- il tracciamento Stochastic
#property indicator_label1 "Stochastic"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrLightSeaGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- il tracciamento di Signal
#property indicator_label2 "Signal"
#property indicator_type2 DRAW_LINE
#property indicator_color2 clrRed
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//--- imposta il limite dei valori degli indicatori
#property indicator_minimum 0
#property indicator_maximum 100
//--- livelli orizzontali nella finestra dell'indicatore
#property indicator_level1 -100.0
#property indicator_level2 100.0
//+--------------------------------------------------------------------------------+
//| Enumerazione dei metodi della creazione dell'handle |
//+--------------------------------------------------------------------------------+
enum Creation
{
Call_iStochastic, // usa iStochastic
Call_IndicatorCreate // usa IndicatorCreate
};
//--- parametri di input
input Creation type=Call_iStochastic; // tipo della funzione
input int Kperiod=5; // il periodo K (il numero di barre per il ca
input int Dperiod=3; // il periodo D (il periodo di smussamento pr
input int slowing=3; // periodo di smussamento finale
input ENUM_MA_METHOD ma_method=MODE_SMA; // tipo di smussamento
input ENUM_STO_PRICE price_field=STO_LOWHIGH; // metodo per il calcolo di Stochastic
pars[3].type=TYPE_INT;
pars[3].integer_value=ma_method;
//--- metodo di calcolo dello Stochastic
pars[4].type=TYPE_INT;
pars[4].integer_value=price_field;
handle=IndicatorCreate(name,period,IND_STOCHASTIC,5,pars);
}
//--- se l'handle non viene creato
if(handle==INVALID_HANDLE)
{
//--- dice riguardo il fallimento e l'output del codice di errore
PrintFormat("Fallimento nel creare l'handle dell'indicatore iStochastic per il simbolo %s/%s,
name,
EnumToString(period),
GetLastError());
//--- l'indicatore si ferma precocemente
return(INIT_FAILED);
}
//--- mostra il simbolo/timeframe per cui è calcolato l'indicatore Stochastic Oscillator
short_name=StringFormat("iStochastic(%s/%s, %d, %d, %d, %s, %s)",name,EnumToString(period),
Kperiod,Dperiod,slowing,EnumToString(ma_method),EnumToString(price_field
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inizializzazione normale dell'indicatore
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//--- numero di valori copiati dall' indicatore iStochastic
int values_to_copy;
//--- determina il numero di valori calcolati in dell'indicatore
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() returned %d, error code %d",calculated,GetLastError());
return(0);
}
//--- se è il primo inizio del calcolo dell'indicatore o se il numero di valori dell'indicatore iSt
//--- o se è necessario calcolare l'indicatore per due o più barre (significa che qualcosa è cambia
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se l' array StochasticBuffer è maggiore del numero di valori dell'indicatore iStochasti
//--- altrimenti, copiamo meno della grandezza del buffer indicatore
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- vuol dire che non è la prima volta del calcolo dell'indicatore, e dopo l'ultima chiamat
//--- per il calcolo non viene aggiunta più di una barra
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- riempie gli array con valori dell'indicatore iStochastic
//--- se FillArraysFromBuffer restituisce false, significa che l'informazione non è ancora pronta,
if(!FillArraysFromBuffers(StochasticBuffer,SignalBuffer,handle,values_to_copy)) return(0);
//--- forma il messaggio
string comm=StringFormat("%s ==> Valore aggiornato nell'indicatore %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- visualizza il messaggio di servizio sul grafico
Comment(comm);
//--- memorizzare il numero di valori dell'indicatore Stochastic Oscillator
bars_calculated=calculated;
//--- restituisce il valore prev_calculated per la chiamata successiva
return(rates_total);
}
//+--------------------------------------------------------------------------------+
//| Riempie il buffer indicatore dall'indicatore iStochastic |
//+--------------------------------------------------------------------------------+
bool FillArraysFromBuffers(double &main_buffer[], // buffer indicatore dei valori di Stochastic
double &signal_buffer[], // buffer indicatore della linea di segnale
int ind_handle, // handle dell'indicatore iStochastic
int amount // numero di valori copiati
)
{
//--- resetta codice errore
ResetLastError();
//--- riempie una parte dell'array iBullsPowerBuffer con valori dal buffer indicatore che ha indice
if(CopyBuffer(ind_handle,MAIN_LINE,0,amount,main_buffer)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iStochastic, codice errore %d",Get
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- riempie una parte dell'array SignalBuffer con valori dal buffer indicatore che ha indice 1
if(CopyBuffer(ind_handle,SIGNAL_LINE,0,amount,signal_buffer)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iStochastic, codice errore %d",Get
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- tutto è ok
return(true);
}
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione indicatore |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- cancella il grafico dopo aver eliminato l'indicatore
Comment("");
}
iTEMA
La funzione restituisce l'handle dell'indicatore T riple Ex ponential Moving Average. H a un solo buffer.
int iTEMA(
string symbol, // nome del simbolo
ENUM_TIMEFRAMES period, // periodo
int ma_period, // periodo medio
int ma_shift, // slittamento orizzontale dell'indicatore
ENUM_APPLIED_PRICE applied_price // tipo di prezzo o handle
);
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori ENUM _TIMEFRAMES , 0 significa il corrente
timefreame.
ma_period
[ in] Periodo medio (conteggio barre) per il calcolo.
ma_shift
[ in] S littamento dell'indicatore relativo al grafico dei prezzi.
applied_price
[in] Il prezzo utilizzato. Può essere una qualsiasi delle costanti ENUM _APPL IED_PRICE o un handle
di un altro indicatore.
Valore restituito
R estituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è pi ù
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_iTEMA.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "L'indicatore dimostra come ottenere i dati"
#property description "dei buffers indicatore per l'indicatore tecnico iTEMA."
#property description "Il simbolo e timeframe usati per i calcoli dell'indicatore,"
#property description "vengono impostati dai parametri simbolo e periodo."
#property description "Il metodo per la creazione dell'handle è impostato attraverso il parametro '
#property description "Tutti gli altri parametri sono simili al Triple Exponential Moving Average."
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//--- il tracciamento di iTEMA
#property indicator_label1 "iTEMA"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//+--------------------------------------------------------------------------------+
//| Enumerazione dei metodi della creazione dell'handle |
//+--------------------------------------------------------------------------------+
enum Creation
{
Call_iTEMA, // uso iTEMA
Call_IndicatorCreate // usa IndicatorCreate
};
//--- parametri di input
input Creation type=Call_iTEMA; // tipo della funzione
input int ma_period=14; // periodo di media
input int ma_shift=0; // slittamento
input ENUM_APPLIED_PRICE applied_price=PRICE_CLOSE; // tipo di prezzo
input string symbol=" "; // simbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffer indicatore
double iTEMABuffer[];
//--- variabile per memorizzare l'handle dell'indicatore iTEMA
int handle;
//--- variabile per memorizzare
string name=symbol;
//--- nome dell'indicatore sul grafico
string short_name;
//--- manterremo il numero di valori nell' indicatore Triple Exponential Moving Average
int bars_calculated=0;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- assegnazione di array al buffer indicatore
SetIndexBuffer(0,iTEMABuffer,INDICATOR_DATA);
//--- imposta lo slittamento
PlotIndexSetInteger(0,PLOT_SHIFT,ma_shift);
//--- determinare il simbolo per cui viene disegnato l'indicatore
name=symbol;
//--- eliminare gli spazi a destra e a sinistra
StringTrimRight(name);
StringTrimLeft(name);
//--- se il risultato è zero nella lunghezza della stringa 'name'
if(StringLen(name)==0)
{
//--- prende il simbolo del grafico indicatore a cui è attaccato
name=_Symbol;
}
//--- crea l'handle dell'indicatore
if(type==Call_iTEMA)
handle=iTEMA(name,period,ma_period,ma_shift,applied_price);
else
{
//--- riempie la struttura con i parametri dell'indicatore
MqlParam pars[3];
//--- periodo
pars[0].type=TYPE_INT;
pars[0].integer_value=ma_period;
//--- slittamento
pars[1].type=TYPE_INT;
pars[1].integer_value=ma_shift;
//--- tipo di prezzo
pars[2].type=TYPE_INT;
pars[2].integer_value=applied_price;
handle=IndicatorCreate(name,period,IND_TEMA,3,pars);
}
//--- se l'handle non viene creato
if(handle==INVALID_HANDLE)
{
//--- dice riguardo il fallimento e l'output del codice di errore
PrintFormat("Fallimento nel creare l'handle dell'indicatore iTEMA per il simbolo %s/%s, codic
name,
EnumToString(period),
GetLastError());
//--- l'indicatore si ferma precocemente
return(INIT_FAILED);
}
//--- mostra il simbolo/timeframe per cui è calcolato l'indicatore Triple Exponential Moving Averag
short_name=StringFormat("iTEMA(%s/%s, %d, %d, %s)",name,EnumToString(period),
ma_period,ma_shift,EnumToString(applied_price));
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inizializzazione normale dell'indicatore
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
iTriX
La funzione restituisce l'handle dell'indicatore T riple Ex ponential Moving A verages Oscillator. H a un
solo buffer.
int iTriX(
string symbol, // nome del simbolo
ENUM_TIMEFRAMES period, // periodo
int ma_period, // periodo medio
ENUM_APPLIED_PRICE applied_price // tipo di prezzo o handle
);
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori ENUM _TIMEFRAMES , 0 significa il corrente
timefreame.
ma_period
[ in] Periodo medio (conteggio barre) per i calcoli.
applied_price
[in] Il prezzo utilizzato. Può essere una qualsiasi delle costanti ENUM _APPL IED_PRICE o un handle
di un altro indicatore.
Valore restituito
R estituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è pi ù
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_iTriX.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "L'indicatore dimostra come ottenere i dati"
#property description "dei buffers indicatore per l'indicatore tecnico iTriX."
#property description "Il simbolo e timeframe usati per i calcoli dell'indicatore,"
#property description "vengono impostati dai parametri simbolo e periodo."
#property description "Il metodo per la creazione dell'handle è impostato attraverso il parametro '
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- il tracciamento di iTriX
#property indicator_label1 "iTriX"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//+--------------------------------------------------------------------------------+
//| Enumerazione dei metodi della creazione dell'handle |
//+--------------------------------------------------------------------------------+
enum Creation
{
Call_iTriX, // uso iTriX
Call_IndicatorCreate // usa IndicatorCreate
};
//--- parametri di input
input Creation type=Call_iTriX; // tipo della funzione
input int ma_period=14; // periodo
input ENUM_APPLIED_PRICE applied_price=PRICE_CLOSE; // tipo di prezzo
input string symbol=" "; // simbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffer indicatore
double iTriXBuffer[];
//--- variabile per memorizzare l'handle dell'indicatore iTriX
int handle;
//--- variabile per memorizzare
string name=symbol;
//--- nome dell'indicatore sul grafico
string short_name;
//--- manterremo il numero di valori nell' indicatore Triple Exponential Moving Averages Oscillator
int bars_calculated=0;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- assegnazione di array al buffer indicatore
SetIndexBuffer(0,iTriXBuffer,INDICATOR_DATA);
//--- determinare il simbolo per cui viene disegnato l'indicatore
name=symbol;
//--- eliminare gli spazi a destra e a sinistra
StringTrimRight(name);
StringTrimLeft(name);
//--- se il risultato è zero nella lunghezza della stringa 'name'
if(StringLen(name)==0)
{
//--- prende il simbolo del grafico indicatore a cui è attaccato
name=_Symbol;
}
//--- crea l'handle dell'indicatore
if(type==Call_iTriX)
handle=iTriX(name,period,ma_period,applied_price);
else
{
//--- riempie la struttura con i parametri dell'indicatore
MqlParam pars[2];
//--- periodo
pars[0].type=TYPE_INT;
pars[0].integer_value=ma_period;
//--- tipo di prezzo
pars[1].type=TYPE_INT;
pars[1].integer_value=applied_price;
handle=IndicatorCreate(name,period,IND_TRIX,2,pars);
}
//--- se l'handle non viene creato
if(handle==INVALID_HANDLE)
{
//--- dice riguardo il fallimento e l'output del codice di errore
PrintFormat("Fallimento nel creare l'handle dell'indicatore iTriX per il simbolo %s/%s, codic
name,
EnumToString(period),
GetLastError());
//--- l'indicatore si ferma precocemente
return(INIT_FAILED);
}
//--- mostra il simbolo/timeframe per cui è calcolato l'indicatore Triple Exponential Moving Averag
short_name=StringFormat("iTriX(%s/%s, %d, %s)",name,EnumToString(period),
ma_period,EnumToString(applied_price));
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inizializzazione normale dell'indicatore
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//--- numero di valori copiati dall' indicatore iTriX
int values_to_copy;
//--- determina il numero di valori calcolati in dell'indicatore
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() returned %d, error code %d",calculated,GetLastError());
return(0);
}
//--- se è il primo inizio del calcolo dell'indicatore o se il numero di valori dell'indicatore iTr
//--- o se è necessario calcolare l'indicatore per due o più barre (significa che qualcosa è cambia
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se l' array iTriXBuffer è maggiore del numero di valori dell'indicatore iTriX per il si
//--- altrimenti, copiamo meno della grandezza del buffer indicatore
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- vuol dire che non è la prima volta del calcolo dell'indicatore, e dopo l'ultima chiamat
//--- per il calcolo non viene aggiunta più di una barra
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- riempie l' array con valori dell'indicatore Triple Exponential Moving Averages Oscillator
//--- se FillArrayFromBuffer restituisce false, significa che l'informazione non è ancora pronta, c
if(!FillArrayFromBuffer(iTriXBuffer,handle,values_to_copy)) return(0);
//--- forma il messaggio
string comm=StringFormat("%s ==> Valore aggiornato nell'indicatore %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- visualizza il messaggio di servizio sul grafico
Comment(comm);
//--- memorizza il numero di valori nell'indicatore Triple Exponential Moving Averages Oscillator
bars_calculated=calculated;
//--- restituisce il valore prev_calculated per la chiamata successiva
return(rates_total);
}
//+--------------------------------------------------------------------------------+
//| Riempie il buffer indicatore dall'indicatore iTriX |
//+--------------------------------------------------------------------------------+
bool FillArrayFromBuffer(double &trix_buffer[], // buffer indicatore dei valori di Triple Exponenti
int ind_handle, // handle dell'indicatore iTriX
int amount // numero di valori copiati
)
{
//--- resetta codice errore
ResetLastError();
//--- riempie una parte dell'array iBullsPowerBuffer con valori dal buffer indicatore che ha indice
if(CopyBuffer(ind_handle,0,0,amount,trix_buffer)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iTriX, codice errore %d",GetLastEr
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- tutto è ok
return(true);
}
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione indicatore |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- cancella il grafico dopo aver eliminato l'indicatore
Comment("");
}
iW PR
La funzione restituisce l'handle di indicatore Larry W illiams ' Percent R ange. H a un solo buffer.
int iWPR(
string symbol, // nome simbolo
ENUM_TIMEFRAMES period, // periodo
int calc_period // periodo medio
);
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori ENUM _TIMEFRAMES , 0 significa il corrente
timefreame.
calc_period
[ in] Periodo (conteggio barre) per i calcoli dell'indicatore.
Valore restituito
R estituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è pi ù
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_iWPR.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "L'indicatore dimostra come ottenere i dati"
#property description "dei buffers indicatore per l'indicatore tecnico iWPR."
#property description "Il simbolo e timeframe usati per i calcoli dell'indicatore,"
#property description "vengono impostati dai parametri simbolo e periodo."
#property description "Il metodo per la creazione dell'handle è impostato attraverso il parametro '
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- il tracciamento di iWPR
#property indicator_label1 "iWPR"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrCyan
return(false);
}
//--- tutto è ok
return(true);
}
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione indicatore |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- cancella il grafico dopo aver eliminato l'indicatore
Comment("");
}
iVIDyA
La funzione restituisce l'handle dell'indicatore Variable Index Dy namic Average. H a un solo buffer.
int iVIDyA(
string symbol, // nome del simbolo
ENUM_TIMEFRAMES period, // periodo
int cmo_period, // periodo per il Chande Momentum
int ema_period, // periodo di smussamento EMA
int ma_shift, // slittamento orizzontale sul grafico dei prezzi
ENUM_APPLIED_PRICE applied_price // tipo di prezzo o handle
);
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori ENUM _TIMEFRAMES , 0 significa il corrente
timefreame.
cmo_period
[ in] Periodo (conteggio barre) per il calcolo di Chande Momentum Oscillator.
ema_period
[ in] Periodo EM A (conteggio barre) per i calcoli del fattore si smussamento.
ma_shift
[ in] S littamento dell'indicatore rispetto al grafico dei prezzi.
applied_price
[in] Il prezzo utilizzato. Può essere una qualsiasi delle costanti ENUM _APPL IED_PRICE o un handle
di un altro indicatore.
Valore restituito
Restituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è più
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_iVIDyA.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//--- il tracciamento di iVIDyA
#property indicator_label1 "iVIDyA"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//+--------------------------------------------------------------------------------+
//| Enumerazione dei metodi della creazione dell'handle |
//+--------------------------------------------------------------------------------+
enum Creation
{
Call_iVIDyA, // uso iVIDyA
Call_IndicatorCreate // usa IndicatorCreate
};
//--- parametri di input
input Creation type=Call_iVIDyA; // tipo della funzione
input int cmo_period=15; // il periodo Chande Momentum
input int ema_period=12; // periodo per il fattore di smussamento
input int ma_shift=0; // slittamento
input ENUM_APPLIED_PRICE applied_price=PRICE_CLOSE; // tipo di prezzo
input string symbol=" "; // simbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
//--- buffer indicatore
double iVIDyABuffer[];
//--- variabile per memorizzare l'handle dell'indicatore iVIDyA
int handle;
//--- variabile per memorizzare
string name=symbol;
//--- nome dell'indicatore sul grafico
string short_name;
//--- manterremo il numero di valori nell' indicatore Variable Index Dynamic Average
int bars_calculated=0;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- assegnazione di array al buffer indicatore
SetIndexBuffer(0,iVIDyABuffer,INDICATOR_DATA);
iVolumes
La funzione restituisce l'handle dell'indicatore Volumes. H a un solo buffer.
int iVolumes(
string symbol, // nome del simbolo
ENUM_TIMEFRAMES period, // periodo
ENUM_APPLIED_VOLUME applied_volume // tipo di volume per il calcolo
)
Parametri
symbol
[ in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare
l'indicatore. Il valore NULL significa il simbolo corrente.
period
[in] Il valore del periodo può essere uno dei valori ENUM _TIMEFRAMES , 0 significa il corrente
timefreame.
applied_volume
[ in] I l volume usato. Può essere uno qualsiasi dei valori ENUM _APPL IED_VOL UME.
Valore restituito
R estituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce
INVA L ID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è pi ù
utilizzato, utilizzando la funzione IndicatorR elease(), al quale l'handle indicatore viene passato.
Esempio:
//+--------------------------------------------------------------------------------+
//| Demo_iVolumes.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. | //| |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "L'indicatore dimostra come ottenere i dati"
#property description "dei buffers indicatore per l'indicatore tecnico iVolumes."
#property description "Il simbolo e timeframe usati per i calcoli dell'indicatore,"
#property description "vengono impostati dai parametri simbolo e periodo."
#property description "Il metodo per la creazione dell'handle è impostato attraverso il parametro '
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots 1
//--- il tracciamento iVolumes
#property indicator_label1 "iVolumes"
#property indicator_type1 DRAW_COLOR_HISTOGRAM
#property indicator_color1 clrGreen, clrRed
{
//--- riempie la struttura con i parametri dell'indicatore
MqlParam pars[1];
//--- tipo di prezzo
pars[0].type=TYPE_INT;
pars[0].integer_value=applied_volume;
handle=IndicatorCreate(name,period,IND_VOLUMES,1,pars);
}
//--- se l'handle non viene creato
if(handle==INVALID_HANDLE)
{
//--- dice riguardo il fallimento e l'output del codice di errore
PrintFormat("Fallimento nel creare l'handle dell'indicatore iVolumes per il simbolo %s/%s, co
name,
EnumToString(period),
GetLastError());
//--- l'indicatore si ferma precocemente
return(INIT_FAILED);
}
//--- mostra il simbolo/timeframe per cui è calcolato l'indicatore Volumes
short_name=StringFormat("iVolumes(%s/%s, %s)",name,EnumToString(period),EnumToString(applied_vol
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inizializzazione normale dell'indicatore
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//--- numero di valori copiati dall' indicatore iVolumes
int values_to_copy;
//--- determina il numero di valori calcolati in dell'indicatore
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() returned %d, error code %d",calculated,GetLastError());
return(0);
}
//--- se è il primo inizio del calcolo dell'indicatore o se il numero di valori dell'indicatore iVo
//--- o se è necessario calcolare l'indicatore per due o più barre (significa che qualcosa è cambia
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se l' array iVolumesBuffer è maggiore del numero di valori dell'indicatore iVolumes per
//--- altrimenti, copiamo meno della grandezza del buffer indicatore
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- vuol dire che non è la prima volta del calcolo dell'indicatore, e dopo l'ultima chiamat
//--- per il calcolo non viene aggiunta più di una barra
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- riempie gli array con valori dell'indicatore iVolumes
//--- se FillArraysFromBuffer restituisce false, significa che l'informazione non è ancora pronta,
if(!FillArraysFromBuffers(iVolumesBuffer,iVolumesColors,handle,values_to_copy)) return(0);
//--- forma il messaggio
string comm=StringFormat("%s ==> Valore aggiornato nell'indicatore %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- visualizza il messaggio di servizio sul grafico
Comment(comm);
//--- memorizza il numero dei valori nell'indicatore Volumes
bars_calculated=calculated;
//--- restituisce il valore prev_calculated per la chiamata successiva
return(rates_total);
}
//+--------------------------------------------------------------------------------+
//| Riempie il buffer indicatore dall'indicatore iVolumes |
//+--------------------------------------------------------------------------------+
bool FillArraysFromBuffers(double &volume_buffer[], // buffer indicatore dei valori di Volumes
double &color_buffer[], // buffer indicatore dei colori
int ind_handle, // handle dell'indicatore iVolumes
int amount // numero di valori copiati
)
{
//--- resetta codice errore
ResetLastError();
//--- riempie una parte dell'array iVolumesBuffer con valori dal buffer indicatore che ha indice 0
if(CopyBuffer(ind_handle,0,0,amount,volume_buffer)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iVolumes, codice errore %d",GetLas
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- riempie una parte dell'array iVolumesColors con valori dal buffer indicatore che ha indice 1
if(CopyBuffer(ind_handle,1,0,amount,color_buffer)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iVolumes, codice errore %d",GetLas
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- tutto è ok
return(true);
}
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione indicatore |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- cancella il grafico dopo aver eliminato l'indicatore
Comment("");
}
Quando si esegue un Ex pert Advisor nello strateg y tester, è possibile creare in proprio array di dati in
base ai tipi semplici o strutture semplici (esse non contengono stringhe, oggetti di classi o di oggetti
di array dinamici). Questo set di dati può essere salvato con la funzione FrameAdd() di una struttura
speciale chiamata frame. Durante l'ottimizzazione di un Ex pert Advisor, ogni agente può inviare una
serie di frames al terminale. T utti i frame ricevuti vengono scritti nel file *.MQD nella cartella ex pert,
terminal_directory/MQL5/Files /T ester denominata come l'Ex pert Advisor. S ono scritti nell'ordine in cui
sono ricevuti dagli agenti. R icezione di un frame nel terminale client da un agente di test genera
l'evento T esterPass.
I frames possono essere memorizzati nella memoria del computer e in un file con il nome specificato.
I l linguaggio MQL5 non pone limiti al numero di frames.
Funzione Azione
F rameFirst Sposta un puntatore di lettura frame all'inizio e
resetta il filtro impostato precedentemente
S trateg y T ester
iniziali e finali
Vedi anche
S tatistiche di T esting, Proprietà di un Programma MQL5 in esecuzione
FrameFirst
Consente di spostare il puntatore del frame leggendo dall'inizio e resetta un filtro settato .
bool FrameFirst();
Valore restituito
Restituisce true se ha successo, altrimenti false. Per ottenere informazioni sull'errore, chiamare la
funzione GetLastError().
FrameFilter
I mposta il filtro di lettura del frame e sposta il puntatore all'inizio.
bool FrameFilter(
const string name, // Nome pubblico/etichetta
long id // ID pubblico
);
Valore restituito
Restituisce true se ha successo, altrimenti false. Per ottenere informazioni sull'errore, chiamare la
funzione GetLastError().
Nota
Se una stringa vuota viene passata come primo parametro, il filtro funziona solo con un parametro
numerico, cioè solo i frames con l'ID specificato verranno visualizzati. S e il valore del secondo
parametro è ULONG_M AX, solo un filtro di testo funziona.
La chiamata di FrameFilter(" " , ULONG_M AX) è equivalente alla chiamata FrameFirst(), cioè pari a
non utilizzare alcun filtro.
FrameNext
Legge un frame e sposta il puntatore al successivo. Ci sono due varianti della funzione.
Parametri
pass
[ out] Il numero di un passaggio durante l'ottimizzazione nel tester strategia.
name
[ out] Il nome dell'identificatore.
id
[ out] Il valore dell'identificatore.
valore
[ out] n singolo valore numerico.
U
data
[ out] n array di un qualunque tipo.
U
Valore restituito
Restituisce true se ha successo, altrimenti false. Per ottenere informazioni sull'errore, chiamare la
funzione GetLastError().
Nota
Nella seconda versione della chiamata, è necessario gestire correttamente i dati ricevuti nell' array
data[].
FrameInputs
R iceve parametri di input, in cui è formato il frame con il numero di passo specificato.
bool FrameInputs(
ulong pass, // Il numero di un passo nell'ottimizzazione
string& parameters[], // Un array di stringhe di tipo "parametroN=valoreN"
uint& parameters_count // Il numero totale dei parametri
);
Parametri
pass
[ in] Il numero di un passaggio durante l'ottimizzazione nel tester strategia.
parameters
[ out] Un array di stringhe con la descrizione dei nomi e dei valori dei parametri
parameters_count
[ out] Il numero di elementi dell'array parameters[].
Valore restituito
Restituisce true se ha successo, altrimenti false. Per ottenere informazioni sull'errore, chiamare la
funzione GetLastError().
Nota
Dopo aver ottenuto il numero di stringhe parameters_count nell' array parameters[],, è possibile
organizzare un ciclo per andare attraverso tutti i record. Questo ti aiuterà a trovare i valori dei
parametri di ingresso di un Ex pert Advisor per il numero di passo specificato.
FrameAdd
Consente di aggiungere un frame con i dati. Ci sono due varianti della funzione.
Parametri
name
[ in] Etichetta frame pubblico. Essa può essere utilizzata per un filtro nella funzione FrameFilter().
id
[ in] Un identificatore pubblico del frame. Essa può essere utilizzata per un filtro nella funzione
F rameFilter().
valore
[in] Un valore numerico da scrivere nel frame. Esso è utilizzato per trasmettere un singolo
risultato come nella funzione OnT ester().
filename
[in] Il nome del file che contiene i dati da aggiungere al frame. Il file deve essere localizzao nella
cartella MQL5/Files.
data
[ in] Un array di qualsiasi tipo da scrivere nel frame. Passato per riferimento.
Valore restituito
Restituisce true se ha successo, altrimenti false. Per ottenere informazioni sull'errore, chiamare la
funzione GetLastError().
ParameterGetRange
Riceve i dati sulla gamma di valori e lo step di cambiamento per una variabile di input quando si
ottimizza un Ex pert Advisor nello S trateg y T ester. Ci sono due varianti della funzione.
Parametri
name
[in] input variable ID. Queste variabili sono parametri esterni di un'applicazione. I loro valori
possono essere specificati quando si avviano su un grafico o in un singolo test.
enable
[ out] Flag di questo parametro che può essere utilizzato per enumerare i valori durante
l'ottimizzazione dello S trateg y T ester.
valore
[ out] alore parametro.
V
start
[ out] Valore iniziale del parametro durante l'ottimizzazione.
step
[ out] S tep di modifica dei parametri durante l'enumerazione dei suoi valori.
stop
[ out] Valore del parametro finale durante l'ottimizzazione.
Valore restituito
Restituisce true se ha successo, altrimenti false. Per ulteriori informazioni sull'errore, utilizzare la
funzione GetLastError().
Nota
La funzione può essere chiamata solo dagli handlers OnT esterInit(), OnT esterPass() ed
OnT esterDeinit(). E' stato introdotto per ricevere valori di parametri di input degli Ex pert Advisor e
gli intervalli di variazione durante l'ottimizzazione nello S trateg y T ester.
Quando viene chiamato in OnT esterInit(), i dati ottenuti possono essere utilizzati per ridefinire le
regole per l'enumerazione di qualsiasi variabile di input utilizzando la funzione ParameterS etR ange
(). Pertanto, nuovi valori di S tart, S top e S tep possono essere impostati, ed il parametro di input
può anche essere completamente escluso dall'ottimizzazione indipendentemente dalle impostazioni
T ester della strategia. Ci ò consente di gestire l'area dei parametri di input durante l'ottimizzazione
escludendo alcuni parametri dall'ottimizzazione in base ai valori dei parametri chiave dell' Ex pert
A dvisor" .
Esempio:
#property description "Expert Advisor per la dimostrazione della funzione ParameterGetRange()."
#property description "Dev'essere lanciato in modalità ottimizzazione dello Strategy Tester"
//--- parametri di input
input int Input1=1;
input double Input2=2.0;
input bool Input3=false;
input ENUM_DAY_OF_WEEK Input4=SUNDAY;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione dell' Expert |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- L' Expert Advisor è designato per l'operazione solo nello the Strategy Tester
if(!MQL5InfoInteger(MQL5_OPTIMIZATION))
{
MessageBox("Dev'essere lanciato in modalità ottimizzazione dello Strategy Tester!");
//--- finisce l'operazione dell' Expert Advisor in anticipo e lo rimuove dal chart
return(INIT_FAILED);
}
//--- completamento dell'inizializzazione, con successo
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione TesterInit |
//+--------------------------------------------------------------------------------+
void OnTesterInit()
{
//--- esempio per il parametro di input di tipo long
string name="Input1";
bool enable;
long par1,par1_start,par1_step,par1_stop;
ParameterGetRange(name,enable,par1,par1_start,par1_step,par1_stop);
Print("Primo parametro");
PrintFormat("%s=%d abilita=%s da %d to %d con lo step=%d",
name,par1,(string)enable,par1_start,par1_stop,par1_step);
//--- esempio di parametro di input per il tipo double
name="Input2";
double par2,par2_start,par2_step,par2_stop;
ParameterGetRange(name,enable,par2,par2_start,par2_step,par2_stop);
Print("Secondo parametro");
PrintFormat("%s=%G abilita=%s da %G to %G con lo step=%G",
name,par2,(string)enable,par2_start,par2_stop,par2_step);
ParameterSetRange
Specifica l'uso dei parametri di input quando si ottimizza un Ex pert Advisor nello S trateg y T ester:
valore, step del cambiamento, i valori iniziali e finali. Ci sono due varianti della funzione.
Parametri
name
[in] input or sinput ID della variabile. Queste variabili sono parametri esterni di un'applicazione. I
loro valori possono essere specificati al momento del lancio del programma.
enable
[ in] Abilitare questo parametro per enumerare i valori durante l'ottimizzazione nello
S trateg yT ester.
valore
[ in] Valore parametro.
start
[ in] il valore del parametro iniziale durante l'ottimizzazione.
step
[ in] Cambiamento dello step parametri durante l'enumerazione dei suoi valori.
stop
[ in] il valore del parametro finale durante l'ottimizzazione.
Valore restituito
Restituisce true se ha successo, altrimenti false. Per ulteriori informazioni sull'errore, utilizzare la
funzione GetLastError().
Nota
La funzione può essere chiamata solo dal gestore OnT esterInit() al momento del lancio dell'
ottimizzazione dallo S trateg y T ester. È stato designato per specificare il range dei parametri e lo
step del cambiamento. Il parametro può essere completamente escluso dall' ottimizzazione
indipendentemente dalle impostazioni dello S trateg y T ester. Consente inoltre di utilizzare le variabili
dichiarate con modificatore sinput nel processo di ottimizzazione.
ParameterS etR ange() consente di gestire l' ottimizzazione di un Ex pert Advisor nello S trateg y T ester
a seconda dei valori dei suoi parametri chiave, includendo o escludendo i parametri di input richiesti
dal l'ottimizzazione ed impostando il range richiesto e lo step del cambiamento.
Funzioni Eventi
Questo gruppo contiene le funzioni per lavorare con gli eventi personalizzati e le funzioni timer. Oltre
a questo gruppo, ci sono funzioni speciali per l' handling di eventi predefiniti.
Funzione Azione
EventS etMillisecondT imer A vvia il generatore evento del timer ad alta
risoluzione con un periodo di meno di 1 secondo
per il chart corrente
Vedi anche
T ipi di Eventi del Grafico
EventSetMillisecondTimer
La funzione indica al terminale client che gli eventi timer dovrebbero essere generati ad intervalli di
meno di un secondo, per questo Ex pert Advisor o indicatore.
bool EventSetMillisecondTimer(
int milliseconds // numero di millisecondi
);
Parametri
millisecondi
[ in] Numero di millisecondi che definiscono la frequenza degli eventi timer.
Valore restituito
In caso di esecuzione di successo, restituisce true, in caso contrario - false. Per ricevere un codice
d'errore, dev 'essere chiamata la funzione GetLastError().
Nota
Questa funzione è progettata per i casi in cui è necessario il timer ad alta risoluzione. In altre
parole, gli eventi timer devono essere ricevuti più di una volta al secondo. S e un timer
convenzionale con il periodo di più di un secondo è abbastanza per voi, usate EventS etT imer().
L 'intervallo minimo di 1000 millisecondi è utilizzato nello strateg y tester. In generale, quando il
periodo del timer viene ridotto, il tempo di prova è aumentato, come gestore di eventi timer viene
chiamato più spesso. Quando si lavora in modalità real-time, gli eventi timer vengono generati non
più di 1 volta a 10-16 millisecondi a causa di limitazioni hardware.
Di solito, questa funzione dovrebbe essere chiamata dalla funzione OnInit() o nella classe
costruttore. Per gestire gli eventi provenienti dal timer, un Ex pert Advisor o un indicatore dovrebbe
avere la funzione OnT imer().
Ogni Ex pert Advisor e ogni indicatore lavorano con un proprio timer ricevendo eventi
esclusivamente da questo timer. Durante la chiusura dell'applicazione mql5, il timer viene
forzatamente distrutto nel caso in cui è stato creato, ma non è stato disabilitato dala funzione
EventKillT imer().
S olo un timer può essere lanciato per ogni programma. Ogni applicazione mql5 e chart hanno la loro
coda di eventi in cui vengono inseriti tutti gli eventi appena arrivati. S e la coda contiene già
l'evento T imer o questo evento è in fase di lavorazione, il nuovo evento T imer non viene aggiunto
alla coda dell' applicazione mql5.
EventSetTimer
La funzione indica al terminale client, che per questo indicatore o Ex pert Advisor, gli eventi dal timer
devono essere generati con la periodicità specificata.
bool EventSetTimer(
int seconds // numero di secondi
);
Parametri
seconds
[ in] Numero di secondi che determinano la frequenza del verificarsi di un evento timer.
Valore restituito
In caso di successo restituisce true, altrimenti false. Al fine di ottenere un codice di errore, deve
essere chiamata la funzione GetLastError().
Nota
Normalmente, questa funzione deve essere chiamata dalla funzione OnInit() o da una classe
costruttore. Al fine di gestire gli eventi provenienti dal timer, l'Ex pert Advisor deve avere la
funzione OnT imer().
Ogni Ex pert Advisor, cos ì come ogni Indicatore lavora con il proprio timer e riceve gli eventi solo da
esso. Non appena un programma MQL5 si arresta, il timer viene distrutto forzatamente se è stato
creato ma non è stato disabilitato dalla funzione EventKillT imer().
Per ciascun programma non più di un timer può essere eseguito. Ogni programma MQL5 ed ogni
grafico ha la propria coda di eventi, in cui si trovano tutti gli eventi appena ricevuti. S e l'evento
T imer è presente nella coda o viene elaborato, il nuovo evento T imer non verrà inserito nella coda
EventKillTimer
S pecifica il terminale client che è necessario fermare la generazione di eventi da T imer.
void EventKillTimer();
Valore restituito
N essun valore restituito.
Nota
In genere, questa funzione deve essere richiamata da una funzione OnDeinit(), se la funzione
EventS etT imer() è stata richiamata da OnInit(). Questa funzione può anche essere chiamata dal
distruttore della classe, se la funzione EventS etT imer () è stata chiamata nel costruttore di questa
classe.
Ogni Ex pert Advisor, cos ì come ogni Indicatore lavora con il proprio timer e riceve gli eventi solo da
esso. Non appena un programma MQL5 si arresta, il timer viene distrutto forzatamente se è stato
creato ma non è stato disabilitato dalla funzione EventKillT imer()
EventChartCustom
La funzione genera un evento personalizzato per il grafico specificato.
bool EventChartCustom(
long chart_id, // identificatore dell'evento ricezione grafico
ushort custom_event_id, // identificatore evento
long lparam, // parametro di tipo long
double dparam, // parametro di tipo double
string sparam // parametro di tipo stringa
);
Parametri
chart_id
[ in] Identificatore del grafico. 0 significa il grafico corrente.
custom_event_id
[in] ID dell'evento utente. Questo identificatore viene automaticamente aggiunto al valore
CHART EVENT_CUS T OM e convertito nel tipo intero.
lparam
[ in] Il parametro di evento del tipo long passato alla funzione OnChartEvent.
dparam
[ in] Il parametro di evento del tipo double passato alla funzione OnChartEvent.
sparam
[in] Il parametro di evento di tipo stringa passato alla funzione OnChartEvent. S e la stringa è più
lunga di 63 caratteri, viene troncata.
Valore restituito
Restituisce true se un evento personalizzato è stato inserito con successo nella coda eventi del
grafico che riceve gli eventi. In caso di fallimento, restituisce false. Utilizzare GetLastError() per
ottenere un codice di errore.
Nota
Un Ex pert Advisor o indicatore attaccato al grafico specificato gestisce l'evento utilizzando la
funzione OnChartEvent(int event_id, long & lparam, double& dparam, string & sparam).
Per ciascun tipo di evento, i parametri di input della funzione OnChartEvent() hanno valori definiti che
sono necessari per l'elaborazione di questo evento. Gli eventi ed i valori passati attraverso questi
parametri sono elencati nella tabella seguente.
rue è impostato
per il grafico)
true è impostato
per il grafico)
grafico
Esempio:
//+--------------------------------------------------------------------------------+
//| ButtonClickExpert.mq5 |
//| Copyright 2009, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
string buttonID="Button";
string labelID="Info";
int broadcastEventID=5000;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione dell' Expert |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- Crea un bottone per inviare gli eventi personalizzati
ObjectCreate(0,buttonID,OBJ_BUTTON,0,100,100);
ObjectSetInteger(0,buttonID,OBJPROP_COLOR,clrWhite);
ObjectSetInteger(0,buttonID,OBJPROP_BGCOLOR,clrGray);
ObjectSetInteger(0,buttonID,OBJPROP_XDISTANCE,100);
ObjectSetInteger(0,buttonID,OBJPROP_YDISTANCE,100);
ObjectSetInteger(0,buttonID,OBJPROP_XSIZE,200);
ObjectSetInteger(0,buttonID,OBJPROP_YSIZE,50);
ObjectSetString(0,buttonID,OBJPROP_FONT,"Arial");
ObjectSetString(0,buttonID,OBJPROP_TEXT,"Button");
ObjectSetInteger(0,buttonID,OBJPROP_FONTSIZE,10);
ObjectSetInteger(0,buttonID,OBJPROP_SELECTABLE,0);
//---
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione Expert |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
ObjectDelete(0,buttonID);
ObjectDelete(0,labelID);
}
//+--------------------------------------------------------------------------------+
//| Funzione tick dell'Expert